Example #1
0
def build_glyphs(bitbucket, f):

    db = font_db.db_create(f)

    db['spacing_anchor_heights'] = { 'hi' : 1350,
                                     'x'  : 852,
                                     'o'  : 453,
                                     'bl' : 40,
                                     'lo' : -420 }

    propagate_hyphens(f)

    make_glyph_reference("quotesingle", f["quoteright"])
    make_glyph_reference("quotedbl", f["quotedblright"])

    f.selection.all()
    spacing_by_anchors.space_selected_by_anchors(f)
    f.selection.none()

    generate_kerning_and_read_features(None, f)

    #--------------------------------------------------------------------------

    font_db.db_close(f)
def build_glyphs(bitbucket, f):

    import cap_spacing

    figures = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

    caps = [
        'A', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'Amacron', 'Abreve', 'Aogonek',
        'B',
        'C', 'Ccedilla', 'Cacute', 'Ccircumflex', 'Cdotaccent', 'Ccaron',
        'D', 'Dcaron', 'Dcroat',
        'E', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Emacron', 'Ebreve', 'Edotaccent', 'Eogonek', 'Ecaron',
        'F',
        'G', 'Gcircumflex', 'Gbreve', 'Gdotaccent', 'Gcommaaccent',
        'H', 'Hcircumflex', 'Hbar',
        'I', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Itilde', 'Imacron', 'Ibreve', 'Iogonek',
        'J', 'Jcircumflex',
        'K', 'Kcommaaccent',
        'L', 'Lacute', 'Lcommaaccent', 'Lcaron', 'Ldot', 'Lslash',
        'M',
        'N', 'Ntilde', 'Nacute', 'Ncommaaccent', 'Ncaron',
        'O', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'Oslash', 'Omacron', 'Obreve', 'Ohungarumlaut',
        'P',
        'Q',
        'R', 'Racute', 'Rcommaaccent', 'Rcaron',
        'S', 'Sacute', 'Scircumflex', 'Scedilla', 'uni0218', 'Scaron',
        'T', 'uni0162', 'uni021A', 'Tcaron', 'Tbar',
        'U', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Utilde', 'Umacron', 'Ubreve', 'Uring', 'Uhungarumlaut', 'Uogonek',
        'V',
        'W', 'Wcircumflex',
        'X',
        'Y', 'Yacute', 'Ydieresis', 'Ycircumflex',
        'Z', 'Zacute', 'Zdotaccent', 'Zcaron',
        'IJ', 'AE', 'OE', 'Eth', 'Thorn',
        'question', 'questiondown',
        'exclam', 'exclamdown',
        'ampersand'
        ]

    def base(letter):
        if letter == 'i':
            base = 'dotlessi'
        elif letter == 'j':
            base = 'uni0237'
        else:
            base = letter
        return base    

    db = font_db.db_create(f)

    db['spacing_anchor_heights'] = { 'hi' : 684, # caps and ascenders
#                                    't'  : ???, # top diacritics
                                     'x'  : 376,  # ex-height
                                     'o'  : 195,  # like the letter o
                                     'bl' : 15,   # baseline
                                     'lo' : -244 } # descenders

    build_several_space_glyphs(f, emsize = 1000, spacesize = 185,
                               thinspacesize = 1000 / 6,
                               hairspacesize = 1000 / 10,
                               tabwidth = f['zero.lining'].width)
    propagate_hyphens(f)
