|
Packit |
46375d |
#!/bin/sh
|
|
Packit |
46375d |
# Implements a font name cleanup heuristic similar to the one described in
|
|
Packit |
46375d |
# http://blogs.msdn.com/text/attachment/2249036.ashx
|
|
Packit |
46375d |
|
|
Packit |
46375d |
usage() {
|
|
Packit |
46375d |
cat >&2 << EOF_USAGE
|
|
Packit |
46375d |
Usage: $0 <family> <style>
|
|
Packit |
46375d |
<family>: font family to test
|
|
Packit |
46375d |
<style>: font style to test
|
|
Packit |
46375d |
|
|
Packit |
46375d |
Example:
|
|
Packit |
46375d |
$0 "DejaVu Sans" "Condensed Bold Oblique"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
EOF_USAGE
|
|
Packit |
46375d |
exit 1
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
fix_naming() {
|
|
Packit |
46375d |
awk --re-interval -v family="$1" -v face="$2" '
|
|
Packit |
46375d |
BEGIN {
|
|
Packit |
46375d |
# regular is a slant but is special-cased in naming
|
|
Packit |
46375d |
attrs = "regular|slant|stretch|weight"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
blocks["regular"] = "Regular"
|
|
Packit |
46375d |
blocks["slant"] = "Italic|Oblique"
|
|
Packit |
46375d |
blocks["stretch"] = "UltraCondensed|ExtraCondensed|SemiCondensed|SemiExpanded|ExtraExpanded|UltraExpanded|Condensed|Expanded"
|
|
Packit |
46375d |
blocks["weight"] = "Thin1|ExtraLight|DemiBold1|ExtraBold1|Bold|Thin2|Light|Medium|ExtraBlack|Black|DemiBold2|ExtraBold2"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
aliases["Regular"] = "Book|Normal|Regular|Roman|Upright"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
aliases["Italic"] = "ita|ital|Italic|cursive|kursiv"
|
|
Packit |
46375d |
aliases["Oblique"] = "inclined|Oblique|backslanted|backslant|slanted"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
aliases["UltraCondensed"] = "extra compressed|ext compressed|ultra compressed|ultra condensed|ultra cond|UltraCondensed"
|
|
Packit |
46375d |
aliases["ExtraCondensed"] = "compressed|extra condensed|ext condensed|extra cond|ext cond|ExtraCondensed"
|
|
Packit |
46375d |
aliases["SemiCondensed"] = "narrow|compact|semi condensed|semi cond|SemiCondensed"
|
|
Packit |
46375d |
aliases["SemiExpanded"] = "wide|semi expanded|semi extended|SemiExpanded"
|
|
Packit |
46375d |
aliases["ExtraExpanded"] = "extra expanded|ext expanded|extra extended|ext extended|ExtraExpanded"
|
|
Packit |
46375d |
aliases["UltraExpanded"] = "ultra expanded|ultra extended|UltraExpanded"
|
|
Packit |
46375d |
aliases["Condensed"] = "Condensed|cond"
|
|
Packit |
46375d |
aliases["Expanded"] = "extended|Expanded|extended"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
aliases["Thin1"] = "extra thin|ext thin|ultra thin"
|
|
Packit |
46375d |
aliases["ExtraLight"] = "extra light|ext light|ultra light|UltraLight|ExtraLight"
|
|
Packit |
46375d |
aliases["DemiBold1"] = "semi bold|demi bold|SemiBold|DemiBold"
|
|
Packit |
46375d |
aliases["ExtraBold1"] = "extra bold|ext bold|ultra bold|UltraBold|ExtraBold"
|
|
Packit |
46375d |
aliases["Bold"] = "Bold"
|
|
Packit |
46375d |
aliases["Thin2"] = "thin"
|
|
Packit |
46375d |
aliases["Light"] = "Light"
|
|
Packit |
46375d |
aliases["Medium"] = "Medium"
|
|
Packit |
46375d |
aliases["ExtraBlack"] = "extra black|ext black|ultra black|UltraBlack|ExtraBlack"
|
|
Packit |
46375d |
aliases["Black"] = "Black|heavy|nord"
|
|
Packit |
46375d |
aliases["DemiBold2"] = "demi"
|
|
Packit |
46375d |
aliases["ExtraBold2"] = "ultra"
|
|
Packit |
46375d |
|
|
Packit |
46375d |
nat = split(attrs,attributes,"|")
|
|
Packit |
46375d |
for ( at = 1 ; at <= nat ; at++ ) {
|
|
Packit |
46375d |
nb = split(blocks[attributes[at]],b_l,"|")
|
|
Packit |
46375d |
for ( b = 1 ; b <= nb ; b++ ) {
|
|
Packit |
46375d |
nal = split(tolower(aliases[b_l[b]]),al_l,"|")
|
|
Packit |
46375d |
aliases[b_l[b]] = ""
|
|
Packit |
46375d |
for ( al = 1 ; al <= nal ; al++ ) {
|
|
Packit |
46375d |
# WWS uses reverse-matching everywhere
|
|
Packit |
46375d |
nw = split(al_l[al], words," ")
|
|
Packit |
46375d |
for (w = nw ; w >= 1 ; w-- ) {
|
|
Packit |
46375d |
aliases[b_l[b]] = aliases[b_l[b]] words[w] " "
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
sub(" $", "|", aliases[b_l[b]])
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
sub("\\|$", "", aliases[b_l[b]])
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
nf = split(family "|" face, s, "|")
|
|
Packit |
46375d |
# This is more aggressive than demanded by WWS
|
|
Packit |
46375d |
for ( i = 1 ; i <= nf ; i++ ) {
|
|
Packit |
46375d |
fs[i] = gensub("&", " and ", "g", s[i])
|
|
Packit |
46375d |
fs[i] = gensub("\\([[:digit:]]){3}", " ", "g", fs[i])
|
|
Packit |
46375d |
fs[i] = gensub("([[:digit:]]+)", " \\1 ", "g", fs[i])
|
|
Packit |
46375d |
fs[i] = gensub("([[:lower:]])([[:upper:]])([[:lower:]])", "\\1 \\2\\3", "g", fs[i])
|
|
Packit |
46375d |
fs[i] = gensub("[ \t_\\.-]+", " ", "g", fs[i])
|
|
Packit |
46375d |
fs[i] = tolower(fs[i])
|
|
Packit |
46375d |
rfs[i] = ""
|
|
Packit |
46375d |
nw = split(fs[i], words, " ")
|
|
Packit |
46375d |
for (w = nw ; w >= 1 ; w-- ) {
|
|
Packit |
46375d |
rfs[i] = rfs[i] words[w] " "
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
sub("^"," ",rfs[i])
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
rffamily = rfs[1]
|
|
Packit |
46375d |
rfface = rfs[2]
|
|
Packit |
46375d |
|
|
Packit |
46375d |
# Remove the rightmost occurrence of a regular face name
|
|
Packit |
46375d |
nrfface = rfface
|
|
Packit |
46375d |
control = nrfface
|
|
Packit |
46375d |
nb = split(blocks[attributes[1]],b_l,"|")
|
|
Packit |
46375d |
b = 1
|
|
Packit |
46375d |
while ((b <= nb) && (nrfface == control)) {
|
|
Packit |
46375d |
nal = split(aliases[b_l[b]],al_l,"|")
|
|
Packit |
46375d |
al = 1
|
|
Packit |
46375d |
while ((al <= nal) && (nrfface == control)) {
|
|
Packit |
46375d |
sub(" " al_l[al] " ", " ", nrfface)
|
|
Packit |
46375d |
al++
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
b++
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
# We should canonalize Regular too but too many fonts get it wrong and
|
|
Packit |
46375d |
# it is not terribly important
|
|
Packit |
46375d |
if (nrfface != control) {
|
|
Packit |
46375d |
canonical_attribute["regular"] = toupper(substr(al_l[al-1], 1,1)) substr(al_l[al-1], 2)
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
# Append FaceName to FontFamily
|
|
Packit |
46375d |
sub(nrfface, " ", rffamily)
|
|
Packit |
46375d |
nrffont = gensub(" ", " ", "g", nrfface rffamily)
|
|
Packit |
46375d |
|
|
Packit |
46375d |
# Process other qualifiers
|
|
Packit |
46375d |
for ( at = 2 ; at <= nat ; at++ ) {
|
|
Packit |
46375d |
canonical_attribute[attributes[at]] = ""
|
|
Packit |
46375d |
control = nrffont
|
|
Packit |
46375d |
nb = split(blocks[attributes[at]],b_l,"|")
|
|
Packit |
46375d |
b = 1
|
|
Packit |
46375d |
while ((b <= nb) && (nrffont == control)) {
|
|
Packit |
46375d |
nal = split(aliases[b_l[b]],al_l,"|")
|
|
Packit |
46375d |
al = 1
|
|
Packit |
46375d |
while ((al <= nal) && (nrffont == control)) {
|
|
Packit |
46375d |
sub(" " al_l[al] " ", " ", nrffont)
|
|
Packit |
46375d |
al++
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
b++
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
if (nrffont != control) {
|
|
Packit |
46375d |
canonical_attribute[attributes[at]] = gensub("[[:digit:]]", "", "g", b_l[b-1])
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
cnface = canonical_attribute["stretch"] " " canonical_attribute["weight"] " " canonical_attribute["slant"]
|
|
Packit |
46375d |
sub(" ", " ", cnface)
|
|
Packit |
46375d |
sub(" $", "", cnface)
|
|
Packit |
46375d |
sub("^ ", "", cnface)
|
|
Packit |
46375d |
if (cnface == "") {
|
|
Packit |
46375d |
if ( canonical_attribute["regular"] != "" )
|
|
Packit |
46375d |
{ cnface = canonical_attribute["regular"] }
|
|
Packit |
46375d |
else { cnface = "Regular" }
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
# Make sure there are no stray attributes left
|
|
Packit |
46375d |
for ( at = 1 ; at <= nat ; at++ ) {
|
|
Packit |
46375d |
nb = split(blocks[attributes[at]],b_l,"|")
|
|
Packit |
46375d |
for ( b = 1 ; b <= nb ; b++ ) {
|
|
Packit |
46375d |
nal = split(aliases[b_l[b]],al_l,"|")
|
|
Packit |
46375d |
for ( al = 1 ; al <= nal ; al++ ) {
|
|
Packit |
46375d |
sub(" " al_l[al] " ", " ", nrffont)
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
cnfamily = ""
|
|
Packit |
46375d |
nw = split(nrffont, words, " ")
|
|
Packit |
46375d |
for (w = nw ; w >= 1 ; w-- ) {
|
|
Packit |
46375d |
cnfamily = cnfamily toupper(substr(words[w], 1,1)) substr(words[w], 2) " "
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
sub(" $", "", cnfamily)
|
|
Packit |
46375d |
|
|
Packit |
46375d |
# Keep the original family name if it matches since some of the
|
|
Packit |
46375d |
# operations performed before, while necessary for attribute detection,
|
|
Packit |
46375d |
# can be needlessly destructive on legitimate family names
|
|
Packit |
46375d |
nfamily = gensub("([[:digit:]]+)", " \\1 ", "g", family)
|
|
Packit |
46375d |
nfamily = gensub("([[:lower:]])([[:upper:]])([[:lower:]])", "\\1 \\2\\3", "g", nfamily)
|
|
Packit |
46375d |
sub("-", " ", nfamily)
|
|
Packit |
46375d |
sub(" +", " ", nfamily)
|
|
Packit |
46375d |
sub(" $", "", nfamily)
|
|
Packit |
46375d |
sub("^ ", "", nfamily)
|
|
Packit |
46375d |
|
|
Packit |
46375d |
if ( tolower(nfamily) == tolower(cnfamily) ) { cnfamily = family }
|
|
Packit |
46375d |
|
|
Packit |
46375d |
print cnfamily "\t" cnface
|
|
Packit |
46375d |
}'
|
|
Packit |
46375d |
|
|
Packit |
46375d |
}
|
|
Packit |
46375d |
|
|
Packit |
46375d |
[ "$#" -lt "2" ] && usage
|
|
Packit |
46375d |
fix_naming "$1" "$2"
|