Changeset 185

Show
Ignore:
Timestamp:
04/12/08 23:18:08 (2 years ago)
Author:
tal
Message:
Added some experimental support for parsing tables.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • packages/feaTools/trunk/Lib/feaTools/parser.py

    r184 r185  
    7272        "([\s;\{\}]|^)"        # whitepace, ; {, } or start of line 
    7373        "table\s+"             # table 
    74         "([\w\d]{4})"          # name 
     74        "([\w\d/]+)"        # name 
    7575        "\s*{"                 # { 
    7676        ) 
     
    8989        "\s*;"                 # ; 
    9090        ] 
     91 
     92# used for getting tag value pairs from tables. 
     93tableTagValueRE = re.compile( 
     94    "([\w\d_.]+)"       # tag 
     95    "\s+"               # 
     96    "([^;]+)"           # anything but ; 
     97    ";"                 # ; 
     98) 
    9199 
    92100# used for finding all class definitions. 
     
    417425 
    418426def _parseTable(writer, name, table): 
    419     # this could parse table secific data. 
    420     # for now, simply ignore the text. 
    421     pass 
     427    tagValueTables = ["head", "hhea", "OS/2", "vhea"] 
     428    # skip unknown tables 
     429    if name not in tagValueTables: 
     430        return 
     431    _parseTagValueTable(writer, name, table) 
     432 
     433def _parseTagValueTable(writer, name, table): 
     434    valueTypes = { 
     435        "head" : { 
     436            "FontRevision" : float 
     437        }, 
     438        "hhea" : { 
     439            "CaretOffset" : float, 
     440            "Ascender"    : float, 
     441            "Descender"   : float, 
     442            "LineGap"     : float, 
     443        }, 
     444        "OS/2" : { 
     445            "FSType"        : int, 
     446            "Panose"        : "listOfInts", 
     447            "UnicodeRange"  : "listOfInts", 
     448            "CodePageRange" : "listOfInts", 
     449            "TypoAscender"  : float, 
     450            "TypoDescender" : float, 
     451            "TypoLineGap"   : float, 
     452            "winAscent"     : float, 
     453            "winDescent"    : float, 
     454            "XHeight"       : float, 
     455            "CapHeight"     : float, 
     456            "WeightClass"   : float, 
     457            "WidthClass"    : float, 
     458            "Vendor"        : str 
     459        }, 
     460        "vhea" : { 
     461            "VertTypoAscender"  : float, 
     462            "VertTypoDescender" : float, 
     463            "VertTypoLineGap"   : float 
     464        } 
     465    } 
     466    tableTypes = valueTypes[name] 
     467    parsedTagValues = [] 
     468    for tag, value in tableTagValueRE.findall(table): 
     469        tag = tag.strip() 
     470        value = value.strip() 
     471        if tag not in tableTypes: 
     472            raise FeaToolsParserSyntaxError("Unknown Tag: %s" % tag) 
     473        desiredType = tableTypes[tag] 
     474        if desiredType == "listOfInts": 
     475            v = [] 
     476            for line in value.splitlines(): 
     477                for i in line.split(): 
     478                    v.append(i) 
     479            value = v 
     480            values = [] 
     481            for i in value: 
     482                try: 
     483                    i = int(i) 
     484                    values.append(i) 
     485                except ValueError: 
     486                    raise FeaToolsParserSyntaxError("Invalid Syntax: %s" % i) 
     487            value = values 
     488        elif desiredType == str: 
     489            raise NotImplementedError 
     490        elif not isinstance(value, desiredType): 
     491            try: 
     492                value = desiredType(value) 
     493            except ValueError: 
     494                raise FeaToolsParserSyntaxError("Invalid Syntax: %s" % i) 
     495        parsedTagValues.append((tag, value)) 
     496    writer.table(name, parsedTagValues) 
    422497 
    423498def _parseClass(writer, name, content): 
  • packages/feaTools/trunk/Lib/feaTools/test.py

    r184 r185  
    2828        return obj 
    2929 
     30    def table(self, name, data): 
     31        self._instructions.append(("table", (name, data))) 
     32 
    3033    def classDefinition(self, name, contents): 
    3134        self._instructions.append(("class", (name, contents))) 
     
    225228        # 
    226229        test = """ 
    227         table test { 
    228             feature TEST {} TEST; 
    229         } test; 
    230         """ 
    231         writer = TestFeatureWriter() 
    232         parseFeatures(writer, test) 
    233         result = writer.getData() 
    234         expected = [] 
     230        table OS/2 { 
     231            FSType 0; 
     232            Panose 0 1 2 3 4 5 6 7 8 9; 
     233            UnicodeRange 0 1 2 3 4 5; 
     234            CodePageRange 0 1 2 3 4 5; 
     235            TypoAscender 750; 
     236            TypoDescender -250; 
     237            TypoLineGap 200; 
     238            winAscent 750; 
     239            winDescent -250; 
     240            XHeight 400; 
     241            CapHeight 750; 
     242            WeightClass 500; 
     243            WidthClass 3; 
     244            Vendor "test"; 
     245        } OS/2; 
     246        """ 
     247        writer = TestFeatureWriter() 
     248        parseFeatures(writer, test) 
     249        result = writer.getData() 
     250        expected = [("table", ("OS/2", [ 
     251            ("FSType", 0), 
     252            ("Panose", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 
     253            ("UnicodeRange", [0, 1, 2, 3, 4, 5]), 
     254            ("CodePageRange", [0, 1, 2, 3, 4, 5]), 
     255            ("TypoAscender", 750.0), 
     256            ("TypoDescender", -250.0), 
     257            ("TypoLineGap", 200.0), 
     258            ("winAscent", 750.0), 
     259            ("winDescent", -250.0), 
     260            ("XHeight", 400.0), 
     261            ("CapHeight", 750.0), 
     262            ("WeightClass", 500.0), 
     263            ("WidthClass", 3.0) 
     264        ]))] 
     265        self.assertEqual(result, expected) 
     266        # 
     267        test = """ 
     268        table head { 
     269            FontRevision 1.1; 
     270        } head; 
     271        """ 
     272        writer = TestFeatureWriter() 
     273        parseFeatures(writer, test) 
     274        result = writer.getData() 
     275        expected = [("table", ("head", [ 
     276            ("FontRevision", 1.1), 
     277        ]))] 
     278        self.assertEqual(result, expected) 
     279        # 
     280        test = """ 
     281        table hhea { 
     282            CaretOffset 1; 
     283            Ascender 2; 
     284            Descender 3; 
     285            LineGap 4; 
     286        } hhea; 
     287        """ 
     288        writer = TestFeatureWriter() 
     289        parseFeatures(writer, test) 
     290        result = writer.getData() 
     291        expected = [("table", ("hhea", [ 
     292            ("CaretOffset", 1), 
     293            ("Ascender", 2), 
     294            ("Descender", 3), 
     295            ("LineGap", 4), 
     296        ]))] 
     297        self.assertEqual(result, expected) 
     298        # 
     299        test = """ 
     300        table vhea { 
     301            VertTypoAscender 2; 
     302            VertTypoDescender 3; 
     303            VertTypoLineGap 4; 
     304        } vhea; 
     305        """ 
     306        writer = TestFeatureWriter() 
     307        parseFeatures(writer, test) 
     308        result = writer.getData() 
     309        expected = [("table", ("vhea", [ 
     310            ("VertTypoAscender", 2.0), 
     311            ("VertTypoDescender", 3.0), 
     312            ("VertTypoLineGap", 4.0), 
     313        ]))] 
    235314        self.assertEqual(result, expected) 
    236315 
  • packages/feaTools/trunk/Lib/feaTools/writers/baseWriter.py

    r184 r185  
    66    def lookup(self, name): 
    77        return self 
     8 
     9    def table(self, name, data): 
     10        pass 
    811 
    912    def featureReference(self, name):