#    propagate_hyphens(f, '.uppercase')
    build_spacing_marks(f, width = 2 * 195)

    make_glyph_reference('quotesingle', f['minute'])
    make_glyph_reference('quotedbl', f['second'])
    make_glyph_reference('asciitilde', f['uni2053']) # Swung dash.
    make_glyph_reference('i.TRK', f['i'])
    make_glyph_reference('Dcroat', f['Eth'])
    make_glyph_reference('Dcroat.001', f['Eth.001'])

    build_multigraph('ellipsis', [f['period'], f['period'], f['period']])

    for fig in figures + ['dollar']:
        make_glyph_reference(fig, f[fig + '.hanging'])

    make_glyph_reference('uni00B9', f['one.sup'])
    make_glyph_reference('uni00B2', f['two.sup'])
    make_glyph_reference('uni00B3', f['three.sup'])
    for extension in [('.numer', 244), ('.sub', -98), ('.sup', 293)]:
        for fig in figures:
            make_glyph_reference(fig + extension[0],
                                 f[fig + '.denom'],
                                 transformation = (1, 0, 0, 1, 0, extension[1]),
                                 copy_spacing_anchors = False)
    build_multigraph('onequarter', [f['one.numer'], f['fraction'], f['four.denom']])
    build_multigraph('onehalf', [f['one.numer'], f['fraction'], f['two.denom']])
    build_multigraph('threequarters', [f['three.numer'], f['fraction'], f['four.denom']])

    #--------------------------------------------------------------------------

    for letter in 'GKkLlNnRr':
        build_accented_glyph(letter + 'commaaccent', f[base(letter)], f['uni0326'])
    for letter in 'k':
        build_accented_glyph(letter + 'commaaccent.001', f[base(letter) + '.001'], f['uni0326'])
    for letter in 'GNR':
        build_accented_glyph(letter + 'commaaccent.001', f[base(letter) + '.001'], f['uni0326'])
    build_accented_glyph('uni0218', f['S'], f['uni0326'])
    build_accented_glyph('uni0219', f['s'], f['uni0326'])
    build_accented_glyph('uni021A', f['T'], f['uni0326'])
    build_accented_glyph('uni021A.001', f['T.001'], f['uni0326'])
    build_accented_glyph('uni021A.002', f['T.002'], f['uni0326'])
    build_accented_glyph('uni021B', f['t'], f['uni0326'])
    build_accented_glyph('gcommaaccent', f['g'], f['uni0312'])
    build_accented_glyph('gcommaaccent.001', f['g.001'], f['uni0312'])

    #--------------------------------------------------------------------------

    for letter in 'CcSs':
        build_accented_glyph(letter + 'cedilla', f[base(letter)], f['uni0327'])
    build_accented_glyph('uni0162', f['T'], f['uni0327'])
    build_accented_glyph('uni0162.001', f['T.001'], f['uni0327'])
    build_accented_glyph('uni0162.002', f['T.002'], f['uni0327'])
    build_accented_glyph('uni0163', f['t'], f['uni0327'])

    #--------------------------------------------------------------------------

    for letter in 'aeiou':
        build_accented_glyph(letter + 'grave', f[base(letter)], f['gravecomb'])
    for letter in 'AEIOU':
        build_accented_glyph(letter + 'grave', f[base(letter)], f['gravecomb.cap'])
    for letter in 'AE':
        build_accented_glyph(letter + 'grave.001', f[base(letter) + '.001'], f['gravecomb.cap'])

    #--------------------------------------------------------------------------

    for letter in 'aceinorsuyz':
        build_accented_glyph(letter + 'acute', f[base(letter)], f['acutecomb'])
    for letter in 'z':
        build_accented_glyph(letter + 'acute.001', f[base(letter) + '.001'], f['acutecomb'])
    for letter in 'ACEILNORSUYZ':
        build_accented_glyph(letter + 'acute', f[base(letter)], f['acutecomb.cap'])
    for letter in 'ACENR':
        build_accented_glyph(letter + 'acute.001', f[base(letter) + '.001'], f['acutecomb.cap'])
    # build_accented_glyph('lacute', f['l'], f['acutecomb.cap']) <-- We are making this one by hand.

    #--------------------------------------------------------------------------

    for letter in 'ainou':
        build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb'])
    for letter in 'AINOU':
        build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb.cap'])
    for letter in 'AN':
        build_accented_glyph(letter + 'tilde.001', f[base(letter) + '.001'], f['tildecomb.cap'])

    #--------------------------------------------------------------------------

    for letter in 'aeouy':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308'])
    for letter in 'AEIOUY':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308.cap'])
    for letter in 'AE':
        build_accented_glyph(letter + 'dieresis.001', f[base(letter) + '.001'], f['uni0308.cap'])
    for letter in 'i':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308'])

    #--------------------------------------------------------------------------

    for letter in 'au':
        build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A'])
    for letter in 'AU':
        build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A.cap'])
    for letter in 'A':
        build_accented_glyph(letter + 'ring.001', f[base(letter) + '.001'], f['uni030A.cap'])

    #--------------------------------------------------------------------------

    for letter in 'acegijosuwy':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302'])
    for letter in 'g':
        build_accented_glyph(letter + 'circumflex.001', f[base(letter) + '.001'], f['uni0302'])
    for letter in 'hACEGHIJOSUWY':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.cap'])
    for letter in 'ACEG':
        build_accented_glyph(letter + 'circumflex.001', f[base(letter) + '.001'], f['uni0302.cap'])
    for letter in ['f_h', 'f_f_h']:
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.cap'])

    #--------------------------------------------------------------------------

    for letter in 'aegiou':
        build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306'])
    for letter in 'g':
        build_accented_glyph(letter + 'breve.001', f[base(letter) + '.001'], f['uni0306'])
    for letter in 'AEGIOU':
        build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306.cap'])
    for letter in 'AEG':
        build_accented_glyph(letter + 'breve.001', f[base(letter) + '.001'], f['uni0306.cap'])

    #--------------------------------------------------------------------------

    for letter in 'cegz':
        build_accented_glyph(letter + 'dotaccent', f[base(letter)], f['uni0307'])
    for letter in 'gz':
        build_accented_glyph(letter + 'dotaccent.001', f[base(letter) + '.001'], f['uni0307'])
    for letter in 'CEGIZ':
        build_accented_glyph(letter + 'dotaccent', f[base(letter)], f['uni0307.cap'])
    for letter in 'CEG':
        build_accented_glyph(letter + 'dotaccent.001', f[base(letter) + '.001'], f['uni0307.cap'])
    build_accented_glyph('i', f['dotlessi'], f['uni0307'])
    build_accented_glyph('iogonek', f['iogonek.dotless'], f['uni0307'])
    build_accented_glyph('j', f['uni0237'], f['uni0307'])

    #--------------------------------------------------------------------------

    for letter in 'cenrsz':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C'])
    for letter in 'z':
        build_accented_glyph(letter + 'caron.001', f[base(letter) + '.001'], f['uni030C'])
    for letter in 'CDENRTSZ':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C.cap'])
    for letter in 'CDENRT':
        build_accented_glyph(letter + 'caron.001', f[base(letter) + '.001'], f['uni030C.cap'])
    for letter in 'T':
        build_accented_glyph(letter + 'caron.002', f[base(letter) + '.002'], f['uni030C.cap'])
    for letter in 'dLlt':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni0315'])

    #--------------------------------------------------------------------------

    for letter in 'aeiou':
        build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304'])
    for letter in 'AEIOU':
        build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304.cap'])
    for letter in 'AE':
        build_accented_glyph(letter + 'macron.001', f[base(letter) + '.001'], f['uni0304.cap'])

    #--------------------------------------------------------------------------

    for letter in 'ou':
        build_accented_glyph(letter + 'hungarumlaut', f[base(letter)], f['uni030B'])
    for letter in 'OU':
        build_accented_glyph(letter + 'hungarumlaut', f[base(letter)], f['uni030B.cap'])

    #--------------------------------------------------------------------------

#    build_multigraph('quotedblleft', [f['quoteleft'], f['quoteleft']])
#    build_multigraph('quotedblright', [f['quoteright'], f['quoteright']])
#    build_multigraph('quotedblbase', [f['quotesinglbase'], f['quotesinglbase']])
#    build_multigraph('uni201F', [f['quotereversed'], f['quotereversed']])
#    build_multigraph('guillemotleft', [f['guilsinglleft'], f['guilsinglleft']])
#    build_multigraph('guillemotright', [f['guilsinglright'], f['guilsinglright']])
    build_multigraph('napostrophe', [f['quoteright'], f['n']])
    build_multigraph('IJ', [f['I'], f['J']])
    build_multigraph('ij', [f['i'], f['j']])
    build_multigraph('Ldot', [f['L'], f['periodcentered']])
    build_multigraph('ldot', [f['l'], f['periodcentered']])

    #--------------------------------------------------------------------------

    f.selection.all()
    spacing_by_anchors.space_selected_by_anchors(f)
    f.selection.none()

    rules = cap_spacing.cap_spacing(f, caps, 0.015)
    cpsp = open('LindenHill-Italic_cpsp.fea', 'w')
    print >> cpsp, 'feature cpsp {'
    print >> cpsp, rules,
    print >> cpsp, '} cpsp;'
    cpsp.close()

    generate_kerning_and_read_features(None, f)

    #--------------------------------------------------------------------------

    font_db.db_close(f)
def build_glyphs(bitbucket, f):

    import cap_spacing

    figures = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

    def base(letter):
        if letter == 'i':
            base = 'dotlessi'
        elif letter == 'j':
            base = 'uni0237'
        else:
            base = letter
        return base    

    db = font_db.db_create(f)

    db['spacing_anchor_heights'] = { 'hi2' : 670, # caps and ascenders,
                                     'hi' : 610,  # caps and ascenders,
                                     'x'  : 385,  # ex-height
                                     'o'  : 200,  # like the letter o
                                     'bl' : 10,   # baseline
                                     'lo' : -200, # descenders
                                     }

#    all_glyphs = set(f) - set(['.notdef'])
#    (smallcaps, capssmall, uppercase, lowercase, fraction_bar, numerators, denominators, remaining) = \
#        tuple(separate_strings(all_glyphs, [
#                (lambda s: s[-3:] == '.sc'),
#                (lambda s: s[-3:] == '.c2'),
#                (lambda s: is_uppercase(s, last_name)),
#                (lambda s: is_lowercase(s, last_name)),
#                (lambda s: s == 'fraction'),
#                (lambda s: s[-6:] == '.numer'),
#                (lambda s: s[-6:] == '.denom'),
#                ]))
#    db["kerning_sets"] = [
#        (remaining, uppercase | lowercase | smallcaps | capssmall | remaining),
#        (uppercase, uppercase | lowercase | smallcaps | remaining),
#        (smallcaps, uppercase | smallcaps | capssmall | remaining),
#        (lowercase, uppercase | lowercase | remaining),
#        (numerators, fraction_bar),
#        (fraction_bar, denominators),
#        ]
#    db['kerning_rounding'] = '(lambda x: int(round(x/5.0)) * 5)'
##    db['kerning_rounding'] = '(lambda x: x if abs(x) < 10 else int(round(x/5.0))*5)'

    build_several_space_glyphs(f, emsize = emsize, spacesize = spacesize,
                               thinspacesize = emsize / 6,
                               hairspacesize = emsize / 10,
#                               tabwidth = f['zero.l'].width)
                               tabwidth = 300) # <-- FIX: SET THIS CORRECTLY

    propagate_hyphens(f)
