[voltLib] Allow passing file-like object to Parser
This commit is contained in:
parent
8c2f72118c
commit
e082abf627
@ -39,10 +39,13 @@ class Lexer(object):
|
||||
if token_type not in {Lexer.NEWLINE}:
|
||||
return (token_type, token, location)
|
||||
|
||||
def location_(self):
|
||||
column = self.pos_ - self.line_start_ + 1
|
||||
return (self.filename_ or "<volt>", self.line_, column)
|
||||
|
||||
def next_(self):
|
||||
self.scan_over_(Lexer.CHAR_WHITESPACE_)
|
||||
column = self.pos_ - self.line_start_ + 1
|
||||
location = (self.filename_, self.line_, column)
|
||||
location = self.location_()
|
||||
start = self.pos_
|
||||
text = self.text_
|
||||
limit = len(text)
|
||||
|
@ -32,10 +32,19 @@ class Parser(object):
|
||||
self.lookups_ = SymbolTable()
|
||||
self.next_token_type_, self.next_token_ = (None, None)
|
||||
self.next_token_location_ = None
|
||||
with open(path, "r") as f:
|
||||
self.lexer_ = Lexer(f.read(), path)
|
||||
self.make_lexer_(path)
|
||||
self.advance_lexer_()
|
||||
|
||||
def make_lexer_(self, file_or_path):
|
||||
if hasattr(file_or_path, "read"):
|
||||
filename = getattr(file_or_path, "name", None)
|
||||
data = file_or_path.read()
|
||||
else:
|
||||
filename = file_or_path
|
||||
with open(file_or_path, "r") as f:
|
||||
data = f.read()
|
||||
self.lexer_ = Lexer(data, filename)
|
||||
|
||||
def parse(self):
|
||||
statements = self.doc_.statements
|
||||
while self.next_token_type_ is not None:
|
||||
|
@ -1,12 +1,9 @@
|
||||
from __future__ import print_function, division, absolute_import
|
||||
from __future__ import unicode_literals
|
||||
from fontTools.misc.py23 import *
|
||||
from fontTools.voltLib import ast
|
||||
from fontTools.voltLib.error import VoltLibError
|
||||
from fontTools.voltLib.parser import Parser
|
||||
from io import open
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1119,22 +1116,8 @@ class ParserTest(unittest.TestCase):
|
||||
def_glyph.type, def_glyph.components),
|
||||
(".notdef", 0, None, "BASE", None))
|
||||
|
||||
def setUp(self):
|
||||
self.tempdir = None
|
||||
self.num_tempfiles = 0
|
||||
|
||||
def tearDown(self):
|
||||
if self.tempdir:
|
||||
shutil.rmtree(self.tempdir)
|
||||
|
||||
def parse(self, text):
|
||||
if not self.tempdir:
|
||||
self.tempdir = tempfile.mkdtemp()
|
||||
self.num_tempfiles += 1
|
||||
path = os.path.join(self.tempdir, "tmp%d.vtp" % self.num_tempfiles)
|
||||
with open(path, "w") as outfile:
|
||||
outfile.write(text)
|
||||
return Parser(path).parse()
|
||||
return Parser(UnicodeIO(text)).parse()
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
Loading…
x
Reference in New Issue
Block a user