init commit

This commit is contained in:
Eigil Nikolajsen 2023-02-05 09:30:02 +01:00
commit 4ec5d43d0b
15 changed files with 1472 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

35
f.js Normal file
View File

@ -0,0 +1,35 @@
// @dflt = [exclam comma period slash colon semicolon question backslash bar];
// @c2_1 = [exclam.c2_1 comma.c2_1 period.c2_1 slash.c2_1 colon.c2_1 semicolon.c2_1 question.c2_1 backslash.c2_1 bar.c2_1];
// @c2_2 = [exclam.c2_2 comma.c2_2 period.c2_2 slash.c2_2 colon.c2_2 semicolon.c2_2 question.c2_2 backslash.c2_2 bar.c2_2];
// @c3_1 = [exclam.c3_1 comma.c3_1 period.c3_1 slash.c3_1 colon.c3_1 semicolon.c3_1 question.c3_1 backslash.c3_1 bar.c3_1];
// @c3_2 = [exclam comma period slash colon semicolon question backslash bar];
// @c3_3 = [exclam.c3_3 comma.c3_3 period.c3_3 slash.c3_3 colon.c3_3 semicolon.c3_3 question.c3_3 backslash.c3_3 bar.c3_3];
const input =
"exclam exclam.square comma period period.square slash slash.case colon colon.square colon.case colon.case.square semicolon semicolon.square semicolon.case semicolon.case.square question question.square backslash backslash.case bar bar.case"
function c002(input) {
const s = input.split(" ")
return `
@dflt = [${input}];
@c2_1 = [${s.join(".c2_1 ")}.c2_1];
@c2_2 = [${s.join(".c2_2 ")}.c2_2];
@c3_1 = [${s.join(".c3_1 ")}.c3_1];
@c3_3 = [${s.join(".c3_3 ")}.c3_3];
`
}
pbcopy(c002(input))
console.log(c002(input))
const classContent =
"exclam numbersign dollar percent ampersand asterisk plus zero one two three four five six seven eight nine question A B C D E F G H I J K L M N O P Q R S T U V W X Y Z sterling yen copyright registered Agrave Aacute Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis Oslash Ugrave Uacute Ucircumflex Udieresis Yacute Thorn Amacron Abreve Aogonek Cacute Ccircumflex Cdotaccent Ccaron Dcaron Dcroat Emacron Ebreve Edotaccent Eogonek Ecaron Gcircumflex Gbreve Gdotaccent Gcommaaccent Hcircumflex Hbar Itilde Imacron Iogonek Idotaccent IJ Jcircumflex Kcommaaccent Lacute Lcommaaccent Lcaron Ldot Lslash Nacute Ncommaaccent Ncaron Omacron Obreve Ohungarumlaut OE Racute Rcommaaccent Rcaron Sacute Scircumflex Scedilla Scaron Tcedilla Tcaron Tbar Utilde Umacron Ubreve Uring Uhungarumlaut Uogonek Wcircumflex Ycircumflex Ydieresis Zdotaccent Zcaron Scommaaccent Tcommaaccent Delta Omega Wgrave Wacute Wdieresis dagger daggerdbl perthousand franc lira peseta Euro product summation radical lozenge Ohm six.cv03 nine.cv03 approxequal.case asciitilde.case asterisk.case at.case backslash.case bar.case braceleft.case braceright.case bracketleft.case bracketright.case brokenbar.case bullet.case bulletoperator.case colon.case divide.case divisionslash.case emdash.case endash.case equal.case exclamdown.case greater.case greaterequal.case guillemotleft.case guillemotright.case guilsinglleft.case guilsinglright.case hyphen.case less.case lessequal.case logicalnot.case minus.case multiply.case notequal.case parenleft.case parenright.case periodcentered.case plus.case plusminus.case questiondown.case semicolon.case slash.case softhyphen.case Adieresis.square Cdotaccent.square Edieresis.square Edotaccent.square Gcommaaccent.square Gdotaccent.square Idieresis.square Idotaccent.square Kcommaaccent.square Lcommaaccent.square Ldot.square Ncommaaccent.square Odieresis.square Rcommaaccent.square Scommaaccent.square Tcommaaccent.square Udieresis.square Wdieresis.square Ydieresis.square Zdotaccent.square backslash.case.c2_1 backslash.case.c2_2 backslash.case.c3_1 backslash.case.c3_3 bar.case.c2_1 bar.case.c2_2 bar.case.c3_1 bar.case.c3_3 bullet.case.square bulletoperator.case.square colon.case.c2_1 colon.case.c2_2 colon.case.c3_1 colon.case.c3_3 colon.case.square colon.case.square.c2_1 colon.case.square.c2_2 colon.case.square.c3_1 colon.case.square.c3_3 equal.arrow.case exclamdown.case.square greater.arrow_end.case greater.arrow_start.case greater.arrow_start_equal.case greater.arrow_start_hyphen.case greater.pipe.case hyphen.arrow.case less.arrow_end.case less.arrow_start.case less.arrow_start_equal.case less.arrow_start_hyphen.case less.pipe.case periodcentered.case.square questiondown.case.square semicolon.case.c2_1 semicolon.case.c2_2 semicolon.case.c3_1 semicolon.case.c3_3 semicolon.case.square semicolon.case.square.c2_1 semicolon.case.square.c2_2 semicolon.case.square.c3_1 semicolon.case.square.c3_3 slash.case.c2_1 slash.case.c2_2 slash.case.c3_1 slash.case.c3_3 divide.case.square approxequal.case asciitilde.case asterisk.case at.case backslash.case backslash.case.c2_1 backslash.case.c2_2 backslash.case.c3_1 backslash.case.c3_3 bar.case bar.case.c2_1 bar.case.c2_2 bar.case.c3_1 bar.case.c3_3 braceleft.case braceright.case bracketleft.case bracketright.case brokenbar.case bullet.case bullet.case.square bulletoperator.case bulletoperator.case.square colon.case colon.case.c2_1 colon.case.c2_2 colon.case.c3_1 colon.case.c3_3 colon.case.square colon.case.square.c2_1 colon.case.square.c2_2 colon.case.square.c3_1 colon.case.square.c3_3 divide.case divide.case.square divisionslash.case emdash.case endash.case equal.arrow.case equal.case exclamdown.case exclamdown.case.square greater.arrow_end.case greater.arrow_start.case greater.arrow_start_equal.case greater.arrow_start_hyphen.case greater.case greater.pipe.case greaterequal.case guillemotleft.case guillemotright.case guilsinglleft.case guilsinglright.case hyphen.arrow.case hyphen.case less.arrow_end.case less.arrow_start.case less.arrow_start_equal.case less.arrow_start_hyphen.case less.case less.pipe.case lessequal.case logicalnot.case minus.case multiply.case notequal.case parenleft.case parenright.case periodcentered.case periodcentered.case.square plus.case plusminus.case questiondown.case questiondown.case.square semicolon.case semicolon.case.c2_1 semicolon.case.c2_2 semicolon.case.c3_1 semicolon.case.c3_3 semicolon.case.square semicolon.case.square.c2_1 semicolon.case.square.c2_2 semicolon.case.square.c3_1 semicolon.case.square.c3_3 slash.case slash.case.c2_1 slash.case.c2_2 slash.case.c3_1 slash.case.c3_3 softhyphen.case"
function classExcess(c) {
return [...new Set(c.split(" "))].join(" ")
}
function pbcopy(data) {
var proc = require("child_process").spawn("pbcopy")
proc.stdin.write(data)
proc.stdin.end()
}
// pbcopy(classExcess(classContent))
// console.log(classExcess(classContent))