#    propagate_hyphens(f, '.uppercase')
    build_spacing_marks(f, width = 2 * 230)

#    for fig in figures:
#        make_glyph_reference(fig, f[fig + '.h'])

    make_glyph_reference('asciitilde', f['uni2053']) # Swung dash.
    make_glyph_reference('i.TRK', f['i'])
    make_glyph_reference('Dcroat', f['Eth'])
#    make_glyph_reference('dcroat.sc', f['eth.sc'])

    build_multigraph('ellipsis', [f['period'], f['period'], f['period']])

#    for fig in figures + ['dollar']:
#        make_glyph_reference(fig, f[fig + '.hanging'])
#
#    make_glyph_reference('uni00B9', f['one.sup'])
#    make_glyph_reference('uni00B2', f['two.sup'])
#    make_glyph_reference('uni00B3', f['three.sup'])
##    for extension in [('.numer', 244), ('.sub', -98), ('.sup', 293)]:
#    for extension in [('.sub', -98), ('.sup', 293)]:
#        for fig in figures:
#            make_glyph_reference(fig + extension[0],
#                                 f[fig + '.denom'],
#                                 transformation = (1, 0, 0, 1, 0, extension[1]),
#                                 copy_spacing_anchors = False)
#    build_multigraph('onequarter', [f['one.numer'], f['fraction'], f['four.denom']])
#    build_multigraph('onehalf', [f['one.numer'], f['fraction'], f['two.denom']])
#    build_multigraph('threequarters', [f['three.numer'], f['fraction'], f['four.denom']])

#    for g in f:
#        if g[-3:] == '.sc':
#            if g == 'periodcentered.sc':
#                make_glyph_reference(g[:-3] + '.c2', f[g])
#            elif g == 'uni0163.sc':
#                make_glyph_reference('uni0162.c2', f[g])
#            elif g == 'uni0219.sc':
#                make_glyph_reference('uni0218.c2', f[g])
#            elif g == 'uni021B.sc':
#                make_glyph_reference('uni021A.c2', f[g])
#            elif g in ('ae.sc', 'oe.sc'):
#                make_glyph_reference(g[:-3].upper() + '.c2', f[g])
#            else:
#                make_glyph_reference(g[:-3].capitalize() + '.c2', f[g])

    #--------------------------------------------------------------------------

    for letter in 'GKkLlNnRr':
        build_accented_glyph(letter + 'commaaccent', f[base(letter)], f['uni0326'])
    build_accented_glyph('uni0218', f['S'], f['uni0326'])
    build_accented_glyph('uni0219', f['s'], f['uni0326'])
    build_accented_glyph('uni021A', f['T'], f['uni0326'])
    build_accented_glyph('uni021B', f['t'], f['uni0326'])
    build_accented_glyph('gcommaaccent', f['g'], f['uni0312'])
    build_accented_glyph('gcommaaccent.ld', f['g.ld'], f['uni0312'])

#    for letter in 'gklnr':
#        build_accented_glyph(letter + 'commaaccent.sc', f[letter + '.sc'], f['uni0326'])
#    build_accented_glyph('uni0219.sc', f['s.sc'], f['uni0326'])
#    build_accented_glyph('uni021B.sc', f['t.sc'], f['uni0326'])

    #--------------------------------------------------------------------------

    for letter in 'CcSs':
        build_accented_glyph(letter + 'cedilla', f[base(letter)], f['uni0327'])
    build_accented_glyph('uni0162', f['T'], f['uni0327'])
    build_accented_glyph('uni0163', f['t'], f['uni0327'])

#    for letter in 'cs':
#        build_accented_glyph(letter + 'cedilla.sc', f[letter + '.sc'], f['uni0327'])
#    build_accented_glyph('uni0163.sc', f['t.sc'], f['uni0327'])

    #--------------------------------------------------------------------------

    for letter in 'aeiou':
        build_accented_glyph(letter + 'grave', f[base(letter)], f['gravecomb'])
    for letter in 'AEIOU':
        build_accented_glyph(letter + 'grave', f[base(letter)], f['gravecomb.cap'])
#    for letter in 'aeiou':
#        build_accented_glyph(letter + 'grave.sc', f[letter + '.sc'], f['gravecomb'])
#
    #--------------------------------------------------------------------------

    for letter in 'aceinorsuyz':
        build_accented_glyph(letter + 'acute', f[base(letter)], f['acutecomb'])
    for letter in 'ACEILNORSUYZ':
        build_accented_glyph(letter + 'acute', f[base(letter)], f['acutecomb.cap'])
    build_accented_glyph('lacute', f['l'], f['acutecomb.cap'])
    for letter in 'y':
        build_accented_glyph(letter + 'acute.ld', f[base(letter) + '.ld'], f['acutecomb'])
#    for letter in 'aceilnorsuyz':
#        build_accented_glyph(letter + 'acute.sc', f[letter + '.sc'], f['acutecomb'])

    #--------------------------------------------------------------------------

    for letter in 'ainou':
        build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb'])
    for letter in 'AINOU':
        build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb.cap'])
#    for letter in 'ainou':
#        build_accented_glyph(letter + 'tilde.sc', f[letter + '.sc'], f['tildecomb'])
#
#    #--------------------------------------------------------------------------
#
    for letter in 'aeouy':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308'])
    for letter in 'AEIOUY':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308.cap'])
    for letter in 'i':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308.narrow'])
    for letter in 'y':
        build_accented_glyph(letter + 'dieresis.ld', f[base(letter) + '.ld'], f['uni0308'])
#    for letter in 'aeiouy':
#        build_accented_glyph(letter + 'dieresis.sc', f[letter + '.sc'], f['uni0308'])

    #--------------------------------------------------------------------------

    for letter in 'au':
        build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A'])
    for letter in 'AU':
        build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A.cap'])
#    for letter in 'au':
#        build_accented_glyph(letter + 'ring.sc', f[letter + '.sc'], f['uni030A'])

    #--------------------------------------------------------------------------

    for letter in 'acegijosuwy':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302'])
    for letter in 'ACEGHIJOSUWY':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.cap'])
    for letter in 'h':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.ascend'])
    for letter in 'gjy':
        build_accented_glyph(letter + 'circumflex.ld', f[base(letter) + '.ld'], f['uni0302'])
#    for letter in ['f_h', 'f_f_h']:
#        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.cap'])
#    for letter in 'aceghijosuwy':
#        build_accented_glyph(letter + 'circumflex.sc', f[letter + '.sc'], f['uni0302'])

    #--------------------------------------------------------------------------

    for letter in 'aegiou':
        build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306'])
    for letter in 'AEGIOU':
        build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306.cap'])
