"""Miscellaneous helpers for our test suite."""

import os
from fontTools.ufoLib.utils import numberTypes


def getDemoFontPath():
    """Return the path to Data/DemoFont.ufo/."""
    testdata = os.path.join(os.path.dirname(__file__), "testdata")
    return os.path.join(testdata, "DemoFont.ufo")


def getDemoFontGlyphSetPath():
    """Return the path to Data/DemoFont.ufo/glyphs/."""
    return os.path.join(getDemoFontPath(), "glyphs")


# GLIF test tools


class Glyph:
    def __init__(self):
        self.name = None
        self.width = None
        self.height = None
        self.unicodes = None
        self.note = None
        self.lib = None
        self.image = None
        self.guidelines = None
        self.anchors = None
        self.outline = []

    def _writePointPenCommand(self, command, args, kwargs):
        args = _listToString(args)
        kwargs = _dictToString(kwargs)
        if args and kwargs:
            return f"pointPen.{command}(*{args}, **{kwargs})"
        elif len(args):
            return f"pointPen.{command}(*{args})"
        elif len(kwargs):
            return f"pointPen.{command}(**{kwargs})"
        else:
            return "pointPen.%s()" % command

    def beginPath(self, **kwargs):
        self.outline.append(self._writePointPenCommand("beginPath", [], kwargs))

    def endPath(self):
        self.outline.append(self._writePointPenCommand("endPath", [], {}))

    def addPoint(self, *args, **kwargs):
        self.outline.append(self._writePointPenCommand("addPoint", args, kwargs))

    def addComponent(self, *args, **kwargs):
        self.outline.append(self._writePointPenCommand("addComponent", args, kwargs))

    def drawPoints(self, pointPen):
        if self.outline:
            py = "\n".join(self.outline)
            exec(py, {"pointPen": pointPen})

    def py(self):
        text = []
        if self.name is not None:
            text.append('glyph.name = "%s"' % self.name)
        if self.width:
            text.append("glyph.width = %r" % self.width)
        if self.height:
            text.append("glyph.height = %r" % self.height)
        if self.unicodes is not None:
            text.append(
                "glyph.unicodes = [%s]" % ", ".join([str(i) for i in self.unicodes])
            )
        if self.note is not None:
            text.append('glyph.note = "%s"' % self.note)
        if self.lib is not None:
            text.append("glyph.lib = %s" % _dictToString(self.lib))
        if self.image is not None:
            text.append("glyph.image = %s" % _dictToString(self.image))
        if self.guidelines is not None:
            text.append("glyph.guidelines = %s" % _listToString(self.guidelines))
        if self.anchors is not None:
            text.append("glyph.anchors = %s" % _listToString(self.anchors))
        if self.outline:
            text += self.outline
        return "\n".join(text)


def _dictToString(d):
    text = []
    for key, value in sorted(d.items()):
        if value is None:
            continue
        key = '"%s"' % key
        if isinstance(value, dict):
            value = _dictToString(value)
        elif isinstance(value, list):
            value = _listToString(value)
        elif isinstance(value, tuple):
            value = _tupleToString(value)
        elif isinstance(value, numberTypes):
            value = repr(value)
        elif isinstance(value, str):
            value = '"%s"' % value
        text.append(f"{key} : {value}")
    if not text:
        return ""
    return "{%s}" % ", ".join(text)


def _listToString(l):
    text = []
    for value in l:
        if isinstance(value, dict):
            value = _dictToString(value)
        elif isinstance(value, list):
            value = _listToString(value)
        elif isinstance(value, tuple):
            value = _tupleToString(value)
        elif isinstance(value, numberTypes):
            value = repr(value)
        elif isinstance(value, str):
            value = '"%s"' % value
        text.append(value)
    if not text:
        return ""
    return "[%s]" % ", ".join(text)


