#!/usr/bin/env python3
# coding=utf8
#
# Usually called via
# $ fontforge query_names fontfile.tff 2>/dev/null

import sys
import os.path
import fontforge

###### Some helpers

def get_sfnt_dict(font):
    """Extract SFNT table as nice dict"""
    return { k: v for l, k, v in font.sfnt_names }

def format_names(header, *stuff):
    """Unify outputs (with header)"""
    f = '| {:50.50}|{:>2.2}| {:64.64}|{:>2.2}| {:64.64}|{:>2.2}| {:55.55}|{:>2.2}| {:30.30}|{:>2.2}| {:40.40}|{:>2.2}| {:40.40}|{:>2.2}|'
    if header:
        d = ''
        return f.format(*stuff) + '\n' + f.format(d, d, d, d, d, d, d, d, d, d, d, d, d, d).replace(' ', '-')
    return f.format(*stuff).rstrip()

###### Let's go!

if len(sys.argv) < 2:
    print('Usage: {} font_name [font_name ...]\n'.format(sys.argv[0]))
    sys.exit(1)

print('Examining {} font files'.format(len(sys.argv) - 1))

print(format_names(True, 'Filename', '', 'PS Name', '', 'Fullname', '', 'Family', '', 'Subfamily', '', 'Typogr. Family', '', 'Typogr. Subfamily', ''))

for filename in sys.argv[1:]:
    fullfile = os.path.basename(filename)
    fname = os.path.splitext(fullfile)[0]

    font = fontforge.open(filename, 1)
    sfnt = get_sfnt_dict(font)
    psname = font.fontname
    font.close()

    sfnt_full =    sfnt['Fullname']
    sfnt_fam =     sfnt['Family']
    sfnt_subfam =  sfnt['SubFamily']
    sfnt_pfam =    sfnt['Preferred Family'] if 'Preferred Family' in sfnt else ''
    sfnt_psubfam = sfnt['Preferred Styles'] if 'Preferred Styles' in sfnt else ''

    o2 = format_names(False,
            fullfile, str(len(fullfile)),
            psname, str(len(psname)),
            sfnt_full, str(len(sfnt_full)),
            sfnt_fam, str(len(sfnt_fam)),
            sfnt_subfam, str(len(sfnt_subfam)),
            # show length zero if a zero length string is stored, show nothing if nothing is stored:
            sfnt_pfam, str(len(sfnt_pfam)) if 'Preferred Family' in sfnt else '',
            sfnt_psubfam, str(len(sfnt_psubfam)) if 'Preferred Family' in sfnt else '')

    print(o2)
