Blame bin/fix-font-naming

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"