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