Changeset 185
- Timestamp:
- 04/12/08 23:18:08 (2 years ago)
- Files:
-
- packages/feaTools/trunk/Lib/feaTools/parser.py (modified) (3 diffs)
- packages/feaTools/trunk/Lib/feaTools/test.py (modified) (2 diffs)
- packages/feaTools/trunk/Lib/feaTools/writers/baseWriter.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
packages/feaTools/trunk/Lib/feaTools/parser.py
r184 r185 72 72 "([\s;\{\}]|^)" # whitepace, ; {, } or start of line 73 73 "table\s+" # table 74 "([\w\d ]{4})"# name74 "([\w\d/]+)" # name 75 75 "\s*{" # { 76 76 ) … … 89 89 "\s*;" # ; 90 90 ] 91 92 # used for getting tag value pairs from tables. 93 tableTagValueRE = re.compile( 94 "([\w\d_.]+)" # tag 95 "\s+" # 96 "([^;]+)" # anything but ; 97 ";" # ; 98 ) 91 99 92 100 # used for finding all class definitions. … … 417 425 418 426 def _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 433 def _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) 422 497 423 498 def _parseClass(writer, name, content): packages/feaTools/trunk/Lib/feaTools/test.py
r184 r185 28 28 return obj 29 29 30 def table(self, name, data): 31 self._instructions.append(("table", (name, data))) 32 30 33 def classDefinition(self, name, contents): 31 34 self._instructions.append(("class", (name, contents))) … … 225 228 # 226 229 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 ]))] 235 314 self.assertEqual(result, expected) 236 315 packages/feaTools/trunk/Lib/feaTools/writers/baseWriter.py
r184 r185 6 6 def lookup(self, name): 7 7 return self 8 9 def table(self, name, data): 10 pass 8 11 9 12 def featureReference(self, name):