72
features/c001.fea Normal file
View File

@ -0,0 +1,72 @@
feature c001 {
# Coding Ligature 001—999
# Case sensitive punctuation
#> feature
ignore sub @case_default' @lowercase_actor;
ignore sub @case_default' @case_default @lowercase_actor;
ignore sub @case_default' @case_default @case_default @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @case_default @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @case_default @lowercase_actor;
ignore sub @lowercase_actor @case_default';
ignore sub @lowercase_actor @case_default @case_default';
ignore sub @lowercase_actor @case_default @case_default @case_default';
ignore sub @lowercase_actor @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @case_default @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @case_default @case_default @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @case_default @case_default @case_default @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @case_default @case_default @case_default @case_default @case_default @case_default @case_default @case_default';
ignore sub @case_default' @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @case_default @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @case_default @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @space_actor @lowercase_actor;
ignore sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @case_default @space_actor @lowercase_actor;
ignore sub @lowercase_actor @space_actor @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default @case_default @case_default @case_default @case_default @case_default';
ignore sub @lowercase_actor @space_actor @case_default @case_default @case_default @case_default @case_default @case_default @case_default @case_default';
sub @case_default @case_default' by @case_top;
sub @case_default' @case_default by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @uppercase_actor by @case_top;
sub @case_default' @case_default @uppercase_actor by @case_top;
sub @case_default' @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @case_default @space_actor @uppercase_actor by @case_top;
sub @case_default' @space_actor @uppercase_actor by @case_top;
sub @uppercase_actor @case_default' by @case_top;
sub @uppercase_actor @space_actor @case_default' by @case_top;
#< feature
} c001;

