mirror of
https://github.com/kiliman/operator-mono-lig.git
synced 2026-08-12 02:10:52 +02:00
Initial import
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
* text=auto
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
build/
|
||||||
|
node_modules/
|
||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible Node.js debug attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch Program",
|
||||||
|
"program": "${workspaceRoot}\\index.js"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# Operator Mono Ligatures
|
||||||
|
|
||||||
|
This project will generate new OpenType fonts for *Operator Mono* that includes ligatures similar to
|
||||||
|
those found in the popular Fira Code font.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
NOTE: Because *Operator Mono* is not a free font, you must have the original font files. This utility
|
||||||
|
will merge the ligature definitions into a copy of the original font. The new font family is named *Operator Mono Lig* so you can install it side-by-side with the original font.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
* The original *Operator Mono* font... of course.
|
||||||
|
* Install *fonttools* from https://github.com/fonttools/fonttools
|
||||||
|
* Install Python
|
||||||
|
* Run: `pip install fonttools`
|
||||||
|
* Node.js
|
||||||
|
|
||||||
|
## How to Install
|
||||||
|
|
||||||
|
Once all the prerequisites have been installed, clone this repo.
|
||||||
|
|
||||||
|
From the command line, run:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy your *Operator Mono* OpenType files into the `original` folder.
|
||||||
|
|
||||||
|
From the command line, run:
|
||||||
|
|
||||||
|
```
|
||||||
|
build
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate the new font files int the `build` folder. You can now install these fonts on your system.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
del .\original\*.ttx
|
||||||
|
ttx .\original\OperatorMono-Medium.otf
|
||||||
|
ttx .\original\OperatorMono-MediumItalic.otf
|
||||||
|
|
||||||
|
if not exist build\* mkdir build
|
||||||
|
|
||||||
|
node index.js OperatorMono-Medium
|
||||||
|
node index.js OperatorMono-MediumItalic
|
||||||
|
|
||||||
|
del /q .\build\*.otf
|
||||||
|
|
||||||
|
ttx .\build\OperatorMonoLig-Medium.ttx
|
||||||
|
ttx .\build\OperatorMonoLig-MediumItalic.ttx
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
node extract.js OperatorMonoLig-Medium
|
||||||
|
node extract.js OperatorMonoLig-MediumItalic
|
||||||
+136
@@ -0,0 +1,136 @@
|
|||||||
|
const Promise = require('bluebird');
|
||||||
|
const fs = Promise.promisifyAll(require('fs'));
|
||||||
|
|
||||||
|
const xpath = require('xpath');
|
||||||
|
const { DOMParser, XMLSerializer } = require('xmldom');
|
||||||
|
const format = require('xml-formatter');
|
||||||
|
let fontName;
|
||||||
|
|
||||||
|
const regEx = /\.liga$/;
|
||||||
|
const regExBlankLines = /^(?=\n)$|^\s*/gm;
|
||||||
|
const regExWhitespace = /^\s+$/;
|
||||||
|
const NodeType = {};
|
||||||
|
NodeType.TEXT_NODE = 3;
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
fontName = process.argv[2];
|
||||||
|
|
||||||
|
const srcFileName = `./ligature_source/${fontName}.ttx`;
|
||||||
|
|
||||||
|
console.log(`Reading file ${srcFileName}`);
|
||||||
|
const xml = await fs.readFileAsync(srcFileName, 'utf-8');
|
||||||
|
const dom = new DOMParser().parseFromString(xml);
|
||||||
|
|
||||||
|
await extractAndWrite('glyphs', extractGlyphs, dom);
|
||||||
|
await extractAndWrite('cmap', extractCmap, dom);
|
||||||
|
await extractAndWrite('classdef', extractClassDef, dom);
|
||||||
|
await extractAndWrite('hmtx', extractHmtx, dom);
|
||||||
|
await extractAndWrite('lookup', extractLookup, dom);
|
||||||
|
await extractAndWrite('charstrings', extractCharStrings, dom);
|
||||||
|
|
||||||
|
console.log('Done');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function extractAndWrite(name, func, dom) {
|
||||||
|
const newDom = func(dom);
|
||||||
|
console.log('Finished extracting ' + name);
|
||||||
|
|
||||||
|
const fileName = `./ligature/${fontName}_${name}.xml`;
|
||||||
|
await fs.writeFileAsync(fileName, format(serialize(newDom)));
|
||||||
|
console.log('Finished writing ' + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
const serialize = dom =>
|
||||||
|
new XMLSerializer().serializeToString(dom, false, node => {
|
||||||
|
if (node.nodeType === NodeType.TEXT_NODE) {
|
||||||
|
if (regExWhitespace.test(node.data)) return null;
|
||||||
|
const data = node.data
|
||||||
|
.split('\r\n')
|
||||||
|
.filter(s => /\S+/.test(s))
|
||||||
|
.map(s => s.replace(/^\s+/g, ''))
|
||||||
|
.join('\n');
|
||||||
|
|
||||||
|
return node.ownerDocument.createTextNode(data);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
});
|
||||||
|
|
||||||
|
const extractGlyphs = dom => {
|
||||||
|
const newDom = new DOMParser().parseFromString('<GlyphOrder/>');
|
||||||
|
const glyphIds = xpath.select('/ttFont/GlyphOrder/GlyphID', dom);
|
||||||
|
|
||||||
|
glyphIds
|
||||||
|
.filter(node => regEx.test(node.getAttribute('name')))
|
||||||
|
.forEach(node => newDom.documentElement.appendChild(node));
|
||||||
|
|
||||||
|
return newDom;
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractCmap = dom => {
|
||||||
|
const newDom = new DOMParser().parseFromString('<cmap/>');
|
||||||
|
const cmap = xpath.select('/ttFont/cmap/cmap_format_4', dom);
|
||||||
|
|
||||||
|
cmap.forEach(node => {
|
||||||
|
// for each cmap_format_4 node, need to copy map elements
|
||||||
|
// create and append cmap_format_4 node
|
||||||
|
const cmap4 = node.cloneNode(false);
|
||||||
|
newDom.documentElement.appendChild(cmap4);
|
||||||
|
|
||||||
|
xpath
|
||||||
|
.select('map', node)
|
||||||
|
.filter(child => regEx.test(child.getAttribute('name')))
|
||||||
|
.forEach(child => cmap4.appendChild(child));
|
||||||
|
});
|
||||||
|
return newDom;
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractClassDef = dom => {
|
||||||
|
const newDom = new DOMParser().parseFromString('<GlyphClassDef/>');
|
||||||
|
const classDefs = xpath.select('/ttFont/GDEF/GlyphClassDef/ClassDef', dom);
|
||||||
|
|
||||||
|
classDefs
|
||||||
|
.filter(node => regEx.test(node.getAttribute('glyph')))
|
||||||
|
.forEach(node => newDom.documentElement.appendChild(node));
|
||||||
|
|
||||||
|
return newDom;
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractHmtx = dom => {
|
||||||
|
const newDom = new DOMParser().parseFromString('<hmtx/>');
|
||||||
|
const mtx = xpath.select('/ttFont/hmtx/mtx', dom);
|
||||||
|
|
||||||
|
mtx
|
||||||
|
.filter(node => regEx.test(node.getAttribute('name')))
|
||||||
|
.forEach(node => newDom.documentElement.appendChild(node));
|
||||||
|
|
||||||
|
return newDom;
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractLookup = dom => {
|
||||||
|
const newDom = new DOMParser().parseFromString('<LookupList/>');
|
||||||
|
const lookup = xpath.select(
|
||||||
|
'/ttFont/GSUB/LookupList/Lookup[@index="20"]',
|
||||||
|
dom,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
newDom.documentElement.appendChild(lookup);
|
||||||
|
|
||||||
|
return newDom;
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractCharStrings = dom => {
|
||||||
|
const newDom = new DOMParser().parseFromString('<CharStrings/>');
|
||||||
|
const charStrings = xpath.select(
|
||||||
|
'/ttFont/CFF/CFFFont/CharStrings/CharString',
|
||||||
|
dom
|
||||||
|
);
|
||||||
|
|
||||||
|
charStrings
|
||||||
|
.filter(node => regEx.test(node.getAttribute('name')))
|
||||||
|
.forEach(node => newDom.documentElement.appendChild(node));
|
||||||
|
|
||||||
|
return newDom;
|
||||||
|
};
|
||||||
|
|
||||||
|
main();
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -0,0 +1,285 @@
|
|||||||
|
const Promise = require('bluebird');
|
||||||
|
const fs = Promise.promisifyAll(require('fs'));
|
||||||
|
|
||||||
|
const xpath = require('xpath');
|
||||||
|
const { DOMParser, XMLSerializer } = require('xmldom');
|
||||||
|
const format = require('xml-formatter');
|
||||||
|
let fontName;
|
||||||
|
let ligFontName;
|
||||||
|
|
||||||
|
const regEx = /\.liga$/;
|
||||||
|
const regExBlankLines = /^(?=\n)$|^\s*/gm;
|
||||||
|
const regExWhitespace = /^\s+$/;
|
||||||
|
const NodeType = {};
|
||||||
|
NodeType.TEXT_NODE = 3;
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
fontName = process.argv[2] || 'OperatorMono-MediumItalic';
|
||||||
|
ligFontName = fontName.split('-').join('Lig-');
|
||||||
|
|
||||||
|
const srcFileName = `./original/${fontName}.ttx`;
|
||||||
|
const dstFileName = `./build/${ligFontName}.ttx`;
|
||||||
|
console.log(`Reading original font file ${srcFileName}`);
|
||||||
|
const xml = await fs.readFileAsync(srcFileName, 'utf-8');
|
||||||
|
const dom = new DOMParser().parseFromString(xml);
|
||||||
|
|
||||||
|
await processPatch('names', patchNames, dom);
|
||||||
|
await processPatch('glyphs', patchGlyphs, dom);
|
||||||
|
await processPatch('cmap', patchCmap, dom);
|
||||||
|
await processPatch('classdef', patchClassDef, dom);
|
||||||
|
await processPatch('hmtx', patchHmtx, dom);
|
||||||
|
await processPatch('lookup', patchLookup, dom);
|
||||||
|
await processPatch('charstrings', patchCharStrings, dom);
|
||||||
|
|
||||||
|
//return;
|
||||||
|
console.log(`Writing ligature font file ${dstFileName}`);
|
||||||
|
await fs.writeFileAsync(dstFileName, format(serialize(dom)));
|
||||||
|
console.log('Done');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadConfigAsync(name) {
|
||||||
|
const fileName = `./ligature/${ligFontName}_${name}.xml`;
|
||||||
|
const xml = await fs.readFileAsync(fileName, 'utf-8');
|
||||||
|
return new DOMParser().parseFromString(xml);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function processPatch(name, patchFunc, dom) {
|
||||||
|
console.log(`Patching ${name}`);
|
||||||
|
await patchFunc(dom);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchNames(dom) {
|
||||||
|
const configDom = await loadConfigAsync('names');
|
||||||
|
|
||||||
|
const names = xpath.select('/name/namerecord', configDom);
|
||||||
|
const targetName = xpath.select('/ttFont/name', dom, true);
|
||||||
|
|
||||||
|
names.forEach(node => {
|
||||||
|
const nameId = node.getAttribute('nameID');
|
||||||
|
const platformId = node.getAttribute('platformID');
|
||||||
|
|
||||||
|
// search for namerecord in target dom and replace with this one or append node
|
||||||
|
const target = xpath.select(
|
||||||
|
`/ttFont/name/namerecord[@nameID="${nameId}" and @platformID="${platformId}"]`,
|
||||||
|
dom,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (target) {
|
||||||
|
target.parentNode.replaceChild(node, target);
|
||||||
|
} else {
|
||||||
|
targetName.appendChild(node);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchGlyphs(dom) {
|
||||||
|
const configDom = await loadConfigAsync('glyphs');
|
||||||
|
// get number of glyphs in target dom
|
||||||
|
const targetGlyphs = xpath.select('/ttFont/GlyphOrder', dom, true);
|
||||||
|
const glyphsCount = xpath.select('count(GlyphID)', targetGlyphs, true);
|
||||||
|
|
||||||
|
let n = glyphsCount;
|
||||||
|
// get ligature glyphs
|
||||||
|
const glyphs = xpath.select('/GlyphOrder/GlyphID', configDom);
|
||||||
|
glyphs.forEach(node => {
|
||||||
|
node.setAttribute('id', n++);
|
||||||
|
targetGlyphs.appendChild(node);
|
||||||
|
});
|
||||||
|
|
||||||
|
// update glyph count
|
||||||
|
setAttribute(dom, '/ttFont/maxp/numGlyphs', 'value', n);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchCmap(dom) {
|
||||||
|
const configDom = await loadConfigAsync('cmap');
|
||||||
|
const cmaps = xpath.select('/cmap/cmap_format_4', configDom);
|
||||||
|
|
||||||
|
cmaps.forEach(node => {
|
||||||
|
const platformId = node.getAttribute('platformID');
|
||||||
|
const platEncId = node.getAttribute('platEncID');
|
||||||
|
|
||||||
|
// search for cmap_format_4 in target dom
|
||||||
|
const target = xpath.select(
|
||||||
|
`/ttFont/cmap/cmap_format_4[@platformID="${platformId}" and @platEncID="${platEncId}"]`,
|
||||||
|
dom,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (target) {
|
||||||
|
// append all map elements to target cmap_format_4
|
||||||
|
const maps = xpath.select('map', node);
|
||||||
|
maps.forEach(child => target.appendChild(child));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchClassDef(dom) {
|
||||||
|
const configDom = await loadConfigAsync('classdef');
|
||||||
|
const glyphClassDef = xpath.select('/ttFont/GDEF/GlyphClassDef', dom, true);
|
||||||
|
|
||||||
|
const classDefs = xpath.select('/GlyphClassDef/ClassDefs', configDom);
|
||||||
|
classDefs.forEach(node => glyphClassDef.appendChild(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchHmtx(dom) {
|
||||||
|
const hmtxDom = await loadConfigAsync('hmtx');
|
||||||
|
const targetHmtx = xpath.select('/ttFont/hmtx', dom, true);
|
||||||
|
|
||||||
|
const mtx = xpath.select('/hmtx/mtx', hmtxDom);
|
||||||
|
mtx.forEach(node => targetHmtx.appendChild(node));
|
||||||
|
|
||||||
|
const mtxCount = xpath.select('count(/ttFont/hmtx/mtx)', dom, true);
|
||||||
|
setAttribute(dom, '/ttFont/hhea/numberOfHMetrics', 'value', mtxCount);
|
||||||
|
|
||||||
|
const configDom = await loadConfigAsync('config');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/head/xMin', 'value');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/head/yMin', 'value');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/head/xMax', 'value');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/head/yMax', 'value');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/hhea/advanceWidthMax', 'value');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/hhea/xMaxExtent', 'value');
|
||||||
|
copyConfigAttribute(dom, configDom, '/ttFont/CFF/CFFFont/FontBBox', 'value');
|
||||||
|
copyConfigAttribute(
|
||||||
|
dom,
|
||||||
|
configDom,
|
||||||
|
'/ttFont/CFF/CFFFont/Private/nominalWidthX',
|
||||||
|
'value'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchLookup(dom) {
|
||||||
|
const configDom = await loadConfigAsync('lookup');
|
||||||
|
const featureList = xpath.select('/ttFont/GSUB/FeatureList', dom, true);
|
||||||
|
|
||||||
|
// look for feature with FeatureTag liga
|
||||||
|
let featureRecord;
|
||||||
|
let featureTag;
|
||||||
|
let feature;
|
||||||
|
let featureTags = xpath.select(
|
||||||
|
'/ttFont/GSUB/FeatureList/FeatureRecord/FeatureTag[@value="liga"]',
|
||||||
|
dom
|
||||||
|
);
|
||||||
|
|
||||||
|
if (featureTags.length) {
|
||||||
|
featureTag = featureTags[0];
|
||||||
|
featureRecord = featureTag.parentNode;
|
||||||
|
feature = xpath.select('Feature', featureRecord, true);
|
||||||
|
} else {
|
||||||
|
// need to add feature to FeatureList
|
||||||
|
const featuresCount = xpath.select(
|
||||||
|
'count(/ttFont/GSUB/FeatureList/FeatureRecord)',
|
||||||
|
dom,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
featureRecord = dom.createElement('FeatureRecord');
|
||||||
|
featureRecord.setAttribute('index', featuresCount);
|
||||||
|
featureTag = dom.createElement('FeatureTag');
|
||||||
|
featureTag.setAttribute('value', 'liga');
|
||||||
|
feature = dom.createElement('Feature');
|
||||||
|
featureRecord.appendChild(featureTag);
|
||||||
|
featureRecord.appendChild(feature);
|
||||||
|
featureList.appendChild(featureRecord);
|
||||||
|
}
|
||||||
|
let lookupListIndex = xpath.select(
|
||||||
|
'LookupListIndex[@value="20"]',
|
||||||
|
feature,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (!lookupListIndex) {
|
||||||
|
const count = xpath.select('count(LookupListIndex)', feature, true);
|
||||||
|
lookupListIndex = dom.createElement('LookupListIndex');
|
||||||
|
lookupListIndex.setAttribute('index', count);
|
||||||
|
lookupListIndex.setAttribute('value', '20');
|
||||||
|
feature.appendChild(lookupListIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper function for adding feature to ScriptRecord
|
||||||
|
const addFeature = (scriptRecord, featureRecord, lang) => {
|
||||||
|
if (!lang) return;
|
||||||
|
const index = featureRecord.getAttribute('index');
|
||||||
|
if (xpath.select(`FeatureIndex[@value="${index}"]`, lang, true)) return;
|
||||||
|
|
||||||
|
const count = xpath.select('count(FeatureIndex)', lang, true);
|
||||||
|
const featureIndex = dom.createElement('FeatureIndex');
|
||||||
|
featureIndex.setAttribute('index', count);
|
||||||
|
featureIndex.setAttribute('value', index);
|
||||||
|
lang.appendChild(featureIndex);
|
||||||
|
};
|
||||||
|
|
||||||
|
// nead to add feature to ScriptList
|
||||||
|
const scriptList = xpath.select('/ttFont/GSUB/ScriptList', dom, true);
|
||||||
|
const scriptRecords = xpath.select('ScriptRecord', scriptList);
|
||||||
|
scriptRecords.forEach(node => {
|
||||||
|
// check for feature in DefaultLangSys
|
||||||
|
addFeature(
|
||||||
|
node,
|
||||||
|
featureRecord,
|
||||||
|
xpath.select('Script/DefaultLangSys', node, true)
|
||||||
|
);
|
||||||
|
// add features to any other languages
|
||||||
|
xpath
|
||||||
|
.select('Script/LangSysRecord/LangSys', node)
|
||||||
|
.forEach(lang => addFeature(node, featureRecord, lang));
|
||||||
|
});
|
||||||
|
|
||||||
|
// finally add LigatureSubst to Lookup index=20
|
||||||
|
const lookupList = xpath.select('/ttFont/GSUB/LookupList', dom, true);
|
||||||
|
const newLookup = xpath.select('/LookupList/Lookup', configDom, true);
|
||||||
|
|
||||||
|
let lookup = xpath.select(
|
||||||
|
'/ttFont/GSUB/LookupList/Lookup[@index="20"]',
|
||||||
|
dom,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (!lookup) {
|
||||||
|
lookupList.appendChild(newLookup);
|
||||||
|
} else {
|
||||||
|
lookupList.replaceChild(newLookup, lookup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchCharStrings(dom) {
|
||||||
|
const configDom = await loadConfigAsync('charstrings');
|
||||||
|
const nameDom = await loadConfigAsync('names');
|
||||||
|
|
||||||
|
const cffFont = xpath.select('/ttFont/CFF/CFFFont', dom, true);
|
||||||
|
|
||||||
|
cffFont.setAttribute('name', ligFontName);
|
||||||
|
// get names from name config
|
||||||
|
const fullName = nameDom.documentElement.getAttribute('fullName');
|
||||||
|
const familyName = nameDom.documentElement.getAttribute('familyName');
|
||||||
|
setAttribute(cffFont, 'FullName', 'value', fullName);
|
||||||
|
setAttribute(cffFont, 'FamilyName', 'value', familyName);
|
||||||
|
|
||||||
|
const targetCharStrings = xpath.select('CharStrings', cffFont, true);
|
||||||
|
|
||||||
|
const charStrings = xpath.select('/CharStrings/CharString', configDom);
|
||||||
|
charStrings.forEach(node => targetCharStrings.appendChild(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
const setAttribute = (parent, path, name, value) => {
|
||||||
|
var node = xpath.select(path, parent, true);
|
||||||
|
node.setAttribute(name, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyConfigAttribute = (dom, configDom, path, name) => {
|
||||||
|
const value = xpath.select(path, configDom, true).getAttribute(name);
|
||||||
|
setAttribute(dom, path, name, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const serialize = dom =>
|
||||||
|
new XMLSerializer().serializeToString(dom, false, node => {
|
||||||
|
if (node.nodeType === NodeType.TEXT_NODE) {
|
||||||
|
if (regExWhitespace.test(node.data)) return null;
|
||||||
|
const data = node.data
|
||||||
|
.split('\r\n')
|
||||||
|
.filter(s => /\S+/.test(s))
|
||||||
|
.map(s => s.replace(/^\s+/g, ''))
|
||||||
|
.join('\n');
|
||||||
|
|
||||||
|
return node.ownerDocument.createTextNode(data);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
});
|
||||||
|
|
||||||
|
main();
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
<CharStrings>
|
||||||
|
<CharString name="ampersand_ampersand.liga">
|
||||||
|
107 385.31746 184.40079 rmoveto
|
||||||
|
4.36612 -7.70291 4.56085 -7.80026 4.75555 -7.89761 -49.33333 -50 -44 -25 -38.66667 0 -34.66667 0 -17.33333 19.66667 0 39.33333 0 52 36 61.33333 72 70.66667 11.63492 -43.63095 20.77249 -48.19974 29.91005 -52.76852 rrcurveto
|
||||||
|
358.73317 -8.25699 rmoveto
|
||||||
|
2.9023 -5.00752 2.98312 -5.04793 3.06395 -5.08835 -49.33333 -50 -44 -25 -38.66667 0 -34.66667 0 -17.33333 19.66667 0 39.33333 0 52 36 61.33333 72 70.66667 12.23906 -45.8965 22.35022 -50.95206 32.46135 -56.00764 rrcurveto
|
||||||
|
143.94937 -196.1438 rmoveto
|
||||||
|
89 65 rlineto
|
||||||
|
-42 46 -35.66667 44 -29.33333 42 38 46.66667 39.33333 58 40.66667 69.33333 rrcurveto
|
||||||
|
-88 31 rlineto
|
||||||
|
-24.66667 -48.66667 -25.66666 -44 -26.66667 -39.33333 -28.66667 52 -19.33333 51.33333 -10 50.66667 31.33333 29.33333 24.33334 30 17.33333 30.66667 17.33333 30.66667 8.66667 26.33333 0 22 0 22 -6.83333 16.66667 -13.66667 11.33333 -13.66667 11.33333 -17.83333 5.66667 -22 0 rrcurveto
|
||||||
|
-32.66667 0 -30.16666 -18.16667 -27.66667 -36.33333 -27.66667 -36.33333 -13.83333 -45.5 0 -54.66667 0 -12 0.33333 -9.33333 0.66667 -6.66667 -85.33333 -68.66667 -57.29137 -67.4156 -29.24939 -66.16457 -42.08394 74.16457 -25.3753 61.74895 -8.66667 49.33333 31.33333 29.33333 24.33334 30 17.33333 30.66667 rrcurveto
|
||||||
|
17.33333 30.66667 8.66667 26.33333 0 22 0 22 -6.83333 16.66667 -13.66667 11.33333 -13.66667 11.33333 -17.83333 5.66667 -22 0 -32.66667 0 -30.16666 -18.16667 -27.66667 -36.33333 -27.66667 -36.33333 -13.83333 -45.5 0 -54.66667 0 -12 0.33333 -9.33333 0.66667 -6.66667 rrcurveto
|
||||||
|
-129.33333 -104 -64.66667 -100.66667 0 -97.33333 0 -39.33333 10.66667 -31.16667 21.33333 -23 21.33333 -23 30.33334 -11.5 39.33333 0 65.33333 0 69.33334 34.66667 73.33333 69.33333 rrcurveto
|
||||||
|
33 -47 rlineto
|
||||||
|
30.66667 -38.66667 37.33333 -19.33333 44 0 64.6701 0 69.66667 35 74.66322 70 28 -39.33333 30.66667 -38.33334 33.33333 -37.33333 rrcurveto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="bar_bar.liga">
|
||||||
|
107 442.49721 378 rmoveto
|
||||||
|
65.50279 335 -102 -3 -174 -892 101 0 rlineto
|
||||||
|
433 892 rmoveto
|
||||||
|
-64.76233 -332 -109.23767 -560 101 0 175 895 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_equal.liga">
|
||||||
|
107 1051 456 rmoveto
|
||||||
|
-940 0 -19 -91 941 0 rlineto
|
||||||
|
-24 -129 rmoveto
|
||||||
|
-941 0 -19 -91 941 0 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_equal_equal.liga">
|
||||||
|
657 1601 527 rmoveto
|
||||||
|
-1450 0 -19 -91 1451 0 rlineto
|
||||||
|
-64 -240 rmoveto
|
||||||
|
-1451 0 -19 -91 1451 0 rlineto
|
||||||
|
-1408 163 rmoveto
|
||||||
|
1451 0 18 91 -1450 0 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_equal_greater.liga">
|
||||||
|
657 1188 -22 rmoveto
|
||||||
|
373 251 17 91 -281 291 -74 -72 83.33333 -83 -1195.33333 0 -19 -91 1305.69879 0 75.30121 -75 -2 -11 -65.2963 -43 -1337.7037 0 -19 -91 1218.51852 0 -124.51852 -82 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_greater.liga">
|
||||||
|
107 652 -22 rmoveto
|
||||||
|
373 251 17 91 -281 291 -74 -72 83.33333 -83 -659.33333 0 -19 -91 769.69879 0 75.30121 -75 -2 -11 -65.2963 -43 -801.7037 0 -19 -91 682.51852 0 -124.51852 -82 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="exclam_equal.liga">
|
||||||
|
107 1009 236 rmoveto
|
||||||
|
-428 0 88 129 364 0 18 91 -320 0 159 234 -89 36 -184 -270 -506 0 -19 -91 462 0 -88 -129 -398 0 -19 -91 355 0 rlineto
|
||||||
|
-208 -305 96 -28 227 333 471 0 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="exclam_equal_equal.liga">
|
||||||
|
657 1022 726 rmoveto
|
||||||
|
-135.886 -199 -735.114 0 -19 -91 691.97517 0 -52.57901 -77 -660.39616 0 -19 -91 617.25734 0 -49.16478 -72 -592.09254 0 -19 -91 548.95372 0 -180.95372 -265 96 -28 199.56036 293 rlineto
|
||||||
|
787.43964 0 19 91 -744.46014 0 49.03873 72 719.42142 0 18 91 -675.44191 0 52.4442 77 644.99773 0 18 91 -601.01822 0 111.01822 163 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="greater_equal.liga">
|
||||||
|
107 247 -32 rmoveto
|
||||||
|
30 -84 562 271 18 103 rlineto
|
||||||
|
-569 -161 rmoveto
|
||||||
|
553 261 17 91 -461 291 -74 -72 430 -249 -2 -11 -508 -226 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="hyphen_greater.liga">
|
||||||
|
107 628 -22 rmoveto
|
||||||
|
373 251 17 91 -281 291 -74 -72 195.78313 -195 -758.78313 0 -18 -93 786.48148 0 -285.48148 -188 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="hyphen_hyphen.liga">
|
||||||
|
107 497 251 rmoveto
|
||||||
|
17 93 -301 0 -18 -93 rlineto
|
||||||
|
409 93 rmoveto
|
||||||
|
-18 -93 302 0 17 93 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="hyphen_hyphen_greater.liga">
|
||||||
|
657 1178 -22 rmoveto
|
||||||
|
373 251 17 91 -281 291 -74 -72 196 -195 -1309 0 -18 -93 1336 0 -285 -188 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_equal.liga">
|
||||||
|
107 256 171 rmoveto
|
||||||
|
481 -299 66 67 -527 329 rlineto
|
||||||
|
563 467 rmoveto
|
||||||
|
-534 -295 -16 -91 440 -249 74 72 -409 208 2 10 488 261 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_equal_equal.liga">
|
||||||
|
657 1592 456 rmoveto
|
||||||
|
-1183.31798 0 107.31798 71 -45 84 -374 -251 -16 -91 280 -291 74 72 -94.62 95 1190.62 0 19 91 -1300.256 0 -63.744 64 2 10 83.13364 55 1302.86636 0 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_exclam_hyphen_x2.liga">
|
||||||
|
1207 2119 344 rmoveto
|
||||||
|
-1169 0 -18 -93 1170 0 rlineto
|
||||||
|
-1631 360 rmoveto
|
||||||
|
-374 -251 -16 -91 280 -291 74 72 -200 201 369 0 17 93 -382 0 277 183 rlineto
|
||||||
|
213 -282 rmoveto
|
||||||
|
72 hlineto
|
||||||
|
4 17.33333 20.16667 73.16667 36.33333 129 36.33333 129 19.83334 70.83333 3.33333 12.66667 rrcurveto
|
||||||
|
-140 hlineto
|
||||||
|
-2.66667 -14 -8.5 -71.33333 -14.33333 -128.66667 -14.33333 -128.66667 -8.83334 -72.66666 -3.33333 -16.66667 rrcurveto
|
||||||
|
77 -114 rmoveto
|
||||||
|
-135 0 -26 -131 135 0 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_hyphen.liga">
|
||||||
|
107 472 611 rmoveto
|
||||||
|
-374 -251 -16 -91 280 -291 74 72 -200.196 201 765.196 0 17 93 -777.60829 0 276.60829 183 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_hyphen_hyphen.liga">
|
||||||
|
657 472 611 rmoveto
|
||||||
|
-374 -251 -16 -91 280 -291 74 72 -200.196 201 1315.196 0 17 93 -1327.60829 0 276.60829 183 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="plus_plus.liga">
|
||||||
|
107 981 252 rmoveto
|
||||||
|
19 91 -173 0 35 179 -97 0 -35 -179 -170 0 -1 0 -172 0 35 179 -97 0 -35 -179 -171 0 -19 -91 173 0 -35 -179 rlineto
|
||||||
|
97 0 35 179 170 0 1 0 172 0 -35 -179 97 0 35 179 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
</CharStrings>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<GlyphClassDef>
|
||||||
|
<ClassDef glyph="ampersand_ampersand.liga" class="2"/>
|
||||||
|
<ClassDef glyph="bar_bar.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_equal_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="exclam_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="exclam_equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="greater_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="hyphen_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="hyphen_hyphen.liga" class="2"/>
|
||||||
|
<ClassDef glyph="hyphen_hyphen_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_exclam_hyphen_x2.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_hyphen.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_hyphen_hyphen.liga" class="2"/>
|
||||||
|
<ClassDef glyph="plus_plus.liga" class="2"/>
|
||||||
|
</GlyphClassDef>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<cmap>
|
||||||
|
<cmap_format_4 platformID="0" platEncID="3" language="0">
|
||||||
|
<map code="0xe600" name="exclam_equal.liga"/>
|
||||||
|
<map code="0xe601" name="equal_equal.liga"/>
|
||||||
|
<map code="0xe602" name="equal_greater.liga"/>
|
||||||
|
<map code="0xe603" name="greater_equal.liga"/>
|
||||||
|
<map code="0xe604" name="less_equal.liga"/>
|
||||||
|
<map code="0xe605" name="equal_equal_equal.liga"/>
|
||||||
|
<map code="0xe606" name="exclam_equal_equal.liga"/>
|
||||||
|
<map code="0xe607" name="ampersand_ampersand.liga"/>
|
||||||
|
<map code="0xe608" name="bar_bar.liga"/>
|
||||||
|
<map code="0xe609" name="plus_plus.liga"/>
|
||||||
|
<map code="0xe60a" name="hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe60b" name="equal_equal_greater.liga"/>
|
||||||
|
<map code="0xe60c" name="hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60d" name="hyphen_hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60e" name="less_hyphen.liga"/>
|
||||||
|
<map code="0xe60f" name="less_hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe610" name="less_equal_equal.liga"/>
|
||||||
|
<map code="0xe611" name="less_exclam_hyphen_x2.liga"/>
|
||||||
|
</cmap_format_4>
|
||||||
|
<cmap_format_4 platformID="3" platEncID="1" language="0">
|
||||||
|
<map code="0xe600" name="exclam_equal.liga"/>
|
||||||
|
<map code="0xe601" name="equal_equal.liga"/>
|
||||||
|
<map code="0xe602" name="equal_greater.liga"/>
|
||||||
|
<map code="0xe603" name="greater_equal.liga"/>
|
||||||
|
<map code="0xe604" name="less_equal.liga"/>
|
||||||
|
<map code="0xe605" name="equal_equal_equal.liga"/>
|
||||||
|
<map code="0xe606" name="exclam_equal_equal.liga"/>
|
||||||
|
<map code="0xe607" name="ampersand_ampersand.liga"/>
|
||||||
|
<map code="0xe608" name="bar_bar.liga"/>
|
||||||
|
<map code="0xe609" name="plus_plus.liga"/>
|
||||||
|
<map code="0xe60a" name="hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe60b" name="equal_equal_greater.liga"/>
|
||||||
|
<map code="0xe60c" name="hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60d" name="hyphen_hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60e" name="less_hyphen.liga"/>
|
||||||
|
<map code="0xe60f" name="less_hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe610" name="less_equal_equal.liga"/>
|
||||||
|
<map code="0xe611" name="less_exclam_hyphen_x2.liga"/>
|
||||||
|
</cmap_format_4>
|
||||||
|
</cmap>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ttFont>
|
||||||
|
<head>
|
||||||
|
<xMin value="-75"/>
|
||||||
|
<yMin value="-364"/>
|
||||||
|
<xMax value="2119"/>
|
||||||
|
<yMax value="1137"/>
|
||||||
|
</head>
|
||||||
|
<hhea>
|
||||||
|
<advanceWidthMax value="2200"/>
|
||||||
|
<xMaxExtent value="2119"/>
|
||||||
|
</hhea>
|
||||||
|
<CFF>
|
||||||
|
<CFFFont>
|
||||||
|
<FontBBox value="-75 -364 2119 1137"/>
|
||||||
|
<Private>
|
||||||
|
<nominalWidthX value="993"/>
|
||||||
|
</Private>
|
||||||
|
</CFFFont>
|
||||||
|
</CFF>
|
||||||
|
</ttFont>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<GlyphOrder>
|
||||||
|
<GlyphID id="383" name="exclam_equal.liga"/>
|
||||||
|
<GlyphID id="384" name="equal_equal.liga"/>
|
||||||
|
<GlyphID id="385" name="equal_greater.liga"/>
|
||||||
|
<GlyphID id="386" name="greater_equal.liga"/>
|
||||||
|
<GlyphID id="387" name="less_equal.liga"/>
|
||||||
|
<GlyphID id="388" name="equal_equal_equal.liga"/>
|
||||||
|
<GlyphID id="389" name="exclam_equal_equal.liga"/>
|
||||||
|
<GlyphID id="390" name="ampersand_ampersand.liga"/>
|
||||||
|
<GlyphID id="391" name="bar_bar.liga"/>
|
||||||
|
<GlyphID id="392" name="plus_plus.liga"/>
|
||||||
|
<GlyphID id="393" name="hyphen_hyphen.liga"/>
|
||||||
|
<GlyphID id="394" name="equal_equal_greater.liga"/>
|
||||||
|
<GlyphID id="395" name="hyphen_greater.liga"/>
|
||||||
|
<GlyphID id="396" name="hyphen_hyphen_greater.liga"/>
|
||||||
|
<GlyphID id="397" name="less_hyphen.liga"/>
|
||||||
|
<GlyphID id="398" name="less_hyphen_hyphen.liga"/>
|
||||||
|
<GlyphID id="399" name="less_equal_equal.liga"/>
|
||||||
|
<GlyphID id="400" name="less_exclam_hyphen_x2.liga"/>
|
||||||
|
</GlyphOrder>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<hmtx>
|
||||||
|
<mtx name="ampersand_ampersand.liga" width="1100" lsb="111"/>
|
||||||
|
<mtx name="bar_bar.liga" width="1100" lsb="232"/>
|
||||||
|
<mtx name="equal_equal.liga" width="1100" lsb="49"/>
|
||||||
|
<mtx name="equal_equal_equal.liga" width="1650" lsb="49"/>
|
||||||
|
<mtx name="equal_equal_greater.liga" width="1650" lsb="49"/>
|
||||||
|
<mtx name="equal_greater.liga" width="1100" lsb="49"/>
|
||||||
|
<mtx name="exclam_equal.liga" width="1100" lsb="49"/>
|
||||||
|
<mtx name="exclam_equal_equal.liga" width="1650" lsb="49"/>
|
||||||
|
<mtx name="greater_equal.liga" width="1100" lsb="243"/>
|
||||||
|
<mtx name="hyphen_greater.liga" width="1100" lsb="82"/>
|
||||||
|
<mtx name="hyphen_hyphen.liga" width="1100" lsb="195"/>
|
||||||
|
<mtx name="hyphen_hyphen_greater.liga" width="1650" lsb="82"/>
|
||||||
|
<mtx name="less_equal.liga" width="1100" lsb="256"/>
|
||||||
|
<mtx name="less_equal_equal.liga" width="1650" lsb="81"/>
|
||||||
|
<mtx name="less_exclam_hyphen_x2.liga" width="2200" lsb="81"/>
|
||||||
|
<mtx name="less_hyphen.liga" width="1100" lsb="82"/>
|
||||||
|
<mtx name="less_hyphen_hyphen.liga" width="1650" lsb="82"/>
|
||||||
|
<mtx name="plus_plus.liga" width="1100" lsb="100"/>
|
||||||
|
</hmtx>
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<LookupList>
|
||||||
|
<Lookup index="20">
|
||||||
|
<LookupType value="4"/>
|
||||||
|
<LookupFlag value="0"/>
|
||||||
|
<!-- SubTableCount=1 -->
|
||||||
|
<LigatureSubst index="0" Format="1">
|
||||||
|
<LigatureSet glyph="ampersand">
|
||||||
|
<Ligature components="ampersand" glyph="ampersand_ampersand.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="bar">
|
||||||
|
<Ligature components="bar" glyph="bar_bar.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="equal">
|
||||||
|
<Ligature components="equal,greater" glyph="equal_equal_greater.liga"/>
|
||||||
|
<Ligature components="equal,equal" glyph="equal_equal_equal.liga"/>
|
||||||
|
<Ligature components="greater" glyph="equal_greater.liga"/>
|
||||||
|
<Ligature components="equal" glyph="equal_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="exclam">
|
||||||
|
<Ligature components="equal,equal" glyph="exclam_equal_equal.liga"/>
|
||||||
|
<Ligature components="equal" glyph="exclam_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="greater">
|
||||||
|
<Ligature components="equal" glyph="greater_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="hyphen">
|
||||||
|
<Ligature components="hyphen,greater" glyph="hyphen_hyphen_greater.liga"/>
|
||||||
|
<Ligature components="hyphen" glyph="hyphen_hyphen.liga"/>
|
||||||
|
<Ligature components="greater" glyph="hyphen_greater.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="less">
|
||||||
|
<Ligature components="exclam,hyphen,hyphen" glyph="less_exclam_hyphen_x2.liga"/>
|
||||||
|
<Ligature components="hyphen,hyphen" glyph="less_hyphen_hyphen.liga"/>
|
||||||
|
<Ligature components="equal,equal" glyph="less_equal_equal.liga"/>
|
||||||
|
<Ligature components="hyphen" glyph="less_hyphen.liga"/>
|
||||||
|
<Ligature components="equal" glyph="less_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="plus">
|
||||||
|
<Ligature components="plus" glyph="plus_plus.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
</LigatureSubst>
|
||||||
|
</Lookup>
|
||||||
|
</LookupList>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<name fullName="Operator Mono Lig Medium Italic" familyName="Operator Mono Lig">
|
||||||
|
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Operator Mono Lig
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Medium Italic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
H&Co: Operator Mono Lig Medium Italic: 1.200
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Operator Mono Lig Medium Italic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
OperatorMonoLig-MediumItalic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="16" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Operator Mono Lig
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Medium Italic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Operator Mono Lig Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Italic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
H&Co: Operator Mono Lig Medium Italic: 1.200
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Operator Mono Lig Medium Italic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
OperatorMonoLig-MediumItalic
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="16" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Operator Mono Lig
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Medium Italic
|
||||||
|
</namerecord>
|
||||||
|
</name>
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
<CharStrings>
|
||||||
|
<CharString name="ampersand_ampersand.liga">
|
||||||
|
107 270.7619 245 rmoveto
|
||||||
|
21.46031 -26 57.77777 -70 rlineto
|
||||||
|
-30.66667 -48 -33.66666 -24 -36.66667 0 -22.66667 0 -17.5 7.5 -12.33333 15 -12.33333 15 -6.16667 19.16667 0 23.33333 0 43.33333 22.66667 39.33334 45.33333 35.33333 rrcurveto
|
||||||
|
494.49207 -43 rmoveto
|
||||||
|
20.63492 -25 47.87302 -58 rlineto
|
||||||
|
-30.66667 -48 -33.66666 -24 -36.66667 0 -22.66667 0 -17.5 7.5 -12.33333 15 -12.33333 15 -6.16667 19.16667 0 23.33333 0 43.33333 22.66667 39.33334 45.33333 35.33333 rrcurveto
|
||||||
|
191 256 rmoveto
|
||||||
|
-7 102 rlineto
|
||||||
|
-102.81816 1.3353 -73.66667 -18 -44.51517 -37.3353 -40 -33.54839 -20 -40.66667 0 -47.78494 0 -35.33333 18.66667 -43 37.33333 -50.66667 -88.66667 -55.33333 -44.33333 -65 0 -74.66667 0 -12 1 -11.66667 2 -11.33333 -18 22 -23.66667 29.33333 -29.33333 36.66667 rrcurveto
|
||||||
|
36 66.66667 27.66667 69.66666 19.33333 72.66667 rrcurveto
|
||||||
|
-94 11 rlineto
|
||||||
|
-9.33333 -47.33333 -15 -51.33334 -20.66667 -55.33333 -6.66667 8 -18.16666 21.16667 -29.66667 34.33333 -29.66667 34.33333 -22.66666 28.33334 -15.66667 22.33333 -15.66667 22.33333 -7.83333 19.5 0 16.66667 0 26.66667 12.66667 19.5 25.33333 12.33333 25.33333 12.33333 46 4.5 66.66667 -3.33333 rrcurveto
|
||||||
|
-7 102 rlineto
|
||||||
|
-102.81816 1.3353 -73.66667 -18 -44.51517 -37.3353 -40 -33.54839 -20 -40.66667 0 -47.78494 0 -35.33333 18.66667 -43 37.33333 -50.66667 -88.66667 -55.33333 -44.33333 -65 0 -74.66667 0 -43.33333 13.16667 -35.16667 26.33333 -27 26.33333 -27 37.83334 -13.5 49.33333 0 rrcurveto
|
||||||
|
69.33333 0 58.33334 33.33333 47.33333 66.66667 46.66667 -64.66667 94.66666 -33.33333 142.66667 -2 69.33333 0 58.33334 33.33333 47.33333 66.66667 19.33333 -24 26 -33.66667 32.66667 -43.33333 rrcurveto
|
||||||
|
91 69 rlineto
|
||||||
|
-12.66667 16 -35.33333 43.66667 -58 71.33333 36 66.66667 27.66667 69.66666 19.33333 72.66667 rrcurveto
|
||||||
|
-94 11 rlineto
|
||||||
|
-9.33333 -47.33333 -15 -51.33334 -20.66667 -55.33333 -6.66667 8 -18.16666 21.16667 -29.66667 34.33333 -29.66667 34.33333 -22.66666 28.33334 -15.66667 22.33333 -15.66667 22.33333 -7.83333 19.5 0 16.66667 0 26.66667 12.66667 19.5 25.33333 12.33333 25.33333 12.33333 46 4.5 66.66667 -3.33333 rrcurveto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="bar_bar.liga">
|
||||||
|
107 672 709 rmoveto
|
||||||
|
-892 105 901 vlineto
|
||||||
|
-454 -9 rmoveto
|
||||||
|
-892 105 901 vlineto
|
||||||
|
410 -1418 rmoveto
|
||||||
|
0 vmoveto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_equal.liga">
|
||||||
|
107 1028 458 rmoveto
|
||||||
|
-956 -2 0 -94 956 2 rlineto
|
||||||
|
-126 vmoveto
|
||||||
|
-956 -2 0 -94 956 2 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_equal_equal.liga">
|
||||||
|
657 72 526 rmoveto
|
||||||
|
0 -94 1506 2 0 94 rlineto
|
||||||
|
-331 vmoveto
|
||||||
|
-1506 -2 0 -94 1506 2 rlineto
|
||||||
|
-1506 159 rmoveto
|
||||||
|
1506 2 0 94 -1506 -2 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_equal_greater.liga">
|
||||||
|
657 1245 -20 rmoveto
|
||||||
|
333 273 0 93 -328 271 -62 -80 99 -79 -1215 -2 0 -94 1332 2 74 -59 0 -11 -70 -56 -1336 -2 0 -94 1219 2 -106 -86 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="equal_greater.liga">
|
||||||
|
107 695 -20 rmoveto
|
||||||
|
333 273 0 93 -328 271 -62 -80 99 -79 -665 -2 0 -94 782 2 74 -59 0 -11 -70 -56 -786 -2 0 -94 669 2 -106 -86 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="exclam_equal.liga">
|
||||||
|
107 1028 238 rmoveto
|
||||||
|
-457 -1 65 126 392 1 0 94 -344 -1 121 238 -96 46 -145 -284 -492 -1 0 -94 445 1 -65 -126 -380 -1 0 -94 333 1 rlineto
|
||||||
|
-153 -300 96 -43 175 343 505 1 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="exclam_equal_equal.liga">
|
||||||
|
657 969 741 rmoveto
|
||||||
|
-109 -214 -788 -1 0 -94 740 1 -38 -76 -702 -1 0 -94 654 1 -34 -67 -620 -1 0 -94 572 1 -132 -259 96 -43 154 302 rlineto
|
||||||
|
816 1 0 94 -768 -1 34 67 734 1 0 94 -686 -1 39 76 647 1 0 94 -599 -1 86 168 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="greater_equal.liga">
|
||||||
|
107 308 -101 rmoveto
|
||||||
|
534 262 -2 96 -583 -292 rlineto
|
||||||
|
60 131 rmoveto
|
||||||
|
523 257 0 126 -518 254 -62 -80 480 -232 0 -11 -483 -236 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="hyphen_greater.liga">
|
||||||
|
107 695 -24 rmoveto
|
||||||
|
333 273 0 93 -328 271 -62 -80 235 -188 -801 0 0 -95 806 0 -243 -196 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="hyphen_hyphen.liga">
|
||||||
|
107 910 345 rmoveto
|
||||||
|
-320 -95 312 hlineto
|
||||||
|
-392 95 rmoveto
|
||||||
|
-320 -95 312 hlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="hyphen_hyphen_greater.liga">
|
||||||
|
657 1245 -24 rmoveto
|
||||||
|
333 273 0 93 -328 271 -62 -80 235 -188 -1351 0 0 -95 1356 0 -243 -196 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_equal.liga">
|
||||||
|
107 791 -101 rmoveto
|
||||||
|
-534 262 2 96 583 -292 rlineto
|
||||||
|
-60 131 rmoveto
|
||||||
|
-523 257 0 126 518 254 62 -80 -480 -232 0 -11 483 -236 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_equal_equal.liga">
|
||||||
|
657 405 -20 rmoveto
|
||||||
|
-333 273 0 93 328 271 62 -80 -99 -79 1215 -2 0 -94 -1332 2 -74 -59 0 -11 70 -56 1336 -2 0 -94 -1219 2 106 -86 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_exclam_hyphen_x2.liga">
|
||||||
|
1207 -98 852 rmoveto
|
||||||
|
1025 -507 rmoveto
|
||||||
|
-9 -95 1194 0 8 95 rlineto
|
||||||
|
-1502 hmoveto
|
||||||
|
-383.28206 0 236.28206 190 -60 79 -331 -272 0 -93 329 -273 63 80 -242.08546 194 380.08546 0 rlineto
|
||||||
|
120 -5 rmoveto
|
||||||
|
74 hlineto
|
||||||
|
0.66667 15.33333 6.66666 72.33334 12.66667 129.33333 12.66667 129.33333 6.66666 71.66667 0.66667 14 rrcurveto
|
||||||
|
-142 hlineto
|
||||||
|
0 -14 4.66667 -71.5 9.33333 -129 9.33333 -129 4.66667 -72.5 0 -16 rrcurveto
|
||||||
|
105 -114 rmoveto
|
||||||
|
-144 0 -3 -131 143 0 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_hyphen.liga">
|
||||||
|
107 405 -24 rmoveto
|
||||||
|
-333 273 0 93 328 271 62 -80 -235 -188 801 0 0 -95 -806 0 243 -196 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="less_hyphen_hyphen.liga">
|
||||||
|
657 405 -24 rmoveto
|
||||||
|
-333 273 0 93 328 271 62 -80 -235 -188 1351 0 0 -95 -1356 0 243 -196 rlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
<CharString name="plus_plus.liga">
|
||||||
|
107 983 251 rmoveto
|
||||||
|
93 -168 178 -99 -178 -163 vlineto
|
||||||
|
-6 0 -162 0 0 178 -99 0 0 -178 -169 0 0 -93 169 0 0 -178 99 0 0 178 162 0 6 0 163 0 0 -178 rlineto
|
||||||
|
99 178 hlineto
|
||||||
|
endchar
|
||||||
|
</CharString>
|
||||||
|
</CharStrings>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<GlyphClassDef>
|
||||||
|
<ClassDef glyph="ampersand_ampersand.liga" class="2"/>
|
||||||
|
<ClassDef glyph="bar_bar.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_equal.liga" class="1"/>
|
||||||
|
<ClassDef glyph="equal_equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_equal_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="equal_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="exclam_equal.liga" class="1"/>
|
||||||
|
<ClassDef glyph="exclam_equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="greater_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="hyphen_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="hyphen_hyphen.liga" class="2"/>
|
||||||
|
<ClassDef glyph="hyphen_hyphen_greater.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_equal_equal.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_exclam_hyphen_x2.liga" class="1"/>
|
||||||
|
<ClassDef glyph="less_hyphen.liga" class="2"/>
|
||||||
|
<ClassDef glyph="less_hyphen_hyphen.liga" class="2"/>
|
||||||
|
<ClassDef glyph="plus_plus.liga" class="2"/>
|
||||||
|
</GlyphClassDef>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<cmap>
|
||||||
|
<cmap_format_4 platformID="0" platEncID="3" language="0">
|
||||||
|
<map code="0xe600" name="exclam_equal.liga"/>
|
||||||
|
<map code="0xe601" name="equal_equal.liga"/>
|
||||||
|
<map code="0xe602" name="equal_greater.liga"/>
|
||||||
|
<map code="0xe603" name="greater_equal.liga"/>
|
||||||
|
<map code="0xe604" name="less_equal.liga"/>
|
||||||
|
<map code="0xe605" name="equal_equal_equal.liga"/>
|
||||||
|
<map code="0xe606" name="exclam_equal_equal.liga"/>
|
||||||
|
<map code="0xe607" name="ampersand_ampersand.liga"/>
|
||||||
|
<map code="0xe608" name="bar_bar.liga"/>
|
||||||
|
<map code="0xe609" name="plus_plus.liga"/>
|
||||||
|
<map code="0xe60a" name="hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe60b" name="equal_equal_greater.liga"/>
|
||||||
|
<map code="0xe60c" name="hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60d" name="hyphen_hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60e" name="less_hyphen.liga"/>
|
||||||
|
<map code="0xe60f" name="less_hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe610" name="less_equal_equal.liga"/>
|
||||||
|
<map code="0xe611" name="less_exclam_hyphen_x2.liga"/>
|
||||||
|
</cmap_format_4>
|
||||||
|
<cmap_format_4 platformID="3" platEncID="1" language="0">
|
||||||
|
<map code="0xe600" name="exclam_equal.liga"/>
|
||||||
|
<map code="0xe601" name="equal_equal.liga"/>
|
||||||
|
<map code="0xe602" name="equal_greater.liga"/>
|
||||||
|
<map code="0xe603" name="greater_equal.liga"/>
|
||||||
|
<map code="0xe604" name="less_equal.liga"/>
|
||||||
|
<map code="0xe605" name="equal_equal_equal.liga"/>
|
||||||
|
<map code="0xe606" name="exclam_equal_equal.liga"/>
|
||||||
|
<map code="0xe607" name="ampersand_ampersand.liga"/>
|
||||||
|
<map code="0xe608" name="bar_bar.liga"/>
|
||||||
|
<map code="0xe609" name="plus_plus.liga"/>
|
||||||
|
<map code="0xe60a" name="hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe60b" name="equal_equal_greater.liga"/>
|
||||||
|
<map code="0xe60c" name="hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60d" name="hyphen_hyphen_greater.liga"/>
|
||||||
|
<map code="0xe60e" name="less_hyphen.liga"/>
|
||||||
|
<map code="0xe60f" name="less_hyphen_hyphen.liga"/>
|
||||||
|
<map code="0xe610" name="less_equal_equal.liga"/>
|
||||||
|
<map code="0xe611" name="less_exclam_hyphen_x2.liga"/>
|
||||||
|
</cmap_format_4>
|
||||||
|
</cmap>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ttFont>
|
||||||
|
<head>
|
||||||
|
<xMin value="-10"/>
|
||||||
|
<yMin value="-294"/>
|
||||||
|
<xMax value="2120"/>
|
||||||
|
<yMax value="1150"/>
|
||||||
|
</head>
|
||||||
|
<hhea>
|
||||||
|
<advanceWidthMax value="2200"/>
|
||||||
|
<xMaxExtent value="2120"/>
|
||||||
|
</hhea>
|
||||||
|
<CFF>
|
||||||
|
<CFFFont>
|
||||||
|
<FontBBox value="-10 -294 2120 1150"/>
|
||||||
|
<Private>
|
||||||
|
<nominalWidthX value="993"/>
|
||||||
|
</Private>
|
||||||
|
</CFFFont>
|
||||||
|
</CFF>
|
||||||
|
</ttFont>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<GlyphOrder>
|
||||||
|
<GlyphID id="383" name="exclam_equal.liga"/>
|
||||||
|
<GlyphID id="384" name="equal_equal.liga"/>
|
||||||
|
<GlyphID id="385" name="equal_greater.liga"/>
|
||||||
|
<GlyphID id="386" name="greater_equal.liga"/>
|
||||||
|
<GlyphID id="387" name="less_equal.liga"/>
|
||||||
|
<GlyphID id="388" name="equal_equal_equal.liga"/>
|
||||||
|
<GlyphID id="389" name="exclam_equal_equal.liga"/>
|
||||||
|
<GlyphID id="390" name="ampersand_ampersand.liga"/>
|
||||||
|
<GlyphID id="391" name="bar_bar.liga"/>
|
||||||
|
<GlyphID id="392" name="plus_plus.liga"/>
|
||||||
|
<GlyphID id="393" name="hyphen_hyphen.liga"/>
|
||||||
|
<GlyphID id="394" name="equal_equal_greater.liga"/>
|
||||||
|
<GlyphID id="395" name="hyphen_greater.liga"/>
|
||||||
|
<GlyphID id="396" name="hyphen_hyphen_greater.liga"/>
|
||||||
|
<GlyphID id="397" name="less_hyphen.liga"/>
|
||||||
|
<GlyphID id="398" name="less_hyphen_hyphen.liga"/>
|
||||||
|
<GlyphID id="399" name="less_equal_equal.liga"/>
|
||||||
|
<GlyphID id="400" name="less_exclam_hyphen_x2.liga"/>
|
||||||
|
</GlyphOrder>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<hmtx>
|
||||||
|
<mtx name="ampersand_ampersand.liga" width="1100" lsb="72"/>
|
||||||
|
<mtx name="bar_bar.liga" width="1100" lsb="323"/>
|
||||||
|
<mtx name="equal_equal.liga" width="1100" lsb="72"/>
|
||||||
|
<mtx name="equal_equal_equal.liga" width="1650" lsb="72"/>
|
||||||
|
<mtx name="equal_equal_greater.liga" width="1650" lsb="72"/>
|
||||||
|
<mtx name="equal_greater.liga" width="1100" lsb="72"/>
|
||||||
|
<mtx name="exclam_equal.liga" width="1100" lsb="72"/>
|
||||||
|
<mtx name="exclam_equal_equal.liga" width="1650" lsb="72"/>
|
||||||
|
<mtx name="greater_equal.liga" width="1100" lsb="257"/>
|
||||||
|
<mtx name="hyphen_greater.liga" width="1100" lsb="72"/>
|
||||||
|
<mtx name="hyphen_hyphen.liga" width="1100" lsb="190"/>
|
||||||
|
<mtx name="hyphen_hyphen_greater.liga" width="1650" lsb="72"/>
|
||||||
|
<mtx name="less_equal.liga" width="1100" lsb="257"/>
|
||||||
|
<mtx name="less_equal_equal.liga" width="1650" lsb="72"/>
|
||||||
|
<mtx name="less_exclam_hyphen_x2.liga" width="2200" lsb="80"/>
|
||||||
|
<mtx name="less_hyphen.liga" width="1100" lsb="72"/>
|
||||||
|
<mtx name="less_hyphen_hyphen.liga" width="1650" lsb="72"/>
|
||||||
|
<mtx name="plus_plus.liga" width="1100" lsb="117"/>
|
||||||
|
</hmtx>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<LookupList>
|
||||||
|
<Lookup index="20">
|
||||||
|
<LookupType value="4"/>
|
||||||
|
<LookupFlag value="0"/>
|
||||||
|
<!-- SubTableCount=1 -->
|
||||||
|
<LigatureSubst index="0" Format="1">
|
||||||
|
<LigatureSet glyph="ampersand">
|
||||||
|
<Ligature components="ampersand" glyph="ampersand_ampersand.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="bar">
|
||||||
|
<Ligature components="bar" glyph="bar_bar.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="equal">
|
||||||
|
<Ligature components="equal,greater" glyph="equal_equal_greater.liga"/>
|
||||||
|
<Ligature components="equal,equal" glyph="equal_equal_equal.liga"/>
|
||||||
|
<Ligature components="greater" glyph="equal_greater.liga"/>
|
||||||
|
<Ligature components="equal" glyph="equal_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="exclam">
|
||||||
|
<Ligature components="equal,equal" glyph="exclam_equal_equal.liga"/>
|
||||||
|
<Ligature components="equal" glyph="exclam_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="greater">
|
||||||
|
<Ligature components="equal" glyph="greater_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="hyphen">
|
||||||
|
<Ligature components="hyphen,greater" glyph="hyphen_hyphen_greater.liga"/>
|
||||||
|
<Ligature components="greater" glyph="hyphen_greater.liga"/>
|
||||||
|
<Ligature components="hyphen" glyph="hyphen_hyphen.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="less">
|
||||||
|
<Ligature components="equal,equal" glyph="less_equal_equal.liga"/>
|
||||||
|
<Ligature components="hyphen,hyphen" glyph="less_hyphen_hyphen.liga"/>
|
||||||
|
<Ligature components="hyphen" glyph="less_hyphen.liga"/>
|
||||||
|
<Ligature components="equal" glyph="less_equal.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
<LigatureSet glyph="plus">
|
||||||
|
<Ligature components="plus" glyph="plus_plus.liga"/>
|
||||||
|
</LigatureSet>
|
||||||
|
</LigatureSubst>
|
||||||
|
</Lookup>
|
||||||
|
</LookupList>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<name fullName="Operator Mono Lig Medium" familyName="Operator Mono Lig">
|
||||||
|
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Operator Mono Lig
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
H&Co: Operator Mono Lig Medium: 1.200
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Operator Mono Lig Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
OperatorMonoLig-Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="16" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Operator Mono Lig
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
|
||||||
|
Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Operator Mono Lig Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Regular
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
H&Co: Operator Mono Lig Medium: 1.200
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Operator Mono Lig Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
OperatorMonoLig-Medium
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="16" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Operator Mono Lig
|
||||||
|
</namerecord>
|
||||||
|
<namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
|
||||||
|
Medium
|
||||||
|
</namerecord>
|
||||||
|
</name>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
Generated
+52
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"name": "operator-mono-lig",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"bluebird": {
|
||||||
|
"version": "3.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
|
||||||
|
"integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw="
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||||
|
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
|
||||||
|
"requires": {
|
||||||
|
"ms": "2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
|
},
|
||||||
|
"xml-formatter": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-OAgz3dC86iwJht7+u6cfhDhPNT0=",
|
||||||
|
"requires": {
|
||||||
|
"xml-parser-xo": "2.1.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xml-parser-xo": {
|
||||||
|
"version": "2.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-2.1.3.tgz",
|
||||||
|
"integrity": "sha1-TqjrhW36TddcSrVLJRVY3grcHGE=",
|
||||||
|
"requires": {
|
||||||
|
"debug": "2.6.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xmldom": {
|
||||||
|
"version": "0.1.27",
|
||||||
|
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
|
||||||
|
"integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk="
|
||||||
|
},
|
||||||
|
"xpath": {
|
||||||
|
"version": "0.0.24",
|
||||||
|
"resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.24.tgz",
|
||||||
|
"integrity": "sha1-Gt4WLhzFI8jTn8fQavwW6iFvKfs="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "operator-mono-lig",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Patch Operator Mono font to include ligatures",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "kiliman@gmail.com",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"bluebird": "^3.5.0",
|
||||||
|
"xml-formatter": "^1.0.1",
|
||||||
|
"xmldom": "^0.1.27",
|
||||||
|
"xpath": "0.0.24"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user