[feaLib] Don't set language when script is unset

Before, if someone tried to set the language before setting the script
a None/language language system would be created (with actual tag
"None" stored in the feature table). This defaults to tag DFLT and
fails when a non-dflt language is set for DFLT, since that's illegal.
This commit is contained in:
James Godfrey-Kittle 2016-06-22 11:29:42 -07:00
parent 87f86424ca
commit e2186dec53
3 changed files with 12 additions and 0 deletions

View File

@ -561,6 +561,7 @@ class Builder(object):
def start_feature(self, location, name):
self.language_systems = self.get_default_language_systems_()
self.script_ = 'DFLT'
self.cur_lookup_ = None
self.cur_feature_name_ = name
self.lookupflag_ = 0
@ -613,6 +614,9 @@ class Builder(object):
raise FeatureLibError(
"Language statements are not allowed "
"within \"feature %s\"" % self.cur_feature_name_, location)
if language != 'dflt' and self.script_ == 'DFLT':
raise FeatureLibError("Need non-DFLT script when using non-dflt "
"language (was: \"%s\")" % language, location)
self.cur_lookup_ = None
key = (self.script_, language, self.cur_feature_name_)

View File

@ -255,6 +255,12 @@ class BuilderTest(unittest.TestCase):
include_default=True, required=False)
self.assertEqual(builder.language_systems,
{('cyrl', 'BGR ')})
builder.start_feature(location=None, name='test2')
self.assertRaisesRegex(
FeatureLibError,
"Need non-DFLT script when using non-dflt language "
"\(was: \"FRA \"\)",
builder.set_language, None, 'FRA ', True, False)
def test_language_in_aalt_feature(self):
self.assertRaisesRegex(
@ -281,6 +287,7 @@ class BuilderTest(unittest.TestCase):
" substitute [a-z] by [A.sc-Z.sc];"
"} scmp;"
"feature test {"
" script latn;"
" language FRA required;"
" substitute [a-z] by [A.sc-Z.sc];"
"} test;")

View File

@ -12,6 +12,7 @@ feature hlig {
} hlig;
feature liga {
script latn;
language ITA exclude_dflt required;
sub I T A by I.sc;
} liga;