27
features/c002.fea Normal file
View File

@ -0,0 +1,27 @@
feature c002 {
# Coding Ligature 001—999
# Adjust punctuation horizontally
#> feature
@dflt = [exclam exclam.square comma period period.square slash slash.case colon colon.square colon.case colon.case.square semicolon semicolon.square semicolon.case semicolon.case.square question question.square backslash backslash.case bar bar.case];
@c2_1 = [exclam.c2_1 exclam.square.c2_1 comma.c2_1 period.c2_1 period.square.c2_1 slash.c2_1 slash.case.c2_1 colon.c2_1 colon.square.c2_1 colon.case.c2_1 colon.case.square.c2_1 semicolon.c2_1 semicolon.square.c2_1 semicolon.case.c2_1 semicolon.case.square.c2_1 question.c2_1 question.square.c2_1 backslash.c2_1 backslash.case.c2_1 bar.c2_1 bar.case.c2_1];
@c2_2 = [exclam.c2_2 exclam.square.c2_2 comma.c2_2 period.c2_2 period.square.c2_2 slash.c2_2 slash.case.c2_2 colon.c2_2 colon.square.c2_2 colon.case.c2_2 colon.case.square.c2_2 semicolon.c2_2 semicolon.square.c2_2 semicolon.case.c2_2 semicolon.case.square.c2_2 question.c2_2 question.square.c2_2 backslash.c2_2 backslash.case.c2_2 bar.c2_2 bar.case.c2_2];
@c3_1 = [exclam.c3_1 exclam.square.c3_1 comma.c3_1 period.c3_1 period.square.c3_1 slash.c3_1 slash.case.c3_1 colon.c3_1 colon.square.c3_1 colon.case.c3_1 colon.case.square.c3_1 semicolon.c3_1 semicolon.square.c3_1 semicolon.case.c3_1 semicolon.case.square.c3_1 question.c3_1 question.square.c3_1 backslash.c3_1 backslash.case.c3_1 bar.c3_1 bar.case.c3_1];
@c3_3 = [exclam.c3_3 exclam.square.c3_3 comma.c3_3 period.c3_3 period.square.c3_3 slash.c3_3 slash.case.c3_3 colon.c3_3 colon.square.c3_3 colon.case.c3_3 colon.case.square.c3_3 semicolon.c3_3 semicolon.square.c3_3 semicolon.case.c3_3 semicolon.case.square.c3_3 question.c3_3 question.square.c3_3 backslash.c3_3 backslash.case.c3_3 bar.c3_3 bar.case.c3_3];
ignore sub @dflt' @dflt @dflt @dflt;
ignore sub @dflt @dflt' @dflt @dflt;
ignore sub @dflt @dflt @dflt' @dflt;
ignore sub @dflt @dflt @dflt @dflt';
sub @dflt' @dflt @dflt by @c3_1;
sub @c3_1 @dflt @dflt' by @c3_3;
ignore sub @c3_1 @dflt' @dflt;
sub @dflt' @dflt by @c2_1;
sub @c2_1 @dflt' by @c2_2;
#< feature
} c002;

99
features/c003.fea Normal file
View File