def _tupleToString(t):
    text = []
    for value in t:
        if isinstance(value, dict):
            value = _dictToString(value)
        elif isinstance(value, list):
            value = _listToString(value)
        elif isinstance(value, tuple):
            value = _tupleToString(value)
        elif isinstance(value, numberTypes):
            value = repr(value)
        elif isinstance(value, str):
            value = '"%s"' % value
        text.append(value)
    if not text:
        return ""
    return "(%s)" % ", ".join(text)


def stripText(text):
    new = []
    for line in text.strip().splitlines():
        line = line.strip()
        if not line:
            continue
        new.append(line)
    return "\n".join(new)


# font info values used by several tests

fontInfoVersion1 = {
    "familyName": "Some Font (Family Name)",
    "styleName": "Regular (Style Name)",
    "fullName": "Some Font-Regular (Postscript Full Name)",
    "fontName": "SomeFont-Regular (Postscript Font Name)",
    "menuName": "Some Font Regular (Style Map Family Name)",
    "fontStyle": 64,
    "note": "A note.",
    "versionMajor": 1,
    "versionMinor": 0,
    "year": 2008,
    "copyright": "Copyright Some Foundry.",
    "notice": "Some Font by Some Designer for Some Foundry.",
    "trademark": "Trademark Some Foundry",
    "license": "License info for Some Foundry.",
    "licenseURL": "http://somefoundry.com/license",
    "createdBy": "Some Foundry",
    "designer": "Some Designer",
    "designerURL": "http://somedesigner.com",
    "vendorURL": "http://somefoundry.com",
    "unitsPerEm": 1000,
    "ascender": 750,
    "descender": -250,
    "capHeight": 750,
    "xHeight": 500,
    "defaultWidth": 400,
    "slantAngle": -12.5,
    "italicAngle": -12.5,
    "widthName": "Medium (normal)",
    "weightName": "Medium",
    "weightValue": 500,
    "fondName": "SomeFont Regular (FOND Name)",
    "otFamilyName": "Some Font (Preferred Family Name)",
    "otStyleName": "Regular (Preferred Subfamily Name)",
    "otMacName": "Some Font Regular (Compatible Full Name)",
    "msCharSet": 0,
    "fondID": 15000,
    "uniqueID": 4000000,
    "ttVendor": "SOME",
    "ttUniqueID": "OpenType name Table Unique ID",
    "ttVersion": "OpenType name Table Version",
}