#    for letter in 'aegiou':
#        build_accented_glyph(letter + 'breve.sc', f[letter + '.sc'], f['uni0306'])

    #--------------------------------------------------------------------------

    for letter in 'cegz':
        build_accented_glyph(letter + 'dotaccent', f[base(letter)], f['uni0307'])
    for letter in 'CEGIZ':
        build_accented_glyph(letter + 'dotaccent', f[base(letter)], f['uni0307.cap'])
    for letter in 'g':
        build_accented_glyph(letter + 'dotaccent.ld', f[base(letter) + '.ld'], f['uni0307'])
#    for letter in 'cegz':
#        build_accented_glyph(letter + 'dotaccent.sc', f[letter + '.sc'], f['uni0307'])
#    build_accented_glyph('i.TRK.sc', f['i.sc'], f['uni0307'])
    build_accented_glyph('i', f['dotlessi'], f['uni0307'])
    build_accented_glyph('iogonek', f['iogonek.dotless'], f['uni0307'])
    build_accented_glyph('j', f['uni0237'], f['uni0307'])
    build_accented_glyph('j.ld', f['uni0237.ld'], f['uni0307'])

    # Extra dot accents for Old Irish.
    build_accented_glyph('uni1E02', f['B'], f['uni0307.cap'])
    build_accented_glyph('uni1E03', f['b'], f['uni0307.cap'])
    build_accented_glyph('uni1E0A', f['D'], f['uni0307.cap'])
    build_accented_glyph('uni1E0B', f['d'], f['uni0307.cap'])
    build_accented_glyph('uni1E1E', f['F'], f['uni0307.cap'])
    build_accented_glyph('uni1E1F', f['f'], f['uni0307.cap'])
    build_accented_glyph('uni1E22', f['H'], f['uni0307.cap'])
    build_accented_glyph('uni1E23', f['h'], f['uni0307.cap'])
    build_accented_glyph('uni1E40', f['M'], f['uni0307.cap'])
    build_accented_glyph('uni1E41', f['m'], f['uni0307'])
    build_accented_glyph('uni1E56', f['P'], f['uni0307.cap'])
    build_accented_glyph('uni1E57', f['p'], f['uni0307'])
    build_accented_glyph('uni1E57.ld', f['p.ld'], f['uni0307'])
    build_accented_glyph('uni1E60', f['S'], f['uni0307.cap'])
    build_accented_glyph('uni1E61', f['s'], f['uni0307'])
    build_accented_glyph('uni1E6A', f['T'], f['uni0307.cap'])
    build_accented_glyph('uni1E6B', f['t'], f['uni0307'])

    #--------------------------------------------------------------------------

    for letter in 'cenrsz':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C'])
    for letter in 'CDENRTSZ':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C.cap'])
    for letter in 'dLlt':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni0315'])

#    for letter in 'cdenrstz':
#        build_accented_glyph(letter + 'caron.sc', f[letter + '.sc'], f['uni030C'])
#    build_accented_glyph('lcaron.sc', f['l.sc'], f['uni0315'])

    #--------------------------------------------------------------------------

    for letter in 'aeiou':
        build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304'])
    for letter in 'AEIOU':
        build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304.cap'])
#    for letter in 'aeiou':
#        build_accented_glyph(letter + 'macron.sc', f[letter + '.sc'], f['uni0304'])

    #--------------------------------------------------------------------------

    for letter in 'ou':
        build_accented_glyph(letter + 'hungarumlaut', f[base(letter)], f['uni030B'])
    for letter in 'OU':
        build_accented_glyph(letter + 'hungarumlaut', f[base(letter)], f['uni030B.cap'])
#    for letter in 'ou':
#        build_accented_glyph(letter + 'hungarumlaut.sc', f[letter + '.sc'], f['uni030B'])

    #--------------------------------------------------------------------------

    build_multigraph('napostrophe', [f['quoteright'], f['n']])
    build_multigraph('IJ', [f['I'], f['J']])
    build_multigraph('ij', [f['i'], f['j']])
##    build_multigraph('Ldot', [f['L'], f['periodcentered']]) # Done by hand.
#    build_multigraph('ldot', [f['l'], f['periodcentered']])
##    build_multigraph('ldot.sc', [f['l.sc'], f['periodcentered.sc']]) # Done by hand.

    #--------------------------------------------------------------------------

    f.selection.all()
    space_selected_by_anchors(f)
    f.selection.none()

    generate_kerning_and_read_features(None, f)

    #--------------------------------------------------------------------------

    font_db.db_close(f)