@ -0,0 +1,99 @@
feature c003 {
# Character Variant 01—99
# Arrows
#> feature
@hyphen = [hyphen hyphen.case];
@hyphen_arrow = [hyphen.arrow hyphen.arrow.case];
@equal = [equal equal.case];
@equal_arrow = [equal.arrow equal.arrow.case];
@less = [less less.case];
@less_arrow_end = [less.arrow_end less.arrow_end.case];
@less_arrow_start = [less.arrow_start less.arrow_start.case];
@less_arrow_start_hyphen = [less.arrow_start_hyphen less.arrow_start_hyphen.case];
@less_arrow_start_equal = [less.arrow_start_equal less.arrow_start_equal.case];
@greater = [greater greater.case];
@greater_arrow_end = [greater.arrow_end greater.arrow_end.case];
@greater_arrow_start = [greater.arrow_start greater.arrow_start.case];
@greater_arrow_start_hyphen = [greater.arrow_start_hyphen greater.arrow_start_hyphen.case];
@greater_arrow_start_equal = [greater.arrow_start_equal greater.arrow_start_equal.case];
@exclam = [exclam exclam.square];
sub @less' @less @less @less @less @hyphen by @less_arrow_start;
sub @less' @less @less @less @hyphen by @less_arrow_start;
sub @less' @less @less @hyphen by @less_arrow_start;
sub @less' @less @hyphen by @less_arrow_start;
sub @less' @hyphen by @less_arrow_start_hyphen;
sub @less_arrow_start_hyphen @hyphen' by @hyphen_arrow;
sub @less' @less @less @less @less @equal by @less_arrow_start;
sub @less' @less @less @less @equal by @less_arrow_start;
sub @less' @less @less @equal by @less_arrow_start;
sub @less' @less @equal by @less_arrow_start;
sub @less' @equal by @less_arrow_start_equal;
sub @less_arrow_start_equal @equal' by @equal_arrow;
sub @greater' @greater @greater @greater @greater @hyphen by @greater_arrow_end;
sub @greater' @greater @greater @greater @hyphen by @greater_arrow_end;
sub @greater' @greater @greater @hyphen by @greater_arrow_end;
sub @greater' @greater @hyphen by @greater_arrow_end;
sub @greater' @hyphen by @greater_arrow_end;
sub @greater_arrow_end @hyphen' by @hyphen_arrow;
sub @greater' @greater @greater @greater @greater @equal by @greater_arrow_end;
sub @greater' @greater @greater @greater @equal by @greater_arrow_end;
sub @greater' @greater @greater @equal by @greater_arrow_end;
sub @greater' @greater @equal by @greater_arrow_end;
sub @greater' @equal by @greater_arrow_end;
sub @greater_arrow_end @equal' by @equal_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @hyphen @hyphen @hyphen @less by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @hyphen @hyphen @less by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @hyphen @less by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @less by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @less by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @less by @hyphen_arrow;
sub @hyphen' @hyphen @less by @hyphen_arrow;
sub @hyphen' @less by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @hyphen @hyphen @hyphen @greater by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @hyphen @hyphen @greater by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @hyphen @greater by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @hyphen @greater by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @hyphen @greater by @hyphen_arrow;
sub @hyphen' @hyphen @hyphen @greater by @hyphen_arrow;
sub @hyphen' @hyphen @greater by @hyphen_arrow;
sub @hyphen' @greater by @hyphen_arrow;
sub @hyphen_arrow @hyphen' by @hyphen_arrow;
sub @hyphen_arrow @less' by @less_arrow_end;
sub @hyphen_arrow @greater' by @greater_arrow_start_hyphen;
sub @equal' @equal @equal @equal @equal @equal @equal @equal @less by @equal_arrow;
sub @equal' @equal @equal @equal @equal @equal @equal @less by @equal_arrow;
sub @equal' @equal @equal @equal @equal @equal @less by @equal_arrow;
sub @equal' @equal @equal @equal @equal @less by @equal_arrow;
sub @equal' @equal @equal @equal @less by @equal_arrow;
sub @equal' @equal @equal @less by @equal_arrow;
sub @equal' @equal @less by @equal_arrow;
sub @equal' @less by @equal_arrow;
sub @equal' @equal @equal @equal @equal @equal @equal @equal @greater by @equal_arrow;
sub @equal' @equal @equal @equal @equal @equal @equal @greater by @equal_arrow;
sub @equal' @equal @equal @equal @equal @equal @greater by @equal_arrow;
sub @equal' @equal @equal @equal @equal @greater by @equal_arrow;
sub @equal' @equal @equal @equal @greater by @equal_arrow;
sub @equal' @equal @equal @greater by @equal_arrow;
sub @equal' @equal @greater by @equal_arrow;
sub @equal' @greater by @equal_arrow;
sub @equal_arrow @equal' by @equal_arrow;
sub @equal_arrow @less' by @less_arrow_end;
sub @equal_arrow @greater' by @greater_arrow_start_equal;
sub @greater_arrow_start_hyphen @greater' by @greater_arrow_start;
sub @greater_arrow_start_equal @greater' by @greater_arrow_start;
sub @less' @exclam @hyphen @hyphen by @less_arrow_start;
sub @less_arrow_start @exclam @hyphen' @hyphen by @hyphen_arrow;
sub @less_arrow_start @exclam @hyphen_arrow @hyphen' by @hyphen_arrow;
#< feature
} c003;