fontInfoVersion2 = {
    "familyName": "Some Font (Family Name)",
    "styleName": "Regular (Style Name)",
    "styleMapFamilyName": "Some Font Regular (Style Map Family Name)",
    "styleMapStyleName": "regular",
    "versionMajor": 1,
    "versionMinor": 0,
    "year": 2008,
    "copyright": "Copyright Some Foundry.",
    "trademark": "Trademark Some Foundry",
    "unitsPerEm": 1000,
    "descender": -250,
    "xHeight": 500,
    "capHeight": 750,
    "ascender": 750,
    "italicAngle": -12.5,
    "note": "A note.",
    "openTypeHeadCreated": "2000/01/01 00:00:00",
    "openTypeHeadLowestRecPPEM": 10,
    "openTypeHeadFlags": [0, 1],
    "openTypeHheaAscender": 750,
    "openTypeHheaDescender": -250,
    "openTypeHheaLineGap": 200,
    "openTypeHheaCaretSlopeRise": 1,
    "openTypeHheaCaretSlopeRun": 0,
    "openTypeHheaCaretOffset": 0,
    "openTypeNameDesigner": "Some Designer",
    "openTypeNameDesignerURL": "http://somedesigner.com",
    "openTypeNameManufacturer": "Some Foundry",
    "openTypeNameManufacturerURL": "http://somefoundry.com",
    "openTypeNameLicense": "License info for Some Foundry.",
    "openTypeNameLicenseURL": "http://somefoundry.com/license",
    "openTypeNameVersion": "OpenType name Table Version",
    "openTypeNameUniqueID": "OpenType name Table Unique ID",
    "openTypeNameDescription": "Some Font by Some Designer for Some Foundry.",
    "openTypeNamePreferredFamilyName": "Some Font (Preferred Family Name)",
    "openTypeNamePreferredSubfamilyName": "Regular (Preferred Subfamily Name)",
    "openTypeNameCompatibleFullName": "Some Font Regular (Compatible Full Name)",
    "openTypeNameSampleText": "Sample Text for Some Font.",
    "openTypeNameWWSFamilyName": "Some Font (WWS Family Name)",
    "openTypeNameWWSSubfamilyName": "Regular (WWS Subfamily Name)",
    "openTypeOS2WidthClass": 5,
    "openTypeOS2WeightClass": 500,
    "openTypeOS2Selection": [3],
    "openTypeOS2VendorID": "SOME",
    "openTypeOS2Panose": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    "openTypeOS2FamilyClass": [1, 1],
    "openTypeOS2UnicodeRanges": [0, 1],
    "openTypeOS2CodePageRanges": [0, 1],
    "openTypeOS2TypoAscender": 750,
    "openTypeOS2TypoDescender": -250,
    "openTypeOS2TypoLineGap": 200,
    "openTypeOS2WinAscent": 750,
    "openTypeOS2WinDescent": 250,
    "openTypeOS2Type": [],
    "openTypeOS2SubscriptXSize": 200,
    "openTypeOS2SubscriptYSize": 400,
    "openTypeOS2SubscriptXOffset": 0,
    "openTypeOS2SubscriptYOffset": -100,
    "openTypeOS2SuperscriptXSize": 200,
    "openTypeOS2SuperscriptYSize": 400,
    "openTypeOS2SuperscriptXOffset": 0,
    "openTypeOS2SuperscriptYOffset": 200,
    "openTypeOS2StrikeoutSize": 20,
    "openTypeOS2StrikeoutPosition": 300,
    "openTypeVheaVertTypoAscender": 750,
    "openTypeVheaVertTypoDescender": -250,
    "openTypeVheaVertTypoLineGap": 200,
    "openTypeVheaCaretSlopeRise": 0,
    "openTypeVheaCaretSlopeRun": 1,
    "openTypeVheaCaretOffset": 0,
    "postscriptFontName": "SomeFont-Regular (Postscript Font Name)",
    "postscriptFullName": "Some Font-Regular (Postscript Full Name)",
    "postscriptSlantAngle": -12.5,
    "postscriptUniqueID": 4000000,
    "postscriptUnderlineThickness": 20,
    "postscriptUnderlinePosition": -200,
    "postscriptIsFixedPitch": False,
    "postscriptBlueValues": [500, 510],
    "postscriptOtherBlues": [-250, -260],
    "postscriptFamilyBlues": [500, 510],
    "postscriptFamilyOtherBlues": [-250, -260],
    "postscriptStemSnapH": [100, 120],
    "postscriptStemSnapV": [80, 90],
    "postscriptBlueFuzz": 1,
    "postscriptBlueShift": 7,
    "postscriptBlueScale": 0.039625,
    "postscriptForceBold": True,
    "postscriptDefaultWidthX": 400,
    "postscriptNominalWidthX": 400,
    "postscriptWeightName": "Medium",
    "postscriptDefaultCharacter": ".notdef",
    "postscriptWindowsCharacterSet": 1,
    "macintoshFONDFamilyID": 15000,
    "macintoshFONDName": "SomeFont Regular (FOND Name)",
}

