├── .github ├── dependabot.yml └── workflows │ ├── beta-unittests.yml │ ├── fmt.yml │ ├── lints.yml │ └── stable-unittests.yml ├── .gitignore ├── CHANGELOG.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── Makefile ├── README.md ├── rustfmt.toml ├── src ├── lib │ ├── errors.rs │ ├── formatters.rs │ ├── mod.rs │ └── utils.rs └── main.rs └── testdata ├── expected └── MutatorSansBoldCondensed-default.ufo │ ├── features.fea │ ├── fontinfo.plist │ ├── glyphs.background │ ├── S_.closed.glif │ ├── contents.plist │ └── layerinfo.plist │ ├── glyphs │ ├── A_.glif │ ├── A_acute.glif │ ├── A_dieresis.glif │ ├── B_.glif │ ├── C_.glif │ ├── D_.glif │ ├── E_.glif │ ├── F_.glif │ ├── G_.glif │ ├── H_.glif │ ├── I_.glif │ ├── I_.narrow.glif │ ├── I_J_.glif │ ├── J_.glif │ ├── J_.narrow.glif │ ├── K_.glif │ ├── L_.glif │ ├── M_.glif │ ├── N_.glif │ ├── O_.glif │ ├── P_.glif │ ├── Q_.glif │ ├── R_.glif │ ├── S_.closed.glif │ ├── S_.glif │ ├── T_.glif │ ├── U_.glif │ ├── V_.glif │ ├── W_.glif │ ├── X_.glif │ ├── Y_.glif │ ├── Z_.glif │ ├── acute.glif │ ├── arrowdown.glif │ ├── arrowleft.glif │ ├── arrowright.glif │ ├── arrowup.glif │ ├── colon.glif │ ├── comma.glif │ ├── contents.plist │ ├── dieresis.glif │ ├── dot.glif │ ├── layerinfo.plist │ ├── period.glif │ ├── quotedblbase.glif │ ├── quotedblleft.glif │ ├── quotedblright.glif │ ├── quotesinglbase.glif │ ├── semicolon.glif │ └── space.glif │ ├── groups.plist │ ├── kerning.plist │ ├── layercontents.plist │ ├── lib.plist │ └── metainfo.plist └── ufo ├── LICENSE-MutatorSans └── MutatorSansBoldCondensed.ufo ├── features.fea ├── fontinfo.plist ├── glyphs.background ├── S_.closed.glif ├── contents.plist └── layerinfo.plist ├── glyphs ├── A_.glif ├── A_acute.glif ├── A_dieresis.glif ├── B_.glif ├── C_.glif ├── D_.glif ├── E_.glif ├── F_.glif ├── G_.glif ├── H_.glif ├── I_.glif ├── I_.narrow.glif ├── I_J_.glif ├── J_.glif ├── J_.narrow.glif ├── K_.glif ├── L_.glif ├── M_.glif ├── N_.glif ├── O_.glif ├── P_.glif ├── Q_.glif ├── R_.glif ├── S_.closed.glif ├── S_.glif ├── T_.glif ├── U_.glif ├── V_.glif ├── W_.glif ├── X_.glif ├── Y_.glif ├── Z_.glif ├── acute.glif ├── arrowdown.glif ├── arrowleft.glif ├── arrowright.glif ├── arrowup.glif ├── colon.glif ├── comma.glif ├── contents.plist ├── dieresis.glif ├── dot.glif ├── layerinfo.plist ├── period.glif ├── quotedblbase.glif ├── quotedblleft.glif ├── quotedblright.glif ├── quotesinglbase.glif ├── semicolon.glif └── space.glif ├── groups.plist ├── kerning.plist ├── layercontents.plist ├── lib.plist └── metainfo.plist /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: cargo 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | open-pull-requests-limit: 10 8 | -------------------------------------------------------------------------------- /.github/workflows/beta-unittests.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | - "test/**" # Push events to branches matching refs/heads/test/[ANYTHING] 6 | - "test-*" # Push events to branches matching refs/heads/test-[ANYTHING] 7 | pull_request: 8 | 9 | name: beta toolchain unit tests 10 | 11 | jobs: 12 | unit-stable: 13 | name: beta toolchain unit tests 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | os: [ubuntu-latest, macos-latest, windows-latest] 18 | steps: 19 | - uses: actions/checkout@v2 20 | - uses: actions-rs/toolchain@v1 21 | with: 22 | toolchain: beta 23 | override: true 24 | - uses: actions-rs/cargo@v1 25 | with: 26 | command: test 27 | -------------------------------------------------------------------------------- /.github/workflows/fmt.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | - "test/**" # Push events to branches matching refs/heads/test/[ANYTHING] 6 | - "test-*" # Push events to branches matching refs/heads/test-[ANYTHING] 7 | pull_request: 8 | 9 | name: rustfmt check 10 | 11 | jobs: 12 | fmt: 13 | name: rustfmt 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | - uses: actions-rs/toolchain@v1 18 | with: 19 | toolchain: stable 20 | override: true 21 | - run: rustup component add rustfmt 22 | - uses: actions-rs/cargo@v1 23 | with: 24 | command: fmt 25 | args: --all -- --check 26 | -------------------------------------------------------------------------------- /.github/workflows/lints.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | - "test/**" # Push events to branches matching refs/heads/test/[ANYTHING] 6 | - "test-*" # Push events to branches matching refs/heads/test-[ANYTHING] 7 | pull_request: 8 | 9 | name: clippy lints 10 | 11 | jobs: 12 | clippy-stable: 13 | name: stable toolchain lints 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | - uses: actions-rs/toolchain@v1 18 | with: 19 | toolchain: stable 20 | override: true 21 | - run: rustup component add clippy 22 | - uses: actions-rs/cargo@v1 23 | with: 24 | command: clippy 25 | args: -- -D warnings 26 | clippy-beta: 27 | name: beta toolchain lints 28 | runs-on: ubuntu-latest 29 | steps: 30 | - uses: actions/checkout@v2 31 | - uses: actions-rs/toolchain@v1 32 | with: 33 | toolchain: beta 34 | override: true 35 | - run: rustup component add clippy 36 | - uses: actions-rs/cargo@v1 37 | with: 38 | command: clippy 39 | args: -- -D warnings 40 | -------------------------------------------------------------------------------- /.github/workflows/stable-unittests.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | - "test/**" # Push events to branches matching refs/heads/test/[ANYTHING] 6 | - "test-*" # Push events to branches matching refs/heads/test-[ANYTHING] 7 | pull_request: 8 | 9 | name: stable toolchain unit tests 10 | 11 | jobs: 12 | unit-stable: 13 | name: stable toolchain unit tests 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | os: [ubuntu-latest, macos-latest, windows-latest] 18 | steps: 19 | - uses: actions/checkout@v2 20 | - uses: actions-rs/toolchain@v1 21 | with: 22 | toolchain: stable 23 | override: true 24 | - uses: actions-rs/cargo@v1 25 | with: 26 | command: test 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | # These are backup files generated by rustfmt 6 | **/*.rs.bk 7 | 8 | # macOS env specific 9 | .DS_Store 10 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v0.7.1 4 | 5 | - Refactor unnecessary late assignment in `formatters::format_ufo` (clippy lint) 6 | - Dependency updates: 7 | - clap v2.33.3 to v2.34.0 8 | - crossbeam-channel from v0.5.1 to v0.5.2 9 | - crossbeam-epoch from v0.8.5 to v0.8.6 10 | - crossbeam-utils from v0.8.5 to v0.8.6 11 | - getrandom from v0.2.3 to v0.2.4 12 | - indexmap from v1.7.0 to v1.8.0 13 | - libc from v0.2.102 to v0.2.115 14 | - memoffset from v0.6.4 to v0.6.5 15 | - plist v1.2.1 to v1.3.1 16 | - proc_macro v1.0.29 to v1.0.36 17 | - quote v1.0.9 to v1.0.15 18 | - serde v1.0.130 to v1.0.136 19 | - serde_derive from v1.0.130 to v1.0.136 20 | - structopt v0.3.25 to v0.3.26 21 | - syn from v1.0.76 to v1.0.86 22 | - unicode-width from v0.1.8 to v0.1.9 23 | - version_check from v0.9.3 to v0.9.4 24 | - New dependencies: 25 | - itoa v1.0.1 26 | - num_threads v0.1.3 27 | - time v0.3.7 28 | - Removed dependencies: 29 | - num-integer 30 | 31 | ## v0.7.0 32 | 33 | - Convert to f64 float value formatting for all numeric fields in the UFO specification that use floats 34 | - Add support for metainfo.plist minor version field, addresses a UFO specification update (https://unifiedfontobject.org/versions/ufo3/metainfo.plist/) 35 | - Dependency updates: 36 | - norad v0.5.1 -> v0.6.0 37 | - pretty_assertions from v0.7.2 to v1.0.0 38 | - structopt from v0.3.23 to v0.3.25 39 | 40 | ## v0.6.0 41 | 42 | - add consistent cross-platform line feed line ending serialization across plist, glif, and feature files 43 | - Dependency updates: 44 | - bump libc v0.2.101 -> v0.2.102 45 | 46 | ## v0.5.0 47 | 48 | - add custom indentation spacing support (1 - 4 tabs or spaces) 49 | - Dependency updates: 50 | - bump ctor v0.1.20 -> v0.1.21 51 | - bump proc-macro2 v1.0.28 -> v1.0.29 52 | - bump serde v1.0.129 -> v1.0.130 53 | - bump serde_derive v1.0.129 -> v1.0.130 54 | - bump structopt v0.3.22 -> v0.3.23 55 | - bump syn v1.0.75 -> v1.0.76 56 | 57 | ## v0.4.1 58 | 59 | - Dependency updates (includes bump beyond yanked version of crossbeam-deque): 60 | - bump bitflags v1.2.1 -> v1.3.2 61 | - bump crossbeam-deque v0.8.0 -> v0.8.1 62 | - bump libc v0.2.98 -> v0.2.101 63 | - bump memchr v2.4.0 -> v2.4.1 64 | - bump proc-macro2 v1.0.27 -> v1.0.28 65 | - bump serde v1.0.126 -> v1.0.129 66 | - bump serde_derive v1.0.126 -> v1.0.129 67 | - bump syn v1.0.74 -> v1.0.75 68 | - bump xml-rs v0.8.3 -> v0.8.4 69 | 70 | ## v0.4.0 71 | 72 | - add parallel glif serialization support 73 | - add custom outpath file extensions with `--out-ext` option 74 | - add custom outpath appended file name strings with `--out-name` option 75 | - add optional XML declaration single quote formatting with `--singlequote` option 76 | - add lazy_static dependency 77 | - bump norad dependency to v0.5.0 (from v0.4.0) 78 | - add pretty_assertions developer dependency 79 | 80 | ## v0.3.0 81 | 82 | - activate rayon feature in norad library dependency 83 | - add new lib module 84 | - refactor error handling to lib sub-modules 85 | - check UFO dir path validity during format execution to avoid a separate loop 86 | - add unit tests 87 | - add `fs_extra` dev dependency (unit testing) 88 | - add `tempdir` dev dependency (unit testing) 89 | - add Mutator Sans sources to support testing (MIT License) 90 | - add rustdoc user documentation 91 | - add developer documentation on the repository README.md 92 | 93 | ## v0.2.0 94 | 95 | - add UFO directory validity checks and informative error messages 96 | - refactor UFO dir path argument parsing to use PathBuf, skip unnecessary extra String->PathBuf instantiation step 97 | - refactor format_ufo function to take a PathBuf reference parameter (from String reference) 98 | 99 | ## v0.1.2 100 | 101 | - add Cargo.lock definitions 102 | 103 | ## v0.1.1 104 | 105 | - improve help message for input path arguments 106 | - fix installation documentation (`cargo install` no longer works) 107 | 108 | ## v0.1.0 109 | 110 | - initial release with rayon-based parallel UFO source formatting support 111 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ansi_term" 7 | version = "0.12.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 10 | dependencies = [ 11 | "winapi", 12 | ] 13 | 14 | [[package]] 15 | name = "atty" 16 | version = "0.2.14" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 19 | dependencies = [ 20 | "hermit-abi", 21 | "libc", 22 | "winapi", 23 | ] 24 | 25 | [[package]] 26 | name = "autocfg" 27 | version = "1.0.1" 28 | source = "registry+https://github.com/rust-lang/crates.io-index" 29 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 30 | 31 | [[package]] 32 | name = "base64" 33 | version = "0.13.0" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 36 | 37 | [[package]] 38 | name = "bitflags" 39 | version = "1.3.2" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 42 | 43 | [[package]] 44 | name = "cfg-if" 45 | version = "1.0.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 48 | 49 | [[package]] 50 | name = "clap" 51 | version = "2.34.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" 54 | dependencies = [ 55 | "ansi_term", 56 | "atty", 57 | "bitflags", 58 | "strsim", 59 | "textwrap", 60 | "unicode-width", 61 | "vec_map", 62 | ] 63 | 64 | [[package]] 65 | name = "colored" 66 | version = "2.0.0" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" 69 | dependencies = [ 70 | "atty", 71 | "lazy_static", 72 | "winapi", 73 | ] 74 | 75 | [[package]] 76 | name = "crossbeam-channel" 77 | version = "0.5.2" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" 80 | dependencies = [ 81 | "cfg-if", 82 | "crossbeam-utils", 83 | ] 84 | 85 | [[package]] 86 | name = "crossbeam-deque" 87 | version = "0.8.1" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" 90 | dependencies = [ 91 | "cfg-if", 92 | "crossbeam-epoch", 93 | "crossbeam-utils", 94 | ] 95 | 96 | [[package]] 97 | name = "crossbeam-epoch" 98 | version = "0.9.6" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "97242a70df9b89a65d0b6df3c4bf5b9ce03c5b7309019777fbde37e7537f8762" 101 | dependencies = [ 102 | "cfg-if", 103 | "crossbeam-utils", 104 | "lazy_static", 105 | "memoffset", 106 | "scopeguard", 107 | ] 108 | 109 | [[package]] 110 | name = "crossbeam-utils" 111 | version = "0.8.8" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" 114 | dependencies = [ 115 | "cfg-if", 116 | "lazy_static", 117 | ] 118 | 119 | [[package]] 120 | name = "ctor" 121 | version = "0.1.21" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" 124 | dependencies = [ 125 | "quote", 126 | "syn", 127 | ] 128 | 129 | [[package]] 130 | name = "diff" 131 | version = "0.1.12" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" 134 | 135 | [[package]] 136 | name = "either" 137 | version = "1.6.1" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 140 | 141 | [[package]] 142 | name = "fs_extra" 143 | version = "1.2.0" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" 146 | 147 | [[package]] 148 | name = "fuchsia-cprng" 149 | version = "0.1.1" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 152 | 153 | [[package]] 154 | name = "getrandom" 155 | version = "0.2.4" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" 158 | dependencies = [ 159 | "cfg-if", 160 | "libc", 161 | "wasi", 162 | ] 163 | 164 | [[package]] 165 | name = "hashbrown" 166 | version = "0.11.2" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 169 | 170 | [[package]] 171 | name = "heck" 172 | version = "0.3.3" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 175 | dependencies = [ 176 | "unicode-segmentation", 177 | ] 178 | 179 | [[package]] 180 | name = "hermit-abi" 181 | version = "0.1.19" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 184 | dependencies = [ 185 | "libc", 186 | ] 187 | 188 | [[package]] 189 | name = "indexmap" 190 | version = "1.8.0" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" 193 | dependencies = [ 194 | "autocfg", 195 | "hashbrown", 196 | ] 197 | 198 | [[package]] 199 | name = "itoa" 200 | version = "1.0.1" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" 203 | 204 | [[package]] 205 | name = "lazy_static" 206 | version = "1.4.0" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 209 | 210 | [[package]] 211 | name = "libc" 212 | version = "0.2.115" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "0a8d982fa7a96a000f6ec4cfe966de9703eccde29750df2bb8949da91b0e818d" 215 | 216 | [[package]] 217 | name = "line-wrap" 218 | version = "0.1.1" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" 221 | dependencies = [ 222 | "safemem", 223 | ] 224 | 225 | [[package]] 226 | name = "memchr" 227 | version = "2.4.1" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 230 | 231 | [[package]] 232 | name = "memoffset" 233 | version = "0.6.5" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 236 | dependencies = [ 237 | "autocfg", 238 | ] 239 | 240 | [[package]] 241 | name = "norad" 242 | version = "0.6.0" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "ce992b9240bd5d664ac85340de11a3800402f7552673898e176262a59447e016" 245 | dependencies = [ 246 | "plist", 247 | "quick-xml", 248 | "rayon", 249 | "serde", 250 | "serde_derive", 251 | "serde_repr", 252 | "uuid", 253 | ] 254 | 255 | [[package]] 256 | name = "num_cpus" 257 | version = "1.13.1" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 260 | dependencies = [ 261 | "hermit-abi", 262 | "libc", 263 | ] 264 | 265 | [[package]] 266 | name = "num_threads" 267 | version = "0.1.3" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15" 270 | dependencies = [ 271 | "libc", 272 | ] 273 | 274 | [[package]] 275 | name = "output_vt100" 276 | version = "0.1.2" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" 279 | dependencies = [ 280 | "winapi", 281 | ] 282 | 283 | [[package]] 284 | name = "plist" 285 | version = "1.3.1" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" 288 | dependencies = [ 289 | "base64", 290 | "indexmap", 291 | "line-wrap", 292 | "serde", 293 | "time", 294 | "xml-rs", 295 | ] 296 | 297 | [[package]] 298 | name = "pretty_assertions" 299 | version = "1.3.0" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" 302 | dependencies = [ 303 | "ctor", 304 | "diff", 305 | "output_vt100", 306 | "yansi", 307 | ] 308 | 309 | [[package]] 310 | name = "proc-macro-error" 311 | version = "1.0.4" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 314 | dependencies = [ 315 | "proc-macro-error-attr", 316 | "proc-macro2", 317 | "quote", 318 | "syn", 319 | "version_check", 320 | ] 321 | 322 | [[package]] 323 | name = "proc-macro-error-attr" 324 | version = "1.0.4" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 327 | dependencies = [ 328 | "proc-macro2", 329 | "quote", 330 | "version_check", 331 | ] 332 | 333 | [[package]] 334 | name = "proc-macro2" 335 | version = "1.0.36" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 338 | dependencies = [ 339 | "unicode-xid", 340 | ] 341 | 342 | [[package]] 343 | name = "quick-xml" 344 | version = "0.22.0" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b" 347 | dependencies = [ 348 | "memchr", 349 | ] 350 | 351 | [[package]] 352 | name = "quote" 353 | version = "1.0.15" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" 356 | dependencies = [ 357 | "proc-macro2", 358 | ] 359 | 360 | [[package]] 361 | name = "rand" 362 | version = "0.4.6" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" 365 | dependencies = [ 366 | "fuchsia-cprng", 367 | "libc", 368 | "rand_core 0.3.1", 369 | "rdrand", 370 | "winapi", 371 | ] 372 | 373 | [[package]] 374 | name = "rand_core" 375 | version = "0.3.1" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 378 | dependencies = [ 379 | "rand_core 0.4.2", 380 | ] 381 | 382 | [[package]] 383 | name = "rand_core" 384 | version = "0.4.2" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 387 | 388 | [[package]] 389 | name = "rayon" 390 | version = "1.5.3" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" 393 | dependencies = [ 394 | "autocfg", 395 | "crossbeam-deque", 396 | "either", 397 | "rayon-core", 398 | ] 399 | 400 | [[package]] 401 | name = "rayon-core" 402 | version = "1.9.2" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" 405 | dependencies = [ 406 | "crossbeam-channel", 407 | "crossbeam-deque", 408 | "crossbeam-utils", 409 | "num_cpus", 410 | ] 411 | 412 | [[package]] 413 | name = "rdrand" 414 | version = "0.4.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 417 | dependencies = [ 418 | "rand_core 0.3.1", 419 | ] 420 | 421 | [[package]] 422 | name = "remove_dir_all" 423 | version = "0.5.3" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 426 | dependencies = [ 427 | "winapi", 428 | ] 429 | 430 | [[package]] 431 | name = "safemem" 432 | version = "0.3.3" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 435 | 436 | [[package]] 437 | name = "scopeguard" 438 | version = "1.1.0" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 441 | 442 | [[package]] 443 | name = "serde" 444 | version = "1.0.136" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" 447 | 448 | [[package]] 449 | name = "serde_derive" 450 | version = "1.0.136" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" 453 | dependencies = [ 454 | "proc-macro2", 455 | "quote", 456 | "syn", 457 | ] 458 | 459 | [[package]] 460 | name = "serde_repr" 461 | version = "0.1.7" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" 464 | dependencies = [ 465 | "proc-macro2", 466 | "quote", 467 | "syn", 468 | ] 469 | 470 | [[package]] 471 | name = "strsim" 472 | version = "0.8.0" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 475 | 476 | [[package]] 477 | name = "structopt" 478 | version = "0.3.26" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" 481 | dependencies = [ 482 | "clap", 483 | "lazy_static", 484 | "structopt-derive", 485 | ] 486 | 487 | [[package]] 488 | name = "structopt-derive" 489 | version = "0.4.18" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" 492 | dependencies = [ 493 | "heck", 494 | "proc-macro-error", 495 | "proc-macro2", 496 | "quote", 497 | "syn", 498 | ] 499 | 500 | [[package]] 501 | name = "syn" 502 | version = "1.0.86" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" 505 | dependencies = [ 506 | "proc-macro2", 507 | "quote", 508 | "unicode-xid", 509 | ] 510 | 511 | [[package]] 512 | name = "tempdir" 513 | version = "0.3.7" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" 516 | dependencies = [ 517 | "rand", 518 | "remove_dir_all", 519 | ] 520 | 521 | [[package]] 522 | name = "textwrap" 523 | version = "0.11.0" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 526 | dependencies = [ 527 | "unicode-width", 528 | ] 529 | 530 | [[package]] 531 | name = "time" 532 | version = "0.3.7" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" 535 | dependencies = [ 536 | "itoa", 537 | "libc", 538 | "num_threads", 539 | ] 540 | 541 | [[package]] 542 | name = "ufofmt" 543 | version = "0.7.2-dev.0" 544 | dependencies = [ 545 | "colored", 546 | "fs_extra", 547 | "lazy_static", 548 | "norad", 549 | "pretty_assertions", 550 | "rayon", 551 | "structopt", 552 | "tempdir", 553 | ] 554 | 555 | [[package]] 556 | name = "unicode-segmentation" 557 | version = "1.8.0" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" 560 | 561 | [[package]] 562 | name = "unicode-width" 563 | version = "0.1.9" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 566 | 567 | [[package]] 568 | name = "unicode-xid" 569 | version = "0.2.2" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 572 | 573 | [[package]] 574 | name = "uuid" 575 | version = "0.8.2" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 578 | dependencies = [ 579 | "getrandom", 580 | ] 581 | 582 | [[package]] 583 | name = "vec_map" 584 | version = "0.8.2" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 587 | 588 | [[package]] 589 | name = "version_check" 590 | version = "0.9.4" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 593 | 594 | [[package]] 595 | name = "wasi" 596 | version = "0.10.2+wasi-snapshot-preview1" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 599 | 600 | [[package]] 601 | name = "winapi" 602 | version = "0.3.9" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 605 | dependencies = [ 606 | "winapi-i686-pc-windows-gnu", 607 | "winapi-x86_64-pc-windows-gnu", 608 | ] 609 | 610 | [[package]] 611 | name = "winapi-i686-pc-windows-gnu" 612 | version = "0.4.0" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 615 | 616 | [[package]] 617 | name = "winapi-x86_64-pc-windows-gnu" 618 | version = "0.4.0" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 621 | 622 | [[package]] 623 | name = "xml-rs" 624 | version = "0.8.4" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" 627 | 628 | [[package]] 629 | name = "yansi" 630 | version = "0.5.1" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" 633 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ufofmt" 3 | version = "0.7.2-dev.0" 4 | edition = "2018" 5 | authors = ["Chris Simpkins ", "Nikolaus Waxweiler ", "Colin Rofls "] 6 | description = "A fast, flexible UFO source file formatter based on the Norad library" 7 | keywords = ["fonts", "ufo", "formatter", "normalizer"] 8 | license = "Apache-2.0" 9 | readme = "README.md" 10 | repository = "https://github.com/source-foundry/ufofmt" 11 | homepage = "https://github.com/source-foundry/ufofmt" 12 | categories = ["graphics", "text-processing"] 13 | 14 | exclude = [ 15 | "/testdata/*" 16 | ] 17 | 18 | [dependencies] 19 | norad = { version = "0.6.0", features = ["rayon"] } 20 | structopt = "0.3" 21 | colored = "2.0" 22 | rayon = "1.5" 23 | lazy_static = "1.4" 24 | 25 | [dev-dependencies] 26 | fs_extra = "1.2.0" 27 | tempdir = "0.3.7" 28 | pretty_assertions = "1.3.0" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: build-release 2 | 3 | build-test: 4 | cargo build 5 | 6 | build-release: 7 | cargo build --release 8 | 9 | install: 10 | cargo install --path . 11 | 12 | fmt: 13 | cargo fmt --all 14 | 15 | check-fmt: 16 | cargo fmt --all -- --check 17 | 18 | check-clippy: 19 | cargo clippy -- -D warnings 20 | 21 | .PHONY: all build-test build-release install fmt check-fmt check-clippy -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ufofmt 2 | 3 | ![crates.io](https://img.shields.io/crates/v/ufofmt.svg) 4 | [![stable toolchain unit tests](https://github.com/source-foundry/ufofmt/actions/workflows/stable-unittests.yml/badge.svg)](https://github.com/source-foundry/ufofmt/actions/workflows/stable-unittests.yml) 5 | [![beta toolchain unit tests](https://github.com/source-foundry/ufofmt/actions/workflows/beta-unittests.yml/badge.svg)](https://github.com/source-foundry/ufofmt/actions/workflows/beta-unittests.yml) 6 | 7 | A fast, flexible UFO source file formatter based on the Rust [Norad library](https://github.com/linebender/norad) 8 | 9 | ## About 10 | 11 | ufofmt is a Rust executable that supports customizable UFO source file formatting. 12 | 13 | ### Default source file format 14 | 15 |   | glif | plist | fea 16 | -- | -- | -- | -- 17 | line endings | line feed | line feed | line feed 18 | indentation spacing | single tab per level | single tab per level | n/a 19 | XML declaration attributes | double quotes | double quotes | n/a 20 | 21 | Custom formatting options are described in the Usage section below. 22 | 23 | ## Installation 24 | 25 | The installation process installs the `ufofmt` executable. 26 | 27 | [Install Rust](https://www.rust-lang.org/tools/install), then follow the instructions below. 28 | 29 | ### User installation 30 | 31 | The following command installs the latest release build: 32 | 33 | ``` 34 | $ cargo install ufofmt 35 | ``` 36 | 37 | Upgrade a previous installation to a new release version with: 38 | 39 | ``` 40 | $ cargo install --force ufofmt 41 | ``` 42 | 43 | ### Developer installation 44 | 45 | The following command installs a build from the latest commit in the main branch of the repository: 46 | 47 | ``` 48 | $ git clone https://github.com/source-foundry/ufofmt.git 49 | $ cd ufofmt && cargo install --path . 50 | ``` 51 | 52 | ## Usage 53 | 54 | Pass one or more UFO source directory paths to the `ufofmt` executable: 55 | 56 | ``` 57 | $ ufofmt [OPTIONS] [UFO PATH 1] ... [UFO PATH N] 58 | ``` 59 | 60 | Use the command `ufofmt --help` to view all available command line options. 61 | 62 | ### Custom source formatting options 63 | 64 | #### Indentation spacing character type 65 | 66 | Single tab indentation spacing per level is the default. Switch to space characters with the `--indent-space` command line option. See the section below to define the number of indentation spacing characters per level. 67 | 68 | #### Indentation spacing character number per level 69 | 70 | Define between 1 - 4 tab or space indentation chars with the `--indent-number [NUMBER]` command line option. See the section above to use spaces instead of tabs. 71 | 72 | #### XML declaration quote style 73 | 74 | XML declaration attributes are enclosed in double quotes by default. Convert to single quotes with the `--singlequotes` command line option. 75 | 76 | ## Contributing 77 | 78 | Contributions to the project are welcomed! All contributions are accepted under the project license defined in the License section below. 79 | 80 | ### Source contributions 81 | 82 | Test local changes in the executable with: 83 | 84 | ``` 85 | $ cargo run -- [ARGS] 86 | ``` 87 | 88 | Add tests to cover your source changes and run the test suite locally with: 89 | 90 | ``` 91 | $ cargo test 92 | ``` 93 | 94 | Please open a GitHub pull request with your change proposal. 95 | 96 | ### Documentation contributions 97 | 98 | Please build and review your documentation changes locally with: 99 | 100 | ``` 101 | $ cargo doc --open 102 | ``` 103 | 104 | Please open a GitHub pull request with your change proposal. 105 | 106 | ## License 107 | 108 | [Apache License v2.0](LICENSE) 109 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | use_small_heuristics = "Max" 2 | max_width = 100 3 | use_field_init_shorthand = true 4 | newline_style = "Unix" -------------------------------------------------------------------------------- /src/lib/errors.rs: -------------------------------------------------------------------------------- 1 | use std::{fmt, path::PathBuf}; 2 | 3 | use colored::*; 4 | use lazy_static::lazy_static; 5 | use norad; 6 | 7 | pub(crate) type Result = std::result::Result; 8 | 9 | lazy_static! { 10 | pub static ref ERROR_INDICATOR: ColoredString = "[ERROR]".red().bold(); 11 | pub static ref OK_INDICATOR: ColoredString = "[OK]".green().bold(); 12 | } 13 | 14 | // ufofmt custom error type 15 | #[derive(Debug)] 16 | pub(crate) enum Error { 17 | InvalidPath(PathBuf), 18 | NoradRead(PathBuf, norad::Error), 19 | NoradWrite(PathBuf, norad::Error), 20 | } 21 | 22 | impl fmt::Display for Error { 23 | fn fmt(&self, f: &mut fmt::Formatter) -> std::result::Result<(), fmt::Error> { 24 | match &self { 25 | Error::NoradRead(p, e) => { 26 | write!(f, "norad read error: {}: {}", p.display(), e) 27 | } 28 | Error::NoradWrite(p, e) => { 29 | write!(f, "norad write error: {}: {}", p.display(), e) 30 | } 31 | Error::InvalidPath(p) => { 32 | write!(f, "invalid path error: {} was not found", p.display()) 33 | } 34 | } 35 | } 36 | } 37 | 38 | impl std::error::Error for Error {} 39 | 40 | #[cfg(test)] 41 | mod tests { 42 | use super::*; 43 | 44 | #[test] 45 | fn test_ufofmterror_invalid_path() { 46 | let ufe = Error::InvalidPath(PathBuf::from("testpath.ufo")); 47 | assert_eq!(ufe.to_string(), "invalid path error: testpath.ufo was not found"); 48 | } 49 | 50 | #[test] 51 | fn test_ufofmterror_read() { 52 | let ne = norad::Error::MissingLayer("test".to_owned()); 53 | let ufe = Error::NoradRead(PathBuf::from("test.ufo"), ne); 54 | assert!(ufe.to_string().starts_with("norad read error: ")); 55 | } 56 | 57 | #[test] 58 | fn test_ufofmterror_write() { 59 | let ne = norad::Error::MissingLayer("test".to_owned()); 60 | let ufe = Error::NoradWrite(PathBuf::from("test.ufo"), ne); 61 | assert!(ufe.to_string().starts_with("norad write error: ")); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/lib/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod errors; 2 | pub mod formatters; 3 | pub mod utils; 4 | -------------------------------------------------------------------------------- /src/lib/utils.rs: -------------------------------------------------------------------------------- 1 | use std::ffi::OsStr; 2 | use std::path::{Path, PathBuf}; 3 | 4 | pub(crate) fn get_ufo_outpath( 5 | user_ufo_path: &Path, 6 | user_unique_filename: &Option, 7 | user_unique_extension: &Option, 8 | ) -> PathBuf { 9 | let original_basepath = match user_ufo_path.parent() { 10 | Some(opar) => opar, 11 | None => Path::new("."), 12 | }; 13 | 14 | let new_basepath = PathBuf::from(original_basepath); 15 | 16 | let original_dir_rootpath = match user_ufo_path.file_stem() { 17 | Some(oroot) => oroot, 18 | None => panic!("missing directory root!"), 19 | }; 20 | 21 | let mut new_outpath = match user_unique_filename { 22 | Some(unique_name) => { 23 | new_basepath.join(format!("{}{}", original_dir_rootpath.to_string_lossy(), unique_name)) 24 | } 25 | None => new_basepath.join(original_dir_rootpath), 26 | }; 27 | 28 | let original_extension = match user_ufo_path.extension() { 29 | Some(oext) => oext, 30 | None => OsStr::new(""), 31 | }; 32 | 33 | match user_unique_extension { 34 | Some(unique_ext) => { 35 | // create the new extension string 36 | if unique_ext.starts_with('.') { 37 | new_outpath.set_extension(unique_ext.strip_prefix('.').unwrap()) 38 | } else { 39 | new_outpath.set_extension(unique_ext) 40 | } 41 | } 42 | None => new_outpath.set_extension(original_extension), 43 | }; 44 | 45 | new_outpath 46 | } 47 | 48 | #[cfg(test)] 49 | mod tests { 50 | use super::*; 51 | 52 | #[test] 53 | fn test_get_ufo_outpath_default() { 54 | let op = get_ufo_outpath(&Path::new("one/two/three.ufo"), &None, &None); 55 | assert_eq!(op, PathBuf::from("one/two/three.ufo")); 56 | } 57 | 58 | #[test] 59 | fn test_get_ufo_path_unique_filename() { 60 | let op = get_ufo_outpath(&Path::new("one/two/three.ufo"), &Some("-new".to_string()), &None); 61 | assert_eq!(op, PathBuf::from("one/two/three-new.ufo")); 62 | } 63 | 64 | #[test] 65 | fn test_get_ufo_path_unique_extension_two_extensions_withperiod() { 66 | let op = 67 | get_ufo_outpath(&Path::new("one/two/three.ufo"), &None, &Some(".fmt.ufo".to_string())); 68 | assert_eq!(op, PathBuf::from("one/two/three.fmt.ufo")); 69 | } 70 | 71 | #[test] 72 | fn test_get_ufo_path_unique_extension_two_extensions_without_period() { 73 | let op = 74 | get_ufo_outpath(&Path::new("one/two/three.ufo"), &None, &Some("fmt.ufo".to_string())); 75 | assert_eq!(op, PathBuf::from("one/two/three.fmt.ufo")); 76 | } 77 | 78 | #[test] 79 | fn test_get_ufo_path_unique_extension_single_extension_with_period() { 80 | let op = get_ufo_outpath(&Path::new("one/two/three.ufo"), &None, &Some(".fmt".to_string())); 81 | assert_eq!(op, PathBuf::from("one/two/three.fmt")); 82 | } 83 | 84 | #[test] 85 | fn test_get_ufo_path_unique_extension_single_extension_without_period() { 86 | let op = get_ufo_outpath(&Path::new("one/two/three.ufo"), &None, &Some("fmt".to_string())); 87 | assert_eq!(op, PathBuf::from("one/two/three.fmt")); 88 | } 89 | 90 | #[test] 91 | fn test_get_ufo_path_unique_extension_empty_extension() { 92 | let op = get_ufo_outpath(&Path::new("one/two/three.ufo"), &None, &Some("".to_string())); 93 | assert_eq!(op, PathBuf::from("one/two/three")); 94 | } 95 | 96 | #[test] 97 | fn test_get_ufo_path_unique_extension_unique_dirname() { 98 | let op = get_ufo_outpath( 99 | &Path::new("one/two/three.ufo"), 100 | &Some("-new".to_string()), 101 | &Some("fmt".to_string()), 102 | ); 103 | assert_eq!(op, PathBuf::from("one/two/three-new.fmt")); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | //! # ufofmt 2 | //! 3 | //! A fast, flexible UFO source formatter. Built with Norad. 4 | //! 5 | //! The `ufofmt` executable formats UFO source files with the specification 6 | //! defined in the Rust [norad library](https://github.com/linebender/norad). 7 | //! 8 | //! ## Resources 9 | //! - Source repository: [https://github.com/source-foundry/ufofmt](https://github.com/source-foundry/ufofmt) 10 | //! - License: [Apache License 2.0](https://github.com/source-foundry/ufofmt/blob/main/LICENSE) 11 | //! - [Issue tracker](https://github.com/source-foundry/ufofmt/issues) 12 | //! - [Changelog](https://github.com/source-foundry/ufofmt/blob/main/CHANGELOG.md) 13 | //! - [Developer documentation](https://github.com/source-foundry/ufofmt/blob/main/README.md) 14 | //! 15 | //! ## Installation 16 | //! Install the `ufofmt` executable with: 17 | //! 18 | //! ``` 19 | //! $ cargo install ufofmt 20 | //! ``` 21 | //! 22 | //! Upgrade a previously installed `ufofmt` executable to the latest release with: 23 | //! 24 | //! ``` 25 | //! $ cargo install --force ufofmt 26 | //!``` 27 | //! 28 | //! ## Usage 29 | //! The command line syntax is: 30 | //! 31 | //! ``` 32 | //! $ ufofmt [OPTIONS] [UFO PATH 1] ... [UFO PATH n] 33 | //! ``` 34 | //! 35 | //! Enter `ufofmt --help` to view help documentation with all available command line options. 36 | 37 | use std::path::PathBuf; 38 | use std::time::Instant; 39 | 40 | use rayon::prelude::*; 41 | use structopt::StructOpt; 42 | 43 | // ufofmt library modules 44 | pub mod lib; 45 | 46 | use crate::lib::errors; 47 | use crate::lib::formatters; 48 | 49 | #[derive(StructOpt, Debug)] 50 | #[structopt(about = "A fast, flexible UFO source formatter. Built with Norad.")] 51 | struct Opt { 52 | /// Format XML declaration attributes with single quotes 53 | #[structopt( 54 | short = "s", 55 | long = "singlequotes", 56 | help = "Format XML declaration attributes with single quotes" 57 | )] 58 | singlequotes: bool, 59 | 60 | #[structopt(long = "indent-space", help = "Use space char for indentation [default: tab]")] 61 | indent_with_space: bool, 62 | 63 | #[structopt( 64 | long = "indent-number", 65 | help = "Number of indentation char per indent level (valid range = 1 - 4)", 66 | default_value = "1" 67 | )] 68 | indent_number: u8, 69 | 70 | /// Display timing data 71 | #[structopt(short = "t", long = "time", help = "Display timing data")] 72 | time: bool, 73 | 74 | /// Define a unique directory write path extension 75 | #[structopt( 76 | name = "UNIQUE_EXTENSION", 77 | long = "out-ext", 78 | help = "Define a unique directory write path extension" 79 | )] 80 | uniqueext: Option, 81 | 82 | /// Append a unique directory write path name before the extension 83 | #[structopt( 84 | name = "UNIQUE_FILENAME_STRING", 85 | long = "out-name", 86 | help = "Append a unique directory write path name before the extension" 87 | )] 88 | uniquename: Option, 89 | 90 | /// UFO source file paths 91 | #[structopt(help = "UFO source path(s)")] 92 | ufopaths: Vec, 93 | } 94 | 95 | fn main() { 96 | let argv = Opt::from_args(); 97 | 98 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | // CL arg validation checks 100 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 101 | if argv.indent_number > 4 || argv.indent_number < 1 { 102 | eprintln!( 103 | "{} indentation char number must be a value between 1 - 4", 104 | *errors::ERROR_INDICATOR, 105 | ); 106 | std::process::exit(1); 107 | } 108 | 109 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 110 | // Source formatting execution 111 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 112 | let now = Instant::now(); 113 | let results: Vec> = argv 114 | .ufopaths 115 | .par_iter() 116 | .map(|ufopath| { 117 | formatters::format_ufo( 118 | ufopath, 119 | &argv.uniquename, 120 | &argv.uniqueext, 121 | argv.singlequotes, 122 | argv.indent_with_space, 123 | argv.indent_number, 124 | ) 125 | }) 126 | .collect(); 127 | let duration = now.elapsed().as_millis(); 128 | 129 | for result in &results { 130 | match result { 131 | Ok(path) => { 132 | println!("{} {}", *errors::OK_INDICATOR, path.display()); 133 | } 134 | Err(err) => { 135 | eprintln!("{} {}", *errors::ERROR_INDICATOR, err); 136 | } 137 | } 138 | } 139 | 140 | if argv.time { 141 | println!("Total duration: {} ms", duration); 142 | } 143 | 144 | // An error was identified if any process returned a u8 value of 1 145 | // If there was no error, the sum = 0 146 | if results.iter().any(|v| v.is_err()) { 147 | std::process::exit(1); 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/features.fea: -------------------------------------------------------------------------------- 1 | # this is the feature from boldcondensed. 2 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/fontinfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ascender 6 | 800 7 | capHeight 8 | 800 9 | copyright 10 | License same as MutatorMath. BSD 3-clause. [test-token: A] 11 | descender 12 | -200 13 | familyName 14 | MutatorMathTest 15 | guidelines 16 | 17 | italicAngle 18 | 0 19 | openTypeNameLicense 20 | License same as MutatorMath. BSD 3-clause. [test-token: A] 21 | openTypeOS2VendorID 22 | LTTR 23 | postscriptBlueValues 24 | 25 | -10 26 | 0 27 | 800 28 | 810 29 | 30 | postscriptDefaultWidthX 31 | 500 32 | postscriptFamilyBlues 33 | 34 | postscriptFamilyOtherBlues 35 | 36 | postscriptFontName 37 | MutatorMathTest-BoldCondensed 38 | postscriptFullName 39 | MutatorMathTest BoldCondensed 40 | postscriptOtherBlues 41 | 42 | 500 43 | 520 44 | 45 | postscriptSlantAngle 46 | 0 47 | postscriptStemSnapH 48 | 49 | postscriptStemSnapV 50 | 51 | postscriptWindowsCharacterSet 52 | 1 53 | styleMapFamilyName 54 | 55 | styleMapStyleName 56 | regular 57 | styleName 58 | BoldCondensed 59 | unitsPerEm 60 | 1000 61 | versionMajor 62 | 1 63 | versionMinor 64 | 2 65 | xHeight 66 | 500 67 | year 68 | 2004 69 | 70 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs.background/S_.closed.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs.background/contents.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | S.closed 6 | S_.closed.glif 7 | 8 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs.background/layerinfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | color 6 | 0.5,1,0,0.7 7 | 8 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/A_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | com.typemytype.robofont.Image.Brightness 34 | 0 35 | com.typemytype.robofont.Image.Contrast 36 | 1 37 | com.typemytype.robofont.Image.Saturation 38 | 1 39 | com.typemytype.robofont.Image.Sharpness 40 | 0.4 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/A_acute.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | public.markColor 12 | 0.6567,0.6903,1,1 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/A_dieresis.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | public.markColor 12 | 0.6567,0.6903,1,1 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/B_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/C_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | com.typemytype.robofont.Image.Brightness 42 | 0 43 | com.typemytype.robofont.Image.Contrast 44 | 1 45 | com.typemytype.robofont.Image.Saturation 46 | 1 47 | com.typemytype.robofont.Image.Sharpness 48 | 0.4 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/D_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/E_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | com.typemytype.robofont.Image.Brightness 35 | 0 36 | com.typemytype.robofont.Image.Contrast 37 | 1 38 | com.typemytype.robofont.Image.Saturation 39 | 1 40 | com.typemytype.robofont.Image.Sharpness 41 | 0.4 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/F_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/G_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/H_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/I_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/I_.narrow.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | com.typemytype.robofont.Image.Brightness 15 | 0 16 | com.typemytype.robofont.Image.Contrast 17 | 1 18 | com.typemytype.robofont.Image.Saturation 19 | 1 20 | com.typemytype.robofont.Image.Sharpness 21 | 0.4 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/I_J_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/J_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/J_.narrow.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/K_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/L_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/M_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/N_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/O_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/P_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/Q_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/R_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | com.typemytype.robofont.Image.Brightness 45 | 0 46 | com.typemytype.robofont.Image.Contrast 47 | 1 48 | com.typemytype.robofont.Image.Saturation 49 | 1 50 | com.typemytype.robofont.Image.Sharpness 51 | 0.4 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/S_.closed.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | com.letterror.skateboard.navigator 55 | 56 | location 57 | 58 | weight 59 | 1000 60 | width 61 | 108.00694056919657 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/S_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | com.typemytype.robofont.Image.Brightness 56 | 0 57 | com.typemytype.robofont.Image.Contrast 58 | 1 59 | com.typemytype.robofont.Image.Saturation 60 | 1 61 | com.typemytype.robofont.Image.Sharpness 62 | 0.4 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/T_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/U_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/V_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/W_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/X_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/Y_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/Z_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/acute.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/arrowdown.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/arrowleft.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/arrowright.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/arrowup.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/colon.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/comma.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | public.markColor 20 | 0,0.95,0.95,1 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/contents.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A 6 | A_.glif 7 | Aacute 8 | A_acute.glif 9 | Adieresis 10 | A_dieresis.glif 11 | B 12 | B_.glif 13 | C 14 | C_.glif 15 | D 16 | D_.glif 17 | E 18 | E_.glif 19 | F 20 | F_.glif 21 | G 22 | G_.glif 23 | H 24 | H_.glif 25 | I 26 | I_.glif 27 | I.narrow 28 | I_.narrow.glif 29 | IJ 30 | I_J_.glif 31 | J 32 | J_.glif 33 | J.narrow 34 | J_.narrow.glif 35 | K 36 | K_.glif 37 | L 38 | L_.glif 39 | M 40 | M_.glif 41 | N 42 | N_.glif 43 | O 44 | O_.glif 45 | P 46 | P_.glif 47 | Q 48 | Q_.glif 49 | R 50 | R_.glif 51 | S 52 | S_.glif 53 | S.closed 54 | S_.closed.glif 55 | T 56 | T_.glif 57 | U 58 | U_.glif 59 | V 60 | V_.glif 61 | W 62 | W_.glif 63 | X 64 | X_.glif 65 | Y 66 | Y_.glif 67 | Z 68 | Z_.glif 69 | acute 70 | acute.glif 71 | arrowdown 72 | arrowdown.glif 73 | arrowleft 74 | arrowleft.glif 75 | arrowright 76 | arrowright.glif 77 | arrowup 78 | arrowup.glif 79 | colon 80 | colon.glif 81 | comma 82 | comma.glif 83 | dieresis 84 | dieresis.glif 85 | dot 86 | dot.glif 87 | period 88 | period.glif 89 | quotedblbase 90 | quotedblbase.glif 91 | quotedblleft 92 | quotedblleft.glif 93 | quotedblright 94 | quotedblright.glif 95 | quotesinglbase 96 | quotesinglbase.glif 97 | semicolon 98 | semicolon.glif 99 | space 100 | space.glif 101 | 102 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/dieresis.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | public.markColor 12 | 0.6567,0.6903,1,1 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/dot.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/layerinfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | color 6 | 1,0.75,0,0.7 7 | lib 8 | 9 | com.typemytype.robofont.segmentType 10 | curve 11 | 12 | 13 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/period.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | public.markColor 16 | 0,0.95,0.95,1 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/quotedblbase.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | com.typemytype.robofont.Image.Brightness 12 | 0 13 | com.typemytype.robofont.Image.Contrast 14 | 1 15 | com.typemytype.robofont.Image.Saturation 16 | 1 17 | com.typemytype.robofont.Image.Sharpness 18 | 0.4 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/quotedblleft.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/quotedblright.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/quotesinglbase.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | com.typemytype.robofont.Image.Brightness 11 | 0 12 | com.typemytype.robofont.Image.Contrast 13 | 1 14 | com.typemytype.robofont.Image.Saturation 15 | 1 16 | com.typemytype.robofont.Image.Sharpness 17 | 0.4 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/semicolon.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/glyphs/space.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/groups.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | public.kern1.@MMK_L_A 6 | 7 | A 8 | 9 | public.kern2.@MMK_R_A 10 | 11 | A 12 | 13 | testGroup 14 | 15 | E 16 | F 17 | H 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/kerning.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A 6 | 7 | J 8 | -20 9 | O 10 | -30 11 | T 12 | -70 13 | U 14 | -30 15 | V 16 | -50 17 | 18 | B 19 | 20 | A 21 | -20 22 | J 23 | -50 24 | O 25 | -20 26 | S 27 | -10 28 | T 29 | -10 30 | U 31 | -20 32 | V 33 | -30 34 | 35 | C 36 | 37 | A 38 | -20 39 | J 40 | -50 41 | T 42 | -20 43 | V 44 | -20 45 | 46 | E 47 | 48 | J 49 | -20 50 | T 51 | -10 52 | V 53 | -10 54 | 55 | F 56 | 57 | A 58 | -40 59 | J 60 | -80 61 | O 62 | -10 63 | S 64 | -20 65 | U 66 | -10 67 | V 68 | -10 69 | 70 | G 71 | 72 | J 73 | -20 74 | S 75 | -10 76 | T 77 | -40 78 | U 79 | -10 80 | V 81 | -30 82 | 83 | H 84 | 85 | J 86 | -30 87 | S 88 | -10 89 | T 90 | -10 91 | 92 | J 93 | 94 | J 95 | -70 96 | 97 | L 98 | 99 | J 100 | -20 101 | O 102 | -20 103 | T 104 | -110 105 | U 106 | -20 107 | V 108 | -60 109 | 110 | O 111 | 112 | A 113 | -30 114 | J 115 | -60 116 | S 117 | -10 118 | T 119 | -30 120 | V 121 | -30 122 | 123 | P 124 | 125 | A 126 | -50 127 | J 128 | -100 129 | S 130 | -10 131 | T 132 | -10 133 | U 134 | -10 135 | V 136 | -20 137 | 138 | R 139 | 140 | H 141 | -10 142 | J 143 | -20 144 | O 145 | -30 146 | S 147 | -20 148 | T 149 | -30 150 | U 151 | -30 152 | V 153 | -40 154 | 155 | S 156 | 157 | A 158 | -20 159 | H 160 | -20 161 | J 162 | -40 163 | O 164 | -10 165 | S 166 | -10 167 | T 168 | -30 169 | U 170 | -10 171 | V 172 | -30 173 | W 174 | -10 175 | 176 | T 177 | 178 | A 179 | -65 180 | H 181 | -10 182 | J 183 | -130 184 | O 185 | -20 186 | 187 | U 188 | 189 | A 190 | -30 191 | J 192 | -60 193 | S 194 | -10 195 | V 196 | -10 197 | 198 | V 199 | 200 | J 201 | -100 202 | O 203 | -30 204 | S 205 | -20 206 | U 207 | -10 208 | 209 | 210 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/layercontents.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | foreground 7 | glyphs 8 | 9 | 10 | background 11 | glyphs.background 12 | 13 | 14 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/lib.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.defcon.sortDescriptor 6 | 7 | 8 | allowPseudoUnicode 9 | 10 | ascending 11 | 12 | type 13 | alphabetical 14 | 15 | 16 | allowPseudoUnicode 17 | 18 | ascending 19 | 20 | type 21 | category 22 | 23 | 24 | allowPseudoUnicode 25 | 26 | ascending 27 | 28 | type 29 | unicode 30 | 31 | 32 | allowPseudoUnicode 33 | 34 | ascending 35 | 36 | type 37 | script 38 | 39 | 40 | allowPseudoUnicode 41 | 42 | ascending 43 | 44 | type 45 | suffix 46 | 47 | 48 | allowPseudoUnicode 49 | 50 | ascending 51 | 52 | type 53 | decompositionBase 54 | 55 | 56 | com.letterror.lightMeter.prefs 57 | 58 | chunkSize 59 | 5 60 | diameter 61 | 200 62 | drawTail 63 | 64 | invert 65 | 66 | toolDiameter 67 | 30 68 | toolStyle 69 | fluid 70 | 71 | com.typemytype.robofont.background.layerStrokeColor 72 | 73 | 0 74 | 0.8 75 | 0.2 76 | 0.7 77 | 78 | com.typemytype.robofont.compileSettings.autohint 79 | 80 | com.typemytype.robofont.compileSettings.checkOutlines 81 | 82 | com.typemytype.robofont.compileSettings.createDummyDSIG 83 | 84 | com.typemytype.robofont.compileSettings.decompose 85 | 86 | com.typemytype.robofont.compileSettings.generateFormat 87 | 0 88 | com.typemytype.robofont.compileSettings.releaseMode 89 | 90 | com.typemytype.robofont.foreground.layerStrokeColor 91 | 92 | 0.5 93 | 0 94 | 0.5 95 | 0.7 96 | 97 | com.typemytype.robofont.italicSlantOffset 98 | 0 99 | com.typemytype.robofont.segmentType 100 | curve 101 | com.typemytype.robofont.shouldAddPointsInSplineConversion 102 | 1 103 | com.typesupply.defcon.sortDescriptor 104 | 105 | 106 | ascending 107 | 108 | space 109 | A 110 | B 111 | C 112 | D 113 | E 114 | F 115 | G 116 | H 117 | I 118 | J 119 | K 120 | L 121 | M 122 | N 123 | O 124 | P 125 | Q 126 | R 127 | S 128 | T 129 | U 130 | V 131 | W 132 | X 133 | Y 134 | Z 135 | a 136 | b 137 | c 138 | d 139 | e 140 | f 141 | g 142 | h 143 | i 144 | j 145 | k 146 | l 147 | m 148 | n 149 | ntilde 150 | o 151 | p 152 | q 153 | r 154 | s 155 | t 156 | u 157 | v 158 | w 159 | x 160 | y 161 | z 162 | zcaron 163 | zero 164 | one 165 | two 166 | three 167 | four 168 | five 169 | six 170 | seven 171 | eight 172 | nine 173 | underscore 174 | hyphen 175 | endash 176 | emdash 177 | parenleft 178 | parenright 179 | bracketleft 180 | bracketright 181 | braceleft 182 | braceright 183 | numbersign 184 | percent 185 | period 186 | comma 187 | colon 188 | semicolon 189 | exclam 190 | question 191 | slash 192 | backslash 193 | bar 194 | at 195 | ampersand 196 | paragraph 197 | bullet 198 | dollar 199 | trademark 200 | fi 201 | fl 202 | .notdef 203 | a_b_c 204 | Atilde 205 | Adieresis 206 | Acircumflex 207 | Aring 208 | Ccedilla 209 | Agrave 210 | Aacute 211 | quotedblright 212 | quotedblleft 213 | 214 | type 215 | glyphList 216 | 217 | 218 | public.glyphOrder 219 | 220 | A 221 | Aacute 222 | Adieresis 223 | B 224 | C 225 | D 226 | E 227 | F 228 | G 229 | H 230 | I 231 | J 232 | K 233 | L 234 | M 235 | N 236 | O 237 | P 238 | Q 239 | R 240 | S 241 | T 242 | U 243 | V 244 | W 245 | X 246 | Y 247 | Z 248 | IJ 249 | S.closed 250 | I.narrow 251 | J.narrow 252 | quotesinglbase 253 | quotedblbase 254 | quotedblleft 255 | quotedblright 256 | comma 257 | period 258 | colon 259 | semicolon 260 | dot 261 | dieresis 262 | acute 263 | space 264 | arrowdown 265 | arrowleft 266 | arrowright 267 | arrowup 268 | 269 | 270 | -------------------------------------------------------------------------------- /testdata/expected/MutatorSansBoldCondensed-default.ufo/metainfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | creator 6 | org.linebender.norad 7 | formatVersion 8 | 3 9 | 10 | -------------------------------------------------------------------------------- /testdata/ufo/LICENSE-MutatorSans: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Erik van Blokland 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/features.fea: -------------------------------------------------------------------------------- 1 | # this is the feature from boldcondensed. 2 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/fontinfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ascender 6 | 800 7 | capHeight 8 | 800 9 | copyright 10 | License same as MutatorMath. BSD 3-clause. [test-token: A] 11 | descender 12 | -200 13 | familyName 14 | MutatorMathTest 15 | guidelines 16 | 17 | italicAngle 18 | 0 19 | openTypeNameLicense 20 | License same as MutatorMath. BSD 3-clause. [test-token: A] 21 | openTypeOS2VendorID 22 | LTTR 23 | postscriptBlueValues 24 | 25 | -10 26 | 0 27 | 800 28 | 810 29 | 30 | postscriptDefaultWidthX 31 | 500 32 | postscriptFamilyBlues 33 | 34 | postscriptFamilyOtherBlues 35 | 36 | postscriptFontName 37 | MutatorMathTest-BoldCondensed 38 | postscriptFullName 39 | MutatorMathTest BoldCondensed 40 | postscriptOtherBlues 41 | 42 | 500 43 | 520 44 | 45 | postscriptSlantAngle 46 | 0 47 | postscriptStemSnapH 48 | 49 | postscriptStemSnapV 50 | 51 | postscriptWindowsCharacterSet 52 | 1 53 | styleMapFamilyName 54 | 55 | styleMapStyleName 56 | regular 57 | styleName 58 | BoldCondensed 59 | unitsPerEm 60 | 1000 61 | versionMajor 62 | 1 63 | versionMinor 64 | 2 65 | xHeight 66 | 500 67 | year 68 | 2004 69 | 70 | 71 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs.background/S_.closed.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs.background/contents.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | S.closed 6 | S_.closed.glif 7 | 8 | 9 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs.background/layerinfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | color 6 | 0.5,1,0,0.7 7 | 8 | 9 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/A_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | com.typemytype.robofont.Image.Brightness 34 | 0 35 | com.typemytype.robofont.Image.Contrast 36 | 1 37 | com.typemytype.robofont.Image.Saturation 38 | 1 39 | com.typemytype.robofont.Image.Sharpness 40 | 0.4 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/A_acute.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | public.markColor 12 | 0.6567,0.6903,1,1 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/A_dieresis.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | public.markColor 12 | 0.6567,0.6903,1,1 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/B_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/C_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | com.typemytype.robofont.Image.Brightness 42 | 0 43 | com.typemytype.robofont.Image.Contrast 44 | 1 45 | com.typemytype.robofont.Image.Saturation 46 | 1 47 | com.typemytype.robofont.Image.Sharpness 48 | 0.4 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/D_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/E_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | com.typemytype.robofont.Image.Brightness 35 | 0 36 | com.typemytype.robofont.Image.Contrast 37 | 1 38 | com.typemytype.robofont.Image.Saturation 39 | 1 40 | com.typemytype.robofont.Image.Sharpness 41 | 0.4 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/F_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/G_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/H_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/I_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/I_.narrow.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | com.typemytype.robofont.Image.Brightness 15 | 0 16 | com.typemytype.robofont.Image.Contrast 17 | 1 18 | com.typemytype.robofont.Image.Saturation 19 | 1 20 | com.typemytype.robofont.Image.Sharpness 21 | 0.4 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/I_J_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/J_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/J_.narrow.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/K_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/L_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/M_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/N_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/O_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/P_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/Q_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/R_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | com.typemytype.robofont.Image.Brightness 45 | 0 46 | com.typemytype.robofont.Image.Contrast 47 | 1 48 | com.typemytype.robofont.Image.Saturation 49 | 1 50 | com.typemytype.robofont.Image.Sharpness 51 | 0.4 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/S_.closed.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | com.letterror.skateboard.navigator 55 | 56 | location 57 | 58 | weight 59 | 1000.0 60 | width 61 | 108.00694056919657 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/S_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | com.typemytype.robofont.Image.Brightness 56 | 0 57 | com.typemytype.robofont.Image.Contrast 58 | 1 59 | com.typemytype.robofont.Image.Saturation 60 | 1 61 | com.typemytype.robofont.Image.Sharpness 62 | 0.4 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/T_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/U_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/V_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/W_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/X_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/Y_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/Z_.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/acute.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/arrowdown.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/arrowleft.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/arrowright.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/arrowup.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/colon.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/comma.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | public.markColor 20 | 0,0.95,0.95,1 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/contents.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A 6 | A_.glif 7 | Aacute 8 | A_acute.glif 9 | Adieresis 10 | A_dieresis.glif 11 | B 12 | B_.glif 13 | C 14 | C_.glif 15 | D 16 | D_.glif 17 | E 18 | E_.glif 19 | F 20 | F_.glif 21 | G 22 | G_.glif 23 | H 24 | H_.glif 25 | I 26 | I_.glif 27 | I.narrow 28 | I_.narrow.glif 29 | IJ 30 | I_J_.glif 31 | J 32 | J_.glif 33 | J.narrow 34 | J_.narrow.glif 35 | K 36 | K_.glif 37 | L 38 | L_.glif 39 | M 40 | M_.glif 41 | N 42 | N_.glif 43 | O 44 | O_.glif 45 | P 46 | P_.glif 47 | Q 48 | Q_.glif 49 | R 50 | R_.glif 51 | S 52 | S_.glif 53 | S.closed 54 | S_.closed.glif 55 | T 56 | T_.glif 57 | U 58 | U_.glif 59 | V 60 | V_.glif 61 | W 62 | W_.glif 63 | X 64 | X_.glif 65 | Y 66 | Y_.glif 67 | Z 68 | Z_.glif 69 | acute 70 | acute.glif 71 | arrowdown 72 | arrowdown.glif 73 | arrowleft 74 | arrowleft.glif 75 | arrowright 76 | arrowright.glif 77 | arrowup 78 | arrowup.glif 79 | colon 80 | colon.glif 81 | comma 82 | comma.glif 83 | dieresis 84 | dieresis.glif 85 | dot 86 | dot.glif 87 | period 88 | period.glif 89 | quotedblbase 90 | quotedblbase.glif 91 | quotedblleft 92 | quotedblleft.glif 93 | quotedblright 94 | quotedblright.glif 95 | quotesinglbase 96 | quotesinglbase.glif 97 | semicolon 98 | semicolon.glif 99 | space 100 | space.glif 101 | 102 | 103 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/dieresis.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | public.markColor 12 | 0.6567,0.6903,1,1 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/dot.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/layerinfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | color 6 | 1,0.75,0,0.7 7 | lib 8 | 9 | com.typemytype.robofont.segmentType 10 | curve 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/period.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | public.markColor 16 | 0,0.95,0.95,1 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/quotedblbase.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | com.typemytype.robofont.Image.Brightness 12 | 0 13 | com.typemytype.robofont.Image.Contrast 14 | 1 15 | com.typemytype.robofont.Image.Saturation 16 | 1 17 | com.typemytype.robofont.Image.Sharpness 18 | 0.4 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/quotedblleft.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/quotedblright.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/quotesinglbase.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | com.typemytype.robofont.Image.Brightness 11 | 0 12 | com.typemytype.robofont.Image.Contrast 13 | 1 14 | com.typemytype.robofont.Image.Saturation 15 | 1 16 | com.typemytype.robofont.Image.Sharpness 17 | 0.4 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/semicolon.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/glyphs/space.glif: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/groups.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | public.kern1.@MMK_L_A 6 | 7 | A 8 | 9 | public.kern2.@MMK_R_A 10 | 11 | A 12 | 13 | testGroup 14 | 15 | E 16 | F 17 | H 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/kerning.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A 6 | 7 | J 8 | -20 9 | O 10 | -30 11 | T 12 | -70 13 | U 14 | -30 15 | V 16 | -50 17 | 18 | B 19 | 20 | A 21 | -20 22 | J 23 | -50 24 | O 25 | -20 26 | S 27 | -10 28 | T 29 | -10 30 | U 31 | -20 32 | V 33 | -30 34 | 35 | C 36 | 37 | A 38 | -20 39 | J 40 | -50 41 | T 42 | -20 43 | V 44 | -20 45 | 46 | E 47 | 48 | J 49 | -20 50 | T 51 | -10 52 | V 53 | -10 54 | 55 | F 56 | 57 | A 58 | -40 59 | J 60 | -80 61 | O 62 | -10 63 | S 64 | -20 65 | U 66 | -10 67 | V 68 | -10 69 | 70 | G 71 | 72 | J 73 | -20 74 | S 75 | -10 76 | T 77 | -40 78 | U 79 | -10 80 | V 81 | -30 82 | 83 | H 84 | 85 | J 86 | -30 87 | S 88 | -10 89 | T 90 | -10 91 | 92 | J 93 | 94 | J 95 | -70 96 | 97 | L 98 | 99 | J 100 | -20 101 | O 102 | -20 103 | T 104 | -110 105 | U 106 | -20 107 | V 108 | -60 109 | 110 | O 111 | 112 | A 113 | -30 114 | J 115 | -60 116 | S 117 | -10 118 | T 119 | -30 120 | V 121 | -30 122 | 123 | P 124 | 125 | A 126 | -50 127 | J 128 | -100 129 | S 130 | -10 131 | T 132 | -10 133 | U 134 | -10 135 | V 136 | -20 137 | 138 | R 139 | 140 | H 141 | -10 142 | J 143 | -20 144 | O 145 | -30 146 | S 147 | -20 148 | T 149 | -30 150 | U 151 | -30 152 | V 153 | -40 154 | 155 | S 156 | 157 | A 158 | -20 159 | H 160 | -20 161 | J 162 | -40 163 | O 164 | -10 165 | S 166 | -10 167 | T 168 | -30 169 | U 170 | -10 171 | V 172 | -30 173 | W 174 | -10 175 | 176 | T 177 | 178 | A 179 | -65 180 | H 181 | -10 182 | J 183 | -130 184 | O 185 | -20 186 | 187 | U 188 | 189 | A 190 | -30 191 | J 192 | -60 193 | S 194 | -10 195 | V 196 | -10 197 | 198 | V 199 | 200 | J 201 | -100 202 | O 203 | -30 204 | S 205 | -20 206 | U 207 | -10 208 | 209 | 210 | 211 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/layercontents.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | foreground 7 | glyphs 8 | 9 | 10 | background 11 | glyphs.background 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/lib.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.defcon.sortDescriptor 6 | 7 | 8 | allowPseudoUnicode 9 | 10 | ascending 11 | 12 | type 13 | alphabetical 14 | 15 | 16 | allowPseudoUnicode 17 | 18 | ascending 19 | 20 | type 21 | category 22 | 23 | 24 | allowPseudoUnicode 25 | 26 | ascending 27 | 28 | type 29 | unicode 30 | 31 | 32 | allowPseudoUnicode 33 | 34 | ascending 35 | 36 | type 37 | script 38 | 39 | 40 | allowPseudoUnicode 41 | 42 | ascending 43 | 44 | type 45 | suffix 46 | 47 | 48 | allowPseudoUnicode 49 | 50 | ascending 51 | 52 | type 53 | decompositionBase 54 | 55 | 56 | com.letterror.lightMeter.prefs 57 | 58 | chunkSize 59 | 5 60 | diameter 61 | 200 62 | drawTail 63 | 64 | invert 65 | 66 | toolDiameter 67 | 30 68 | toolStyle 69 | fluid 70 | 71 | com.typemytype.robofont.background.layerStrokeColor 72 | 73 | 0.0 74 | 0.8 75 | 0.2 76 | 0.7 77 | 78 | com.typemytype.robofont.compileSettings.autohint 79 | 80 | com.typemytype.robofont.compileSettings.checkOutlines 81 | 82 | com.typemytype.robofont.compileSettings.createDummyDSIG 83 | 84 | com.typemytype.robofont.compileSettings.decompose 85 | 86 | com.typemytype.robofont.compileSettings.generateFormat 87 | 0 88 | com.typemytype.robofont.compileSettings.releaseMode 89 | 90 | com.typemytype.robofont.foreground.layerStrokeColor 91 | 92 | 0.5 93 | 0.0 94 | 0.5 95 | 0.7 96 | 97 | com.typemytype.robofont.italicSlantOffset 98 | 0 99 | com.typemytype.robofont.segmentType 100 | curve 101 | com.typemytype.robofont.shouldAddPointsInSplineConversion 102 | 1 103 | com.typesupply.defcon.sortDescriptor 104 | 105 | 106 | ascending 107 | 108 | space 109 | A 110 | B 111 | C 112 | D 113 | E 114 | F 115 | G 116 | H 117 | I 118 | J 119 | K 120 | L 121 | M 122 | N 123 | O 124 | P 125 | Q 126 | R 127 | S 128 | T 129 | U 130 | V 131 | W 132 | X 133 | Y 134 | Z 135 | a 136 | b 137 | c 138 | d 139 | e 140 | f 141 | g 142 | h 143 | i 144 | j 145 | k 146 | l 147 | m 148 | n 149 | ntilde 150 | o 151 | p 152 | q 153 | r 154 | s 155 | t 156 | u 157 | v 158 | w 159 | x 160 | y 161 | z 162 | zcaron 163 | zero 164 | one 165 | two 166 | three 167 | four 168 | five 169 | six 170 | seven 171 | eight 172 | nine 173 | underscore 174 | hyphen 175 | endash 176 | emdash 177 | parenleft 178 | parenright 179 | bracketleft 180 | bracketright 181 | braceleft 182 | braceright 183 | numbersign 184 | percent 185 | period 186 | comma 187 | colon 188 | semicolon 189 | exclam 190 | question 191 | slash 192 | backslash 193 | bar 194 | at 195 | ampersand 196 | paragraph 197 | bullet 198 | dollar 199 | trademark 200 | fi 201 | fl 202 | .notdef 203 | a_b_c 204 | Atilde 205 | Adieresis 206 | Acircumflex 207 | Aring 208 | Ccedilla 209 | Agrave 210 | Aacute 211 | quotedblright 212 | quotedblleft 213 | 214 | type 215 | glyphList 216 | 217 | 218 | public.glyphOrder 219 | 220 | A 221 | Aacute 222 | Adieresis 223 | B 224 | C 225 | D 226 | E 227 | F 228 | G 229 | H 230 | I 231 | J 232 | K 233 | L 234 | M 235 | N 236 | O 237 | P 238 | Q 239 | R 240 | S 241 | T 242 | U 243 | V 244 | W 245 | X 246 | Y 247 | Z 248 | IJ 249 | S.closed 250 | I.narrow 251 | J.narrow 252 | quotesinglbase 253 | quotedblbase 254 | quotedblleft 255 | quotedblright 256 | comma 257 | period 258 | colon 259 | semicolon 260 | dot 261 | dieresis 262 | acute 263 | space 264 | arrowdown 265 | arrowleft 266 | arrowright 267 | arrowup 268 | 269 | 270 | 271 | -------------------------------------------------------------------------------- /testdata/ufo/MutatorSansBoldCondensed.ufo/metainfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | creator 6 | com.github.fonttools.ufoLib 7 | formatVersion 8 | 3 9 | 10 | 11 | --------------------------------------------------------------------------------