Home | History | Annotate | Download | only in designspaceLib
      1 #################################
      2 DesignSpaceDocument Specification
      3 #################################
      4 
      5 An object to read, write and edit interpolation systems for typefaces.
      6 
      7 -  the format was originally written for MutatorMath.
      8 -  the format is now also used in fontTools.varlib.
      9 -  Define sources, axes and instances.
     10 -  Not all values might be required by all applications.
     11 
     12 A couple of differences between things that use designspaces:
     13 
     14 -  Varlib does not support anisotropic interpolations.
     15 -  MutatorMath and Superpolator will extrapolate over the boundaries of
     16    the axes. Varlib can not (at the moment).
     17 -  Varlib requires much less data to define an instance than
     18    MutatorMath.
     19 -  The goals of Varlib and MutatorMath are different, so not all
     20    attributes are always needed.
     21 -  Need to expand the description of FDK use of designspace files.
     22 
     23 The DesignSpaceDocument object can read and write ``.designspace`` data.
     24 It imports the axes, sources and instances to very basic **descriptor**
     25 objects that store the data in attributes. Data is added to the document
     26 by creating such descriptor objects, filling them with data and then
     27 adding them to the document. This makes it easy to integrate this object
     28 in different contexts.
     29 
     30 The **DesignSpaceDocument** object can be subclassed to work with
     31 different objects, as long as they have the same attributes.
     32 
     33 .. code:: python
     34 
     35     from designSpaceDocument import DesignSpaceDocument
     36     doc = DesignSpaceDocument()
     37     doc.read("some/path/to/my.designspace")
     38     doc.axes
     39     doc.sources
     40     doc.instances
     41 
     42 **********
     43 Validation
     44 **********
     45 
     46 Some validation is done when reading.
     47 
     48 Axes
     49 ====
     50 
     51 -  If the ``axes`` element is available in the document then all
     52    locations will check their dimensions against the defined axes. If a
     53    location uses an axis that is not defined it will be ignored.
     54 -  If there are no ``axes`` in the document, locations will accept all
     55    axis names, so that we can..
     56 -  Use ``doc.checkAxes()`` to reconstruct axes definitions based on the
     57    ``source.location`` values. If you save the document the axes will be
     58    there.
     59 
     60 Default font
     61 ============
     62 
     63 -  The source with the ``copyInfo`` flag indicates this is the default
     64    font.
     65 -  In mutatorMath the default font is selected automatically. A warning
     66    is printed if the mutatorMath default selection differs from the one
     67    set by ``copyInfo``. But the ``copyInfo`` source will be used.
     68 -  If no source has a ``copyInfo`` flag, mutatorMath will be used to
     69    select one. This source gets its ``copyInfo`` flag set. If you save
     70    the document this flag will be set.
     71 -  Use ``doc.checkDefault()`` to set the default font.
     72 
     73 ************
     74 Localisation
     75 ************
     76 
     77 Some of the descriptors support localised names. The names are stored in
     78 dictionaries using the language code as key. That means that there are
     79 now two places to store names: the old attribute and the new localised
     80 dictionary, ``obj.stylename`` and ``obj.localisedStyleName['en']``.
     81 
     82 *****
     83 Rules
     84 *****
     85 
     86 Rules describe designspace areas in which one glyph should be replaced by another.
     87 A rule has a name and a number of conditionsets. The rule also contains a list of
     88 glyphname pairs: the glyphs that need to be substituted. For a rule to be triggered
     89 **only one** of the conditionsets needs to be true, ``OR``. Within a conditionset 
     90 **all** conditions need to be true, ``AND``.
     91 
     92 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**.
     93 
     94 UFO instances
     95 =============
     96 
     97 -  When making instances as UFOs however, we need to swap the glyphs so
     98    that the original shape is still available. For instance, if a rule
     99    swaps ``a`` for ``a.alt``, but a glyph that references ``a`` in a
    100    component would then show the new ``a.alt``.
    101 -  But that can lead to unexpected results. So, if there are no rules
    102    for ``adieresis`` (assuming it references ``a``) then that glyph
    103    **should not change appearance**. That means that when the rule swaps
    104    ``a`` and ``a.alt`` it also swaps all components that reference these
    105    glyphs so they keep their appearance.
    106 -  The swap function also needs to take care of swapping the names in
    107    kerning data.
    108 
    109 **********
    110 Python API
    111 **********
    112 
    113 SourceDescriptor object
    114 =======================
    115 
    116 Attributes
    117 ----------
    118 
    119 -  ``filename``: string. A relative path to the source file, **as it is
    120    in the document**. MutatorMath + Varlib.
    121 -  ``path``: string. Absolute path to the source file, calculated from
    122    the document path and the string in the filename attr. MutatorMath +
    123    Varlib.
    124 -  ``layerName``: string. The name of the layer in the source to look for
    125    outline data. Default ``None`` which means ``foreground``.
    126 -  ``font``: Any Python object. Optional. Points to a representation of
    127    this source font that is loaded in memory, as a Python object
    128    (e.g. a ``defcon.Font`` or a ``fontTools.ttFont.TTFont``). The default
    129    document reader will not fill-in this attribute, and the default
    130    writer will not use this attribute. It is up to the user of
    131    ``designspaceLib`` to either load the resource identified by ``filename``
    132    and store it in this field, or write the contents of this field to the
    133    disk and make ``filename`` point to that.
    134 -  ``name``: string. Optional. Unique identifier name for this source,
    135    if there is one or more ``instance.glyph`` elements in the document.
    136    MutatorMath.
    137 -  ``location``: dict. Axis values for this source. MutatorMath + Varlib
    138 -  ``copyLib``: bool. Indicates if the contents of the font.lib need to
    139    be copied to the instances. MutatorMath.
    140 -  ``copyInfo`` bool. Indicates if the non-interpolating font.info needs
    141    to be copied to the instances. Also indicates this source is expected
    142    to be the default font. MutatorMath + Varlib
    143 -  ``copyGroups`` bool. Indicates if the groups need to be copied to the
    144    instances. MutatorMath.
    145 -  ``copyFeatures`` bool. Indicates if the feature text needs to be
    146    copied to the instances. MutatorMath.
    147 -  ``muteKerning``: bool. Indicates if the kerning data from this source
    148    needs to be muted (i.e. not be part of the calculations).
    149    MutatorMath.
    150 -  ``muteInfo``: bool. Indicated if the interpolating font.info data for
    151    this source needs to be muted. MutatorMath.
    152 -  ``mutedGlyphNames``: list. Glyphnames that need to be muted in the
    153    instances. MutatorMath.
    154 -  ``familyName``: string. Family name of this source. Though this data
    155    can be extracted from the font, it can be efficient to have it right
    156    here. Varlib.
    157 -  ``styleName``: string. Style name of this source. Though this data
    158    can be extracted from the font, it can be efficient to have it right
    159    here. Varlib.
    160 
    161 .. code:: python
    162 
    163     doc = DesignSpaceDocument()
    164     s1 = SourceDescriptor()
    165     s1.path = masterPath1
    166     s1.name = "master.ufo1"
    167     s1.font = defcon.Font("master.ufo1")
    168     s1.copyLib = True
    169     s1.copyInfo = True
    170     s1.copyFeatures = True
    171     s1.location = dict(weight=0)
    172     s1.familyName = "MasterFamilyName"
    173     s1.styleName = "MasterStyleNameOne"
    174     s1.mutedGlyphNames.append("A")
    175     s1.mutedGlyphNames.append("Z")
    176     doc.addSource(s1)
    177 
    178 .. _instance-descriptor-object:
    179 
    180 InstanceDescriptor object
    181 =========================
    182 
    183 .. attributes-1:
    184 
    185 Attributes
    186 ----------
    187 
    188 -  ``filename``: string. Relative path to the instance file, **as it is
    189    in the document**. The file may or may not exist. MutatorMath.
    190 -  ``path``: string. Absolute path to the source file, calculated from
    191    the document path and the string in the filename attr. The file may
    192    or may not exist. MutatorMath.
    193 -  ``name``: string. Unique identifier name of the instance, used to
    194    identify it if it needs to be referenced from elsewhere in the
    195    document.
    196 -  ``location``: dict. Axis values for this source. MutatorMath +
    197    Varlib.
    198 -  ``familyName``: string. Family name of this instance. MutatorMath +
    199    Varlib.
    200 -  ``localisedFamilyName``: dict. A dictionary of localised family name
    201    strings, keyed by language code.
    202 -  ``styleName``: string. Style name of this source. MutatorMath +
    203    Varlib.
    204 -  ``localisedStyleName``: dict. A dictionary of localised stylename
    205    strings, keyed by language code.
    206 -  ``postScriptFontName``: string. Postscript fontname for this
    207    instance. MutatorMath.
    208 -  ``styleMapFamilyName``: string. StyleMap familyname for this
    209    instance. MutatorMath.
    210 -  ``localisedStyleMapFamilyName``: A dictionary of localised style map
    211    familyname strings, keyed by language code.
    212 -  ``localisedStyleMapStyleName``: A dictionary of localised style map
    213    stylename strings, keyed by language code.
    214 -  ``styleMapStyleName``: string. StyleMap stylename for this instance.
    215    MutatorMath.
    216 -  ``glyphs``: dict for special master definitions for glyphs. If glyphs
    217    need special masters (to record the results of executed rules for
    218    example). MutatorMath.
    219 -  ``kerning``: bool. Indicates if this instance needs its kerning
    220    calculated. MutatorMath.
    221 -  ``info``: bool. Indicated if this instance needs the interpolating
    222    font.info calculated.
    223 -  ``lib``: dict. Custom data associated with this instance.
    224 
    225 Methods
    226 -------
    227 
    228 These methods give easier access to the localised names.
    229 
    230 -  ``setStyleName(styleName, languageCode="en")``
    231 -  ``getStyleName(languageCode="en")``
    232 -  ``setFamilyName(familyName, languageCode="en")``
    233 -  ``getFamilyName(self, languageCode="en")``
    234 -  ``setStyleMapStyleName(styleMapStyleName, languageCode="en")``
    235 -  ``getStyleMapStyleName(languageCode="en")``
    236 -  ``setStyleMapFamilyName(styleMapFamilyName, languageCode="en")``
    237 -  ``getStyleMapFamilyName(languageCode="en")``
    238 
    239 Example
    240 -------
    241 
    242 .. code:: python
    243 
    244     i2 = InstanceDescriptor()
    245     i2.path = instancePath2
    246     i2.familyName = "InstanceFamilyName"
    247     i2.styleName = "InstanceStyleName"
    248     i2.name = "instance.ufo2"
    249     # anisotropic location
    250     i2.location = dict(weight=500, width=(400,300))
    251     i2.postScriptFontName = "InstancePostscriptName"
    252     i2.styleMapFamilyName = "InstanceStyleMapFamilyName"
    253     i2.styleMapStyleName = "InstanceStyleMapStyleName"
    254     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))]
    255     glyphData = dict(name="arrow", unicodeValue=1234)
    256     glyphData['masters'] = glyphMasters
    257     glyphData['note'] = "A note about this glyph"
    258     glyphData['instanceLocation'] = dict(width=100, weight=120)
    259     i2.glyphs['arrow'] = glyphData
    260     i2.glyphs['arrow2'] = dict(mute=False)
    261     i2.lib['com.coolDesignspaceApp.specimenText'] = 'Hamburgerwhatever'
    262     doc.addInstance(i2)
    263 
    264 .. _axis-descriptor-object:
    265 
    266 AxisDescriptor object
    267 =====================
    268 
    269 -  ``tag``: string. Four letter tag for this axis. Some might be
    270    registered at the `OpenType
    271    specification <https://www.microsoft.com/typography/otspec/fvar.htm#VAT>`__.
    272    Privately-defined axis tags must begin with an uppercase letter and
    273    use only uppercase letters or digits.
    274 -  ``name``: string. Name of the axis as it is used in the location
    275    dicts. MutatorMath + Varlib.
    276 -  ``labelNames``: dict. When defining a non-registered axis, it will be
    277    necessary to define user-facing readable names for the axis. Keyed by
    278    xml:lang code. Values are required to be ``unicode`` strings, even if
    279    they only contain ASCII characters.
    280 -  ``minimum``: number. The minimum value for this axis in user space.
    281    MutatorMath + Varlib.
    282 -  ``maximum``: number. The maximum value for this axis in user space.
    283    MutatorMath + Varlib.
    284 -  ``default``: number. The default value for this axis, i.e. when a new
    285    location is created, this is the value this axis will get in user
    286    space. MutatorMath + Varlib.
    287 -  ``map``: list of input / output values that can describe a warp of user space
    288    to design space coordinates. If no map values are present, it is assumed user
    289    space is the same as design space, as in [(minimum, minimum), (maximum, maximum)].
    290    Varlib.
    291 
    292 .. code:: python
    293 
    294     a1 = AxisDescriptor()
    295     a1.minimum = 1
    296     a1.maximum = 1000
    297     a1.default = 400
    298     a1.name = "weight"
    299     a1.tag = "wght"
    300     a1.labelNames[u'fa-IR'] = u""
    301     a1.labelNames[u'en'] = u"Wght"
    302     a1.map = [(1.0, 10.0), (400.0, 66.0), (1000.0, 990.0)]
    303 
    304 RuleDescriptor object
    305 =====================
    306 
    307 -  ``name``: string. Unique name for this rule. Can be used to
    308    reference this rule data.
    309 -  ``conditionSets``: a list of conditionsets
    310 -  Each conditionset is a list of conditions.
    311 -  Each condition is a dict with ``name``, ``minimum`` and ``maximum`` keys.
    312 -  ``subs``: list of substitutions
    313 -  Each substitution is stored as tuples of glyphnames, e.g. ("a", "a.alt").
    314 
    315 .. code:: python
    316 
    317     r1 = RuleDescriptor()
    318     r1.name = "unique.rule.name"
    319     r1.conditionsSets.append([dict(name="weight", minimum=-10, maximum=10), dict(...)])
    320     r1.conditionsSets.append([dict(...), dict(...)])
    321     r1.subs.append(("a", "a.alt"))
    322 
    323 .. _subclassing-descriptors:
    324 
    325 Subclassing descriptors
    326 =======================
    327 
    328 The DesignSpaceDocument can take subclassed Reader and Writer objects.
    329 This allows you to work with your own descriptors. You could subclass
    330 the descriptors. But as long as they have the basic attributes the
    331 descriptor does not need to be a subclass.
    332 
    333 .. code:: python
    334 
    335     class MyDocReader(BaseDocReader):
    336         ruleDescriptorClass = MyRuleDescriptor
    337         axisDescriptorClass = MyAxisDescriptor
    338         sourceDescriptorClass = MySourceDescriptor
    339         instanceDescriptorClass = MyInstanceDescriptor
    340 
    341     class MyDocWriter(BaseDocWriter):
    342         ruleDescriptorClass = MyRuleDescriptor
    343         axisDescriptorClass = MyAxisDescriptor
    344         sourceDescriptorClass = MySourceDescriptor
    345         instanceDescriptorClass = MyInstanceDescriptor
    346 
    347     myDoc = DesignSpaceDocument(KeyedDocReader, KeyedDocWriter)
    348 
    349 **********************
    350 Document xml structure
    351 **********************
    352 
    353 -  The ``axes`` element contains one or more ``axis`` elements.
    354 -  The ``sources`` element contains one or more ``source`` elements.
    355 -  The ``instances`` element contains one or more ``instance`` elements.
    356 -  The ``rules`` element contains one or more ``rule`` elements.
    357 -  The ``lib`` element contains arbitrary data.
    358 
    359 .. code:: xml
    360 
    361     <?xml version='1.0' encoding='utf-8'?>
    362     <designspace format="3">
    363         <axes>
    364             <!-- define axes here -->
    365             <axis../>
    366         </axes>
    367         <sources>
    368             <!-- define masters here -->
    369             <source../>
    370         </sources>
    371         <instances>
    372             <!-- define instances here -->
    373             <instance../>
    374         </instances>
    375         <rules>
    376             <!-- define rules here -->
    377             <rule../>
    378         </rules>
    379         <lib>
    380             <dict>
    381                 <!-- store custom data here -->
    382             </dict>
    383         </lib>
    384     </designspace>
    385 
    386 .. 1-axis-element:
    387 
    388 1. axis element
    389 ===============
    390 
    391 -  Define a single axis
    392 -  Child element of ``axes``
    393 
    394 .. attributes-2:
    395 
    396 Attributes
    397 ----------
    398 
    399 -  ``name``: required, string. Name of the axis that is used in the
    400    location elements.
    401 -  ``tag``: required, string, 4 letters. Some axis tags are registered
    402    in the OpenType Specification.
    403 -  ``minimum``: required, number. The minimum value for this axis.
    404 -  ``maximum``: required, number. The maximum value for this axis.
    405 -  ``default``: required, number. The default value for this axis.
    406 -  ``hidden``: optional, 0 or 1. Records whether this axis needs to be
    407    hidden in interfaces.
    408 
    409 .. code:: xml
    410 
    411     <axis name="weight" tag="wght" minimum="1" maximum="1000" default="400">
    412 
    413 .. 11-labelname-element:
    414 
    415 1.1 labelname element
    416 =====================
    417 
    418 -  Defines a human readable name for UI use.
    419 -  Optional for non-registered axis names.
    420 -  Can be localised with ``xml:lang``
    421 -  Child element of ``axis``
    422 
    423 .. attributes-3:
    424 
    425 Attributes
    426 ----------
    427 
    428 -  ``xml:lang``: required, string. `XML language
    429    definition <https://www.w3.org/International/questions/qa-when-xmllang.en>`__
    430 
    431 Value
    432 -----
    433 
    434 -  The natural language name of this axis.
    435 
    436 .. example-1:
    437 
    438 Example
    439 -------
    440 
    441 .. code:: xml
    442 
    443     <labelname xml:lang="fa-IR"></labelname>
    444     <labelname xml:lang="en">Wght</labelname>
    445 
    446 .. 12-map-element:
    447 
    448 1.2 map element
    449 ===============
    450 
    451 -  Defines a single node in a series of input value / output value
    452    pairs.
    453 -  Together these values transform the designspace.
    454 -  Child of ``axis`` element.
    455 
    456 .. example-2:
    457 
    458 Example
    459 -------
    460 
    461 .. code:: xml
    462 
    463     <map input="1.0" output="10.0" />
    464     <map input="400.0" output="66.0" />
    465     <map input="1000.0" output="990.0" />
    466 
    467 Example of all axis elements together:
    468 --------------------------------------
    469 
    470 .. code:: xml
    471 
    472         <axes>
    473             <axis default="1" maximum="1000" minimum="0" name="weight" tag="wght">
    474                 <labelname xml:lang="fa-IR"></labelname>
    475                 <labelname xml:lang="en">Wght</labelname>
    476             </axis>
    477             <axis default="100" maximum="200" minimum="50" name="width" tag="wdth">
    478                 <map input="50.0" output="10.0" />
    479                 <map input="100.0" output="66.0" />
    480                 <map input="200.0" output="990.0" />
    481             </axis>
    482         </axes>
    483 
    484 .. 2-location-element:
    485 
    486 2. location element
    487 ===================
    488 
    489 -  Defines a coordinate in the design space.
    490 -  Dictionary of axisname: axisvalue
    491 -  Used in ``source``, ``instance`` and ``glyph`` elements.
    492 
    493 .. 21-dimension-element:
    494 
    495 2.1 dimension element
    496 =====================
    497 
    498 -  Child element of ``location``
    499 
    500 .. attributes-4:
    501 
    502 Attributes
    503 ----------
    504 
    505 -  ``name``: required, string. Name of the axis.
    506 -  ``xvalue``: required, number. The value on this axis.
    507 -  ``yvalue``: optional, number. Separate value for anisotropic
    508    interpolations.
    509 
    510 .. example-3:
    511 
    512 Example
    513 -------
    514 
    515 .. code:: xml
    516 
    517     <location>
    518         <dimension name="width" xvalue="0.000000" />
    519         <dimension name="weight" xvalue="0.000000" yvalue="0.003" />
    520     </location>
    521 
    522 .. 3-source-element:
    523 
    524 3. source element
    525 =================
    526 
    527 -  Defines a single font that contributes to the designspace.
    528 -  Child element of ``sources``
    529 
    530 .. attributes-5:
    531 
    532 Attributes
    533 ----------
    534 
    535 -  ``familyname``: optional, string. The family name of the source font.
    536    While this could be extracted from the font data itself, it can be
    537    more efficient to add it here.
    538 -  ``stylename``: optional, string. The style name of the source font.
    539 -  ``name``: required, string. A unique name that can be used to
    540    identify this font if it needs to be referenced elsewhere.
    541 -  ``filename``: required, string. A path to the source file, relative
    542    to the root path of this document. The path can be at the same level
    543    as the document or lower.
    544 -  ``layer``: optional, string. The name of the layer in the source file.
    545    If no layer attribute is given assume the foreground layer should be used.
    546 
    547 .. 31-lib-element:
    548 
    549 3.1 lib element
    550 ===============
    551 
    552 There are two meanings for the ``lib`` element:
    553 
    554 1. Source lib
    555     -  Example: ``<lib copy="1" />``
    556     -  Child element of ``source``
    557     -  Defines if the instances can inherit the data in the lib of this
    558        source.
    559     -  MutatorMath only
    560 
    561 2. Document and instance lib
    562     - Example:
    563 
    564       .. code:: xml
    565 
    566         <lib>
    567             <dict>
    568                 <key>...</key>
    569                 <string>The contents use the PLIST format.</string>
    570             </dict>
    571         </lib>
    572 
    573     - Child element of ``designspace`` and ``instance``
    574     - Contains arbitrary data about the whole document or about a specific
    575       instance.
    576     - Items in the dict need to use **reverse domain name notation** <https://en.wikipedia.org/wiki/Reverse_domain_name_notation>__
    577 
    578 .. 32-info-element:
    579 
    580 3.2 info element
    581 ================
    582 
    583 -  ``<info copy="1" />``
    584 -  Child element of ``source``
    585 -  Defines if the instances can inherit the non-interpolating font info
    586    from this source.
    587 -  MutatorMath + Varlib
    588 -  NOTE: **This presence of this element indicates this source is to be
    589    the default font.**
    590 
    591 .. 33-features-element:
    592 
    593 3.3 features element
    594 ====================
    595 
    596 -  ``<features copy="1" />``
    597 -  Defines if the instances can inherit opentype feature text from this
    598    source.
    599 -  Child element of ``source``
    600 -  MutatorMath only
    601 
    602 .. 34-glyph-element:
    603 
    604 3.4 glyph element
    605 =================
    606 
    607 -  Can appear in ``source`` as well as in ``instance`` elements.
    608 -  In a ``source`` element this states if a glyph is to be excluded from
    609    the calculation.
    610 -  MutatorMath only
    611 
    612 .. attributes-6:
    613 
    614 Attributes
    615 ----------
    616 
    617 -  ``mute``: optional attribute, number 1 or 0. Indicate if this glyph
    618    should be ignored as a master.
    619 -  ``<glyph mute="1" name="A"/>``
    620 -  MutatorMath only
    621 
    622 .. 35-kerning-element:
    623 
    624 3.5 kerning element
    625 ===================
    626 
    627 -  ``<kerning mute="1" />``
    628 -  Can appear in ``source`` as well as in ``instance`` elements.
    629 
    630 .. attributes-7:
    631 
    632 Attributes
    633 ----------
    634 
    635 -  ``mute``: required attribute, number 1 or 0. Indicate if the kerning
    636    data from this source is to be excluded from the calculation.
    637 -  If the kerning element is not present, assume ``mute=0``, yes,
    638    include the kerning of this source in the calculation.
    639 -  MutatorMath only
    640 
    641 .. example-4:
    642 
    643 Example
    644 -------
    645 
    646 .. code:: xml
    647 
    648     <source familyname="MasterFamilyName" filename="masters/masterTest1.ufo" name="master.ufo1" stylename="MasterStyleNameOne">
    649         <lib copy="1" />
    650         <features copy="1" />
    651         <info copy="1" />
    652         <glyph mute="1" name="A" />
    653         <glyph mute="1" name="Z" />
    654         <location>
    655             <dimension name="width" xvalue="0.000000" />
    656             <dimension name="weight" xvalue="0.000000" />
    657         </location>
    658     </source>
    659 
    660 .. 4-instance-element:
    661 
    662 4. instance element
    663 ===================
    664 
    665 -  Defines a single font that can be calculated with the designspace.
    666 -  Child element of ``instances``
    667 -  For use in Varlib the instance element really only needs the names
    668    and the location. The ``glyphs`` element is not required.
    669 -  MutatorMath uses the ``glyphs`` element to describe how certain
    670    glyphs need different masters, mainly to describe the effects of
    671    conditional rules in Superpolator.
    672 
    673 .. attributes-8:
    674 
    675 Attributes
    676 ----------
    677 
    678 -  ``familyname``: required, string. The family name of the instance
    679    font. Corresponds with ``font.info.familyName``
    680 -  ``stylename``: required, string. The style name of the instance font.
    681    Corresponds with ``font.info.styleName``
    682 -  ``name``: required, string. A unique name that can be used to
    683    identify this font if it needs to be referenced elsewhere.
    684 -  ``filename``: string. Required for MutatorMath. A path to the
    685    instance file, relative to the root path of this document. The path
    686    can be at the same level as the document or lower.
    687 -  ``postscriptfontname``: string. Optional for MutatorMath. Corresponds
    688    with ``font.info.postscriptFontName``
    689 -  ``stylemapfamilyname``: string. Optional for MutatorMath. Corresponds
    690    with ``styleMapFamilyName``
    691 -  ``stylemapstylename``: string. Optional for MutatorMath. Corresponds
    692    with ``styleMapStyleName``
    693 
    694 Example for varlib
    695 ------------------
    696 
    697 .. code:: xml
    698 
    699     <instance familyname="InstanceFamilyName" filename="instances/instanceTest2.ufo" name="instance.ufo2" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName" stylename="InstanceStyleName">
    700     <location>
    701         <dimension name="width" xvalue="400" yvalue="300" />
    702         <dimension name="weight" xvalue="66" />
    703     </location>
    704     <kerning />
    705     <info />
    706     <lib>
    707         <dict>
    708             <key>com.coolDesignspaceApp.specimenText</key>
    709             <string>Hamburgerwhatever</string>
    710         </dict>
    711     </lib>
    712     </instance>
    713 
    714 .. 41-glyphs-element:
    715 
    716 4.1 glyphs element
    717 ==================
    718 
    719 -  Container for ``glyph`` elements.
    720 -  Optional
    721 -  MutatorMath only.
    722 
    723 .. 42-glyph-element:
    724 
    725 4.2 glyph element
    726 =================
    727 
    728 -  Child element of ``glyphs``
    729 -  May contain a ``location`` element.
    730 
    731 .. attributes-9:
    732 
    733 Attributes
    734 ----------
    735 
    736 -  ``name``: string. The name of the glyph.
    737 -  ``unicode``: string. Unicode values for this glyph, in hexadecimal.
    738    Multiple values should be separated with a space.
    739 -  ``mute``: optional attribute, number 1 or 0. Indicate if this glyph
    740    should be supressed in the output.
    741 
    742 .. 421-note-element:
    743 
    744 4.2.1 note element
    745 ==================
    746 
    747 -  String. The value corresponds to glyph.note in UFO.
    748 
    749 .. 422-masters-element:
    750 
    751 4.2.2 masters element
    752 =====================
    753 
    754 -  Container for ``master`` elements
    755 -  These ``master`` elements define an alternative set of glyph masters
    756    for this glyph.
    757 
    758 .. 4221-master-element:
    759 
    760 4.2.2.1 master element
    761 ======================
    762 
    763 -  Defines a single alternative master for this glyph.
    764 
    765 4.3 Localised names for instances
    766 =================================
    767 
    768 Localised names for instances can be included with these simple elements
    769 with an ``xml:lang`` attribute:
    770 `XML language definition <https://www.w3.org/International/questions/qa-when-xmllang.en>`__
    771 
    772 -  stylename
    773 -  familyname
    774 -  stylemapstylename
    775 -  stylemapfamilyname
    776 
    777 .. example-5:
    778 
    779 Example
    780 -------
    781 
    782 .. code:: xml
    783 
    784     <stylename xml:lang="fr">Demigras</stylename>
    785     <stylename xml:lang="ja"></stylename>
    786     <familyname xml:lang="fr">Montserrat</familyname>
    787     <familyname xml:lang="ja"></familyname>
    788     <stylemapstylename xml:lang="de">Standard</stylemapstylename>
    789     <stylemapfamilyname xml:lang="de">Montserrat Halbfett</stylemapfamilyname>
    790     <stylemapfamilyname xml:lang="ja"> SemiBold</stylemapfamilyname>
    791 
    792 .. attributes-10:
    793 
    794 Attributes
    795 ----------
    796 
    797 -  ``glyphname``: the name of the alternate master glyph.
    798 -  ``source``: the identifier name of the source this master glyph needs
    799    to be loaded from
    800 
    801 .. example-6:
    802 
    803 Example
    804 -------
    805 
    806 .. code:: xml
    807 
    808     <instance familyname="InstanceFamilyName" filename="instances/instanceTest2.ufo" name="instance.ufo2" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName" stylename="InstanceStyleName">
    809     <location>
    810         <dimension name="width" xvalue="400" yvalue="300" />
    811         <dimension name="weight" xvalue="66" />
    812     </location>
    813     <glyphs>
    814         <glyph name="arrow2" />
    815         <glyph name="arrow" unicode="0x4d2 0x4d3">
    816         <location>
    817             <dimension name="width" xvalue="100" />
    818             <dimension name="weight" xvalue="120" />
    819         </location>
    820         <note>A note about this glyph</note>
    821         <masters>
    822             <master glyphname="BB" source="master.ufo1">
    823             <location>
    824                 <dimension name="width" xvalue="20" />
    825                 <dimension name="weight" xvalue="20" />
    826             </location>
    827             </master>
    828         </masters>
    829         </glyph>
    830     </glyphs>
    831     <kerning />
    832     <info />
    833     <lib>
    834         <dict>
    835             <key>com.coolDesignspaceApp.specimenText</key>
    836             <string>Hamburgerwhatever</string>
    837         </dict>
    838     </lib>
    839     </instance>
    840 
    841 .. 50-rules-element:
    842 
    843 5.0 rules element
    844 =================
    845 
    846 -  Container for ``rule`` elements
    847 -  The rules are evaluated in this order.
    848 
    849 .. 51-rule-element:
    850 
    851 5.1 rule element
    852 ================
    853 
    854 -  Defines a named rule.
    855 -  Each ``rule`` element contains one or more ``conditionset`` elements.
    856 -  Only one ``conditionset`` needs to be true to trigger the rule.
    857 -  All conditions in a ``conditionset`` must be true to make the ``conditionset`` true.
    858 -  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.
    859 -  A rule element needs to contain one or more ``sub`` elements in order to be compiled to a variable font.
    860 -  Rules without sub elements should be ignored when compiling a font.
    861 -  For authoring tools it might be necessary to save designspace files without ``sub`` elements just because the work is incomplete.
    862 
    863 .. attributes-11:
    864 
    865 Attributes
    866 ----------
    867 
    868 -  ``name``: optional, string. A unique name that can be used to
    869    identify this rule if it needs to be referenced elsewhere. The name
    870    is not important for compiling variable fonts.
    871 
    872 5.1.1 conditionset element
    873 =======================
    874 
    875 -  Child element of ``rule``
    876 -  Contains one or more ``condition`` elements.
    877 
    878 .. 512-condition-element:
    879 
    880 5.1.2 condition element
    881 =======================
    882 
    883 -  Child element of ``conditionset``
    884 -  Between the ``minimum`` and ``maximum`` this rule is ``True``.
    885 -  If ``minimum`` is not available, assume it is ``axis.minimum``.
    886 -  If ``maximum`` is not available, assume it is ``axis.maximum``.
    887 -  The condition must contain at least a minimum or maximum or both.
    888 
    889 .. attributes-12:
    890 
    891 Attributes
    892 ----------
    893 
    894 -  ``name``: string, required. Must match one of the defined ``axis``
    895    name attributes.
    896 -  ``minimum``: number, required*. The low value.
    897 -  ``maximum``: number, required*. The high value.
    898 
    899 .. 513-sub-element:
    900 
    901 5.1.3 sub element
    902 =================
    903 
    904 -  Child element of ``rule``.
    905 -  Defines which glyph to replace when the rule evaluates to **True**.
    906 
    907 .. attributes-13:
    908 
    909 Attributes
    910 ----------
    911 
    912 -  ``name``: string, required. The name of the glyph this rule looks
    913    for.
    914 -  ``with``: string, required. The name of the glyph it is replaced
    915    with.
    916 
    917 .. example-7:
    918 
    919 Example
    920 -------
    921 
    922 Example with an implied ``conditionset``. Here the conditions are not
    923 contained in a conditionset. 
    924 
    925 .. code:: xml
    926 
    927     <rules>
    928         <rule name="named.rule.1">
    929             <condition minimum="250" maximum="750" name="weight" />
    930             <condition minimum="50" maximum="100" name="width" />
    931             <sub name="dollar" with="dollar.alt"/>
    932         </rule>
    933     </rules>
    934 
    935 Example with ``conditionsets``. All conditions in a conditionset must be true.
    936 
    937 .. code:: xml
    938 
    939     <rules>
    940         <rule name="named.rule.2">
    941             <conditionset>
    942                 <condition minimum="250" maximum="750" name="weight" />
    943                 <condition minimum="50" maximum="100" name="width" />
    944             </conditionset>
    945             <conditionset>
    946                 <condition ... />
    947                 <condition ... />
    948             </conditionset>
    949             <sub name="dollar" with="dollar.alt"/>
    950         </rule>
    951     </rules>
    952 
    953 .. 6-notes:
    954 
    955 6 Notes
    956 =======
    957 
    958 Paths and filenames
    959 -------------------
    960 
    961 A designspace file needs to store many references to UFO files.
    962 
    963 -  designspace files can be part of versioning systems and appear on
    964    different computers. This means it is not possible to store absolute
    965    paths.
    966 -  So, all paths are relative to the designspace document path.
    967 -  Using relative paths allows designspace files and UFO files to be
    968    **near** each other, and that they can be **found** without enforcing
    969    one particular structure.
    970 -  The **filename** attribute in the ``SourceDescriptor`` and
    971    ``InstanceDescriptor`` classes stores the preferred relative path.
    972 -  The **path** attribute in these objects stores the absolute path. It
    973    is calculated from the document path and the relative path in the
    974    filename attribute when the object is created.
    975 -  Only the **filename** attribute is written to file.
    976 -  Both **filename** and **path** must use forward slashes (``/``) as
    977    path separators, even on Windows.
    978 
    979 Right before we save we need to identify and respond to the following
    980 situations:
    981 
    982 In each descriptor, we have to do the right thing for the filename
    983 attribute. Before writing to file, the ``documentObject.updatePaths()``
    984 method prepares the paths as follows:
    985 
    986 **Case 1**
    987 
    988 ::
    989 
    990     descriptor.filename == None
    991     descriptor.path == None
    992 
    993 **Action**
    994 
    995 -  write as is, descriptors will not have a filename attr. Useless, but
    996    no reason to interfere.
    997 
    998 **Case 2**
    999 
   1000 ::
   1001 
   1002     descriptor.filename == "../something"
   1003     descriptor.path == None
   1004 
   1005 **Action**
   1006 
   1007 -  write as is. The filename attr should not be touched.
   1008 
   1009 **Case 3**
   1010 
   1011 ::
   1012 
   1013     descriptor.filename == None
   1014     descriptor.path == "~/absolute/path/there"
   1015 
   1016 **Action**
   1017 
   1018 -  calculate the relative path for filename. We're not overwriting some
   1019    other value for filename, it should be fine.
   1020 
   1021 **Case 4**
   1022 
   1023 ::
   1024 
   1025     descriptor.filename == '../somewhere'
   1026     descriptor.path == "~/absolute/path/there"
   1027 
   1028 **Action**
   1029 
   1030 -  There is a conflict between the given filename, and the path. The
   1031    difference could have happened for any number of reasons. Assuming
   1032    the values were not in conflict when the object was created, either
   1033    could have changed. We can't guess.
   1034 -  Assume the path attribute is more up to date. Calculate a new value
   1035    for filename based on the path and the document path.
   1036 
   1037 Recommendation for editors
   1038 --------------------------
   1039 
   1040 -  If you want to explicitly set the **filename** attribute, leave the
   1041    path attribute empty.
   1042 -  If you want to explicitly set the **path** attribute, leave the
   1043    filename attribute empty. It will be recalculated.
   1044 -  Use ``documentObject.updateFilenameFromPath()`` to explicitly set the
   1045    **filename** attributes for all instance and source descriptors.
   1046 
   1047 .. 7-common-lib-key-registry:
   1048 
   1049 7 Common Lib Key Registry
   1050 =========================
   1051 
   1052 public.skipExportGlyphs
   1053 -----------------------
   1054 
   1055 This lib key works the same as the UFO lib key with the same name. The
   1056 difference is that applications using a Designspace as the corner stone of the
   1057 font compilation process should use the lib key in that Designspace instead of
   1058 any of the UFOs. If the lib key is empty or not present in the Designspace, all
   1059 glyphs should be exported, regardless of what the same lib key in any of the
   1060 UFOs says.
   1061 
   1062 .. 8-this-document:
   1063 
   1064 8 This document
   1065 ===============
   1066 
   1067 -  The package is rather new and changes are to be expected.
   1068