fontInfoVersion3 = {
    "familyName": "Some Font (Family Name)",
    "styleName": "Regular (Style Name)",
    "styleMapFamilyName": "Some Font Regular (Style Map Family Name)",
    "styleMapStyleName": "regular",
    "versionMajor": 1,
    "versionMinor": 0,
    "year": 2008,
    "copyright": "Copyright Some Foundry.",
    "trademark": "Trademark Some Foundry",
    "unitsPerEm": 1000,
    "descender": -250,
    "xHeight": 500,
    "capHeight": 750,
    "ascender": 750,
    "italicAngle": -12.5,
    "note": "A note.",
    "openTypeGaspRangeRecords": [
        dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]),
        dict(rangeMaxPPEM=20, rangeGaspBehavior=[1]),
        dict(rangeMaxPPEM=30, rangeGaspBehavior=[2]),
        dict(rangeMaxPPEM=40, rangeGaspBehavior=[3]),
        dict(rangeMaxPPEM=50, rangeGaspBehavior=[0, 1, 2, 3]),
        dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]),
    ],
    "openTypeHeadCreated": "2000/01/01 00:00:00",
    "openTypeHeadLowestRecPPEM": 10,
    "openTypeHeadFlags": [0, 1],
    "openTypeHheaAscender": 750,
    "openTypeHheaDescender": -250,
    "openTypeHheaLineGap": 200,
    "openTypeHheaCaretSlopeRise": 1,
    "openTypeHheaCaretSlopeRun": 0,
    "openTypeHheaCaretOffset": 0,
    "openTypeNameDesigner": "Some Designer",
    "openTypeNameDesignerURL": "http://somedesigner.com",
    "openTypeNameManufacturer": "Some Foundry",
    "openTypeNameManufacturerURL": "http://somefoundry.com",
    "openTypeNameLicense": "License info for Some Foundry.",
    "openTypeNameLicenseURL": "http://somefoundry.com/license",
    "openTypeNameVersion": "OpenType name Table Version",
    "openTypeNameUniqueID": "OpenType name Table Unique ID",
    "openTypeNameDescription": "Some Font by Some Designer for Some Foundry.",
    "openTypeNamePreferredFamilyName": "Some Font (Preferred Family Name)",
    "openTypeNamePreferredSubfamilyName": "Regular (Preferred Subfamily Name)",
    "openTypeNameCompatibleFullName": "Some Font Regular (Compatible Full Name)",
    "openTypeNameSampleText": "Sample Text for Some Font.",
    "openTypeNameWWSFamilyName": "Some Font (WWS Family Name)",
    "openTypeNameWWSSubfamilyName": "Regular (WWS Subfamily Name)",
    "openTypeNameRecords": [
        dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record."),
        dict(nameID=2, platformID=1, encodingID=1, languageID=1, string="Name Record."),
    ],
    "openTypeOS2WidthClass": 5,
    "openTypeOS2WeightClass": 500,
    "openTypeOS2Selection": [3],
    "openTypeOS2VendorID": "SOME",
    "openTypeOS2Panose": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    "openTypeOS2FamilyClass": [1, 1],
    "openTypeOS2UnicodeRanges": [0, 1],
    "openTypeOS2CodePageRanges": [0, 1],
    "openTypeOS2TypoAscender": 750,
    "openTypeOS2TypoDescender": -250,
    "openTypeOS2TypoLineGap": 200,
    "openTypeOS2WinAscent": 750,
    "openTypeOS2WinDescent": 250,
    "openTypeOS2Type": [],
    "openTypeOS2SubscriptXSize": 200,
    "openTypeOS2SubscriptYSize": 400,
    "openTypeOS2SubscriptXOffset": 0,
    "openTypeOS2SubscriptYOffset": -100,
    "openTypeOS2SuperscriptXSize": 200,
    "openTypeOS2SuperscriptYSize": 400,
    "openTypeOS2SuperscriptXOffset": 0,
    "openTypeOS2SuperscriptYOffset": 200,
    "openTypeOS2StrikeoutSize": 20,
    "openTypeOS2StrikeoutPosition": 300,
    "openTypeVheaVertTypoAscender": 750,
    "openTypeVheaVertTypoDescender": -250,
    "openTypeVheaVertTypoLineGap": 200,
    "openTypeVheaCaretSlopeRise": 0,
    "openTypeVheaCaretSlopeRun": 1,
    "openTypeVheaCaretOffset": 0,
    "postscriptFontName": "SomeFont-Regular (Postscript Font Name)",
    "postscriptFullName": "Some Font-Regular (Postscript Full Name)",
    "postscriptSlantAngle": -12.5,
    "postscriptUniqueID": 4000000,
    "postscriptUnderlineThickness": 20,
    "postscriptUnderlinePosition": -200,
    "postscriptIsFixedPitch": False,
    "postscriptBlueValues": [500, 510],
    "postscriptOtherBlues": [-250, -260],
    "postscriptFamilyBlues": [500, 510],
    "postscriptFamilyOtherBlues": [-250, -260],
    "postscriptStemSnapH": [100, 120],
    "postscriptStemSnapV": [80, 90],
    "postscriptBlueFuzz": 1,
    "postscriptBlueShift": 7,
    "postscriptBlueScale": 0.039625,
    "postscriptForceBold": True,
    "postscriptDefaultWidthX": 400,
    "postscriptNominalWidthX": 400,
    "postscriptWeightName": "Medium",
    "postscriptDefaultCharacter": ".notdef",
    "postscriptWindowsCharacterSet": 1,
    "macintoshFONDFamilyID": 15000,
    "macintoshFONDName": "SomeFont Regular (FOND Name)",
    "woffMajorVersion": 1,
    "woffMinorVersion": 0,
    "woffMetadataUniqueID": dict(id="string"),
    "woffMetadataVendor": dict(name="Some Foundry", url="http://somefoundry.com"),
    "woffMetadataCredits": dict(
        credits=[
            dict(name="Some Designer"),
            dict(name=""),
            dict(name="Some Designer", url="http://somedesigner.com"),
            dict(name="Some Designer", url=""),
            dict(name="Some Designer", role="Designer"),
            dict(name="Some Designer", role=""),
            dict(name="Some Designer", dir="ltr"),
            dict(name="rengiseD emoS", dir="rtl"),
            {"name": "Some Designer", "class": "hello"},
            {"name": "Some Designer", "class": ""},
        ]
    ),
    "woffMetadataDescription": dict(
        url="http://somefoundry.com/foo/description",
        text=[
            dict(text="foo"),
            dict(text=""),
            dict(text="foo", language="bar"),
            dict(text="foo", language=""),
            dict(text="foo", dir="ltr"),
            dict(text="foo", dir="rtl"),
            {"text": "foo", "class": "foo"},
            {"text": "foo", "class": ""},
        ],
    ),
    "woffMetadataLicense": dict(
        url="http://somefoundry.com/foo/license",
        id="foo",
        text=[
            dict(text="foo"),
            dict(text=""),
            dict(text="foo", language="bar"),
            dict(text="foo", language=""),
            dict(text="foo", dir="ltr"),
            dict(text="foo", dir="rtl"),
            {"text": "foo", "class": "foo"},
            {"text": "foo", "class": ""},
        ],
    ),
    "woffMetadataCopyright": dict(
        text=[
            dict(text="foo"),
            dict(text=""),
            dict(text="foo", language="bar"),
            dict(text="foo", language=""),
            dict(text="foo", dir="ltr"),
            dict(text="foo", dir="rtl"),
            {"text": "foo", "class": "foo"},
            {"text": "foo", "class": ""},
        ]
    ),
    "woffMetadataTrademark": dict(
        text=[
            dict(text="foo"),
            dict(text=""),
            dict(text="foo", language="bar"),
            dict(text="foo", language=""),
            dict(text="foo", dir="ltr"),
            dict(text="foo", dir="rtl"),
            {"text": "foo", "class": "foo"},
            {"text": "foo", "class": ""},
        ]
    ),
    "woffMetadataLicensee": dict(name="Some Licensee"),
    "woffMetadataExtensions": [
        dict(
            # everything
            names=[
                dict(text="foo"),
                dict(text=""),
                dict(text="foo", language="bar"),
                dict(text="foo", language=""),
                dict(text="foo", dir="ltr"),
                dict(text="foo", dir="rtl"),
                {"text": "foo", "class": "hello"},
                {"text": "foo", "class": ""},
            ],
            items=[
                # everything
                dict(
                    id="foo",
                    names=[
                        dict(text="foo"),
                        dict(text=""),
                        dict(text="foo", language="bar"),
                        dict(text="foo", language=""),
                        dict(text="foo", dir="ltr"),
                        dict(text="foo", dir="rtl"),
                        {"text": "foo", "class": "hello"},
                        {"text": "foo", "class": ""},
                    ],
                    values=[
                        dict(text="foo"),
                        dict(text=""),
                        dict(text="foo", language="bar"),
                        dict(text="foo", language=""),
                        dict(text="foo", dir="ltr"),
                        dict(text="foo", dir="rtl"),
                        {"text": "foo", "class": "hello"},
                        {"text": "foo", "class": ""},
                    ],
                ),
                # no id
                dict(names=[dict(text="foo")], values=[dict(text="foo")]),
            ],
        ),
        # no names
        dict(
            items=[dict(id="foo", names=[dict(text="foo")], values=[dict(text="foo")])]
        ),
    ],
    "guidelines": [
        # ints
        dict(x=100, y=200, angle=45),
        # floats
        dict(x=100.5, y=200.5, angle=45.5),
        # edges
        dict(x=0, y=0, angle=0),
        dict(x=0, y=0, angle=360),
        dict(x=0, y=0, angle=360.0),
        # no y
        dict(x=100),
        # no x
        dict(y=200),
        # name
        dict(x=100, y=200, angle=45, name="foo"),
        dict(x=100, y=200, angle=45, name=""),
        # identifier
        dict(x=100, y=200, angle=45, identifier="guide1"),
        dict(x=100, y=200, angle=45, identifier="guide2"),
        dict(x=100, y=200, angle=45, identifier="\x20"),
        dict(x=100, y=200, angle=45, identifier="\x7E"),
        # colors
        dict(x=100, y=200, angle=45, color="0,0,0,0"),
        dict(x=100, y=200, angle=45, color="1,0,0,0"),
        dict(x=100, y=200, angle=45, color="1,1,1,1"),
        dict(x=100, y=200, angle=45, color="0,1,0,0"),
        dict(x=100, y=200, angle=45, color="0,0,1,0"),
        dict(x=100, y=200, angle=45, color="0,0,0,1"),
        dict(x=100, y=200, angle=45, color="1, 0, 0, 0"),
        dict(x=100, y=200, angle=45, color="0, 1, 0, 0"),
        dict(x=100, y=200, angle=45, color="0, 0, 1, 0"),
        dict(x=100, y=200, angle=45, color="0, 0, 0, 1"),
        dict(x=100, y=200, angle=45, color=".5,0,0,0"),
        dict(x=100, y=200, angle=45, color="0,.5,0,0"),
        dict(x=100, y=200, angle=45, color="0,0,.5,0"),
        dict(x=100, y=200, angle=45, color="0,0,0,.5"),
        dict(x=100, y=200, angle=45, color=".5,1,1,1"),
        dict(x=100, y=200, angle=45, color="1,.5,1,1"),
        dict(x=100, y=200, angle=45, color="1,1,.5,1"),
        dict(x=100, y=200, angle=45, color="1,1,1,.5"),
    ],
}

