[feaLib] Rename features.py to ast.py, for Abstract Syntax Tree

This commit is contained in:
Sascha Brawer 2015-08-01 14:49:19 +02:00
parent 23997cfd95
commit b86e30d7c6
4 changed files with 36 additions and 25 deletions

View File

@ -0,0 +1,25 @@
from __future__ import print_function, division, absolute_import
from __future__ import unicode_literals
def write(buffer, text):
buffer.write(text.encode("utf-8"))
class FeatureFile:
def __init__(self):
self.statements = []
def write(self, out, linesep):
for s in self.statements:
s.write(out, linesep)
class LanguageSystemStatement:
def __init__(self, location, script, language):
self.location = location
self.script, self.language = (script, language)
def write(self, out, linesep):
write(out, "languagesystem %s %s;%s" %
(self.script.strip(), self.language.strip(), linesep))

View File

@ -1,17 +0,0 @@
from __future__ import print_function, division, absolute_import
from __future__ import unicode_literals
import os
def write(buffer, text):
buffer.write(text.encode("utf-8"))
class Features:
def __init__(self):
self.language_system = {} # script --> {language}
def write(self, out, linesep=os.linesep):
for script in sorted(self.language_system.keys()):
for lang in sorted(self.language_system[script]):
write(out, "languagesystem %s %s;%s" % (script, lang, linesep))

View File

@ -1,8 +1,9 @@
from __future__ import print_function, division, absolute_import
from __future__ import unicode_literals
from fontTools.feaLib.features import Features
from fontTools.feaLib.lexer import Lexer, IncludingLexer
import fontTools.feaLib.ast as ast
class ParserError(Exception):
def __init__(self, message, location):
@ -20,7 +21,7 @@ class ParserError(Exception):
class Parser(object):
def __init__(self, path):
self.doc_ = Features()
self.doc_ = ast.FeatureFile()
self.next_token_type_, self.next_token_ = (None, None)
self.next_token_location_ = None
@ -37,10 +38,11 @@ class Parser(object):
return self.doc_
def parse_languagesystem_(self):
location = self.cur_token_location_
script, language = self.expect_tag_(), self.expect_tag_()
self.expect_symbol_(";")
langsys = self.doc_.language_system.setdefault(script, set())
langsys.add(language)
langsys = ast.LanguageSystemStatement(location, script, language)
self.doc_.statements.append(langsys)
def expect_keyword_(self, keywords):
self.advance_lexer_()

View File

@ -20,8 +20,9 @@ class ParserTest(unittest.TestCase):
self.assertRaisesRegex = self.assertRaisesRegexp
def test_languagesystem(self):
langsys = self.parse("languagesystem latn DEU;").language_system
self.assertEqual(langsys, {"latn": {"DEU "}})
[langsys] = self.parse("languagesystem latn DEU;").statements
self.assertEqual(langsys.script, "latn")
self.assertEqual(langsys.language, "DEU ")
self.assertRaisesRegex(
ParserError, "Expected ';'",
self.parse, "languagesystem latn DEU")
@ -54,9 +55,9 @@ class ParserTest(unittest.TestCase):
def roundtrip(self, testfile):
buffer1, buffer2 = StringIO(), StringIO()
Parser(ParserTest.getpath(testfile)).parse().write(buffer1)
Parser(ParserTest.getpath(testfile)).parse().write(buffer1, os.linesep)
text1 = buffer1.getvalue().decode("utf-8")
self.parse(text1).write(buffer2)
self.parse(text1).write(buffer2, os.linesep)
text2 = buffer2.getvalue().decode("utf-8")
self.assertEqual(text1, text2)