52
features/c004.fea Normal file
View File

@ -0,0 +1,52 @@
feature c004 {
# Coding Ligature 001—999
# Pipe substitution
#> feature
@less_ = [less less.case];
@less_pipe = [less.pipe less.pipe.case];
@greater_ = [greater greater.case];
@greater_pipe = [greater.pipe greater.pipe.case];
@bar = [bar.pipe bar.case.pipe];
@bar_c = [bar.c2_1 bar.c2_2 bar bar.c3_1 bar.c3_3 bar.pipe];
@bar_c_case = [bar.case.c2_1 bar.case.c2_2 bar.case bar.case.c3_1 bar.case.c3_3 bar.case.pipe];
sub @less_' @bar_c by @less_pipe;
sub @less_' @bar_c_case by @less_pipe;
sub @bar_c' @bar_c @bar_c @greater by bar.pipe;
sub bar.pipe @bar_c' @bar_c @greater by bar.pipe;
sub bar.pipe bar.pipe @bar_c' @greater by bar.pipe;
sub @bar_c' @bar_c @greater by bar.pipe;
sub bar.pipe @bar_c' @greater by bar.pipe;
sub @bar_c' @greater by bar.pipe;
sub @bar_c_case' @bar_c_case @bar_c_case @greater by bar.case.pipe;
sub bar.case.pipe @bar_c_case' @bar_c_case @greater by bar.case.pipe;
sub bar.case.pipe bar.case.pipe @bar_c_case' @greater by bar.case.pipe;
sub @bar_c_case' @bar_c_case @greater by bar.case.pipe;
sub bar.case.pipe @bar_c_case' @greater by bar.case.pipe;
sub @bar_c_case' @greater by bar.case.pipe;
sub @less_pipe @bar_c' @bar_c @bar_c by bar.pipe;
sub @less_pipe bar.pipe @bar_c' @bar_c by bar.pipe;
sub @less_pipe bar.pipe bar.pipe @bar_c' by bar.pipe;
sub @less_pipe @bar_c' @bar_c by bar.pipe;
sub @less_pipe bar.pipe @bar_c' by bar.pipe;
sub @less_pipe @bar_c' by bar.pipe;
sub @less_pipe @bar_c_case' @bar_c_case @bar_c_case by bar.case.pipe;
sub @less_pipe bar.case.pipe @bar_c_case' @bar_c_case by bar.case.pipe;
sub @less_pipe bar.case.pipe bar.case.pipe @bar_c_case' by bar.case.pipe;
sub @less_pipe @bar_c_case' @bar_c_case by bar.case.pipe;
sub @less_pipe bar.case.pipe @bar_c_case' by bar.case.pipe;
sub @less_pipe @bar_c_case' by bar.case.pipe;
sub bar.pipe @greater_' by @greater_pipe;
sub bar.case.pipe @greater_' by @greater_pipe;
#< feature
} c004;

86
features/frac.fea Normal file
View File