expectedFontInfo1To2Conversion = {
    "familyName": "Some Font (Family Name)",
    "styleMapFamilyName": "Some Font Regular (Style Map Family Name)",
    "styleMapStyleName": "regular",
    "styleName": "Regular (Style Name)",
    "unitsPerEm": 1000,
    "ascender": 750,
    "capHeight": 750,
    "xHeight": 500,
    "descender": -250,
    "italicAngle": -12.5,
    "versionMajor": 1,
    "versionMinor": 0,
    "year": 2008,
    "copyright": "Copyright Some Foundry.",
    "trademark": "Trademark Some Foundry",
    "note": "A note.",
    "macintoshFONDFamilyID": 15000,
    "macintoshFONDName": "SomeFont Regular (FOND Name)",
    "openTypeNameCompatibleFullName": "Some Font Regular (Compatible Full Name)",
    "openTypeNameDescription": "Some Font by Some Designer for Some Foundry.",
    "openTypeNameDesigner": "Some Designer",
    "openTypeNameDesignerURL": "http://somedesigner.com",
    "openTypeNameLicense": "License info for Some Foundry.",
    "openTypeNameLicenseURL": "http://somefoundry.com/license",
    "openTypeNameManufacturer": "Some Foundry",
    "openTypeNameManufacturerURL": "http://somefoundry.com",
    "openTypeNamePreferredFamilyName": "Some Font (Preferred Family Name)",
    "openTypeNamePreferredSubfamilyName": "Regular (Preferred Subfamily Name)",
    "openTypeNameCompatibleFullName": "Some Font Regular (Compatible Full Name)",
    "openTypeNameUniqueID": "OpenType name Table Unique ID",
    "openTypeNameVersion": "OpenType name Table Version",
    "openTypeOS2VendorID": "SOME",
    "openTypeOS2WeightClass": 500,
    "openTypeOS2WidthClass": 5,
    "postscriptDefaultWidthX": 400,
    "postscriptFontName": "SomeFont-Regular (Postscript Font Name)",
    "postscriptFullName": "Some Font-Regular (Postscript Full Name)",
    "postscriptSlantAngle": -12.5,
    "postscriptUniqueID": 4000000,
    "postscriptWeightName": "Medium",
    "postscriptWindowsCharacterSet": 1,
}