Example #4
0
def build_glyphs(bitbucket, f):

    import cap_spacing

    emsize = 2156
    spacesize = 448

    figures = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    lining_figures = [s + ".lining" for s in figures]

    caps = [
        "A",
        "Agrave",
        "Aacute",
        "Acircumflex",
        "Atilde",
        "Adieresis",
        "Aring",
        "Amacron",
        "Abreve",
        "Aogonek",
        "B",
        "C",
        "Ccedilla",
        "Cacute",
        "Ccircumflex",
        "Cdotaccent",
        "Ccaron",
        "D",
        "Dcaron",
        "Dcroat",
        "E",
        "Egrave",
        "Eacute",
        "Ecircumflex",
        "Edieresis",
        "Emacron",
        "Ebreve",
        "Edotaccent",
        "Eogonek",
        "Ecaron",
        "F",
        "G",
        "Gcircumflex",
        "Gbreve",
        "Gdotaccent",
        "Gcommaaccent",
        "H",
        "Hcircumflex",
        "Hbar",
        "I",
        "Igrave",
        "Iacute",
        "Icircumflex",
        "Idieresis",
        "Itilde",
        "Imacron",
        "Ibreve",
        "Iogonek",
        "J",
        "Jcircumflex",
        "K",
        "Kcommaaccent",
        "L",
        "Lacute",
        "Lcommaaccent",
        "Lcaron",
        "Ldot",
        "Lslash",
        "M",
        "N",
        "Ntilde",
        "Nacute",
        "Ncommaaccent",
        "Ncaron",
        "O",
        "Ograve",
        "Oacute",
        "Ocircumflex",
        "Otilde",
        "Odieresis",
        "Oslash",
        "Omacron",
        "Obreve",
        "Ohungarumlaut",
        "P",
        "Q",
        "R",
        "Racute",
        "Rcommaaccent",
        "Rcaron",
        "S",
        "Sacute",
        "Scircumflex",
        "Scedilla",
        "uni0218",
        "Scaron",
        "T",
        "uni0162",
        "uni021A",
        "Tcaron",
        "Tbar",
        "U",
        "Ugrave",
        "Uacute",
        "Ucircumflex",
        "Udieresis",
        "Utilde",
        "Umacron",
        "Ubreve",
        "Uring",
        "Uhungarumlaut",
        "Uogonek",
        "V",
        "W",
        "Wcircumflex",
        "X",
        "Y",
        "Yacute",
        "Ydieresis",
        "Ycircumflex",
        "Z",
        "Zacute",
        "Zdotaccent",
        "Zcaron",
        "IJ",
        "AE",
        "OE",
        "Eth",
        "Thorn",
        "question",
        "questiondown",
        "exclam",
        "exclamdown",
        "ampersand",
    ]

    def base(letter):
        if letter == "i":
            base = "dotlessi"
        elif letter == "j":
            base = "uni0237"
        else:
            base = letter
        return base

    db = font_db.db_create(f)

    db["spacing_anchor_heights"] = {
        "hi": 1400,  # caps and ascenders
        # 't'  : 1150, # top diacritics
        "x": 770,  # ex-height
        "o": 400,  # like the letter o
        "bl": 30,  # baseline
        "lo": -500,
    }  # descenders

    #    build_several_space_glyphs(f, emsize = emsize, spacesize = spacesize,
    #                               thinspacesize = emsize / 6,
    #                               hairspacesize = emsize / 10,
    #                               tabwidth = f['zero.lining'].width)
    propagate_hyphens(f)
    #    propagate_hyphens(f, '.uppercase')
    build_spacing_marks(f, width=1100)

    #    make_glyph_reference('quotesingle', f['minute'])
    #    make_glyph_reference('quotedbl', f['second'])
    #    make_glyph_reference('asciitilde', f['uni2053']) # Swung dash.
    make_glyph_reference("i.TRK", f["i"])
    #    make_glyph_reference('Dcroat', f['Eth'])
    #    make_glyph_reference('dcroat.sc', f['eth.sc'])

    build_multigraph("ellipsis", [f["period"], f["period"], f["period"]])

    #    make_glyph_reference('uni00B9', f['one.sup'])
    #    make_glyph_reference('uni00B2', f['two.sup'])
    #    make_glyph_reference('uni00B3', f['three.sup'])
    #    build_multigraph('onequarter', [f['one.numer'], f['fraction'], f['four.denom']])
    #    build_multigraph('onehalf', [f['one.numer'], f['fraction'], f['two.denom']])
    #    build_multigraph('threequarters', [f['three.numer'], f['fraction'], f['four.denom']])

    # --------------------------------------------------------------------------

    """
    for letter in 'GKkLlNnRr':
                build_accented_glyph(letter + 'commaaccent', f[base(letter)], f['uni0326'])
    build_accented_glyph('gcommaaccent', f['g'], f['uni0312'])
    build_accented_glyph('uni0218', f['S'], f['uni0326'])
    build_accented_glyph('uni0219', f['s'], f['uni0326'])
    build_accented_glyph('uni021A', f['T'], f['uni0326'])
    build_accented_glyph('uni021B', f['t'], f['uni0326'])

    for letter in 'gklnr':
        build_accented_glyph(letter + 'commaaccent.sc', f[letter + '.sc'], f['uni0326'])
    build_accented_glyph('uni0219.sc', f['s.sc'], f['uni0326'])
    build_accented_glyph('uni021B.sc', f['t.sc'], f['uni0326'])
    """

    # --------------------------------------------------------------------------

    """
    for letter in 'CcSs':
        build_accented_glyph(letter + 'cedilla', f[base(letter)], f['uni0327'])
    build_accented_glyph('uni0162', f['T'], f['uni0327'])
    build_accented_glyph('uni0163', f['t'], f['uni0327'])

    for letter in 'cs':
        build_accented_glyph(letter + 'cedilla.sc', f[letter + '.sc'], f['uni0327'])
    build_accented_glyph('uni0163.sc', f['t.sc'], f['uni0327'])
    """

    # --------------------------------------------------------------------------

    for letter in "aeiou":
        build_accented_glyph(letter + "grave", f[base(letter)], f["gravecomb"])
    for letter in "AEIOU":
        build_accented_glyph(letter + "grave", f[base(letter)], f["gravecomb"])
    #    for letter in 'aeiou':
    #        build_accented_glyph(letter + 'grave.sc', f[letter + '.sc'], f['gravecomb'])

    # --------------------------------------------------------------------------

    for letter in "aceinorsuyz":
        build_accented_glyph(letter + "acute", f[base(letter)], f["acutecomb"])
    for letter in "ACEILNORSUYZ":
        build_accented_glyph(letter + "acute", f[base(letter)], f["acutecomb"])
    build_accented_glyph("lacute", f["l"], f["acutecomb"])
    #    for letter in 'aceilnorsuyz':
    #        build_accented_glyph(letter + 'acute.sc', f[letter + '.sc'], f['acutecomb'])

    # --------------------------------------------------------------------------

    """
    for letter in 'ainou':
        build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb'])
    for letter in 'AINOU':
        build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb.cap'])
    for letter in 'ainou':
        build_accented_glyph(letter + 'tilde.sc', f[letter + '.sc'], f['tildecomb'])
    """

    # --------------------------------------------------------------------------

    """
    for letter in 'aeouy':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308'])
    for letter in 'AEIOUY':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308.cap'])
    for letter in 'aeiouy':
        build_accented_glyph(letter + 'dieresis.sc', f[letter + '.sc'], f['uni0308'])
    for letter in 'i':
        build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308.narrow'])
    """

    # --------------------------------------------------------------------------

    """
    for letter in 'au':
        build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A'])
    for letter in 'AU':
        build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A.cap'])
    for letter in 'au':
        build_accented_glyph(letter + 'ring.sc', f[letter + '.sc'], f['uni030A'])
    """

    # --------------------------------------------------------------------------

    """
    for letter in 'acegijosuwy':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302'])
    for letter in 'hACEGHIJOSUWY':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.cap'])
    for letter in ['f_h', 'f_f_h']:
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302.cap'])
    for letter in 'aceghijosuwy':
        build_accented_glyph(letter + 'circumflex.sc', f[letter + '.sc'], f['uni0302'])
    """

    # --------------------------------------------------------------------------

    """
    for letter in 'aegiou':
        build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306'])
    for letter in 'AEGIOU':
        build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306.cap'])
    for letter in 'aegiou':
        build_accented_glyph(letter + 'breve.sc', f[letter + '.sc'], f['uni0306'])
    """

    # --------------------------------------------------------------------------

    for letter in "cegz":
        build_accented_glyph(letter + "dotaccent", f[base(letter)], f["uni0307"])
    for letter in "CEGIZ":
        build_accented_glyph(letter + "dotaccent", f[base(letter)], f["uni0307"])
    #    for letter in 'cegz':
    #        build_accented_glyph(letter + 'dotaccent.sc', f[letter + '.sc'], f['uni0307'])
    #    build_accented_glyph('i.TRK.sc', f['i.sc'], f['uni0307'])
    build_accented_glyph("i", f["dotlessi"], f["uni0307"])
    build_accented_glyph("j", f["uni0237"], f["uni0307"])

    # --------------------------------------------------------------------------

    """
    for letter in 'cenrsz':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C'])
    for letter in 'CDENRTSZ':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C.cap'])
    for letter in 'dLlt':
        build_accented_glyph(letter + 'caron', f[base(letter)], f['uni0315'])

    for letter in 'cdenrstz':
        build_accented_glyph(letter + 'caron.sc', f[letter + '.sc'], f['uni030C'])
    build_accented_glyph('lcaron.sc', f['l.sc'], f['uni0315'])
    """

    # --------------------------------------------------------------------------

    """
    for letter in 'aeiou':
        build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304'])
    for letter in 'AEIOU':
        build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304.cap'])
    for letter in 'aeiou':
        build_accented_glyph(letter + 'macron.sc', f[letter + '.sc'], f['uni0304'])
    """

    # --------------------------------------------------------------------------

    for letter in "ou":
        build_accented_glyph(letter + "hungarumlaut", f[base(letter)], f["uni030B"])
    for letter in "OU":
        build_accented_glyph(letter + "hungarumlaut", f[base(letter)], f["uni030B"])
    #    for letter in 'ou':
    #        build_accented_glyph(letter + 'hungarumlaut.sc', f[letter + '.sc'], f['uni030B'])

    # --------------------------------------------------------------------------

    #    build_multigraph('quotedblleft', [f['quoteleft'], f['quoteleft']])
    #    build_multigraph('quotedblright', [f['quoteright'], f['quoteright']])
    #    build_multigraph('quotedblbase', [f['quotesinglbase'], f['quotesinglbase']])
    #    build_multigraph('uni201F', [f['quotereversed'], f['quotereversed']])
    #    build_multigraph('guillemotleft', [f['guilsinglleft'], f['guilsinglleft']])
    #    build_multigraph('guillemotright', [f['guilsinglright'], f['guilsinglright']])
    build_multigraph("napostrophe", [f["quoteright"], f["n"]])
    build_multigraph("IJ", [f["I"], f["J"]])
    build_multigraph("ij", [f["i"], f["j"]])
    #    build_multigraph('Ldot', [f['L'], f['periodcentered']])
    #    build_multigraph('ldot', [f['l'], f['periodcentered']])
    #    build_multigraph('ldot.sc', [f['l.sc'], f['periodcentered.sc']])

    # --------------------------------------------------------------------------

    """
    f.selection.all()
    spacing_by_anchors.space_selected_by_anchors(f)
    f.selection.none()

    rules = cap_spacing.cap_spacing(f, caps, 0.015)
    cpsp = open('SlabMediaeval_cpsp.fea', 'w')
    print >> cpsp, 'feature cpsp {'
    print >> cpsp, rules,
    print >> cpsp, '} cpsp;'
    cpsp.close()
    """

    # generate_kerning_and_read_features(None, f)

    # --------------------------------------------------------------------------

    font_db.db_close(f)