@ -0,0 +1,86 @@
feature frac {
# Fractions
#> featur
# Arbitrary fractions (based on opentypecookbook.com)
lookup frac_bar {
ignore sub slash @figs @figs @figs @figs @figs @figs @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs @figs @figs @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs @figs @figs @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs @figs @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs @figs @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs @figs slash;
ignore sub slash @figs @figs @figs slash';
ignore sub slash' @figs @figs @figs slash;
ignore sub slash @figs @figs slash';
ignore sub slash' @figs @figs slash;
ignore sub slash @figs slash';
ignore sub slash' @figs slash;
ignore sub slash slash';
ignore sub slash' slash;
sub @figs slash' @figs by fraction;
} frac_bar;
lookup numr1 {
sub @figs' fraction by @numr;
} numr1;
lookup numr2 {
sub @figs' @numr fraction by @numr;
} numr2;
lookup numr3 {
sub @figs' @numr @numr fraction by @numr;
} numr3;
lookup numr4 {
sub @figs' @numr @numr @numr fraction by @numr;
} numr4;
lookup numr5 {
sub @figs' @numr @numr @numr @numr fraction by @numr;
} numr5;
lookup numr6 {
sub @figs' @numr @numr @numr @numr @numr fraction by @numr;
} numr6;
lookup numr7 {
sub @figs' @numr @numr @numr @numr @numr @numr fraction by @numr;
} numr7;
lookup numr8 {
sub @figs' @numr @numr @numr @numr @numr @numr @numr fraction by @numr;
} numr8;
lookup numr9 {
sub @figs' @numr @numr @numr @numr @numr @numr @numr @numr fraction by @numr;
} numr9;
lookup numr10 {
sub @figs' @numr @numr @numr @numr @numr @numr @numr @numr @numr fraction by @numr;
} numr10;
lookup dnom {
sub [fraction @dnom] @figs' by @dnom;
} dnom;
#< feature
} frac;

20
features/posa.fea Normal file
View File

@ -0,0 +1,20 @@
feature c002 {
# Coding Ligature 001—999
# Adjust punctuation
#> feature
pos @uppercase_actor @adjust_punctuation' @adjust_punctuation @uppercase_actor <40 0 0 0>;
pos @uppercase_actor @adjust_punctuation @adjust_punctuation' @uppercase_actor <-40 0 0 0>;
pos @uppercase_actor @adjust_punctuation' @adjust_punctuation @adjust_punctuation @uppercase_actor <80 0 0 0>;
pos @uppercase_actor @adjust_punctuation @adjust_punctuation' @adjust_punctuation @uppercase_actor <0 0 0 0>;
pos @uppercase_actor @adjust_punctuation @adjust_punctuation @adjust_punctuation' @uppercase_actor <-80 0 0 0>;
pos @space_actor @adjust_punctuation' @adjust_punctuation @space_actor <40 0 0 0>;
pos @space_actor @adjust_punctuation @adjust_punctuation' @space_actor <-40 0 0 0>;
pos @space_actor @adjust_punctuation' @adjust_punctuation @adjust_punctuation @space_actor <80 0 0 0>;
pos @space_actor @adjust_punctuation @adjust_punctuation' @adjust_punctuation @space_actor <0 0 0 0>;
pos @space_actor @adjust_punctuation @adjust_punctuation @adjust_punctuation' @space_actor <-80 0 0 0>;
#< feature
} c002;

34
index.html Normal file
View File

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
@font-face {
font-family: "CommitMono";
src: url("CommitMonoV10.woff2");
}
body {
display: flex;
justify-content: center;
align-items: center;
height: 90vh;
overflow: hidden;
}
p {
font-family: "CommitMono";
font-size: 5rem;
background-color: hsl(0, 0%, 50%);
line-height: calc(7 / 12);
width: calc(5rem * 0.5 * 27);
}
</style>
<script src="https://cdn.jsdelivr.net/npm/opentype.js@latest/dist/opentype.min.js" defer></script>
<script src="t.js" defer></script>
</head>
<body>
<p>Hello Button Type TEXT TEST</p>
</body>
</html>

890
package-lock.json generated Normal file
View File

