[feaLib] Rename features.py to ast.py, for Abstract Syntax Tree
This commit is contained in:
parent
23997cfd95
commit
b86e30d7c6
25
Lib/fontTools/feaLib/ast.py
Normal file
25
Lib/fontTools/feaLib/ast.py
Normal 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))
|
@ -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))
|
@ -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_()
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user