Merged features to otfcc
This commit is contained in:
parent
5cf5dc8662
commit
6801aacf27
11 changed files with 274 additions and 300 deletions
|
@ -32,7 +32,7 @@ Iosevka supports accessing all letter variants using OpenType features.
|
||||||
|
|
||||||
To build Iosevka you should:
|
To build Iosevka you should:
|
||||||
|
|
||||||
1. Ensure that [`node`](http://nodejs.org) (≥ 5.0), [`FontForge`](http://fontforge.org) (with Python scripting support, ≥ Aug. 2015 release), [`ttfautohint`](http://www.freetype.org/ttfautohint/), [`otfcc`](https://github.com/caryll/otfcc) (≥ 0.1.5) and `make` are runnable in your terminal.
|
1. Ensure that [`node`](http://nodejs.org) (≥ 5.0), [`FontForge`](http://fontforge.org) (with Python scripting support, ≥ Aug. 2015 release), [`ttfautohint`](http://www.freetype.org/ttfautohint/), [`otfcc`](https://github.com/caryll/otfcc) (≥ 0.1.6) and `make` are runnable in your terminal.
|
||||||
- Windows users may need to install MinGW and make \*nix utilities accessible (`mkdir.exe`, `cp.exe`, `cat.exe` and `rm.exe`, in particular) from Command Prompt. Utilities provided by [Git for Windows](https://git-for-windows.github.io/) works fine.
|
- Windows users may need to install MinGW and make \*nix utilities accessible (`mkdir.exe`, `cp.exe`, `cat.exe` and `rm.exe`, in particular) from Command Prompt. Utilities provided by [Git for Windows](https://git-for-windows.github.io/) works fine.
|
||||||
2. Install necessary libs by `npm install`.
|
2. Install necessary libs by `npm install`.
|
||||||
3. `make`.
|
3. `make`.
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
lookup ccmpSubIota { sub iotaBelow by iotaLF; } ccmpSubIota;
|
|
||||||
lookup ccmpSubOgonek { sub ogonekBelow by ogonekTR; } ccmpSubOgonek;
|
|
||||||
lookup ccmpManual1 {
|
|
||||||
sub [i cyrUkrainiani j cyrje iogonekBelow]' @MG_above by [dotlessi dotlessi dotlessj dotlessj iogonek.dotless];
|
|
||||||
sub eta iotaBelow' lookup ccmpSubIota;
|
|
||||||
sub eta @MG_above iotaBelow' lookup ccmpSubIota;
|
|
||||||
sub eta @MG_above @MG_above iotaBelow' lookup ccmpSubIota;
|
|
||||||
sub eta @MG_above @MG_above @MG_above iotaBelow' lookup ccmpSubIota;
|
|
||||||
sub [a A u cyra cyrA] ogonekBelow' lookup ccmpSubOgonek;
|
|
||||||
sub [a A u cyra cyrA] @MG_above ogonekBelow' lookup ccmpSubOgonek;
|
|
||||||
sub [a A u cyra cyrA] @MG_above @MG_above ogonekBelow' lookup ccmpSubOgonek;
|
|
||||||
sub [a A u cyra cyrA] @MG_above @MG_above @MG_above ogonekBelow' lookup ccmpSubOgonek;
|
|
||||||
} ccmpManual1;
|
|
||||||
|
|
||||||
lookup ccmpManual2 {
|
|
||||||
sub commaAbove graveAbove by psilivaria;
|
|
||||||
sub commaAbove acuteAbove by psilioxia;
|
|
||||||
sub commaAbove perispomeniAbove by psiliperispomeni;
|
|
||||||
sub revCommaAbove graveAbove by dasiavaria;
|
|
||||||
sub revCommaAbove acuteAbove by dasiaoxia;
|
|
||||||
sub revCommaAbove perispomeniAbove by dasiaperispomeni;
|
|
||||||
} ccmpManual2;
|
|
||||||
|
|
||||||
feature ccmp {
|
|
||||||
script latn;
|
|
||||||
language dflt;
|
|
||||||
lookup ccmpManual1;
|
|
||||||
script grek;
|
|
||||||
language dflt;
|
|
||||||
lookup ccmpManual1;
|
|
||||||
lookup ccmpManual2;
|
|
||||||
script cyrl;
|
|
||||||
language dflt;
|
|
||||||
lookup ccmpManual1;
|
|
||||||
script DFLT;
|
|
||||||
language dflt;
|
|
||||||
lookup ccmpManual1;
|
|
||||||
} ccmp;
|
|
||||||
|
|
||||||
feature mark {
|
|
||||||
script latn;
|
|
||||||
language dflt;
|
|
||||||
lookup markAuto_letter1;
|
|
||||||
lookup markAuto_letter2;
|
|
||||||
lookup markAuto_overlay;
|
|
||||||
script grek;
|
|
||||||
language dflt;
|
|
||||||
lookup markAuto_letter1;
|
|
||||||
lookup markAuto_letter2;
|
|
||||||
lookup markAuto_overlay;
|
|
||||||
script cyrl;
|
|
||||||
language dflt;
|
|
||||||
lookup markAuto_letter1;
|
|
||||||
lookup markAuto_letter2;
|
|
||||||
lookup markAuto_overlay;
|
|
||||||
script DFLT;
|
|
||||||
language dflt;
|
|
||||||
lookup markAuto_letter1;
|
|
||||||
lookup markAuto_letter2;
|
|
||||||
lookup markAuto_overlay;
|
|
||||||
} mark;
|
|
||||||
|
|
||||||
feature mkmk {
|
|
||||||
script latn;
|
|
||||||
language dflt;
|
|
||||||
lookup mkmkAuto;
|
|
||||||
script grek;
|
|
||||||
language dflt;
|
|
||||||
lookup mkmkAuto;
|
|
||||||
script cyrl;
|
|
||||||
language dflt;
|
|
||||||
lookup mkmkAuto;
|
|
||||||
script DFLT;
|
|
||||||
language dflt;
|
|
||||||
lookup mkmkAuto;
|
|
||||||
} mkmk;
|
|
|
@ -1,9 +0,0 @@
|
||||||
lookup loclSerbian {
|
|
||||||
sub [cyrbe cyrghe cyrde cyrpe cyrte] by [cyrbe.serbian cyrghe.serbian cyrde.serbian cyrpe.serbian cyrte.serbian];
|
|
||||||
} loclSerbian;
|
|
||||||
|
|
||||||
feature locl {
|
|
||||||
script cyrl;
|
|
||||||
language SRB exclude_dflt;
|
|
||||||
lookup loclSerbian;
|
|
||||||
} locl;
|
|
|
@ -1,96 +0,0 @@
|
||||||
# Programming ligations
|
|
||||||
lookup arrowStickFR { sub [hyphen equal] by [lighy.fr ligeq.fr]; } arrowStickFR;
|
|
||||||
lookup arrowStickLF { sub [hyphen equal] by [lighy.lf ligeq.lf]; } arrowStickLF;
|
|
||||||
lookup arrowStickFR1 { sub [hyphen equal] by [lighy.fr1 ligeq.fr1]; } arrowStickFR1;
|
|
||||||
lookup arrowStickL1F { sub [hyphen equal] by [lighy.l1f ligeq.l1f]; } arrowStickL1F;
|
|
||||||
lookup arrowStickCR { sub [hyphen equal] by [lighy.cr ligeq.cr]; } arrowStickCR;
|
|
||||||
lookup arrowStickLC { sub [hyphen equal] by [lighy.lc ligeq.lc]; } arrowStickLC;
|
|
||||||
lookup arrowStickLXC { sub [hyphen equal] by [lighy.lxc ligeq.lxc]; } arrowStickLXC;
|
|
||||||
lookup arrowStickCF { sub [hyphen equal] by [lighy.cf ligeq.cf]; } arrowStickCF;
|
|
||||||
lookup arrowStickFC { sub [hyphen equal] by [lighy.fc ligeq.fc]; } arrowStickFC;
|
|
||||||
lookup arrowStickJF { sub [hyphen equal] by [lighy.jf ligeq.jf]; } arrowStickJF;
|
|
||||||
lookup arrowStickFJ { sub [hyphen equal] by [lighy.fj ligeq.fj]; } arrowStickFJ;
|
|
||||||
lookup arrowStickJ1F { sub [hyphen equal] by [lighy.j1f ligeq.j1f]; } arrowStickJ1F;
|
|
||||||
lookup arrowStickFJ1 { sub [hyphen equal] by [lighy.fj1 ligeq.fj1]; } arrowStickFJ1;
|
|
||||||
lookup arrowStickJR { sub [hyphen equal] by [lighy.jr ligeq.jr]; } arrowStickJR;
|
|
||||||
lookup arrowStickLJ { sub [hyphen equal] by [lighy.lj ligeq.lj]; } arrowStickLJ;
|
|
||||||
lookup arrowStickLR { sub [hyphen equal] by [lighy.lr ligeq.lr]; } arrowStickLR;
|
|
||||||
|
|
||||||
lookup lessShift1 { sub less by ligless.shift1; } lessShift1;
|
|
||||||
lookup greaterShift1 { sub greater by liggreater.shift1; } greaterShift1;
|
|
||||||
lookup lessShiftN1 { sub less by ligless.shiftN1; } lessShiftN1;
|
|
||||||
lookup greaterShiftN1 { sub greater by liggreater.shiftN1; } greaterShiftN1;
|
|
||||||
lookup arrowExclamHTMLComment { sub exclam by ligexclam.htmlcommentstart; } arrowExclamHTMLComment;
|
|
||||||
|
|
||||||
@arrowstick = [hyphen equal];
|
|
||||||
lookup caltArrow1 {
|
|
||||||
# Arrows, sub
|
|
||||||
sub less @arrowstick' lookup arrowStickLC @arrowstick' lookup arrowStickCR greater; # <-->, <==>
|
|
||||||
sub less @arrowstick' lookup arrowStickLR greater; # <->, <=>
|
|
||||||
sub less @arrowstick' lookup arrowStickLJ less; # <-<, <=<
|
|
||||||
sub less @arrowstick' lookup arrowStickLC @arrowstick' lookup arrowStickCF; # <--, <==
|
|
||||||
sub less less' lookup lessShift1 @arrowstick' lookup arrowStickL1F; # <<-, <<=
|
|
||||||
sub less hyphen' lookup arrowStickLF; # <-
|
|
||||||
sub less exclam' lookup arrowExclamHTMLComment hyphen' lookup arrowStickLXC hyphen' lookup arrowStickCF; # <!--
|
|
||||||
sub greater greater' lookup greaterShiftN1 @arrowstick' lookup arrowStickJ1F; # >>-, >>=
|
|
||||||
sub greater @arrowstick' lookup arrowStickJR greater; # >->, >=>
|
|
||||||
sub greater [hyphen]' lookup arrowStickJF; # >-
|
|
||||||
sub @arrowstick' lookup arrowStickFC @arrowstick' lookup arrowStickCR greater; # -->, ==>
|
|
||||||
sub @arrowstick' lookup arrowStickFR1 greater' lookup greaterShift1 greater; # ->>, =>>
|
|
||||||
sub @arrowstick' lookup arrowStickFR greater; # ->, =>
|
|
||||||
sub @arrowstick' lookup arrowStickFJ1 less' lookup lessShiftN1 less; # -<<, =<<
|
|
||||||
sub @arrowstick' lookup arrowStickFJ less; # -<, =<
|
|
||||||
} caltArrow1;
|
|
||||||
|
|
||||||
feature calt {
|
|
||||||
script latn;
|
|
||||||
language dflt;
|
|
||||||
lookup caltArrow1;
|
|
||||||
script grek;
|
|
||||||
language dflt;
|
|
||||||
lookup caltArrow1;
|
|
||||||
script cyrl;
|
|
||||||
language dflt;
|
|
||||||
lookup caltArrow1;
|
|
||||||
script DFLT;
|
|
||||||
language dflt;
|
|
||||||
lookup caltArrow1;
|
|
||||||
} calt;
|
|
||||||
|
|
||||||
@fwclose = [fwlcloseDoubleQuote fwlcloseSingleQuote dwlcjkSingleQuoteRight dwlcjkDoubleQuoteRight dwlparenRight];
|
|
||||||
@hwclose = [closeDoubleQuote closeSingleQuote cjkSingleQuoteRight cjkDoubleQuoteRight parenRight];
|
|
||||||
@fwopen = [fwropenDoubleQuote fwropenSingleQuote dwrcjkSingleQuoteLeft dwrcjkDoubleQuoteLeft dwrparenLeft];
|
|
||||||
@hwopen = [openDoubleQuote openSingleQuote cjkSingleQuoteLeft cjkDoubleQuoteLeft parenLeft];
|
|
||||||
@fwquoteopen = [fwropenDoubleQuote fwropenSingleQuote];
|
|
||||||
@hwquoteopen = [openDoubleQuote openSingleQuote];
|
|
||||||
@fwtrail = [dwlperiod dwlcomma dwlcjkperiod dwlcjkcomma];
|
|
||||||
@hwtrail = [period comma cjkperiod cjkcomma];
|
|
||||||
@fwmid = [dwccolon dwcsemicolon];
|
|
||||||
@hwmid = [colon semicolon];
|
|
||||||
|
|
||||||
|
|
||||||
lookup cjkCompress {
|
|
||||||
sub [@fwtrail @hwtrail @fwopen @hwopen @fwmid @hwmid] @fwopen' by @hwopen;
|
|
||||||
sub @fwclose' [@fwtrail @hwtrail @fwclose @hwclose @fwopen @hwopen @fwmid @hwmid] by @hwclose;
|
|
||||||
} cjkCompress;
|
|
||||||
|
|
||||||
feature opbd {
|
|
||||||
script latn;
|
|
||||||
language dflt;
|
|
||||||
lookup cjkCompress;
|
|
||||||
script grek;
|
|
||||||
language dflt;
|
|
||||||
lookup cjkCompress;
|
|
||||||
script cyrl;
|
|
||||||
language dflt;
|
|
||||||
lookup cjkCompress;
|
|
||||||
script hani;
|
|
||||||
language dflt;
|
|
||||||
lookup cjkCompress;
|
|
||||||
script kana;
|
|
||||||
language dflt;
|
|
||||||
lookup cjkCompress;
|
|
||||||
script DFLT;
|
|
||||||
language dflt;
|
|
||||||
lookup cjkCompress;
|
|
||||||
} opbd;
|
|
|
@ -1,9 +0,0 @@
|
||||||
lookup loclSerbian {
|
|
||||||
sub [cyrbe] by [cyrbe.serbian];
|
|
||||||
} loclSerbian;
|
|
||||||
|
|
||||||
feature locl {
|
|
||||||
script cyrl;
|
|
||||||
language SRB exclude_dflt;
|
|
||||||
lookup loclSerbian;
|
|
||||||
} locl;
|
|
37
generator.js
37
generator.js
|
@ -44,44 +44,11 @@ if (argv.charmap) (function() {
|
||||||
if (argv.feature) (function() {
|
if (argv.feature) (function() {
|
||||||
console.log(' Writing feature file -> ' + argv.feature);
|
console.log(' Writing feature file -> ' + argv.feature);
|
||||||
var featurefile = '\n\n';
|
var featurefile = '\n\n';
|
||||||
// markGlyphs
|
|
||||||
for (var feature in font.features.cv) {
|
// MG groups
|
||||||
var base = [], replace = [];
|
|
||||||
for (var key in font.features.cv[feature]) {
|
|
||||||
base.push(key);
|
|
||||||
replace.push(font.features.cv[feature][key]);
|
|
||||||
};
|
|
||||||
var lookupName = feature + 'Auto';
|
|
||||||
featurefile += 'lookup ' + lookupName + ' { sub [' + base.join(' ') + '] by [' + replace.join(' ') + '];} ' + lookupName + ';\n\n';
|
|
||||||
featurefile += 'feature ' + feature + ' { script latn; lookup ' + lookupName + '; script grek; lookup ' + lookupName + '; script cyrl; lookup ' + lookupName + '; script DFLT; lookup ' + lookupName + '; } ' + feature + ';\n\n';
|
|
||||||
}
|
|
||||||
for (var feature in font.features.sscompose) {
|
|
||||||
var stmt = font.features.sscompose[feature].map(function(lookup) { return 'lookup ' + lookup + 'Auto' }).join(';')
|
|
||||||
featurefile += 'feature ' + feature + ' { script latn; ' + stmt + '; script grek; ' + stmt + '; script cyrl; ' + stmt + '; script DFLT; ' + stmt + '; } ' + feature + ';\n\n';
|
|
||||||
}
|
|
||||||
for (var key in font.features.markGlyphs) {
|
for (var key in font.features.markGlyphs) {
|
||||||
featurefile += '@MG_' + key + '= [' + font.features.markGlyphs[key].join(' ') + '];\n'
|
featurefile += '@MG_' + key + '= [' + font.features.markGlyphs[key].join(' ') + '];\n'
|
||||||
}
|
}
|
||||||
// mark
|
|
||||||
var mark = font.features.mark;
|
|
||||||
for (var id in mark) {
|
|
||||||
var lookup = mark[id];
|
|
||||||
var lookupName = 'markAuto_' + id;
|
|
||||||
featurefile += 'lookup ' + lookupName + ' {' + lookup.marks.join(';\n') + ';\n'
|
|
||||||
+ lookup.bases.join(';\n') + ';} ' + lookupName + ';'
|
|
||||||
}
|
|
||||||
|
|
||||||
// mkmk
|
|
||||||
var mkmk = font.features.mkmk;
|
|
||||||
featurefile += 'lookup mkmkAuto {' + mkmk.marks.join(';\n') + ';\n'
|
|
||||||
+ mkmk.bases.join(';\n') + ';} mkmkAuto;'
|
|
||||||
|
|
||||||
// gdef
|
|
||||||
var gdef = font.features.gdef;
|
|
||||||
featurefile += '@GDEF_Simple = [' + gdef.simple.join(' \n') + '];\n'
|
|
||||||
+ '@GDEF_Ligature =[' + gdef.ligature.join(' \n') + '];\n'
|
|
||||||
+ '@GDEF_Mark = [' + gdef.mark.join(' \n') + '];\n'
|
|
||||||
+ 'table GDEF { GlyphClassDef @GDEF_Simple, @GDEF_Ligature, @GDEF_Mark, ;} GDEF;'
|
|
||||||
|
|
||||||
featurefile += fs.readFileSync(__dirname + '/features/common.fea', 'utf-8');
|
featurefile += fs.readFileSync(__dirname + '/features/common.fea', 'utf-8');
|
||||||
featurefile += fs.readFileSync(__dirname + '/features/' + (font.parameters.isItalic ? 'italiconly.fea' : 'uprightonly.fea'), 'utf-8');
|
featurefile += fs.readFileSync(__dirname + '/features/' + (font.parameters.isItalic ? 'italiconly.fea' : 'uprightonly.fea'), 'utf-8');
|
||||||
|
|
|
@ -821,25 +821,43 @@ if [not recursive] : begin
|
||||||
set glyphList.length font.glyf.length
|
set glyphList.length font.glyf.length
|
||||||
for [local j 0] (j < font.glyf.length) [inc j] : set glyphList.(j) font.glyf.(j)
|
for [local j 0] (j < font.glyf.length) [inc j] : set glyphList.(j) font.glyf.(j)
|
||||||
|
|
||||||
set font.features.cv {.}
|
# GPOS mark and mkmk
|
||||||
foreach [name : items-of : Object.keys glyphs] : begin
|
local markGlyphs {.}
|
||||||
if glyphs.(name).featureSelector : begin
|
|
||||||
local fs glyphs.(name).featureSelector
|
|
||||||
foreach [feature : items-of : Object.keys fs] : begin
|
|
||||||
if [not font.features.cv.(feature)] : set font.features.cv.(feature) {.}
|
|
||||||
set font.features.cv.(feature).(name) fs.(feature)
|
|
||||||
|
|
||||||
set font.features.mark {.}
|
local lookup_mark
|
||||||
set font.features.mkmk {.marks {} .bases {}}
|
.type 'gpos_mark_to_base'
|
||||||
set font.features.markGlyphs {.}
|
.subtables {}
|
||||||
set font.features.gdef {.simple {} .ligature {} .mark {}}
|
local lookup_mkmk
|
||||||
define [buildAnchorDescription glyph inserter propx propy prefix th] : begin
|
.type 'gpos_mark_to_mark'
|
||||||
local buf ''
|
.subtables {}
|
||||||
foreach key [items-of : Object.keys glyph.anchors] : if (!th || th.(key)) : buf = buf + ' <anchor ' + [Math.round glyph.anchors.(key).(propx)] + ' ' + [Math.round glyph.anchors.(key).(propy)] + '> ' + inserter + ' @' + prefix + key
|
|
||||||
return buf
|
|
||||||
|
|
||||||
# mark
|
set font.GPOS : object
|
||||||
define [createMarkLookup tableName anchorClasses] : let [lookup : set font.features.mark.(tableName) {.marks {} .bases {}}] : begin
|
languages
|
||||||
|
.DFLT_DFLT {.features {'mark0', 'mkmk0'}}
|
||||||
|
.latn_DFLT {.features {'mark0', 'mkmk0'}}
|
||||||
|
.grek_DFLT {.features {'mark0', 'mkmk0'}}
|
||||||
|
.cyrl_DFLT {.features {'mark0', 'mkmk0'}}
|
||||||
|
features
|
||||||
|
.mark0 {'l_mark'}
|
||||||
|
.mkmk0 {'l_mkmk'}
|
||||||
|
lookups
|
||||||
|
.l_mark lookup_mark
|
||||||
|
.l_mkmk lookup_mkmk
|
||||||
|
set font.GDEF {.glyphClassDef {.}}
|
||||||
|
|
||||||
|
# mark and mkmk
|
||||||
|
define [createBaseInfo g th px py] : begin
|
||||||
|
local res {.}
|
||||||
|
local pushed false
|
||||||
|
foreach key [items-of : Object.keys g.anchors] : if (!th || th.(key)) : begin
|
||||||
|
set res.(key) : object
|
||||||
|
.x g.anchors.(key).(px || 'x')
|
||||||
|
.y g.anchors.(key).(py || 'y')
|
||||||
|
set pushed true
|
||||||
|
return : if pushed res nothing
|
||||||
|
|
||||||
|
define [createMTSSubtable lookup anchorClasses] : begin
|
||||||
|
local subtable {.marks {.} .bases {.}}
|
||||||
local th {.}
|
local th {.}
|
||||||
foreach [ac : items-of anchorClasses] : set th.(ac) true
|
foreach [ac : items-of anchorClasses] : set th.(ac) true
|
||||||
foreach glyph [items-of glyphList] : if glyph.anchors : begin
|
foreach glyph [items-of glyphList] : if glyph.anchors : begin
|
||||||
|
@ -848,29 +866,214 @@ if [not recursive] : begin
|
||||||
foreach [key : items-of anchorKeys] : if th.(key) : set hasAnchor true
|
foreach [key : items-of anchorKeys] : if th.(key) : set hasAnchor true
|
||||||
if hasAnchor : begin
|
if hasAnchor : begin
|
||||||
local isMarkGlyph false
|
local isMarkGlyph false
|
||||||
foreach key [items-of anchorKeys] : if (glyph.anchors.(key).type == 'mark') : set isMarkGlyph true
|
local markKey nothing
|
||||||
|
foreach key [items-of anchorKeys] : if (glyph.anchors.(key).type == 'mark') : begin
|
||||||
|
set isMarkGlyph true
|
||||||
|
set markKey key
|
||||||
if isMarkGlyph
|
if isMarkGlyph
|
||||||
then : lookup.marks.push : 'markClass ' + glyph.name + [buildAnchorDescription glyph '' 'x' 'y' 'mark' th]
|
: then : begin
|
||||||
else : lookup.bases.push : 'pos base ' + glyph.name + [buildAnchorDescription glyph 'mark' 'x' 'y' 'mark' th]
|
set subtable.marks.(glyph.name) : object
|
||||||
|
class markKey
|
||||||
|
x glyph.anchors.(markKey).x
|
||||||
|
y glyph.anchors.(markKey).y
|
||||||
|
if (lookup == lookup_mkmk) : begin
|
||||||
|
local r : createBaseInfo glyph th 'mbx' 'mby'
|
||||||
|
if r : set subtable.bases.(glyph.name) r
|
||||||
|
: else : if (lookup == lookup_mark) : begin
|
||||||
|
local r : createBaseInfo glyph th 'x' 'y'
|
||||||
|
if r : set subtable.bases.(glyph.name) r
|
||||||
|
lookup.subtables.push subtable
|
||||||
|
|
||||||
createMarkLookup 'letter1' {'above' 'below'}
|
createMTSSubtable lookup_mark {'above' 'below' 'overlay' 'slash'}
|
||||||
createMarkLookup 'letter2' {'trailing' 'lf' 'topright' 'bottomright'}
|
createMTSSubtable lookup_mark {'trailing' 'lf' 'topright' 'bottomright'}
|
||||||
createMarkLookup 'overlay' {'overlay' 'slash'}
|
createMTSSubtable lookup_mkmk {'above'}
|
||||||
# mkmk and GDEF
|
createMTSSubtable lookup_mkmk {'below'}
|
||||||
foreach glyph [items-of glyphList] : if (glyph.anchors && [begin [local anchorKeys : Object.keys glyph.anchors] anchorKeys.length])
|
createMTSSubtable lookup_mkmk {'trailing' 'lf' 'topright' 'bottomright' 'overlay' 'slash'}
|
||||||
then
|
# GDEF
|
||||||
local isMarkGlyph false
|
foreach glyph [items-of glyphList] : begin
|
||||||
foreach key [items-of anchorKeys] : if (glyph.anchors.(key).type == 'mark') : set isMarkGlyph true
|
set font.GDEF.glyphClassDef.(glyph.name) : if [[regex '_'].test glyph.name] 2 1
|
||||||
|
if (glyph.anchors && [begin [local anchorKeys : Object.keys glyph.anchors] anchorKeys.length]) : begin
|
||||||
|
foreach key [items-of anchorKeys] : if (glyph.anchors.(key).type == 'mark') : begin
|
||||||
|
if [not markGlyphs.(key)] : set markGlyphs.(key) {}
|
||||||
|
markGlyphs.(key).push glyph.name
|
||||||
|
set font.GDEF.glyphClassDef.(glyph.name) 3
|
||||||
|
|
||||||
if isMarkGlyph
|
# GSUB
|
||||||
then
|
let : begin
|
||||||
font.features.mkmk.marks.push : 'markClass ' + glyph.name + ' ' + [buildAnchorDescription glyph '' 'x' 'y' 'mkmk']
|
local commonList {}
|
||||||
font.features.mkmk.bases.push : 'pos mark ' + glyph.name + ' ' + [buildAnchorDescription glyph 'mark' 'mbx' 'mby' 'mkmk']
|
local languages
|
||||||
foreach key [items-of anchorKeys] : begin
|
.DFLT_DFLT {.features commonList}
|
||||||
if [not font.features.markGlyphs.(key)] : set font.features.markGlyphs.(key) {}
|
.latn_DFLT {.features commonList}
|
||||||
font.features.markGlyphs.(key).push glyph.name
|
.grek_DFLT {.features commonList}
|
||||||
font.features.gdef.mark.push glyph.name
|
.cyrl_DFLT {.features commonList}
|
||||||
else : if [[regex '_'].test glyph.name] [font.features.gdef.ligature.push glyph.name] [font.features.gdef.simple.push glyph.name]
|
.kana_DFLT {.features commonList}
|
||||||
else : if [[regex '_'].test glyph.name] [font.features.gdef.ligature.push glyph.name] [font.features.gdef.simple.push glyph.name]
|
.hani_DFLT {.features commonList}
|
||||||
|
local features {.}
|
||||||
|
local lookups {.}
|
||||||
|
|
||||||
|
define [lookup-single name f t] : begin
|
||||||
|
local subtable {.}
|
||||||
|
set lookups.(name) {.type 'gsub_single' .subtables {subtable}}
|
||||||
|
foreach [j : range 0 f.length] : set subtable.(f.(j)) t.(j)
|
||||||
|
define [chain-rule] : begin
|
||||||
|
local terms : {}.slice.call arguments 0
|
||||||
|
local subtable {.match {} .apply {} .inputBegins 0 .inputEnds 0}
|
||||||
|
local foundi false
|
||||||
|
local founde false
|
||||||
|
foreach [j : range 0 terms.length] : if (!foundi && terms.(j).1) : begin
|
||||||
|
set subtable.inputBegins j
|
||||||
|
set foundi true
|
||||||
|
foreach [j : range (terms.length - 1) downtill 0] : if (!founde && terms.(j).1) : begin
|
||||||
|
set subtable.inputEnds (j + 1)
|
||||||
|
set founde true
|
||||||
|
foreach [j : range 0 terms.length] : begin
|
||||||
|
local term terms.(j)
|
||||||
|
subtable.match.push term.0
|
||||||
|
if term.1 : begin
|
||||||
|
subtable.apply.push {.at j .lookup term.1}
|
||||||
|
return subtable
|
||||||
|
define [flatten] : begin
|
||||||
|
local ans {}
|
||||||
|
foreach [term : items-of : {}.slice.call arguments 0] : begin
|
||||||
|
if (term <@ Array)
|
||||||
|
: then : set ans : ans.concat term
|
||||||
|
: else : ans.push term
|
||||||
|
return ans
|
||||||
|
|
||||||
|
# cvxx
|
||||||
|
foreach [name : items-of : Object.keys glyphs] : begin
|
||||||
|
if glyphs.(name).featureSelector : begin
|
||||||
|
local fs glyphs.(name).featureSelector
|
||||||
|
foreach [feature : items-of : Object.keys fs] : begin
|
||||||
|
if [not lookups.(feature)] : begin
|
||||||
|
set features.(feature) {feature}
|
||||||
|
set lookups.(feature) {.type 'gsub_single' .subtables{{.}}}
|
||||||
|
commonList.push feature
|
||||||
|
set lookups.(feature).subtables.0.(name) fs.(feature)
|
||||||
|
# ssxx
|
||||||
|
foreach [name : items-of : Object.keys para.sscompose] : begin
|
||||||
|
commonList.push name
|
||||||
|
set features.(name) para.sscompose.(name)
|
||||||
|
#ccmp
|
||||||
|
commonList.push 'ccmp'
|
||||||
|
set features.ccmp {'ccmp1' 'ccmp2'}
|
||||||
|
set lookups.ccmpSubIota {.type 'gsub_single' .subtables {{.iotaBelow 'iotaLF'}}}
|
||||||
|
set lookups.ccmpSubOgonek {.type 'gsub_single' .subtables {{.ogonekBelow 'ogonekTR'}}}
|
||||||
|
set lookups.ccmpSubIJ {.type 'gsub_single' .subtables {{
|
||||||
|
.i 'dotlessi'
|
||||||
|
.cyrUkrainiani 'dotlessi'
|
||||||
|
.j 'dotlessj'
|
||||||
|
.cyrje 'dotlessj'
|
||||||
|
.iogonekBelow 'iogonek.dotless'
|
||||||
|
}}}
|
||||||
|
set lookups.ccmp1
|
||||||
|
.type 'gsub_chaining'
|
||||||
|
.subtables : list
|
||||||
|
chain-rule {{'i' 'cyrUkrainiani' 'j' 'cyrje' 'iogonekBelow'} 'ccmpSubIJ'} {markGlyphs.above}
|
||||||
|
chain-rule {{'eta'}} {{'iotaBelow'} 'ccmpSubIota'}
|
||||||
|
chain-rule {{'eta'}} {markGlyphs.above} {{'iotaBelow'} 'ccmpSubIota'}
|
||||||
|
chain-rule {{'eta'}} {markGlyphs.above} {markGlyphs.above} {{'iotaBelow'} 'ccmpSubIota'}
|
||||||
|
chain-rule {{'eta'}} {markGlyphs.above} {markGlyphs.above} {markGlyphs.above} {{'iotaBelow'} 'ccmpSubIota'}
|
||||||
|
chain-rule {{'A' 'a' 'u' 'cyrA' 'cyra'}} {{'ogonekBelow'} 'ccmpSubOgonek'}
|
||||||
|
chain-rule {{'A' 'a' 'u' 'cyrA' 'cyra'}} {markGlyphs.above} {{'ogonekBelow'} 'ccmpSubOgonek'}
|
||||||
|
chain-rule {{'A' 'a' 'u' 'cyrA' 'cyra'}} {markGlyphs.above} {markGlyphs.above} {{'ogonekBelow'} 'ccmpSubOgonek'}
|
||||||
|
chain-rule {{'A' 'a' 'u' 'cyrA' 'cyra'}} {markGlyphs.above} {markGlyphs.above} {markGlyphs.above} {{'ogonekBelow'} 'ccmpSubOgonek'}
|
||||||
|
set lookups.ccmp2
|
||||||
|
.type 'gsub_ligature'
|
||||||
|
.subtables : list : object
|
||||||
|
psilivaria {'commaAbove' 'graveAbove'}
|
||||||
|
psilioxia {'commaAbove' 'acuteAbove'}
|
||||||
|
psiliperispomeni {'commaAbove' 'perispomeniAbove'}
|
||||||
|
dasiavaria {'revCommaAbove' 'graveAbove'}
|
||||||
|
dasiaoxia {'revCommaAbove' 'acuteAbove'}
|
||||||
|
dasiaperispomeni {'revCommaAbove' 'perispomeniAbove'}
|
||||||
|
|
||||||
|
if (para.spacing > 0) : let : begin
|
||||||
|
#calt
|
||||||
|
local arrowStick {'hyphen' 'equal'}
|
||||||
|
local less {'less'}
|
||||||
|
local greater {'greater'}
|
||||||
|
lookup-single 'arrowStickFR' {'hyphen' 'equal'} {'lighy.fr' 'ligeq.fr'}
|
||||||
|
lookup-single 'arrowStickLF' {'hyphen' 'equal'} {'lighy.lf' 'ligeq.lf'}
|
||||||
|
lookup-single 'arrowStickFR1' {'hyphen' 'equal'} {'lighy.fr1' 'ligeq.fr1'}
|
||||||
|
lookup-single 'arrowStickL1F' {'hyphen' 'equal'} {'lighy.l1f' 'ligeq.l1f'}
|
||||||
|
lookup-single 'arrowStickCR' {'hyphen' 'equal'} {'lighy.cr' 'ligeq.cr'}
|
||||||
|
lookup-single 'arrowStickLC' {'hyphen' 'equal'} {'lighy.lc' 'ligeq.lc'}
|
||||||
|
lookup-single 'arrowStickLXC' {'hyphen' 'equal'} {'lighy.lxc' 'ligeq.lxc'}
|
||||||
|
lookup-single 'arrowStickCF' {'hyphen' 'equal'} {'lighy.cf' 'ligeq.cf'}
|
||||||
|
lookup-single 'arrowStickFC' {'hyphen' 'equal'} {'lighy.fc' 'ligeq.fc'}
|
||||||
|
lookup-single 'arrowStickJF' {'hyphen' 'equal'} {'lighy.jf' 'ligeq.jf'}
|
||||||
|
lookup-single 'arrowStickFJ' {'hyphen' 'equal'} {'lighy.fj' 'ligeq.fj'}
|
||||||
|
lookup-single 'arrowStickJ1F' {'hyphen' 'equal'} {'lighy.j1f' 'ligeq.j1f'}
|
||||||
|
lookup-single 'arrowStickFJ1' {'hyphen' 'equal'} {'lighy.fj1' 'ligeq.fj1'}
|
||||||
|
lookup-single 'arrowStickJR' {'hyphen' 'equal'} {'lighy.jr' 'ligeq.jr'}
|
||||||
|
lookup-single 'arrowStickLJ' {'hyphen' 'equal'} {'lighy.lj' 'ligeq.lj'}
|
||||||
|
lookup-single 'arrowStickLR' {'hyphen' 'equal'} {'lighy.lr' 'ligeq.lr'}
|
||||||
|
|
||||||
|
lookup-single 'lessShift1' {'less'} {'ligless.shift1'}
|
||||||
|
lookup-single 'greaterShift1' {'greater'} {'liggreater.shift1'}
|
||||||
|
lookup-single 'lessShiftN1' {'less'} {'ligless.shiftN1'}
|
||||||
|
lookup-single 'greaterShiftN1' {'greater'} {'liggreater.shiftN1'}
|
||||||
|
lookup-single 'arrowExclamHTMLComment' {'exclam'} {'ligexclam.htmlcommentstart'}
|
||||||
|
|
||||||
|
commonList.push 'calt'
|
||||||
|
set features.calt {'caltArrow1'}
|
||||||
|
set lookups.caltArrow1
|
||||||
|
.type 'gsub_chaining'
|
||||||
|
.subtables : list
|
||||||
|
chain-rule {less} {arrowStick 'arrowStickLC'} {arrowStick 'arrowStickCR'} {greater}
|
||||||
|
chain-rule {less} {arrowStick 'arrowStickLR'} {greater} # <->, <=>
|
||||||
|
chain-rule {less} {arrowStick 'arrowStickLJ'} {less} # <-<, <=<
|
||||||
|
chain-rule {less} {arrowStick 'arrowStickLC'} {arrowStick 'arrowStickCF'} # <--, <==
|
||||||
|
chain-rule {less} {less 'lessShift1'} {arrowStick 'arrowStickL1F'} # <<-, <<=
|
||||||
|
chain-rule {less} {{'hyphen'} 'arrowStickLF'} # <-
|
||||||
|
chain-rule {less} {{'exclam'} 'arrowExclamHTMLComment'} {{'hyphen'} 'arrowStickLXC'} {{'hyphen'} 'arrowStickCF'} # <!--
|
||||||
|
chain-rule {greater} {greater 'greaterShiftN1'} {arrowStick 'arrowStickJ1F'} # >>-, >>=
|
||||||
|
chain-rule {greater} {arrowStick 'arrowStickJR'} {greater} # >->, >=>
|
||||||
|
chain-rule {greater} {{'hyphen'} 'arrowStickJF'} # >-
|
||||||
|
chain-rule {arrowStick 'arrowStickFC'} {arrowStick 'arrowStickCR'} {greater} # -->, ==>
|
||||||
|
chain-rule {arrowStick 'arrowStickFR1'} {greater 'greaterShift1'} {greater} # ->>, =>>
|
||||||
|
chain-rule {arrowStick 'arrowStickFR'} {greater} # ->, =>
|
||||||
|
chain-rule {arrowStick 'arrowStickFJ1'} {less 'lessShiftN1'} {less} # -<<, =<<
|
||||||
|
chain-rule {arrowStick 'arrowStickFJ'} {less} # -<, =<
|
||||||
|
|
||||||
|
#opbd
|
||||||
|
local fwclose {'fwlcloseDoubleQuote' 'fwlcloseSingleQuote' 'dwlcjkSingleQuoteRight' 'dwlcjkDoubleQuoteRight' 'dwlparenRight'}
|
||||||
|
local hwclose {'closeDoubleQuote' 'closeSingleQuote' 'cjkSingleQuoteRight' 'cjkDoubleQuoteRight' 'parenRight'}
|
||||||
|
local fwopen {'fwropenDoubleQuote' 'fwropenSingleQuote' 'dwrcjkSingleQuoteLeft' 'dwrcjkDoubleQuoteLeft' 'dwrparenLeft'}
|
||||||
|
local hwopen {'openDoubleQuote' 'openSingleQuote' 'cjkSingleQuoteLeft' 'cjkDoubleQuoteLeft' 'parenLeft'}
|
||||||
|
local fwquoteopen {'fwropenDoubleQuote' 'fwropenSingleQuote'}
|
||||||
|
local hwquoteopen {'openDoubleQuote' 'openSingleQuote'}
|
||||||
|
local fwtrail {'dwlperiod' 'dwlcomma' 'dwlcjkperiod' 'dwlcjkcomma'}
|
||||||
|
local hwtrail {'period' 'comma' 'cjkperiod' 'cjkcomma'}
|
||||||
|
local fwmid {'dwccolon' 'dwcsemicolon'}
|
||||||
|
local hwmid {'colon' 'semicolon'}
|
||||||
|
|
||||||
|
lookup-single 'closefw' [flatten fwopen fwclose] [flatten hwopen hwclose]
|
||||||
|
commonList.push 'opbd'
|
||||||
|
set features.opbd {'opbd1'}
|
||||||
|
set lookups.opbd1
|
||||||
|
.type 'gsub_chaining'
|
||||||
|
.subtables : list
|
||||||
|
chain-rule {[flatten fwtrail hwtrail fwopen hwopen fwmid hwmid]} {fwopen 'closefw'}
|
||||||
|
chain-rule {fwclose 'closefw'} {[flatten fwtrail hwtrail fwclose hwclose fwopen hwopen fwmid hwmid]}
|
||||||
|
|
||||||
|
#localized SRB
|
||||||
|
local srbSubtable null
|
||||||
|
if para.isItalic
|
||||||
|
: then : set srbSubtable : object
|
||||||
|
cyrbe 'cyrbe.serbian'
|
||||||
|
cyrghe 'cyrghe.serbian'
|
||||||
|
cyrde 'cyrde.serbian'
|
||||||
|
cyrpe 'cyrpe.serbian'
|
||||||
|
cyrte 'cyrte.serbian'
|
||||||
|
: else : set srbSubtable : object
|
||||||
|
cyrbe 'cyrbe.serbian'
|
||||||
|
|
||||||
|
set lookups.locl_srb {.type 'gsub_single' .subtables {srbSubtable}}
|
||||||
|
set features.locl_srb {'locl_srb'}
|
||||||
|
set languages.'cyrl_SRB ' {.features [{'locl_srb'}.concat commonList]}
|
||||||
|
|
||||||
|
set font.GSUB {.languages languages .features features .lookups lookups}
|
||||||
|
|
||||||
progress 'Features'
|
progress 'Features'
|
51
onegroup.mk
51
onegroup.mk
|
@ -32,12 +32,9 @@ OBLIQUE = $(OBJDIR)/$(PREFIX)-thinoblique.ttf $(OBJDIR)/$(PREFIX)-extralightobli
|
||||||
TARGETS = $(UPRIGHT) $(ITALIC) $(OBLIQUE)
|
TARGETS = $(UPRIGHT) $(ITALIC) $(OBLIQUE)
|
||||||
MAPS = $(if $(NOCHARMAP),,$(OBJDIR)/$(PREFIX)-regular.charmap)
|
MAPS = $(if $(NOCHARMAP),,$(OBJDIR)/$(PREFIX)-regular.charmap)
|
||||||
|
|
||||||
FEASRC = features/common.fea features/ligation.fea features/uprightonly.fea features/italiconly.fea
|
|
||||||
|
|
||||||
FDTS = $(subst .ttf,.fdt,$(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS)))
|
FDTS = $(subst .ttf,.fdt,$(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS)))
|
||||||
SVG0 = $(subst .ttf,.svg,$(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS)))
|
SVG0 = $(subst .ttf,.svg,$(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS)))
|
||||||
|
|
||||||
FEATURE = $(subst .ttf,.fea,$(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS)))
|
|
||||||
PASS1 = $(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS))
|
PASS1 = $(subst $(OBJDIR)/,$(OBJDIR)/.pass0-,$(TARGETS))
|
||||||
PASS1 = $(subst $(OBJDIR)/,$(OBJDIR)/.pass1-,$(TARGETS))
|
PASS1 = $(subst $(OBJDIR)/,$(OBJDIR)/.pass1-,$(TARGETS))
|
||||||
PASS2 = $(subst $(OBJDIR)/,$(OBJDIR)/.pass2-,$(TARGETS))
|
PASS2 = $(subst $(OBJDIR)/,$(OBJDIR)/.pass2-,$(TARGETS))
|
||||||
|
@ -48,64 +45,62 @@ fonts : $(DISTTARGETS)
|
||||||
svgs : $(SVG0)
|
svgs : $(SVG0)
|
||||||
|
|
||||||
# Pass 0 : file construction
|
# Pass 0 : file construction
|
||||||
OUTPUTS = --meta $@ --feature $(subst .fdt,.fea,$@) --svg $(subst .fdt,.svg,$@)
|
OUTPUTS = --meta $@ --svg $(subst .fdt,.svg,$@)
|
||||||
OUTPUT_CM = $(if $(NOCHARMAP),,--charmap $(subst .fdt,.charmap,$(subst $(OBJDIR)/.pass0-,$(OBJDIR)/,$@)))
|
OUTPUT_CM = $(if $(NOCHARMAP),,--charmap $(subst .fdt,.charmap,$(subst $(OBJDIR)/.pass0-,$(OBJDIR)/,$@)))
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-thin.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-thin.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-thin s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-thin s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-extralight.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-extralight.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-extralight s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-extralight s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-light.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-light.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-light s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-light s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-regular.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-regular.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-book s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) $(OUTPUT_CM)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-book s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) $(OUTPUT_CM)
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-medium.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-medium.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-medium s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-medium s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-bold.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-bold.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-bold s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-bold s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-heavy.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-heavy.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-heavy s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-heavy s-upright $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS)
|
||||||
|
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-thinitalic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-thinitalic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-thin s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-thin s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-extralightitalic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-extralightitalic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-extralight s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-extralight s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-lightitalic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-lightitalic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-light s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-light s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-italic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-italic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-book s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-book s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-mediumitalic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-mediumitalic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-medium s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-medium s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-bolditalic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-bolditalic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-bold s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-bold s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-heavyitalic.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-heavyitalic.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-heavy s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-heavy s-italic $(STYLE_ITALIC) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
|
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-thinoblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-thinoblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-thin s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-thin s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-extralightoblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-extralightoblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-extralight s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-extralight s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-lightoblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-lightoblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-light s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-light s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-oblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-oblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-book s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-book s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-mediumoblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-mediumoblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-medium s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-medium s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-boldoblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-boldoblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-bold s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-bold s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
$(OBJDIR)/.pass0-$(PREFIX)-heavyoblique.fdt : $(SCRIPTS) $(FEASRC) | $(OBJDIR) $(DISTDIR)
|
$(OBJDIR)/.pass0-$(PREFIX)-heavyoblique.fdt : $(SCRIPTS) | $(OBJDIR) $(DISTDIR)
|
||||||
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-heavy s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
$(NODE_FDT) generator iosevka $(STYLE_COMMON) w-heavy s-oblique $(STYLE_UPRIGHT) $(STYLE_SUFFIX) $(OUTPUTS) --uprightify 1
|
||||||
|
|
||||||
$(SVG0) : $(OBJDIR)/.pass0-%.svg : $(OBJDIR)/.pass0-%.fdt
|
$(SVG0) : $(OBJDIR)/.pass0-%.svg : $(OBJDIR)/.pass0-%.fdt
|
||||||
$(PASS)
|
$(PASS)
|
||||||
$(FEATURE) : $(OBJDIR)/.pass0-%.fea : $(OBJDIR)/.pass0-%.fdt
|
|
||||||
$(PASS)
|
|
||||||
$(MAPS) : $(OBJDIR)/%.charmap : $(OBJDIR)/.pass0-%.fdt
|
$(MAPS) : $(OBJDIR)/%.charmap : $(OBJDIR)/.pass0-%.fdt
|
||||||
$(PASS)
|
$(PASS)
|
||||||
|
|
||||||
HINT = ttfautohint --increase-x-height=0
|
HINT = ttfautohint --increase-x-height=0
|
||||||
|
|
||||||
# Pass 1 : Outline cleanup and merge features
|
# Pass 1 : Outline cleanup and merge features
|
||||||
$(PASS1) : $(OBJDIR)/.pass1-%.ttf : pass1-cleanup.py $(OBJDIR)/.pass0-%.svg $(OBJDIR)/.pass0-%.fea
|
$(PASS1) : $(OBJDIR)/.pass1-%.ttf : pass1-cleanup.py $(OBJDIR)/.pass0-%.svg
|
||||||
@fontforge -quiet -script $^ $@.a.ttf $(if $(findstring italic,$@),10,$(if $(findstring oblique,$@),10,0)) $(FAST) $(SUPPRESS_ERRORS)
|
@fontforge -quiet -script $^ $@.a.ttf $(if $(findstring italic,$@),10,$(if $(findstring oblique,$@),10,0)) $(FAST) $(SUPPRESS_ERRORS)
|
||||||
@$(HINT) $@.a.ttf $@
|
@$(HINT) $@.a.ttf $@
|
||||||
@-rm $@.a.ttf
|
@-rm $@.a.ttf
|
||||||
|
|
|
@ -5,7 +5,6 @@ import sys
|
||||||
|
|
||||||
source = sys.argv[1]
|
source = sys.argv[1]
|
||||||
font = fontforge.open(source)
|
font = fontforge.open(source)
|
||||||
font.mergeFeature(sys.argv[2])
|
|
||||||
font.selection.all()
|
font.selection.all()
|
||||||
# Replace accented characters into references
|
# Replace accented characters into references
|
||||||
font.selection.select(("ranges", "unicode", None), 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF)
|
font.selection.select(("ranges", "unicode", None), 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF)
|
||||||
|
@ -40,7 +39,7 @@ font.simplify(0.05, ("smoothcurves", "choosehv"), 0.1)
|
||||||
#font.em = 2000
|
#font.em = 2000
|
||||||
font.selection.all()
|
font.selection.all()
|
||||||
font.layers["Fore"].is_quadratic = True
|
font.layers["Fore"].is_quadratic = True
|
||||||
font.transform(psMat.skew(float(sys.argv[4]) / 180 * math.pi))
|
font.transform(psMat.skew(float(sys.argv[3]) / 180 * math.pi))
|
||||||
font.em = 1000
|
font.em = 1000
|
||||||
|
|
||||||
font.selection.all()
|
font.selection.all()
|
||||||
|
@ -52,4 +51,4 @@ font.removeOverlap()
|
||||||
|
|
||||||
font.canonicalContours()
|
font.canonicalContours()
|
||||||
font.canonicalStart()
|
font.canonicalStart()
|
||||||
font.generate(sys.argv[3], flags = ("opentype"))
|
font.generate(sys.argv[2], flags = ("opentype"))
|
|
@ -18,8 +18,8 @@ process.stdin.on('end', function () {
|
||||||
ttf.cvt_ = glyfs.cvt_;
|
ttf.cvt_ = glyfs.cvt_;
|
||||||
ttf.maxp = glyfs.maxp;
|
ttf.maxp = glyfs.maxp;
|
||||||
ttf.gasp = glyfs.gasp;
|
ttf.gasp = glyfs.gasp;
|
||||||
ttf.GDEF = glyfs.GDEF;
|
//ttf.GDEF = glyfs.GDEF;
|
||||||
ttf.GSUB = glyfs.GSUB;
|
//ttf.GSUB = glyfs.GSUB;
|
||||||
ttf.GPOS = glyfs.GPOS;
|
//ttf.GPOS = glyfs.GPOS;
|
||||||
process.stdout.write(JSON.stringify(ttf));
|
process.stdout.write(JSON.stringify(ttf));
|
||||||
});
|
});
|
|
@ -201,7 +201,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="display" class="show {{currentFont.cls}}">
|
<div id="display" class="show {{currentFont.cls}}">
|
||||||
<p class="waterfall" v-for="size in waterfall" style="font-size:{{size / 14}}rem">float Fox.quick(h){!isBrown && jumpOver(doges.lazy)}</p>
|
<p class="waterfall" v-for="size in waterfall" style="font-size:{{size / 14}}rem">float Fox.quick(h){!isBrown && jumpO̶̸ver(dogeś̠̣.lazy)}</p>
|
||||||
<p class="lipsum" v-for="item in lipsums">{{item}}</p>
|
<p class="lipsum" v-for="item in lipsums">{{item}}</p>
|
||||||
<pre class="langs"><code class=patel><span class=keyword>define</span> samples : <span class=keyword>object</span><template v-for="sample in samples">
|
<pre class="langs"><code class=patel><span class=keyword>define</span> samples : <span class=keyword>object</span><template v-for="sample in samples">
|
||||||
{<span class=qualifier>.lang</span> <span class=string>'{{sample.lang}}'</span>{{sample.spaces}}<span class=qualifier>.sample</span> <span class=string lang="{{sample.code}}">'{{{sample.sample}}}'</span>}<span class=comment>{{sample.comment}}</span></template></code></pre>
|
{<span class=qualifier>.lang</span> <span class=string>'{{sample.lang}}'</span>{{sample.spaces}}<span class=qualifier>.sample</span> <span class=string lang="{{sample.code}}">'{{{sample.sample}}}'</span>}<span class=comment>{{sample.comment}}</span></template></code></pre>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue