diff --git a/src/fontra_compile/compile_fontmake_action.py b/src/fontra_compile/compile_fontmake_action.py index 7c813c0..3b5194e 100644 --- a/src/fontra_compile/compile_fontmake_action.py +++ b/src/fontra_compile/compile_fontmake_action.py @@ -1,3 +1,4 @@ +import itertools import os import pathlib import subprocess @@ -10,6 +11,7 @@ from fontra.backends.copy import copyFont from fontra.core.protocols import ReadableFontBackend from fontra.workflow.actions import OutputActionProtocol, registerActionClass +from fontTools.designspaceLib import DesignSpaceDocument @registerActionClass("compile-fontmake") @@ -46,6 +48,8 @@ async def process( async with aclosing(dsBackend): await copyFont(self.input, dsBackend, continueOnError=continueOnError) + addInstances(designspacePath) + command = [ "fontmake", "-m", @@ -62,3 +66,44 @@ async def process( command.append(value) subprocess.run(command, check=True) + + +def addInstances(designspacePath): + dsDoc = DesignSpaceDocument.fromfile(designspacePath) + if dsDoc.instances: + # There are instances + return + + # We will make up instances based on the axis value labels + + sortOrder = { + "wght": 0, + "wdth": 1, + "ital": 2, + "slnt": 3, + } + axes = sorted(dsDoc.axes, key=lambda axis: sortOrder.get(axis.tag, 100)) + + elidedFallbackName = dsDoc.elidedFallbackName or "Regular" + dsDoc.elidedFallbackName = elidedFallbackName + + axisLabels = [ + [ + (axis.name, label.name if not label.elidable else None, label.userValue) + for label in axis.axisLabels + ] + for axis in axes + ] + + for items in itertools.product(*axisLabels): + location = {name: value for (name, valueLabel, value) in items} + nameParts = [valueLabel for (name, valueLabel, value) in items if valueLabel] + if not nameParts: + nameParts = [elidedFallbackName] + styleName = " ".join(nameParts) + + # TODO: styleName seems to be ignored, and the instance names are derived + # from axis labels elsewhere. Figure out where this happens. + dsDoc.addInstanceDescriptor(styleName=styleName, userLocation=location) + + dsDoc.write(designspacePath) diff --git a/tests/data/MutatorSans-fontmake.ttx b/tests/data/MutatorSans-fontmake.ttx index fc9d925..17aae8c 100644 --- a/tests/data/MutatorSans-fontmake.ttx +++ b/tests/data/MutatorSans-fontmake.ttx @@ -1,5 +1,5 @@ - + @@ -63,12 +63,12 @@ - + - - + + @@ -1592,10 +1592,55 @@ - Width + Weight - Weight + Width + + + Light Condensed + + + Light + + + Light Wide + + + Condensed + + + Regular + + + Wide + + + Medium Condensed + + + Medium + + + Medium Wide + + + Black Condensed + + + Black + + + Black Wide + + + weight + + + width + + + Normal License same as MutatorMath. BSD 3-clause. [test-token: C] @@ -1622,10 +1667,55 @@ License same as MutatorMath. BSD 3-clause. [test-token: C] - Width + Weight - Weight + Width + + + Light Condensed + + + Light + + + Light Wide + + + Condensed + + + Regular + + + Wide + + + Medium Condensed + + + Medium + + + Medium Wide + + + Black Condensed + + + Black + + + Black Wide + + + weight + + + width + + + Normal @@ -1677,7 +1767,7 @@ - + @@ -1688,14 +1778,14 @@ - - - + + + - - + + @@ -1705,7 +1795,7 @@ - + @@ -1713,37 +1803,37 @@ - + - + - + - + - - + + - - + + @@ -1764,7 +1854,7 @@ - + @@ -1790,7 +1880,7 @@ - + @@ -1819,16 +1909,16 @@ - - - - + + + + - + @@ -1845,8 +1935,8 @@ - - + + @@ -1901,32 +1991,66 @@ - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - wdth - 0x0 - 0.0 - 0.0 - 1000.0 - 256 - - wght @@ -1934,8 +2058,90 @@ 100.0 100.0 900.0 + 256 + + + + + wdth + 0x0 + 0.0 + 0.0 + 1000.0 257 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1943,45 +2149,29 @@ - + - + - + - + - - - - - - - - - - - - - - - - @@ -2000,7 +2190,23 @@ + + + + + + + + + + + + + + + + @@ -2024,11 +2230,6 @@ - - - - - @@ -2036,22 +2237,17 @@ + + + + + - - - - - - - - - - @@ -2064,7 +2260,17 @@ + + + + + + + + + + @@ -2075,37 +2281,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2212,7 +2387,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2265,51 +2471,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2357,7 +2518,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2403,39 +2609,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2471,7 +2644,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2505,17 +2711,6 @@ - - - - - - - - - - - @@ -2542,7 +2737,18 @@ + + + + + + + + + + + @@ -2566,15 +2772,6 @@ - - - - - - - - - @@ -2597,7 +2794,16 @@ + + + + + + + + + @@ -2608,58 +2814,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2766,29 +2920,81 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2819,14 +3025,6 @@ - - - - - - - - @@ -2839,7 +3037,15 @@ + + + + + + + + @@ -2850,15 +3056,6 @@ - - - - - - - - - @@ -2871,7 +3068,16 @@ + + + + + + + + + @@ -2882,11 +3088,6 @@ - - - - - @@ -2895,7 +3096,12 @@ + + + + + @@ -2907,39 +3113,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2975,7 +3148,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3009,35 +3215,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3069,7 +3246,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3099,31 +3305,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3151,7 +3332,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3177,28 +3383,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -3223,7 +3407,29 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -3246,13 +3452,6 @@ - - - - - - - @@ -3263,7 +3462,14 @@ + + + + + + + @@ -3272,29 +3478,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -3320,7 +3503,30 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -3344,6 +3550,18 @@ + + + + + + + + + + + + @@ -3365,19 +3583,7 @@ - - - - - - - - - - - - @@ -3396,50 +3602,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3485,7 +3648,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3529,43 +3735,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3605,7 +3774,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3643,37 +3849,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3723,7 +3898,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3771,51 +3977,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3857,13 +4018,58 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -3909,71 +4115,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4041,7 +4182,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4106,8 +4312,8 @@ - + @@ -4173,74 +4379,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4305,13 +4443,81 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -4379,8 +4585,8 @@ - + @@ -4448,8 +4654,8 @@ - + @@ -4518,13 +4724,6 @@ - - - - - - - @@ -4535,7 +4734,14 @@ + + + + + + + @@ -4544,35 +4750,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4604,7 +4781,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4634,25 +4840,6 @@ - - - - - - - - - - - - - - - - - - - @@ -4674,7 +4861,26 @@ + + + + + + + + + + + + + + + + + + + @@ -4694,29 +4900,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -4742,7 +4925,30 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -4766,27 +4972,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -4810,7 +4995,28 @@ + + + + + + + + + + + + + + + + + + + + + @@ -4831,26 +5037,7 @@ - - - - - - - - - - - - - - - - - - - - + @@ -4872,7 +5059,26 @@ + + + + + + + + + + + + + + + + + + + @@ -4892,6 +5098,18 @@ + + + + + + + + + + + + @@ -4913,19 +5131,7 @@ - - - - - - - - - - - - @@ -4945,17 +5151,6 @@ - - - - - - - - - - - @@ -4969,7 +5164,18 @@ + + + + + + + + + + + @@ -4981,12 +5187,6 @@ - - - - - - @@ -5003,19 +5203,19 @@ + + + + + + - - - - - - @@ -5032,7 +5232,13 @@ + + + + + + @@ -5040,13 +5246,6 @@ - - - - - - - @@ -5063,7 +5262,14 @@ + + + + + + + @@ -5078,12 +5284,6 @@ - - - - - - @@ -5100,22 +5300,19 @@ + + + + + + - - - - - - - - - @@ -5127,7 +5324,16 @@ + + + + + + + + + @@ -5137,12 +5343,6 @@ - - - - - - @@ -5160,22 +5360,19 @@ + + + + + + - - - - - - - - - @@ -5187,7 +5384,16 @@ + + + + + + + + + @@ -5206,8 +5412,8 @@ - + @@ -5215,12 +5421,6 @@ - - - - - - @@ -5229,7 +5429,13 @@ + + + + + + @@ -5237,26 +5443,26 @@ - + - + - + - + - + - + - + @@ -5266,15 +5472,6 @@ - - - - - - - - - @@ -5286,25 +5483,25 @@ - - - + + - + - - + - - + + - + + + @@ -5316,7 +5513,16 @@ + + + + + + + + + @@ -5327,24 +5533,24 @@ - + - + - + - + - + @@ -5353,15 +5559,6 @@ - - - - - - - - - @@ -5373,7 +5570,16 @@ + + + + + + + + + diff --git a/tests/data/MutatorSans.fontra/font-data.json b/tests/data/MutatorSans.fontra/font-data.json index ea0ff30..50a3a05 100644 --- a/tests/data/MutatorSans.fontra/font-data.json +++ b/tests/data/MutatorSans.fontra/font-data.json @@ -7,16 +7,9 @@ "copyright": "License same as MutatorMath. BSD 3-clause. [test-token: C]", "licenseDescription": "License same as MutatorMath. BSD 3-clause. [test-token: C]" }, +"axes": { "axes": [ { -"name": "width", -"label": "width", -"tag": "wdth", -"minValue": 0, -"defaultValue": 0, -"maxValue": 1000 -}, -{ "name": "weight", "label": "weight", "tag": "wght", @@ -32,9 +25,52 @@ 900, 850 ] +], +"valueLabels": [ +{ +"name": "Light", +"value": 100 +}, +{ +"name": "Regular", +"value": 400, +"elidable": true +}, +{ +"name": "Medium", +"value": 600 +}, +{ +"name": "Black", +"value": 900 +} ] +}, +{ +"name": "width", +"label": "width", +"tag": "wdth", +"minValue": 0, +"defaultValue": 0, +"maxValue": 1000, +"valueLabels": [ +{ +"name": "Condensed", +"value": 0 +}, +{ +"name": "Normal", +"value": 400, +"elidable": true +}, +{ +"name": "Wide", +"value": 1000 } -], +] +} +] +}, "sources": {}, "customData": {} } diff --git a/tests/data/MutatorSans.ttx b/tests/data/MutatorSans.ttx index afb24b3..1b9d54a 100644 --- a/tests/data/MutatorSans.ttx +++ b/tests/data/MutatorSans.ttx @@ -1,5 +1,5 @@ - + @@ -63,12 +63,12 @@ - + - - + + @@ -1502,10 +1502,10 @@ - width + weight - weight + width V000 @@ -1514,10 +1514,10 @@ V001 - width + weight - weight + width V000 @@ -1567,16 +1567,6 @@ - - - wdth - 0x0 - 0.0 - 0.0 - 1000.0 - 256 - - wght @@ -1584,6 +1574,16 @@ 100.0 100.0 900.0 + 256 + + + + + wdth + 0x0 + 0.0 + 0.0 + 1000.0 257 @@ -1659,8 +1659,8 @@ - + @@ -1701,8 +1701,8 @@ - + @@ -1730,8 +1730,8 @@ - + @@ -1877,8 +1877,8 @@ - + @@ -1999,8 +1999,8 @@ - + @@ -2097,8 +2097,8 @@ - + @@ -2198,8 +2198,8 @@ - + @@ -2281,8 +2281,8 @@ - + @@ -2435,8 +2435,8 @@ - + @@ -2520,8 +2520,8 @@ - + @@ -2580,8 +2580,8 @@ - + @@ -2624,8 +2624,8 @@ - + @@ -2696,8 +2696,8 @@ - + @@ -2778,8 +2778,8 @@ - + @@ -2852,8 +2852,8 @@ - + @@ -2922,8 +2922,8 @@ - + @@ -2977,8 +2977,8 @@ - + @@ -3041,8 +3041,8 @@ - + @@ -3105,8 +3105,8 @@ - + @@ -3197,8 +3197,8 @@ - + @@ -3293,8 +3293,8 @@ - + @@ -3339,8 +3339,8 @@ - + @@ -3421,8 +3421,8 @@ - + @@ -3532,8 +3532,8 @@ - + @@ -3673,8 +3673,8 @@ - + @@ -3725,8 +3725,8 @@ - + @@ -3881,8 +3881,8 @@ - + @@ -3933,8 +3933,8 @@ - + @@ -3985,8 +3985,8 @@ - + @@ -4069,8 +4069,8 @@ - + @@ -4137,8 +4137,8 @@ - + @@ -4203,8 +4203,8 @@ - + @@ -4271,8 +4271,8 @@ - + @@ -4339,8 +4339,8 @@ - + @@ -4401,8 +4401,8 @@ - + @@ -4461,8 +4461,8 @@ - + @@ -4505,8 +4505,8 @@ - + @@ -4547,8 +4547,8 @@ - + @@ -4592,8 +4592,8 @@ - + @@ -4637,8 +4637,8 @@ - + @@ -4682,8 +4682,8 @@ - + @@ -4717,8 +4717,8 @@ - + @@ -4759,8 +4759,8 @@ - + @@ -4795,8 +4795,8 @@ - + @@ -4829,8 +4829,8 @@ - + @@ -4843,8 +4843,8 @@ - + @@ -4911,8 +4911,8 @@ - + @@ -4943,8 +4943,8 @@ - + @@ -4977,8 +4977,8 @@ - + @@ -5009,8 +5009,8 @@ - + @@ -5037,8 +5037,8 @@ - + @@ -5066,8 +5066,8 @@ - + @@ -5092,8 +5092,8 @@ - + diff --git a/tests/test_workflow.py b/tests/test_workflow.py index 056c180..7353f89 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -54,6 +54,9 @@ async def test_workflow(tmpdir, workflowSource, ttxFileName): outTTXPath = tmpdir / (outPath.stem + ".ttx") subprocess.run(["ttx", "-o", outTTXPath, outPath], check=True) + # # Write expected + # ttxPath.write_text(outTTXPath.read_text()) + ttxLines = cleanupTTX(outTTXPath.read_text()) expectedLines = cleanupTTX(ttxPath.read_text()) assert expectedLines == ttxLines, outTTXPath