262 Commits

Author SHA1 Message Date
Denis Moyogo Jacquerye
7930106740 feaLib: limit language statements to 1 feature block (#658)
* feaLib: limit language statements to 1 feature block

language exclude_dflt statements should only apply to lookups
defined in their feature block and not to lookups defined
in previous blocks sharing the same feature tag

* feaLib: add BuilderTest::test_FeatureFile_multiple_feature_blocks
2016-08-30 19:44:33 +02:00
Cosimo Lupo
53232c02bd [feaLib.parser_test] test for stray semicolons 2016-07-27 09:55:11 +01:00
Cosimo Lupo
e9c3686b18 [feaLib.parser] ignore top-level empty statements made up of a single semicolon
makeotf doesn't complain about them either.

Fixes #641
2016-07-27 09:54:08 +01:00
James Godfrey-Kittle
5c723ebfb0 [feaLib] Don't assume feature has lookups in DFLT
It's possible for all of a feature's lookups to be in specific script
and/or language systems, so this code could crash.
2016-06-22 16:19:45 -07:00
James Godfrey-Kittle
e2186dec53 [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.
2016-06-22 11:29:42 -07:00
James Godfrey-Kittle
aaf9294d97 [feaLib] Add another test for language systems 2016-06-21 16:40:17 -07:00
James Godfrey-Kittle
d1af1cfd4a [feaLib] Fix exclude_dflt handling
This is to fix what I think was a misunderstanding of the exclude_dflt
keyword (and the implicit include_dflt option active by default).

Rather than including the following lookups in the default language
systems, I think it is used to include the lookups specific to default
language systems in the system defined by the current language
statement. Thus instead of registering a lookup in all default
systems when include_dflt is true, we should exclude the lookups
registered with default systems from the current system when
include_dflt is false.
2016-06-21 16:39:27 -07:00
moyogo
70a60433f8 [feaLib]: fix unescape_mac_name_string() and unescape_windows_name_string() 2016-06-01 17:33:15 +01:00
moyogo
84e7423a6e [feaLib] use OrderedDict instead of dict in MarkClass 2016-04-26 06:58:46 +01:00
moyogo
4ec59b27dd [feaLib] add test for issue #504 2016-04-25 22:37:58 +01:00
moyogo
17c8e582d0 [feaLib] glyph class as list and tuple instead of set and frozenset 2016-04-25 22:36:56 +01:00
Khaled Hosny
cdda278bd4 Use ttLib.newTable when possible
I learnt about it from [1] and seems like a nice thing to use.

1. https://github.com/behdad/fonttools/pull/586#issuecomment-213285350
2016-04-23 02:00:24 +02:00
Cosimo Lupo
47039f709b feaLib.lexer_test: add test for newlines in string token 2016-04-17 22:21:40 +01:00
Cosimo Lupo
cd8457f091 feaLib.lexer: strip newlines embedded within a string
Fixes #578
2016-04-17 22:21:24 +01:00
Sascha Brawer
967cf8bb15 Sort feature records by feature tag
Resolves https://github.com/behdad/fonttools/issues/568
2016-04-12 13:53:25 +02:00
Cosimo Lupo
2ac24ec27e feaLib.ast: fix 'TypeError: not enough arguments for format string' 2016-04-10 23:06:35 +01:00
Khaled Hosny
5ceaa43d27 [feaLib] Support hhea table 2016-04-09 18:02:40 +02:00
Behdad Esfahbod
2a0359af4d Always import * from py23
Since py23 modifies some essential builtins, it's safe to import
everything all the time.  At least, that's how it was designed.
It's a bug if importing * breaks some code.
2016-04-06 18:15:43 -07:00
Khaled Hosny
0a1f323835 [feaLib] Support OS/2 table 2016-03-23 15:42:00 +04:00
Khaled Hosny
fdcba0e130 [feaLib] Allow “/” in name tokens
For “OS/2” table.
2016-03-23 03:10:05 +04:00
Cosimo Lupo
9e8113718b [feaLib.builder] decode features string using tounicode before passing it to StringIO (for python2) 2016-03-21 19:39:07 +00:00
Cosimo Lupo
bb937e35e6 [feaLib.parser_test] fix up tests after changes to featurefile arg 2016-03-21 18:55:38 +00:00
Cosimo Lupo
3affc725aa [feaLib.lexer_test] fix up tests after changes to make_lexer_ 2016-03-21 18:55:35 +00:00
Cosimo Lupo
0f8f71d5ec [feaLib.lexer] modify make_lexer_ factory to take a 'file_or_path' argument
if 'file_or_path' is a file object keep it open, otherwise read the data from
the path and then close it.
2016-03-21 18:53:25 +00:00
Cosimo Lupo
6a05367a2c [feaLib.parser] change argument name 2016-03-21 18:47:27 +00:00
Cosimo Lupo
06b9a808ad [feaLib.builder] make addOpenTypeFeatures take only one 'featurefile' argument; add addOpenTypeFeaturesFromString
'featurefile' can be either a path (string) or a file object, like in TTFont or XMLReader and XMLWriter constructors.

If a file object does not have a 'name' attribute, a default "<features>" name is
used and the current working directory is assumed as the root for relative includes.
2016-03-21 18:46:50 +00:00
Cosimo Lupo
83f074aac4 [feaLib] use shorter fea_path and fea_data kwargs in addOpenTypeFeatures
as discussed here: https://github.com/behdad/fonttools/pull/547/files#r56807232
2016-03-21 12:18:32 +00:00
Cosimo Lupo
694b9d6917 [feaLib.parser_test] add test for ignored nameIDs 1-6 2016-03-21 11:02:03 +00:00
Cosimo Lupo
5efc85873b [feaLib.parser] issue a warning and ignore 1 <= nameID <= 6 (like makeotf) 2016-03-21 11:01:33 +00:00
Sascha Brawer
7eed24725f Allow include statements not terminated by a semicolon
The lexer passes the semicolon to the parser, which will read over it.
Resolves https://github.com/behdad/fonttools/issues/552.
2016-03-20 17:26:20 +01:00
Sascha Brawer
9ec04f0537 Merge pull request #547 from adrientetar/patch-2
feaLib: support string input
2016-03-20 09:09:06 -07:00
Adrien Tétar
492df7359b feaLib: fix tests 2016-03-20 15:01:33 +01:00
Khaled Hosny
1ac37d7d00 [feaLib] Support BASE table
Just the parts documented a currently implemented by Adobe’s
implementation.
2016-03-20 13:36:02 +04:00
Khaled Hosny
40be0e6f3a [feaLib] Support size feature 2016-03-19 21:55:24 +04:00
Khaled Hosny
6e291cf705 [feaLib] Fix parsing float numbers
Numbers with integral parts >= 10 were incorrectly parsed as integers as
next_char always pointed to the second number not the decimal point.
2016-03-18 18:42:59 +04:00
Khaled Hosny
9feaab13aa [feaLib] Support stylistic set featureNames
Does not handle featureNames for cvXX features, but it shouldn’t be hard
for someone to extend the code to support them if inclined to do so.
2016-03-18 14:08:00 +04:00
Khaled Hosny
53dc98be55 [feaLib] Fix parsing name records
Don’t override supplied encoding and language ids.
2016-03-18 14:06:33 +04:00
Masaya Nakamura
1adb1ad9e8 [feaLib] Fix typo in testdata/spec9e.*
Feature File Spec itself was fixed in https://github.com/adobe-type-tools/afdko/pull/110
2016-03-17 09:44:20 +09:00
Adrien Tétar
5e64857b97 feaLib: support string input 2016-03-15 20:01:29 +01:00
Sascha Brawer
4680701b6e Merge pull request #545 from khaledhosny/fea-lookupflag
Fix handling of default lookupflag
2016-03-15 09:12:44 -07:00
Khaled Hosny
4e316cd337 [feaLib] Support name table 2016-03-15 17:49:02 +04:00
Khaled Hosny
8d1930a27a Fix handling of default lookupflag
According to the spec:
> The lookupflag attribute defaults to 0 at the start of a feature
> block.
>
> The lookupflag attribute stays the same until explicitly changed, until
> a lookup reference statement is encountered that changes it, until the
> script is changed, or until the end of the feature.

This is an attempt to fix this by resetting the lookupflag at the start
and end of feature/lookup blacks. I’m not sure if resetting it in lookup
blocks is correct (my reading of the spec suggests it is not), but one
needs to test this against makeotf and see how it behaves here.
2016-03-13 00:43:10 +04:00
Sascha Brawer
809698611e [feaLib] Fix SequenceIndex in ChainContextPos
In the long term, we might want to make a different low-level API
for building ChainContextPos lookups; for now, this should fix the
current bug with SequenceIndex.

Resolves https://github.com/behdad/fonttools/issues/517.
2016-02-09 15:38:18 +01:00
Sascha Brawer
873f3570af [feaLib] Emit ChainContextPos before dependent SinglePos
There should be no semantic difference from this change,
since dependent lookups (the chain targets) are never directly
invoked by a feature. But the output of feaLib becomes more
similar to the output of makeotf, which helps debugging.
2016-02-09 09:25:54 +01:00
Sascha Brawer
5ab852277d [feaLib] Emit context-free contextual chains to SinglePos
Before this change, we had only emitted a SinglePos (GPOS type 1) lookup
for a statement like `pos A' B' 20`; after this change, we always emit a
chain rule even if there is no context. There is a semantic difference if
the rule is preceded by a `ignore pos` statement. Omitting context-free
contextual chains was actually not a (premature) optimization, but an
artifact that came from the representation of glyph patterns.

https://github.com/behdad/fonttools/issues/516
2016-02-09 09:00:06 +01:00
Sascha Brawer
bd6bea0f7f [feaLib] Allow non-disjoint markClasses
After this change, feaLib generates the exact same output as makeotf
for the test case in `bug453.fea`. Before this change, feaLib had
rejected the input as malformed.

Our new behavior is in blatant violation of the OpenType Feature File
Syntax specification, which writes: "NOTE! If a GDEF table is not
explicitly defined in the feature file, [...] all mark glyph classes
must be disjoint". However:

1. makeotf does not enforce this constraint;
2. existing feature files happily define non-disjoint markClasses;
3. existing tools such as the Glyphs font editor generate feature files
   with non-disjoint markClasses;
4. it is not obvious what the intention of this constraint would be.

Therefore, fewLib now follows the makeotf implementation, intentionally
ignoring what is mandated by the specification. I've proposed a spec change
at https://github.com/adobe-type-tools/afdko/issues/106.

Resolves https://github.com/behdad/fonttools/issues/453.
2016-02-08 10:27:31 +01:00
Sascha Brawer
d03ce3c119 [feaLib] Add unit test for the ignore pos statement
There are no examples for `ignore pos` in the OpenType Feature File
Syntax specification, therefore using a made-up example for the test.
The output from feaLib is identical to what makeotf generates.

Resolves https://github.com/behdad/fonttools/issues/503.
2016-02-06 12:13:03 +01:00
Sascha Brawer
b5d1124f43 [feaLib] Handle the ignore pos statement
https://github.com/behdad/fonttools/issues/503
2016-02-06 11:14:27 +01:00
Sascha Brawer
4a23f8eb85 [feaLib] Add unit test with spec section 5.f.ii, example 4
This is another test case for the `ignore sub` statement.
After the recent changes to feaLib, the output is now identical
to the output generated by makeotf.

https://github.com/behdad/fonttools/issues/503
2016-02-05 15:55:53 +01:00
Sascha Brawer
ec9077a566 [feaLib] Merge SingleSubst chain targets
This makes the output of feaLib more compact, using a similar technique
as seems to be used by makeotf.

After this change, feaLib generates output that more similar to makeotf:

* For the test cases in `bug512.fea` and `bug463.fea`, feaLib now
  generates the exact same output as makeotf v2.0.90.

* For the test cases in `GSUB_6.fea`, it is hard to say because makeotf
  crashes on the test file; our test contains language constructs that
  are valid according to the spec, but didn't yet get implemented by makeotf.
  When commenting out those constructs, feaLib generates the exact same
  output as makeotf v2.0.90.

* For the test cases in `feature_aalt.fea`, the output of feaLib is now
  structually the same as the output of makeotf v2.0.90.  However, two
  lookups are in different order. feaLib's ordering reflects the order
  of statements in the compiled input source; no idea why makeotf would
  want to reverse the ordering. Since this ordering difference only
  affects the _targets_ of chain substitutions, there is no semantic
  difference.

Resolves https://github.com/behdad/fonttools/issues/512.
2016-02-05 15:12:07 +01:00