def build_glyphs(bitbucket, f):

    import cap_spacing

    figures = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    lining_figures = [s + ".lining" for s in figures]

    caps = [
        "A",
        "Agrave",
        "Aacute",
        "Acircumflex",
        "Atilde",
        "Adieresis",
        "Aring",
        "Amacron",
        "Abreve",
        "Aogonek",
        "B",
        "C",
        "Ccedilla",
        "Cacute",
        "Ccircumflex",
        "Cdotaccent",
        "Ccaron",
        "D",
        "Dcaron",
        "Dcroat",
        "E",
        "Egrave",
        "Eacute",
        "Ecircumflex",
        "Edieresis",
        "Emacron",
        "Ebreve",
        "Edotaccent",
        "Eogonek",
        "Ecaron",
        "F",
        "G",
        "Gcircumflex",
        "Gbreve",
        "Gdotaccent",
        "Gcommaaccent",
        "H",
        "Hcircumflex",
        "Hbar",
        "I",
        "Igrave",
        "Iacute",
        "Icircumflex",
        "Idieresis",
        "Itilde",
        "Imacron",
        "Ibreve",
        "Iogonek",
        "J",
        "Jcircumflex",
        "K",
        "Kcommaaccent",
        "L",
        "Lacute",
        "Lcommaaccent",
        "Lcaron",
        "Ldot",
        "Lslash",
        "M",
        "N",
        "Ntilde",
        "Nacute",
        "Ncommaaccent",
        "Ncaron",
        "O",
        "Ograve",
        "Oacute",
        "Ocircumflex",
        "Otilde",
        "Odieresis",
        "Oslash",
        "Omacron",
        "Obreve",
        "Ohungarumlaut",
        "P",
        "Q",
        "R",
        "Racute",
        "Rcommaaccent",
        "Rcaron",
        "S",
        "Sacute",
        "Scircumflex",
        "Scedilla",
        "uni0218",
        "Scaron",
        "T",
        "uni0162",
        "uni021A",
        "Tcaron",
        "Tbar",
        "U",
        "Ugrave",
        "Uacute",
        "Ucircumflex",
        "Udieresis",
        "Utilde",
        "Umacron",
        "Ubreve",
        "Uring",
        "Uhungarumlaut",
        "Uogonek",
        "V",
        "W",
        "Wcircumflex",
        "X",
        "Y",
        "Yacute",
        "Ydieresis",
        "Ycircumflex",
        "Z",
        "Zacute",
        "Zdotaccent",
        "Zcaron",
        "IJ",
        "AE",
        "OE",
        "Eth",
        "Thorn",
        "question",
        "questiondown",
        "exclam",
        "exclamdown",
        "ampersand",
    ]

    def base(letter):
        if letter == "i":
            base = "dotlessi"
        elif letter == "j":
            base = "uni0237"
        else:
            base = letter
        return base

    db = font_db.db_create(f)

    db["spacing_anchor_heights"] = {
        "hi": 684,  # caps and ascenders
        #                                    't'  : ???, # top diacritics
        "x": 376,  # ex-height
        "o": 195,  # like the letter o
        "bl": 15,  # baseline
        "lo": -244,
    }  # descenders

    build_several_space_glyphs(
        f, emsize=1000, spacesize=185, thinspacesize=1000 / 6, hairspacesize=1000 / 10, tabwidth=f["zero.lining"].width
    )
    propagate_hyphens(f)
    #    propagate_hyphens(f, '.uppercase')
    build_spacing_marks(f, width=2 * 195)

    make_glyph_reference("quotesingle", f["minute"])
    make_glyph_reference("quotedbl", f["second"])
    make_glyph_reference("asciitilde", f["uni2053"])  # Swung dash.
    make_glyph_reference("i.TRK", f["i"])
    #    make_glyph_reference('Dcroat', f['Eth'])

    build_multigraph("ellipsis", [f["period"], f["period"], f["period"]])

    for fig in figures + ["dollar"]:
        make_glyph_reference(fig, f[fig + ".hanging"])

    make_glyph_reference("uni00B9", f["one.sup"])
    make_glyph_reference("uni00B2", f["two.sup"])
    make_glyph_reference("uni00B3", f["three.sup"])
    for extension in [(".numer", 244), (".sub", -98), (".sup", 293)]:
        for fig in figures:
            make_glyph_reference(
                fig + extension[0],
                f[fig + ".denom"],
                transformation=(1, 0, 0, 1, 0, extension[1]),
                copy_spacing_anchors=False,
            )
    build_multigraph("onequarter", [f["one.numer"], f["fraction"], f["four.denom"]])
    build_multigraph("onehalf", [f["one.numer"], f["fraction"], f["two.denom"]])
    build_multigraph("threequarters", [f["three.numer"], f["fraction"], f["four.denom"]])

    # --------------------------------------------------------------------------

    for letter in "GKkLlNnRr":
        build_accented_glyph(letter + "commaaccent", f[base(letter)], f["uni0326"])
    build_accented_glyph("gcommaaccent", f["g"], f["uni0312"])
    build_accented_glyph("uni0218", f["S"], f["uni0326"])
    build_accented_glyph("uni0219", f["s"], f["uni0326"])
    build_accented_glyph("uni021A", f["T"], f["uni0326"])
    build_accented_glyph("uni021B", f["t"], f["uni0326"])

    # --------------------------------------------------------------------------

    for letter in "CcSs":
        build_accented_glyph(letter + "cedilla", f[base(letter)], f["uni0327"])
    build_accented_glyph("uni0162", f["T"], f["uni0327"])
    build_accented_glyph("uni0163", f["t"], f["uni0327"])

    # --------------------------------------------------------------------------

    for letter in "aeiou":
        build_accented_glyph(letter + "grave", f[base(letter)], f["gravecomb"])
    for letter in "AEIOU":
        build_accented_glyph(letter + "grave", f[base(letter)], f["gravecomb.cap"])

    # --------------------------------------------------------------------------

    for letter in "aceinorsuyz":
        build_accented_glyph(letter + "acute", f[base(letter)], f["acutecomb"])
    for letter in "ACEILNORSUYZ":
        build_accented_glyph(letter + "acute", f[base(letter)], f["acutecomb.cap"])
    # build_accented_glyph('lacute', f['l'], f['acutecomb.cap']) <-- We are making this one by hand.

    # --------------------------------------------------------------------------

    for letter in "ainou":
        build_accented_glyph(letter + "tilde", f[base(letter)], f["tildecomb"])
    for letter in "AINOU":
        build_accented_glyph(letter + "tilde", f[base(letter)], f["tildecomb.cap"])

    # --------------------------------------------------------------------------

    for letter in "aeouy":
        build_accented_glyph(letter + "dieresis", f[base(letter)], f["uni0308"])
    for letter in "AEIOUY":
        build_accented_glyph(letter + "dieresis", f[base(letter)], f["uni0308.cap"])
    for letter in "i":
        build_accented_glyph(letter + "dieresis", f[base(letter)], f["uni0308.narrow"])

    # --------------------------------------------------------------------------

    for letter in "au":
        build_accented_glyph(letter + "ring", f[base(letter)], f["uni030A"])
    for letter in "AU":
        build_accented_glyph(letter + "ring", f[base(letter)], f["uni030A.cap"])

    # --------------------------------------------------------------------------

    for letter in "acegijosuwy":
        build_accented_glyph(letter + "circumflex", f[base(letter)], f["uni0302"])
    for letter in "hACEGHIJOSUWY":
        build_accented_glyph(letter + "circumflex", f[base(letter)], f["uni0302.cap"])
    for letter in ["f_h", "f_f_h"]:
        build_accented_glyph(letter + "circumflex", f[base(letter)], f["uni0302.cap"])

    # --------------------------------------------------------------------------

    for letter in "aegiou":
        build_accented_glyph(letter + "breve", f[base(letter)], f["uni0306"])
    for letter in "AEGIOU":
        build_accented_glyph(letter + "breve", f[base(letter)], f["uni0306.cap"])

    # --------------------------------------------------------------------------

    for letter in "cegz":
        build_accented_glyph(letter + "dotaccent", f[base(letter)], f["uni0307"])
    for letter in "CEGIZ":
        build_accented_glyph(letter + "dotaccent", f[base(letter)], f["uni0307.cap"])
    build_accented_glyph("i", f["dotlessi"], f["uni0307"])
    build_accented_glyph("j", f["uni0237"], f["uni0307"])

    # --------------------------------------------------------------------------

    for letter in "cenrsz":
        build_accented_glyph(letter + "caron", f[base(letter)], f["uni030C"])
    for letter in "CDENRTSZ":
        build_accented_glyph(letter + "caron", f[base(letter)], f["uni030C.cap"])
    for letter in "dLlt":
        build_accented_glyph(letter + "caron", f[base(letter)], f["uni0315"])

    # --------------------------------------------------------------------------

    for letter in "aeiou":
        build_accented_glyph(letter + "macron", f[base(letter)], f["uni0304"])
    for letter in "AEIOU":
        build_accented_glyph(letter + "macron", f[base(letter)], f["uni0304.cap"])

    # --------------------------------------------------------------------------

    for letter in "ou":
        build_accented_glyph(letter + "hungarumlaut", f[base(letter)], f["uni030B"])
    for letter in "OU":
        build_accented_glyph(letter + "hungarumlaut", f[base(letter)], f["uni030B.cap"])

    # --------------------------------------------------------------------------

    build_multigraph("quotedblleft", [f["quoteleft"], f["quoteleft"]])
    build_multigraph("quotedblright", [f["quoteright"], f["quoteright"]])
    build_multigraph("quotedblbase", [f["quotesinglbase"], f["quotesinglbase"]])
    build_multigraph("uni201F", [f["quotereversed"], f["quotereversed"]])
    build_multigraph("guillemotleft", [f["guilsinglleft"], f["guilsinglleft"]])
    build_multigraph("guillemotright", [f["guilsinglright"], f["guilsinglright"]])
    build_multigraph("napostrophe", [f["quoteright"], f["n"]])
    build_multigraph("IJ", [f["I"], f["J"]])
    build_multigraph("ij", [f["i"], f["j"]])
    build_multigraph("Ldot", [f["L"], f["periodcentered"]])
    build_multigraph("ldot", [f["l"], f["periodcentered"]])

    # --------------------------------------------------------------------------

    f.selection.all()
    spacing_by_anchors.space_selected_by_anchors(f)
    f.selection.none()

    rules = cap_spacing.cap_spacing(f, caps, 0.015)
    cpsp = open("LindenHill-Bold_cpsp.fea", "w")
    print >> cpsp, "feature cpsp {"
    print >> cpsp, rules,
    print >> cpsp, "} cpsp;"
    cpsp.close()

    generate_kerning_and_read_features(None, f)

    # --------------------------------------------------------------------------

    font_db.db_close(f)