@ -0,0 +1,890 @@
{
"name": "commit-webtests",
"version": "0.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "commit-webtests",
"version": "0.0.0",
"devDependencies": {
"vite": "^4.1.0"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
"integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
"integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
"integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
"integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
"integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
"integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
"integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
"integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
"integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
"integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
"integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
"cpu": [
"loong64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
"integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
"cpu": [
"mips64el"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
"integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
"cpu": [
"ppc64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
"integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
"cpu": [
"riscv64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
"integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
"cpu": [
"s390x"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
"integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
"integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
"integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
"integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
"integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
"integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
"integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
"integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
"dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/android-arm": "0.16.17",
"@esbuild/android-arm64": "0.16.17",
"@esbuild/android-x64": "0.16.17",
"@esbuild/darwin-arm64": "0.16.17",
"@esbuild/darwin-x64": "0.16.17",
"@esbuild/freebsd-arm64": "0.16.17",
"@esbuild/freebsd-x64": "0.16.17",
"@esbuild/linux-arm": "0.16.17",
"@esbuild/linux-arm64": "0.16.17",
"@esbuild/linux-ia32": "0.16.17",
"@esbuild/linux-loong64": "0.16.17",
"@esbuild/linux-mips64el": "0.16.17",
"@esbuild/linux-ppc64": "0.16.17",
"@esbuild/linux-riscv64": "0.16.17",
"@esbuild/linux-s390x": "0.16.17",
"@esbuild/linux-x64": "0.16.17",
"@esbuild/netbsd-x64": "0.16.17",
"@esbuild/openbsd-x64": "0.16.17",
"@esbuild/sunos-x64": "0.16.17",
"@esbuild/win32-arm64": "0.16.17",
"@esbuild/win32-ia32": "0.16.17",
"@esbuild/win32-x64": "0.16.17"
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"node_modules/postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"dependencies": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/rollup": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.14.0.tgz",
"integrity": "sha512-o23sdgCLcLSe3zIplT9nQ1+r97okuaiR+vmAPZPTDYB7/f3tgWIYNyiQveMsZwshBT0is4eGax/HH83Q7CG+/Q==",
"dev": true,
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=14.18.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/vite": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz",
"integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==",
"dev": true,
"dependencies": {
"esbuild": "^0.16.14",
"postcss": "^8.4.21",
"resolve": "^1.22.1",
"rollup": "^3.10.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
},
"peerDependencies": {
"@types/node": ">= 14",
"less": "*",
"sass": "*",
"stylus": "*",
"sugarss": "*",
"terser": "^5.4.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"less": {
"optional": true
},
"sass": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
}
}
}
},
"dependencies": {
"@esbuild/android-arm": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
"integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
"dev": true,
"optional": true
},
"@esbuild/android-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
"integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
"dev": true,
"optional": true
},
"@esbuild/android-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
"integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
"dev": true,
"optional": true
},
"@esbuild/darwin-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
"integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
"dev": true,
"optional": true
},
"@esbuild/darwin-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
"integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
"dev": true,
"optional": true
},
"@esbuild/freebsd-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
"integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
"dev": true,
"optional": true
},
"@esbuild/freebsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
"integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
"dev": true,
"optional": true
},
"@esbuild/linux-arm": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
"integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
"integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
"dev": true,
"optional": true
},
"@esbuild/linux-ia32": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
"integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
"dev": true,
"optional": true
},
"@esbuild/linux-loong64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
"integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-mips64el": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
"integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
"dev": true,
"optional": true
},
"@esbuild/linux-ppc64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
"integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
"dev": true,
"optional": true
},
"@esbuild/linux-riscv64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
"integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
"dev": true,
"optional": true
},
"@esbuild/linux-s390x": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
"integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
"dev": true,
"optional": true
},
"@esbuild/linux-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
"integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
"dev": true,
"optional": true
},
"@esbuild/netbsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
"integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
"dev": true,
"optional": true
},
"@esbuild/openbsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
"integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
"dev": true,
"optional": true
},
"@esbuild/sunos-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
"integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
"dev": true,
"optional": true
},
"@esbuild/win32-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
"integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
"dev": true,
"optional": true
},
"@esbuild/win32-ia32": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
"integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
"dev": true,
"optional": true
},
"@esbuild/win32-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
"integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
"dev": true,
"optional": true
},
"esbuild": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
"integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
"dev": true,
"requires": {
"@esbuild/android-arm": "0.16.17",
"@esbuild/android-arm64": "0.16.17",
"@esbuild/android-x64": "0.16.17",
"@esbuild/darwin-arm64": "0.16.17",
"@esbuild/darwin-x64": "0.16.17",
"@esbuild/freebsd-arm64": "0.16.17",
"@esbuild/freebsd-x64": "0.16.17",
"@esbuild/linux-arm": "0.16.17",
"@esbuild/linux-arm64": "0.16.17",
"@esbuild/linux-ia32": "0.16.17",
"@esbuild/linux-loong64": "0.16.17",
"@esbuild/linux-mips64el": "0.16.17",
"@esbuild/linux-ppc64": "0.16.17",
"@esbuild/linux-riscv64": "0.16.17",
"@esbuild/linux-s390x": "0.16.17",
"@esbuild/linux-x64": "0.16.17",
"@esbuild/netbsd-x64": "0.16.17",
"@esbuild/openbsd-x64": "0.16.17",
"@esbuild/sunos-x64": "0.16.17",
"@esbuild/win32-arm64": "0.16.17",
"@esbuild/win32-ia32": "0.16.17",
"@esbuild/win32-x64": "0.16.17"
}
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true
},
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"dev": true,
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
},
"resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"requires": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
"rollup": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.14.0.tgz",
"integrity": "sha512-o23sdgCLcLSe3zIplT9nQ1+r97okuaiR+vmAPZPTDYB7/f3tgWIYNyiQveMsZwshBT0is4eGax/HH83Q7CG+/Q==",
"dev": true,
"requires": {
"fsevents": "~2.3.2"
}
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"vite": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz",
"integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==",
"dev": true,
"requires": {
"esbuild": "^0.16.14",
"fsevents": "~2.3.2",
"postcss": "^8.4.21",
"resolve": "^1.22.1",
"rollup": "^3.10.0"
}
}
}
}