expectedFontInfo2To1Conversion = {
    "familyName": "Some Font (Family Name)",
    "menuName": "Some Font Regular (Style Map Family Name)",
    "fontStyle": 64,
    "styleName": "Regular (Style Name)",
    "unitsPerEm": 1000,
    "ascender": 750,
    "capHeight": 750,
    "xHeight": 500,
    "descender": -250,
    "italicAngle": -12.5,
    "versionMajor": 1,
    "versionMinor": 0,
    "copyright": "Copyright Some Foundry.",
    "trademark": "Trademark Some Foundry",
    "note": "A note.",
    "fondID": 15000,
    "fondName": "SomeFont Regular (FOND Name)",
    "fullName": "Some Font Regular (Compatible Full Name)",
    "notice": "Some Font by Some Designer for Some Foundry.",
    "designer": "Some Designer",
    "designerURL": "http://somedesigner.com",
    "license": "License info for Some Foundry.",
    "licenseURL": "http://somefoundry.com/license",
    "createdBy": "Some Foundry",
    "vendorURL": "http://somefoundry.com",
    "otFamilyName": "Some Font (Preferred Family Name)",
    "otStyleName": "Regular (Preferred Subfamily Name)",
    "otMacName": "Some Font Regular (Compatible Full Name)",
    "ttUniqueID": "OpenType name Table Unique ID",
    "ttVersion": "OpenType name Table Version",
    "ttVendor": "SOME",
    "weightValue": 500,
    "widthName": "Medium (normal)",
    "defaultWidth": 400,
    "fontName": "SomeFont-Regular (Postscript Font Name)",
    "fullName": "Some Font-Regular (Postscript Full Name)",
    "slantAngle": -12.5,
    "uniqueID": 4000000,
    "weightName": "Medium",
    "msCharSet": 0,
    "year": 2008,
}