def build_glyphs(bitbucket, f):

    import cap_spacing

    figures = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    lining_figures = [s + '.lining' for s in figures]

    caps = [
        'A', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'Amacron', 'Abreve', 'Aogonek',
        'B',
        'C', 'Ccedilla', 'Cacute', 'Ccircumflex', 'Cdotaccent', 'Ccaron',
        'D', 'Dcaron', 'Dcroat',
        'E', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Emacron', 'Ebreve', 'Edotaccent', 'Eogonek', 'Ecaron',
        'F',
        'G', 'Gcircumflex', 'Gbreve', 'Gdotaccent', 'Gcommaaccent',
        'G.001', 'Gcircumflex.001', 'Gbreve.001', 'Gdotaccent.001', 'Gcommaaccent.001',
        'H', 'Hcircumflex', 'Hbar',
        'I', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Itilde', 'Imacron', 'Ibreve', 'Iogonek',
        'J', 'Jcircumflex',
        'J.001', 'Jcircumflex.001',
        'K', 'Kcommaaccent',
        'L', 'Lacute', 'Lcommaaccent', 'Lcaron', 'Ldot', 'Lslash',
        'M',
        'N', 'Ntilde', 'Nacute', 'Ncommaaccent', 'Ncaron',
        'O', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'Oslash', 'Omacron', 'Obreve', 'Ohungarumlaut',
        'P',
        'Q',
        'R', 'Racute', 'Rcommaaccent', 'Rcaron',
        'S', 'Sacute', 'Scircumflex', 'Scedilla', 'uni0218', 'Scaron',
        'T', 'uni0162', 'uni021A', 'Tcaron', 'Tbar',
        'T.001', 'uni0162.001', 'uni021A.001', 'Tcaron.001', 'Tbar.001',
        'U', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Utilde', 'Umacron', 'Ubreve', 'Uring', 'Uhungarumlaut', 'Uogonek',
        'V',
        'W', 'Wcircumflex',
        'X',
        'Y', 'Yacute', 'Ydieresis', 'Ycircumflex',
        'Y.001', 'Yacute.001', 'Ydieresis.001', 'Ycircumflex.001',
        'Z', 'Zacute', 'Zdotaccent', 'Zcaron',
        'IJ', 'AE', 'OE', 'Eth', 'Thorn',
        'question', 'questiondown',
        'exclam', 'exclamdown',
        'ampersand'
        ]

    def base(letter):
        if letter == 'i':
            base = 'dotlessi'
        elif letter == 'j':
            base = 'uni0237'
        else:
            base = letter
        return base    

    db = font_db.db_create(f)

    db['spacing_anchor_heights'] = { 'hi' : 732, # caps and ascenders
                                     't'  : 562, # top diacritics
                                     'x'  : 415,  # ex-height
                                     'o'  : 220,  # like the letter o
                                     'bl' : 20,   # baseline
                                     'lo' : -205 } # descenders

    build_several_space_glyphs(f, emsize = 1000, spacesize = 213,
                               thinspacesize = 1000 / 6,
                               hairspacesize = 1000 / 10,
                               tabwidth = f['zero.lining'].width)
    propagate_hyphens(f)
    propagate_hyphens(f, '.uppercase')
    build_spacing_marks(f, width = 439)

    make_glyph_reference('quotesingle', f['quoteright'])
    make_glyph_reference('quotedbl', f['quotedblright'])
    make_glyph_reference('i.TRK', f['i'])
    make_glyph_reference('Dcroat', f['Eth'])

    make_glyph_reference('florin', f['f']) # I'm not sure whether this
                                           # is a good idea.

    make_glyph_reference('uni00B9', f['one.lining.sup'])
    make_glyph_reference('uni00B2', f['two.lining.sup'])
    make_glyph_reference('uni00B3', f['three.lining.sup'])
    for g in f:
        if g[-4:] == '.sup':
            make_glyph_reference(g[:-4] + '.sub', f[g], (1, 0, 0, 1, 0, -707))
    for g in lining_figures + ['comma', 'period']:
        make_glyph_reference(g + '.numer', f[g + '.sup'], (1, 0, 0, 1, 0, -177))
    for g in lining_figures + ['comma', 'period']:
        make_glyph_reference(g + '.denom', f[g + '.sup'], (1, 0, 0, 1, 0, -386))
    build_multigraph('onequarter', [f['one.lining.numer'], f['fraction'], f['four.lining.denom']])
    build_multigraph('onehalf', [f['one.lining.numer'], f['fraction'], f['two.lining.denom']])
    build_multigraph('threequarters', [f['three.lining.numer'], f['fraction'], f['four.lining.denom']])

    #--------------------------------------------------------------------------

    for letter in 'GKkLlNnRr':
                build_accented_glyph(letter + 'commaaccent', f[base(letter)], f['uni0326'])
    build_accented_glyph('Gcommaaccent.001', f['G.001'], f['uni0326'])
    build_accented_glyph('gcommaaccent', f['g'], f['uni0312'])
    build_accented_glyph('uni0218', f['S'], f['uni0326'])
    build_accented_glyph('uni0219', f['s'], f['uni0326'])
    build_accented_glyph('uni021A', f['T'], f['uni0326'])
    build_accented_glyph('uni021A.001', f['T.001'], f['uni0326'])
    build_accented_glyph('uni021B', f['t'], f['uni0326'])

    #--------------------------------------------------------------------------

    for letter in 'CcSs':
                build_accented_glyph(letter + 'cedilla', f[base(letter)], f['uni0327'])
    build_accented_glyph('uni0162', f['T'], f['uni0327'])
    build_accented_glyph('uni0162.001', f['T.001'], f['uni0327'])
    build_accented_glyph('uni0163', f['t'], f['uni0327'])

    #--------------------------------------------------------------------------

    for letter in 'AaEeIiOoUu':
                build_accented_glyph(letter + 'grave', f[base(letter)], f['gravecomb'])

    #--------------------------------------------------------------------------

    for letter in 'AaCcEeIiLlNnOoRrSsUuYyZz':
                build_accented_glyph(letter + 'acute', f[base(letter)], f['acutecomb'])
    build_accented_glyph('Yacute.001', f['Y.001'], f['acutecomb'])

    #--------------------------------------------------------------------------

    for letter in 'AaIiNnOoUu':
                build_accented_glyph(letter + 'tilde', f[base(letter)], f['tildecomb'])

    #--------------------------------------------------------------------------

    for letter in 'AaEeIiOoUuYy':
                build_accented_glyph(letter + 'dieresis', f[base(letter)], f['uni0308'])
    build_accented_glyph('Ydieresis.001', f['Y.001'], f['uni0308'])

    #--------------------------------------------------------------------------

    for letter in 'AaUu':
                build_accented_glyph(letter + 'ring', f[base(letter)], f['uni030A'])

    #--------------------------------------------------------------------------

    for letter in 'AaCcEeGgHhIiJjOoSsUuWwYy':
        build_accented_glyph(letter + 'circumflex', f[base(letter)], f['uni0302'])
    build_accented_glyph('Gcircumflex.001', f['G.001'], f['uni0302'])
    build_accented_glyph('Jcircumflex.001', f['J.001'], f['uni0302'])
    build_accented_glyph('Ycircumflex.001', f['Y.001'], f['uni0302'])

    #--------------------------------------------------------------------------

    for letter in 'AaEeGgIiOoUu':
                build_accented_glyph(letter + 'breve', f[base(letter)], f['uni0306'])
    build_accented_glyph('Gbreve.001', f['G.001'], f['uni0306'])

    #--------------------------------------------------------------------------

    for letter in 'CcEeGgIZz':
                build_accented_glyph(letter + 'dotaccent', f[base(letter)], f['uni0307'])
    build_accented_glyph('Gdotaccent.001', f['G.001'], f['uni0307'])

    #--------------------------------------------------------------------------

    for letter in 'CcDEeNnRrTSsZz':
                build_accented_glyph(letter + 'caron', f[base(letter)], f['uni030C'])
    build_accented_glyph('Tcaron.001', f['T.001'], f['uni030C'])
    for letter in 'dLlt':
                build_accented_glyph(letter + 'caron', f[base(letter)], f['uni0315'])

    #--------------------------------------------------------------------------

    for letter in 'AaEeIiOoUu':
                build_accented_glyph(letter + 'macron', f[base(letter)], f['uni0304'])

    #--------------------------------------------------------------------------

    for letter in 'OoUu':
                build_accented_glyph(letter + 'hungarumlaut', f[base(letter)], f['uni030B'])

    #--------------------------------------------------------------------------

    build_multigraph('ellipsis', [f['period'], f['period'], f['period']])
    build_multigraph('napostrophe', [f['quoteright'], f['n']])
    build_multigraph('IJ', [f['I'], f['J']])
    build_multigraph('ij', [f['i'], f['j']])
    build_multigraph('Ldot', [f['L'], f['periodcentered']])
    build_multigraph('ldot', [f['l'], f['periodcentered']])

    #--------------------------------------------------------------------------

    f.selection.all()
    spacing_by_anchors.space_selected_by_anchors(f)
    f.selection.none()

    generate_kerning_and_read_features(None, f)

    #--------------------------------------------------------------------------

    font_db.db_close(f)