14
package.json Normal file
View File

@ -0,0 +1,14 @@
{
"name": "commit-webtests",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"vite": "^4.1.0"
}
}

1
public/vite.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

27
t.js Normal file
View File

@ -0,0 +1,27 @@
console.log("opentype test")
async function initFont() {
const font = await opentype.load("/fonts/CommitMonoOTV1-450.otf")
console.log(font)
console.log(font.glyphs.glyphs[50].path)
console.log(font.glyphs.glyphs[76].path)
const newFont = switchGlyphs(font, 50, 76)
console.log(newFont)
console.log(newFont.glyphs.glyphs[50].path)
console.log(newFont.glyphs.glyphs[76].path)
// newFont.download()
}
function switchGlyphs(font, glyphIndexA, glyphIndexB) {
const glyphPathA = font.glyphs.glyphs[glyphIndexA].path
const glyphPathB = font.glyphs.glyphs[glyphIndexB].path
font.glyphs.glyphs[glyphIndexB].path = glyphPathA
font.glyphs.glyphs[glyphIndexA].path = glyphPathB
return font
}
initFont()

91
txt/ligatures.txt Normal file
View File

@ -0,0 +1,91 @@
LIGATURE INTENT FINISH
-> y f
--> y f
---> y f
<- y f
<-- y f
<--- y f
<!-- y f
=> y f
==> y f
=>> y f
=<< y f
>=> y f
<=< y f
=>= y f
=<= y f
!= m f
!== y f
== n f
=== n f
.. y f
... y f
:: y f
;; y f
::: y f
?. y f
!! y f
!. y f
..= m f
..< m f
:= y f
=: y f
:# y f
#: y f
www y f
|| y f
// y f
#### m f
<> y f
<~> y f
:> y f
:< y f
>: y f
<: y f
::> y f
::< y f
>:: y f
<:: y f
:<: y f
:>: y f
/\ y f
\/ y f
-| y f
|- y f
_|_ y f
<| y f
<|| y f
<||| y f
|> y f
||> y f
|||> y f
|] y u
[| y u
|} y u
{| y u
<$ y f
$> y f
<$> y f
<+ y f
+> y f
<+> y f
<* y f
*> y f
<*> y f

0
txt/test.txt Normal file
View File