diff --git a/Lib/fontTools/feaLib/lexer.py b/Lib/fontTools/feaLib/lexer.py index d790dcc87..1362eed5d 100644 --- a/Lib/fontTools/feaLib/lexer.py +++ b/Lib/fontTools/feaLib/lexer.py @@ -142,10 +142,12 @@ class Lexer(object): return (Lexer.SYMBOL, cur_char, location) if cur_char == '"': self.pos_ += 1 - self.scan_until_('"\r\n') + self.scan_until_('"') if self.pos_ < self.text_length_ and self.text_[self.pos_] == '"': self.pos_ += 1 - return (Lexer.STRING, text[start + 1:self.pos_ - 1], location) + # strip newlines embedded within a string + string = re.sub("[\r\n]", "", text[start + 1:self.pos_ - 1]) + return (Lexer.STRING, string, location) else: raise FeatureLibError("Expected '\"' to terminate string", location) diff --git a/Lib/fontTools/feaLib/lexer_test.py b/Lib/fontTools/feaLib/lexer_test.py index e6055e826..adc700487 100644 --- a/Lib/fontTools/feaLib/lexer_test.py +++ b/Lib/fontTools/feaLib/lexer_test.py @@ -82,7 +82,9 @@ class LexerTest(unittest.TestCase): def test_string(self): self.assertEqual(lex('"foo" "bar"'), [(Lexer.STRING, "foo"), (Lexer.STRING, "bar")]) - self.assertRaises(FeatureLibError, lambda: lex('"foo\n bar"')) + self.assertEqual(lex('"foo \nbar\r baz \r\nqux\n\n "'), + [(Lexer.STRING, "foo bar baz qux ")]) + self.assertRaises(FeatureLibError, lambda: lex('"foo\n bar')) def test_bad_character(self): self.assertRaises(FeatureLibError, lambda: lex("123 \u0001"))