Add clarification about document.lib keys using reverse domain name notation. Add test for document.lib with some nested data.
1051 lines
32 KiB
ReStructuredText
1051 lines
32 KiB
ReStructuredText
#################################
|
|
DesignSpaceDocument Specification
|
|
#################################
|
|
|
|
An object to read, write and edit interpolation systems for typefaces.
|
|
|
|
- the format was originally written for MutatorMath.
|
|
- the format is now also used in fontTools.varlib.
|
|
- Define sources, axes and instances.
|
|
- Not all values might be required by all applications.
|
|
|
|
A couple of differences between things that use designspaces:
|
|
|
|
- Varlib does not support anisotropic interpolations.
|
|
- MutatorMath and Superpolator will extrapolate over the boundaries of
|
|
the axes. Varlib can not (at the moment).
|
|
- Varlib requires much less data to define an instance than
|
|
MutatorMath.
|
|
- The goals of Varlib and MutatorMath are different, so not all
|
|
attributes are always needed.
|
|
- Need to expand the description of FDK use of designspace files.
|
|
|
|
The DesignSpaceDocument object can read and write ``.designspace`` data.
|
|
It imports the axes, sources and instances to very basic **descriptor**
|
|
objects that store the data in attributes. Data is added to the document
|
|
by creating such descriptor objects, filling them with data and then
|
|
adding them to the document. This makes it easy to integrate this object
|
|
in different contexts.
|
|
|
|
The **DesignSpaceDocument** object can be subclassed to work with
|
|
different objects, as long as they have the same attributes.
|
|
|
|
.. code:: python
|
|
|
|
from designSpaceDocument import DesignSpaceDocument
|
|
doc = DesignSpaceDocument()
|
|
doc.read("some/path/to/my.designspace")
|
|
doc.axes
|
|
doc.sources
|
|
doc.instances
|
|
|
|
**********
|
|
Validation
|
|
**********
|
|
|
|
Some validation is done when reading.
|
|
|
|
Axes
|
|
====
|
|
|
|
- If the ``axes`` element is available in the document then all
|
|
locations will check their dimensions against the defined axes. If a
|
|
location uses an axis that is not defined it will be ignored.
|
|
- If there are no ``axes`` in the document, locations will accept all
|
|
axis names, so that we can..
|
|
- Use ``doc.checkAxes()`` to reconstruct axes definitions based on the
|
|
``source.location`` values. If you save the document the axes will be
|
|
there.
|
|
|
|
Default font
|
|
============
|
|
|
|
- The source with the ``copyInfo`` flag indicates this is the default
|
|
font.
|
|
- In mutatorMath the default font is selected automatically. A warning
|
|
is printed if the mutatorMath default selection differs from the one
|
|
set by ``copyInfo``. But the ``copyInfo`` source will be used.
|
|
- If no source has a ``copyInfo`` flag, mutatorMath will be used to
|
|
select one. This source gets its ``copyInfo`` flag set. If you save
|
|
the document this flag will be set.
|
|
- Use ``doc.checkDefault()`` to set the default font.
|
|
|
|
************
|
|
Localisation
|
|
************
|
|
|
|
Some of the descriptors support localised names. The names are stored in
|
|
dictionaries using the language code as key. That means that there are
|
|
now two places to store names: the old attribute and the new localised
|
|
dictionary, ``obj.stylename`` and ``obj.localisedStyleName['en']``.
|
|
|
|
*****
|
|
Rules
|
|
*****
|
|
|
|
Rules describe designspace areas in which one glyph should be replaced by another.
|
|
A rule has a name and a number of conditionsets. The rule also contains a list of
|
|
glyphname pairs: the glyphs that need to be substituted. For a rule to be triggered
|
|
**only one** of the conditionsets needs to be true, ``OR``. Within a conditionset
|
|
**all** conditions need to be true, ``AND``.
|
|
|
|
The ``sub`` element contains a pair of glyphnames. The ``name`` attribute is the glyph that should be visible when the rule evaluates to **False**. The ``with`` attribute is the glyph that should be visible when the rule evaluates to **True**.
|
|
|
|
UFO instances
|
|
=============
|
|
|
|
- When making instances as UFOs however, we need to swap the glyphs so
|
|
that the original shape is still available. For instance, if a rule
|
|
swaps ``a`` for ``a.alt``, but a glyph that references ``a`` in a
|
|
component would then show the new ``a.alt``.
|
|
- But that can lead to unexpected results. So, if there are no rules
|
|
for ``adieresis`` (assuming it references ``a``) then that glyph
|
|
**should not change appearance**. That means that when the rule swaps
|
|
``a`` and ``a.alt`` it also swaps all components that reference these
|
|
glyphs so they keep their appearance.
|
|
- The swap function also needs to take care of swapping the names in
|
|
kerning data.
|
|
|
|
**********
|
|
Python API
|
|
**********
|
|
|
|
SourceDescriptor object
|
|
=======================
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``filename``: string. A relative path to the source file, **as it is
|
|
in the document**. MutatorMath + Varlib.
|
|
- ``path``: string. Absolute path to the source file, calculated from
|
|
the document path and the string in the filename attr. MutatorMath +
|
|
Varlib.
|
|
- ``layerName``: string. The name of the layer in the source to look for
|
|
outline data. Default ``None`` which means ``foreground``.
|
|
- ``font``: Any Python object. Optional. Points to a representation of
|
|
this source font that is loaded in memory, as a Python object
|
|
(e.g. a ``defcon.Font`` or a ``fontTools.ttFont.TTFont``). The default
|
|
document reader will not fill-in this attribute, and the default
|
|
writer will not use this attribute. It is up to the user of
|
|
``designspaceLib`` to either load the resource identified by ``filename``
|
|
and store it in this field, or write the contents of this field to the
|
|
disk and make ``filename`` point to that.
|
|
- ``name``: string. Optional. Unique identifier name for this source,
|
|
if there is one or more ``instance.glyph`` elements in the document.
|
|
MutatorMath.
|
|
- ``location``: dict. Axis values for this source. MutatorMath + Varlib
|
|
- ``copyLib``: bool. Indicates if the contents of the font.lib need to
|
|
be copied to the instances. MutatorMath.
|
|
- ``copyInfo`` bool. Indicates if the non-interpolating font.info needs
|
|
to be copied to the instances. Also indicates this source is expected
|
|
to be the default font. MutatorMath + Varlib
|
|
- ``copyGroups`` bool. Indicates if the groups need to be copied to the
|
|
instances. MutatorMath.
|
|
- ``copyFeatures`` bool. Indicates if the feature text needs to be
|
|
copied to the instances. MutatorMath.
|
|
- ``muteKerning``: bool. Indicates if the kerning data from this source
|
|
needs to be muted (i.e. not be part of the calculations).
|
|
MutatorMath.
|
|
- ``muteInfo``: bool. Indicated if the interpolating font.info data for
|
|
this source needs to be muted. MutatorMath.
|
|
- ``mutedGlyphNames``: list. Glyphnames that need to be muted in the
|
|
instances. MutatorMath.
|
|
- ``familyName``: string. Family name of this source. Though this data
|
|
can be extracted from the font, it can be efficient to have it right
|
|
here. Varlib.
|
|
- ``styleName``: string. Style name of this source. Though this data
|
|
can be extracted from the font, it can be efficient to have it right
|
|
here. Varlib.
|
|
|
|
.. code:: python
|
|
|
|
doc = DesignSpaceDocument()
|
|
s1 = SourceDescriptor()
|
|
s1.path = masterPath1
|
|
s1.name = "master.ufo1"
|
|
s1.font = defcon.Font("master.ufo1")
|
|
s1.copyLib = True
|
|
s1.copyInfo = True
|
|
s1.copyFeatures = True
|
|
s1.location = dict(weight=0)
|
|
s1.familyName = "MasterFamilyName"
|
|
s1.styleName = "MasterStyleNameOne"
|
|
s1.mutedGlyphNames.append("A")
|
|
s1.mutedGlyphNames.append("Z")
|
|
doc.addSource(s1)
|
|
|
|
.. _instance-descriptor-object:
|
|
|
|
InstanceDescriptor object
|
|
=========================
|
|
|
|
.. attributes-1:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``filename``: string. Relative path to the instance file, **as it is
|
|
in the document**. The file may or may not exist. MutatorMath.
|
|
- ``path``: string. Absolute path to the source file, calculated from
|
|
the document path and the string in the filename attr. The file may
|
|
or may not exist. MutatorMath.
|
|
- ``name``: string. Unique identifier name of the instance, used to
|
|
identify it if it needs to be referenced from elsewhere in the
|
|
document.
|
|
- ``location``: dict. Axis values for this source. MutatorMath +
|
|
Varlib.
|
|
- ``familyName``: string. Family name of this instance. MutatorMath +
|
|
Varlib.
|
|
- ``localisedFamilyName``: dict. A dictionary of localised family name
|
|
strings, keyed by language code.
|
|
- ``styleName``: string. Style name of this source. MutatorMath +
|
|
Varlib.
|
|
- ``localisedStyleName``: dict. A dictionary of localised stylename
|
|
strings, keyed by language code.
|
|
- ``postScriptFontName``: string. Postscript fontname for this
|
|
instance. MutatorMath.
|
|
- ``styleMapFamilyName``: string. StyleMap familyname for this
|
|
instance. MutatorMath.
|
|
- ``localisedStyleMapFamilyName``: A dictionary of localised style map
|
|
familyname strings, keyed by language code.
|
|
- ``localisedStyleMapStyleName``: A dictionary of localised style map
|
|
stylename strings, keyed by language code.
|
|
- ``styleMapStyleName``: string. StyleMap stylename for this instance.
|
|
MutatorMath.
|
|
- ``glyphs``: dict for special master definitions for glyphs. If glyphs
|
|
need special masters (to record the results of executed rules for
|
|
example). MutatorMath.
|
|
- ``mutedGlyphNames``: list of glyphnames that should be suppressed in
|
|
the generation of this instance.
|
|
- ``kerning``: bool. Indicates if this instance needs its kerning
|
|
calculated. MutatorMath.
|
|
- ``info``: bool. Indicated if this instance needs the interpolating
|
|
font.info calculated.
|
|
- ``lib``: dict. Custom data associated with this instance.
|
|
|
|
Methods
|
|
-------
|
|
|
|
These methods give easier access to the localised names.
|
|
|
|
- ``setStyleName(styleName, languageCode="en")``
|
|
- ``getStyleName(languageCode="en")``
|
|
- ``setFamilyName(familyName, languageCode="en")``
|
|
- ``getFamilyName(self, languageCode="en")``
|
|
- ``setStyleMapStyleName(styleMapStyleName, languageCode="en")``
|
|
- ``getStyleMapStyleName(languageCode="en")``
|
|
- ``setStyleMapFamilyName(styleMapFamilyName, languageCode="en")``
|
|
- ``getStyleMapFamilyName(languageCode="en")``
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: python
|
|
|
|
i2 = InstanceDescriptor()
|
|
i2.path = instancePath2
|
|
i2.familyName = "InstanceFamilyName"
|
|
i2.styleName = "InstanceStyleName"
|
|
i2.name = "instance.ufo2"
|
|
# anisotropic location
|
|
i2.location = dict(weight=500, width=(400,300))
|
|
i2.postScriptFontName = "InstancePostscriptName"
|
|
i2.styleMapFamilyName = "InstanceStyleMapFamilyName"
|
|
i2.styleMapStyleName = "InstanceStyleMapStyleName"
|
|
glyphMasters = [dict(font="master.ufo1", glyphName="BB", location=dict(width=20,weight=20)), dict(font="master.ufo2", glyphName="CC", location=dict(width=900,weight=900))]
|
|
glyphData = dict(name="arrow", unicodeValue=1234)
|
|
glyphData['masters'] = glyphMasters
|
|
glyphData['note'] = "A note about this glyph"
|
|
glyphData['instanceLocation'] = dict(width=100, weight=120)
|
|
i2.glyphs['arrow'] = glyphData
|
|
i2.glyphs['arrow2'] = dict(mute=False)
|
|
i2.lib['com.coolDesignspaceApp.specimenText'] = 'Hamburgerwhatever'
|
|
doc.addInstance(i2)
|
|
|
|
.. _axis-descriptor-object:
|
|
|
|
AxisDescriptor object
|
|
=====================
|
|
|
|
- ``tag``: string. Four letter tag for this axis. Some might be
|
|
registered at the `OpenType
|
|
specification <https://www.microsoft.com/typography/otspec/fvar.htm#VAT>`__.
|
|
Privately-defined axis tags must begin with an uppercase letter and
|
|
use only uppercase letters or digits.
|
|
- ``name``: string. Name of the axis as it is used in the location
|
|
dicts. MutatorMath + Varlib.
|
|
- ``labelNames``: dict. When defining a non-registered axis, it will be
|
|
necessary to define user-facing readable names for the axis. Keyed by
|
|
xml:lang code. Varlib.
|
|
- ``minimum``: number. The minimum value for this axis. MutatorMath +
|
|
Varlib.
|
|
- ``maximum``: number. The maximum value for this axis. MutatorMath +
|
|
Varlib.
|
|
- ``default``: number. The default value for this axis, i.e. when a new
|
|
location is created, this is the value this axis will get.
|
|
MutatorMath + Varlib.
|
|
- ``map``: list of input / output values that can describe a warp of
|
|
user space to designspace coordinates. If no map values are present,
|
|
it is assumed it is [(minimum, minimum), (maximum, maximum)]. Varlib.
|
|
|
|
.. code:: python
|
|
|
|
a1 = AxisDescriptor()
|
|
a1.minimum = 1
|
|
a1.maximum = 1000
|
|
a1.default = 400
|
|
a1.name = "weight"
|
|
a1.tag = "wght"
|
|
a1.labelNames[u'fa-IR'] = u"قطر"
|
|
a1.labelNames[u'en'] = u"Wéíght"
|
|
a1.map = [(1.0, 10.0), (400.0, 66.0), (1000.0, 990.0)]
|
|
|
|
RuleDescriptor object
|
|
=====================
|
|
|
|
- ``name``: string. Unique name for this rule. Can be used to
|
|
reference this rule data.
|
|
- ``conditionSets``: a list of conditionsets
|
|
- Each conditionset is a list of conditions.
|
|
- Each condition is a dict with ``name``, ``minimum`` and ``maximum`` keys.
|
|
- ``subs``: list of substitutions
|
|
- Each substitution is stored as tuples of glyphnames, e.g. ("a", "a.alt").
|
|
|
|
.. code:: python
|
|
|
|
r1 = RuleDescriptor()
|
|
r1.name = "unique.rule.name"
|
|
r1.conditionsSets.append([dict(name="weight", minimum=-10, maximum=10), dict(...)])
|
|
r1.conditionsSets.append([dict(...), dict(...)])
|
|
r1.subs.append(("a", "a.alt"))
|
|
|
|
.. _subclassing-descriptors:
|
|
|
|
Subclassing descriptors
|
|
=======================
|
|
|
|
The DesignSpaceDocument can take subclassed Reader and Writer objects.
|
|
This allows you to work with your own descriptors. You could subclass
|
|
the descriptors. But as long as they have the basic attributes the
|
|
descriptor does not need to be a subclass.
|
|
|
|
.. code:: python
|
|
|
|
class MyDocReader(BaseDocReader):
|
|
ruleDescriptorClass = MyRuleDescriptor
|
|
axisDescriptorClass = MyAxisDescriptor
|
|
sourceDescriptorClass = MySourceDescriptor
|
|
instanceDescriptorClass = MyInstanceDescriptor
|
|
|
|
class MyDocWriter(BaseDocWriter):
|
|
ruleDescriptorClass = MyRuleDescriptor
|
|
axisDescriptorClass = MyAxisDescriptor
|
|
sourceDescriptorClass = MySourceDescriptor
|
|
instanceDescriptorClass = MyInstanceDescriptor
|
|
|
|
myDoc = DesignSpaceDocument(KeyedDocReader, KeyedDocWriter)
|
|
|
|
**********************
|
|
Document xml structure
|
|
**********************
|
|
|
|
- The ``axes`` element contains one or more ``axis`` elements.
|
|
- The ``sources`` element contains one or more ``source`` elements.
|
|
- The ``instances`` element contains one or more ``instance`` elements.
|
|
- The ``rules`` element contains one or more ``rule`` elements.
|
|
- The ``lib`` element contains arbitrary data.
|
|
|
|
.. code:: xml
|
|
|
|
<?xml version='1.0' encoding='utf-8'?>
|
|
<designspace format="3">
|
|
<axes>
|
|
<!-- define axes here -->
|
|
<axis../>
|
|
</axes>
|
|
<sources>
|
|
<!-- define masters here -->
|
|
<source../>
|
|
</sources>
|
|
<instances>
|
|
<!-- define instances here -->
|
|
<instance../>
|
|
</instances>
|
|
<rules>
|
|
<!-- define rules here -->
|
|
<rule../>
|
|
</rules>
|
|
<lib>
|
|
<dict>
|
|
<!-- store custom data here -->
|
|
</dict>
|
|
</lib>
|
|
</designspace>
|
|
|
|
.. 1-axis-element:
|
|
|
|
1. axis element
|
|
===============
|
|
|
|
- Define a single axis
|
|
- Child element of ``axes``
|
|
|
|
.. attributes-2:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``name``: required, string. Name of the axis that is used in the
|
|
location elements.
|
|
- ``tag``: required, string, 4 letters. Some axis tags are registered
|
|
in the OpenType Specification.
|
|
- ``minimum``: required, number. The minimum value for this axis.
|
|
- ``maximum``: required, number. The maximum value for this axis.
|
|
- ``default``: required, number. The default value for this axis.
|
|
- ``hidden``: optional, 0 or 1. Records whether this axis needs to be
|
|
hidden in interfaces.
|
|
|
|
.. code:: xml
|
|
|
|
<axis name="weight" tag="wght" minimum="1" maximum="1000" default="400">
|
|
|
|
.. 11-labelname-element:
|
|
|
|
1.1 labelname element
|
|
=====================
|
|
|
|
- Defines a human readable name for UI use.
|
|
- Optional for non-registered axis names.
|
|
- Can be localised with ``xml:lang``
|
|
- Child element of ``axis``
|
|
|
|
.. attributes-3:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``xml:lang``: required, string. `XML language
|
|
definition <https://www.w3.org/International/questions/qa-when-xmllang.en>`__
|
|
|
|
Value
|
|
-----
|
|
|
|
- The natural language name of this axis.
|
|
|
|
.. example-1:
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: xml
|
|
|
|
<labelname xml:lang="fa-IR">قطر</labelname>
|
|
<labelname xml:lang="en">Wéíght</labelname>
|
|
|
|
.. 12-map-element:
|
|
|
|
1.2 map element
|
|
===============
|
|
|
|
- Defines a single node in a series of input value / output value
|
|
pairs.
|
|
- Together these values transform the designspace.
|
|
- Child of ``axis`` element.
|
|
|
|
.. example-2:
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: xml
|
|
|
|
<map input="1.0" output="10.0" />
|
|
<map input="400.0" output="66.0" />
|
|
<map input="1000.0" output="990.0" />
|
|
|
|
Example of all axis elements together:
|
|
--------------------------------------
|
|
|
|
.. code:: xml
|
|
|
|
<axes>
|
|
<axis default="1" maximum="1000" minimum="0" name="weight" tag="wght">
|
|
<labelname xml:lang="fa-IR">قطر</labelname>
|
|
<labelname xml:lang="en">Wéíght</labelname>
|
|
</axis>
|
|
<axis default="100" maximum="200" minimum="50" name="width" tag="wdth">
|
|
<map input="50.0" output="10.0" />
|
|
<map input="100.0" output="66.0" />
|
|
<map input="200.0" output="990.0" />
|
|
</axis>
|
|
</axes>
|
|
|
|
.. 2-location-element:
|
|
|
|
2. location element
|
|
===================
|
|
|
|
- Defines a coordinate in the design space.
|
|
- Dictionary of axisname: axisvalue
|
|
- Used in ``source``, ``instance`` and ``glyph`` elements.
|
|
|
|
.. 21-dimension-element:
|
|
|
|
2.1 dimension element
|
|
=====================
|
|
|
|
- Child element of ``location``
|
|
|
|
.. attributes-4:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``name``: required, string. Name of the axis.
|
|
- ``xvalue``: required, number. The value on this axis.
|
|
- ``yvalue``: optional, number. Separate value for anisotropic
|
|
interpolations.
|
|
|
|
.. example-3:
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: xml
|
|
|
|
<location>
|
|
<dimension name="width" xvalue="0.000000" />
|
|
<dimension name="weight" xvalue="0.000000" yvalue="0.003" />
|
|
</location>
|
|
|
|
.. 3-source-element:
|
|
|
|
3. source element
|
|
=================
|
|
|
|
- Defines a single font that contributes to the designspace.
|
|
- Child element of ``sources``
|
|
|
|
.. attributes-5:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``familyname``: optional, string. The family name of the source font.
|
|
While this could be extracted from the font data itself, it can be
|
|
more efficient to add it here.
|
|
- ``stylename``: optional, string. The style name of the source font.
|
|
- ``name``: required, string. A unique name that can be used to
|
|
identify this font if it needs to be referenced elsewhere.
|
|
- ``filename``: required, string. A path to the source file, relative
|
|
to the root path of this document. The path can be at the same level
|
|
as the document or lower.
|
|
- ``layer``: optional, string. The name of the layer in the source file.
|
|
If no layer attribute is given assume the foreground layer should be used.
|
|
|
|
.. 31-lib-element:
|
|
|
|
3.1 lib element
|
|
===============
|
|
|
|
There are two meanings for the ``lib`` element:
|
|
|
|
1. Source lib
|
|
- Example: ``<lib copy="1" />``
|
|
- Child element of ``source``
|
|
- Defines if the instances can inherit the data in the lib of this
|
|
source.
|
|
- MutatorMath only
|
|
|
|
2. Document and instance lib
|
|
- Example:
|
|
|
|
.. code:: xml
|
|
|
|
<lib>
|
|
<dict>
|
|
<key>...</key>
|
|
<string>The contents use the PLIST format.</string>
|
|
</dict>
|
|
</lib>
|
|
|
|
- Child element of ``designspace`` and ``instance``
|
|
- Contains arbitrary data about the whole document or about a specific
|
|
instance.
|
|
- Items in the dict need to use **reverse domain name notation** <https://en.wikipedia.org/wiki/Reverse_domain_name_notation>__
|
|
|
|
.. 32-info-element:
|
|
|
|
3.2 info element
|
|
================
|
|
|
|
- ``<info copy="1" />``
|
|
- Child element of ``source``
|
|
- Defines if the instances can inherit the non-interpolating font info
|
|
from this source.
|
|
- MutatorMath + Varlib
|
|
- NOTE: **This presence of this element indicates this source is to be
|
|
the default font.**
|
|
|
|
.. 33-features-element:
|
|
|
|
3.3 features element
|
|
====================
|
|
|
|
- ``<features copy="1" />``
|
|
- Defines if the instances can inherit opentype feature text from this
|
|
source.
|
|
- Child element of ``source``
|
|
- MutatorMath only
|
|
|
|
.. 34-glyph-element:
|
|
|
|
3.4 glyph element
|
|
=================
|
|
|
|
- Can appear in ``source`` as well as in ``instance`` elements.
|
|
- In a ``source`` element this states if a glyph is to be excluded from
|
|
the calculation.
|
|
- MutatorMath only
|
|
|
|
.. attributes-6:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``mute``: optional attribute, number 1 or 0. Indicate if this glyph
|
|
should be ignored as a master.
|
|
- ``<glyph mute="1" name="A"/>``
|
|
- MutatorMath only
|
|
|
|
.. 35-kerning-element:
|
|
|
|
3.5 kerning element
|
|
===================
|
|
|
|
- ``<kerning mute="1" />``
|
|
- Can appear in ``source`` as well as in ``instance`` elements.
|
|
|
|
.. attributes-7:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``mute``: required attribute, number 1 or 0. Indicate if the kerning
|
|
data from this source is to be excluded from the calculation.
|
|
- If the kerning element is not present, assume ``mute=0``, yes,
|
|
include the kerning of this source in the calculation.
|
|
- MutatorMath only
|
|
|
|
.. example-4:
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: xml
|
|
|
|
<source familyname="MasterFamilyName" filename="masters/masterTest1.ufo" name="master.ufo1" stylename="MasterStyleNameOne">
|
|
<lib copy="1" />
|
|
<features copy="1" />
|
|
<info copy="1" />
|
|
<glyph mute="1" name="A" />
|
|
<glyph mute="1" name="Z" />
|
|
<location>
|
|
<dimension name="width" xvalue="0.000000" />
|
|
<dimension name="weight" xvalue="0.000000" />
|
|
</location>
|
|
</source>
|
|
|
|
.. 4-instance-element:
|
|
|
|
4. instance element
|
|
===================
|
|
|
|
- Defines a single font that can be calculated with the designspace.
|
|
- Child element of ``instances``
|
|
- For use in Varlib the instance element really only needs the names
|
|
and the location. The ``glyphs`` element is not required.
|
|
- MutatorMath uses the ``glyphs`` element to describe how certain
|
|
glyphs need different masters, mainly to describe the effects of
|
|
conditional rules in Superpolator.
|
|
|
|
.. attributes-8:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``familyname``: required, string. The family name of the instance
|
|
font. Corresponds with ``font.info.familyName``
|
|
- ``stylename``: required, string. The style name of the instance font.
|
|
Corresponds with ``font.info.styleName``
|
|
- ``name``: required, string. A unique name that can be used to
|
|
identify this font if it needs to be referenced elsewhere.
|
|
- ``filename``: string. Required for MutatorMath. A path to the
|
|
instance file, relative to the root path of this document. The path
|
|
can be at the same level as the document or lower.
|
|
- ``postscriptfontname``: string. Optional for MutatorMath. Corresponds
|
|
with ``font.info.postscriptFontName``
|
|
- ``stylemapfamilyname``: string. Optional for MutatorMath. Corresponds
|
|
with ``styleMapFamilyName``
|
|
- ``stylemapstylename``: string. Optional for MutatorMath. Corresponds
|
|
with ``styleMapStyleName``
|
|
|
|
Example for varlib
|
|
------------------
|
|
|
|
.. code:: xml
|
|
|
|
<instance familyname="InstanceFamilyName" filename="instances/instanceTest2.ufo" name="instance.ufo2" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName" stylename="InstanceStyleName">
|
|
<location>
|
|
<dimension name="width" xvalue="400" yvalue="300" />
|
|
<dimension name="weight" xvalue="66" />
|
|
</location>
|
|
<kerning />
|
|
<info />
|
|
<lib>
|
|
<dict>
|
|
<key>com.coolDesignspaceApp.specimenText</key>
|
|
<string>Hamburgerwhatever</string>
|
|
</dict>
|
|
</lib>
|
|
</instance>
|
|
|
|
.. 41-glyphs-element:
|
|
|
|
4.1 glyphs element
|
|
==================
|
|
|
|
- Container for ``glyph`` elements.
|
|
- Optional
|
|
- MutatorMath only.
|
|
|
|
.. 42-glyph-element:
|
|
|
|
4.2 glyph element
|
|
=================
|
|
|
|
- Child element of ``glyphs``
|
|
- May contain a ``location`` element.
|
|
|
|
.. attributes-9:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``name``: string. The name of the glyph.
|
|
- ``unicode``: string. Unicode values for this glyph, in hexadecimal.
|
|
Multiple values should be separated with a space.
|
|
- ``mute``: optional attribute, number 1 or 0. Indicate if this glyph
|
|
should be supressed in the output.
|
|
|
|
.. 421-note-element:
|
|
|
|
4.2.1 note element
|
|
==================
|
|
|
|
- String. The value corresponds to glyph.note in UFO.
|
|
|
|
.. 422-masters-element:
|
|
|
|
4.2.2 masters element
|
|
=====================
|
|
|
|
- Container for ``master`` elements
|
|
- These ``master`` elements define an alternative set of glyph masters
|
|
for this glyph.
|
|
|
|
.. 4221-master-element:
|
|
|
|
4.2.2.1 master element
|
|
======================
|
|
|
|
- Defines a single alternative master for this glyph.
|
|
|
|
#4.3 Localised names for intances Localised names for instances can be
|
|
included with these simple elements with an xml:lang attribute: `XML
|
|
language
|
|
definition <https://www.w3.org/International/questions/qa-when-xmllang.en>`__
|
|
|
|
- stylename
|
|
- familyname
|
|
- stylemapstylename
|
|
- stylemapfamilyname
|
|
|
|
.. example-5:
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: xml
|
|
|
|
<stylename xml:lang="fr">Demigras</stylename>
|
|
<stylename xml:lang="ja">半ば</stylename>
|
|
<familyname xml:lang="fr">Montserrat</familyname>
|
|
<familyname xml:lang="ja">モンセラート</familyname>
|
|
<stylemapstylename xml:lang="de">Standard</stylemapstylename>
|
|
<stylemapfamilyname xml:lang="de">Montserrat Halbfett</stylemapfamilyname>
|
|
<stylemapfamilyname xml:lang="ja">モンセラート SemiBold</stylemapfamilyname>
|
|
|
|
.. attributes-10:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``glyphname``: the name of the alternate master glyph.
|
|
- ``source``: the identifier name of the source this master glyph needs
|
|
to be loaded from
|
|
|
|
.. example-6:
|
|
|
|
Example
|
|
-------
|
|
|
|
.. code:: xml
|
|
|
|
<instance familyname="InstanceFamilyName" filename="instances/instanceTest2.ufo" name="instance.ufo2" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName" stylename="InstanceStyleName">
|
|
<location>
|
|
<dimension name="width" xvalue="400" yvalue="300" />
|
|
<dimension name="weight" xvalue="66" />
|
|
</location>
|
|
<glyphs>
|
|
<glyph name="arrow2" />
|
|
<glyph name="arrow" unicode="0x4d2 0x4d3">
|
|
<location>
|
|
<dimension name="width" xvalue="100" />
|
|
<dimension name="weight" xvalue="120" />
|
|
</location>
|
|
<note>A note about this glyph</note>
|
|
<masters>
|
|
<master glyphname="BB" source="master.ufo1">
|
|
<location>
|
|
<dimension name="width" xvalue="20" />
|
|
<dimension name="weight" xvalue="20" />
|
|
</location>
|
|
</master>
|
|
</masters>
|
|
</glyph>
|
|
</glyphs>
|
|
<kerning />
|
|
<info />
|
|
<lib>
|
|
<dict>
|
|
<key>com.coolDesignspaceApp.specimenText</key>
|
|
<string>Hamburgerwhatever</string>
|
|
</dict>
|
|
</lib>
|
|
</instance>
|
|
|
|
.. 50-rules-element:
|
|
|
|
5.0 rules element
|
|
=================
|
|
|
|
- Container for ``rule`` elements
|
|
- The rules are evaluated in this order.
|
|
|
|
.. 51-rule-element:
|
|
|
|
5.1 rule element
|
|
================
|
|
|
|
- Defines a named rule.
|
|
- Each ``rule`` element contains one or more ``conditionset`` elements.
|
|
- Only one ``conditionset`` needs to be true to trigger the rule.
|
|
- All conditions in a ``conditionset`` must be true to make the ``conditionset`` true.
|
|
- For backwards compatibility a ``rule`` can contain ``condition`` elements outside of a conditionset. These are then understood to be part of a single, implied, ``conditionset``. Note: these conditions should be written wrapped in a conditionset.
|
|
- A rule element needs to contain one or more ``sub`` elements in order to be compiled to a variable font.
|
|
- Rules without sub elements should be ignored when compiling a font.
|
|
- For authoring tools it might be necessary to save designspace files without ``sub`` elements just because the work is incomplete.
|
|
|
|
.. attributes-11:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``name``: optional, string. A unique name that can be used to
|
|
identify this rule if it needs to be referenced elsewhere. The name
|
|
is not important for compiling variable fonts.
|
|
|
|
5.1.1 conditionset element
|
|
=======================
|
|
|
|
- Child element of ``rule``
|
|
- Contains one or more ``condition`` elements.
|
|
|
|
.. 512-condition-element:
|
|
|
|
5.1.2 condition element
|
|
=======================
|
|
|
|
- Child element of ``conditionset``
|
|
- Between the ``minimum`` and ``maximum`` this rule is ``True``.
|
|
- If ``minimum`` is not available, assume it is ``axis.minimum``.
|
|
- If ``maximum`` is not available, assume it is ``axis.maximum``.
|
|
- The condition must contain at least a minimum or maximum or both.
|
|
|
|
.. attributes-12:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``name``: string, required. Must match one of the defined ``axis``
|
|
name attributes.
|
|
- ``minimum``: number, required*. The low value.
|
|
- ``maximum``: number, required*. The high value.
|
|
|
|
.. 513-sub-element:
|
|
|
|
5.1.3 sub element
|
|
=================
|
|
|
|
- Child element of ``rule``.
|
|
- Defines which glyph to replace when the rule evaluates to **True**.
|
|
|
|
.. attributes-13:
|
|
|
|
Attributes
|
|
----------
|
|
|
|
- ``name``: string, required. The name of the glyph this rule looks
|
|
for.
|
|
- ``with``: string, required. The name of the glyph it is replaced
|
|
with.
|
|
|
|
.. example-7:
|
|
|
|
Example
|
|
-------
|
|
|
|
Example with an implied ``conditionset``. Here the conditions are not
|
|
contained in a conditionset.
|
|
|
|
.. code:: xml
|
|
|
|
<rules>
|
|
<rule name="named.rule.1">
|
|
<condition minimum="250" maximum="750" name="weight" />
|
|
<condition minimum="50" maximum="100" name="width" />
|
|
<sub name="dollar" with="dollar.alt"/>
|
|
</rule>
|
|
</rules>
|
|
|
|
Example with ``conditionsets``. All conditions in a conditionset must be true.
|
|
|
|
.. code:: xml
|
|
|
|
<rules>
|
|
<rule name="named.rule.2">
|
|
<conditionset>
|
|
<condition minimum="250" maximum="750" name="weight" />
|
|
<condition minimum="50" maximum="100" name="width" />
|
|
</conditionset>
|
|
<conditionset>
|
|
<condition ... />
|
|
<condition ... />
|
|
</conditionset>
|
|
<sub name="dollar" with="dollar.alt"/>
|
|
</rule>
|
|
</rules>
|
|
|
|
.. 6-notes:
|
|
|
|
6 Notes
|
|
=======
|
|
|
|
Paths and filenames
|
|
-------------------
|
|
|
|
A designspace file needs to store many references to UFO files.
|
|
|
|
- designspace files can be part of versioning systems and appear on
|
|
different computers. This means it is not possible to store absolute
|
|
paths.
|
|
- So, all paths are relative to the designspace document path.
|
|
- Using relative paths allows designspace files and UFO files to be
|
|
**near** each other, and that they can be **found** without enforcing
|
|
one particular structure.
|
|
- The **filename** attribute in the ``SourceDescriptor`` and
|
|
``InstanceDescriptor`` classes stores the preferred relative path.
|
|
- The **path** attribute in these objects stores the absolute path. It
|
|
is calculated from the document path and the relative path in the
|
|
filename attribute when the object is created.
|
|
- Only the **filename** attribute is written to file.
|
|
- Both **filename** and **path** must use forward slashes (``/``) as
|
|
path separators, even on Windows.
|
|
|
|
Right before we save we need to identify and respond to the following
|
|
situations:
|
|
|
|
In each descriptor, we have to do the right thing for the filename
|
|
attribute. Before writing to file, the ``documentObject.updatePaths()``
|
|
method prepares the paths as follows:
|
|
|
|
**Case 1**
|
|
|
|
::
|
|
|
|
descriptor.filename == None
|
|
descriptor.path == None
|
|
|
|
**Action**
|
|
|
|
- write as is, descriptors will not have a filename attr. Useless, but
|
|
no reason to interfere.
|
|
|
|
**Case 2**
|
|
|
|
::
|
|
|
|
descriptor.filename == "../something"
|
|
descriptor.path == None
|
|
|
|
**Action**
|
|
|
|
- write as is. The filename attr should not be touched.
|
|
|
|
**Case 3**
|
|
|
|
::
|
|
|
|
descriptor.filename == None
|
|
descriptor.path == "~/absolute/path/there"
|
|
|
|
**Action**
|
|
|
|
- calculate the relative path for filename. We're not overwriting some
|
|
other value for filename, it should be fine.
|
|
|
|
**Case 4**
|
|
|
|
::
|
|
|
|
descriptor.filename == '../somewhere'
|
|
descriptor.path == "~/absolute/path/there"
|
|
|
|
**Action**
|
|
|
|
- There is a conflict between the given filename, and the path. The
|
|
difference could have happened for any number of reasons. Assuming
|
|
the values were not in conflict when the object was created, either
|
|
could have changed. We can't guess.
|
|
- Assume the path attribute is more up to date. Calculate a new value
|
|
for filename based on the path and the document path.
|
|
|
|
Recommendation for editors
|
|
--------------------------
|
|
|
|
- If you want to explicitly set the **filename** attribute, leave the
|
|
path attribute empty.
|
|
- If you want to explicitly set the **path** attribute, leave the
|
|
filename attribute empty. It will be recalculated.
|
|
- Use ``documentObject.updateFilenameFromPath()`` to explicitly set the
|
|
**filename** attributes for all instance and source descriptors.
|
|
|
|
.. 7-this-document:
|
|
|
|
7 This document
|
|
===============
|
|
|
|
- The package is rather new and changes are to be expected.
|