diff --git a/README.md b/README.md index ecf2a0dd0..ae510bf61 100644 --- a/README.md +++ b/README.md @@ -205,8 +205,8 @@ The current available styles for `design`/`upright`/`italic`/`oblique` options a * `v-t-standard` : Standard `t` shape (default). * `v-t-cross` : Futura-like `t` shape. * Styles for letter `Q`: - * `v-q-taily` : `Q` with a curly tail (default). - * `v-q-straight` : `Q` with a straight tail in the old versions. + * `v-capital-q-taily` : `Q` with a curly tail (default). + * `v-capital-q-straight` : `Q` with a straight tail in the old versions. * Styles for letter `y`: * `v-y-straight`: More-straight letter `y`. * `v-y-curly`: More curly letter `y`, like Iosevka 2.x. @@ -273,7 +273,7 @@ The current available styles for `design`/`upright`/`italic`/`oblique` options a * Styles for letter `R`: * `v-capital-r-straight`: Standard, straight `R` (default). * `v-capital-r-curly`: Slightly curly `R`, like Iosevka 2.x. - * Styles for letter `Y`, `У`: + * Styles for letter `Y`: * `v-capital-y-straight`: Standard, straight `Y` (default). * `v-capital-y-curly`: Slightly curly `Y`, like Iosevka 2.x. * Styles for letter `A`, `Λ`, `Δ`: diff --git a/gen/build-glyphs.ptl b/gen/build-glyphs.ptl index d23ad08d4..ae80e73e9 100644 --- a/gen/build-glyphs.ptl +++ b/gen/build-glyphs.ptl @@ -125,28 +125,13 @@ define [buildGlyphs para recursive recursiveCodes] : begin # Basic knots define spirofns : spirokit.SetupBuilders : object globalTransform CONTRAST STROKE Glyph para SUPERNESS - sketch # .null - set-width 0 - set currentGlyph.cmpPriority (9998) - save '.null' - - sketch # nonmarkingreturn - set-width WIDTH - set currentGlyph.cmpPriority (-1) - save 'nonmarkingreturn' 0x000D - - sketch # space - local df : DivFrame para.diversityF - set-width df.width - include df.markSet.e - save 'space' ' ' - # IDKY, but wrapping "metrics" prevents Node.js on Arch modifying it. - define $Capture$ : object [metrics : Object.create metrics] $NamedParameterPair$ $donothing$ para recursive recursiveCodes variantSelector glyphs glyphList unicodeGlyphs create-glyph $save$ save-glyph spirofns MarkSet MARK BASE AS_BASE ALSO_METRICS pickHash dependencyProfile getDependencyProfile buildGlyphs newtemp tagged includeGlyphPart compsiteMarkSet DivFrame fontMetrics + define $$Capture$$ : object [metrics : Object.create metrics] $NamedParameterPair$ $donothing$ para recursive recursiveCodes variantSelector glyphs glyphList unicodeGlyphs create-glyph $save$ save-glyph spirofns MarkSet MARK BASE AS_BASE ALSO_METRICS pickHash dependencyProfile getDependencyProfile buildGlyphs newtemp tagged includeGlyphPart compsiteMarkSet DivFrame fontMetrics ### HERE WE GO run-glyph-module '../glyphs/common-shapes.js' - run-glyph-module '../glyphs/Overmarks.js' + run-glyph-module '../glyphs/space.js' + run-glyph-module '../glyphs/overmarks.js' # Unified letters run-glyph-module '../glyphs/letters-unified-basic.js' diff --git a/glyphs/letters-unified-basic.ptl b/glyphs/letters-unified-basic.ptl index 1be8a9e67..cd9f16886 100644 --- a/glyphs/letters-unified-basic.ptl +++ b/glyphs/letters-unified-basic.ptl @@ -1305,7 +1305,7 @@ glyph-block LetterUnified-Basic : begin ### y do "y and related ============================================================================" define [GenSmallYShape straightBar] : begin - local useCurlyBottom : para.isItalic || SLAB || straightBar + local useCurlyBottom : SLAB || straightBar local px1 0.84 local py1 : linreg 18 0.8 126 0.76 STROKE local px2 0.95 diff --git a/glyphs/space.ptl b/glyphs/space.ptl new file mode 100644 index 000000000..3969a1d59 --- /dev/null +++ b/glyphs/space.ptl @@ -0,0 +1,22 @@ +$$include '../meta/macros.ptl' + +import [mix linreg clamp fallback] from '../support/utils' + +glyph-module + +glyph-block Symbol-Mosaic-NotDef : begin + sketch # .null + set-width 0 + set currentGlyph.cmpPriority (9998) + save '.null' + + sketch # nonmarkingreturn + set-width WIDTH + set currentGlyph.cmpPriority (-1) + save 'nonmarkingreturn' 0x000D + + sketch # space + local df : DivFrame para.diversityF + set-width df.width + include df.markSet.e + save 'space' ' ' diff --git a/images/charvars.png b/images/charvars.png index 311147953..15afef96f 100644 Binary files a/images/charvars.png and b/images/charvars.png differ diff --git a/images/download-options.png b/images/download-options.png deleted file mode 100644 index 53139df21..000000000 Binary files a/images/download-options.png and /dev/null differ diff --git a/images/family.png b/images/family.png deleted file mode 100644 index 8e7bc3d7e..000000000 Binary files a/images/family.png and /dev/null differ diff --git a/images/languages.png b/images/languages.png index 151ef5c70..099eea4b6 100644 Binary files a/images/languages.png and b/images/languages.png differ diff --git a/images/ligations.png b/images/ligations.png index ce3215b6e..a04fe375e 100644 Binary files a/images/ligations.png and b/images/ligations.png differ diff --git a/images/matrix.png b/images/matrix.png index 1fa2f67f4..efc880f05 100644 Binary files a/images/matrix.png and b/images/matrix.png differ diff --git a/images/preview-all.png b/images/preview-all.png index fd9156487..7f3a95395 100644 Binary files a/images/preview-all.png and b/images/preview-all.png differ diff --git a/images/stylesets.png b/images/stylesets.png index afd2c5c0a..b475b6953 100644 Binary files a/images/stylesets.png and b/images/stylesets.png differ diff --git a/images/variants.png b/images/variants.png deleted file mode 100644 index 041641374..000000000 Binary files a/images/variants.png and /dev/null differ diff --git a/images/weights.png b/images/weights.png index 7c62d1c6a..9f964f6bd 100644 Binary files a/images/weights.png and b/images/weights.png differ diff --git a/meta/macros.ptl b/meta/macros.ptl index 0de794f49..729055e34 100644 --- a/meta/macros.ptl +++ b/meta/macros.ptl @@ -113,7 +113,7 @@ define-macro sketch : syntax-rules begin @::[steps.map formOf] set $Capture$.dependencyProfile.(currentGlyph.name) : $Capture$.getDependencyProfile currentGlyph return currentGlyph - ]].call [$Capture$.create-glyph @tcn $donothing$]] + ]].call [create-glyph @tcn $donothing$]] define-macro branch : syntax-rules `[branch @::steps] : begin @@ -129,13 +129,13 @@ define-macro branch : syntax-rules begin @::[steps.map formOf] set $Capture$.dependencyProfile.(currentGlyph.name) : $Capture$.getDependencyProfile currentGlyph return currentGlyph - ]].call [$Capture$.create-glyph @tcn [lambda : begin [this.include currentGlyph true] [set this.advanceWidth currentGlyph.advanceWidth]]]] + ]].call [create-glyph @tcn [lambda : begin [this.include currentGlyph true] [set this.advanceWidth currentGlyph.advanceWidth]]]] define-macro save : syntax-rules `[save @::args] : dirty `[$save$.call currentGlyph @::args] define-macro run-glyph-module : syntax-rules - `[run-glyph-module @path] : dirty `[[import @path].apply.call $Capture$] + `[run-glyph-module @path] : dirty `[[import @path].apply.call $$Capture$$] define-macro glyph-block-import : syntax-rules `[glyph-block-import @_blockName] : begin @@ -210,7 +210,7 @@ define-macro glyph-block : syntax-rules ([typeof form] === "string") : set variableSet.(form) true traceBody body - traceBody `[$save$ $NamedParameterPair$ $donothing$] + traceBody `[$save$ $NamedParameterPair$ $donothing$ create-glyph] set externEnv.$glyphBlockVariableUsage$ variableSet diff --git a/package.json b/package.json index 136ea5bd5..fc5bdab7f 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ "patrisika-scopes": "^0.11.1", "eslint": "^5.2.0", "stylus": "^0.54.5", - "semver": "^7.1.1" + "semver": "^7.1.1", + "ejs": "^3.0.1", + "fs-extra": "^8.1.0" } } diff --git a/snapshot/get-snap.js b/snapshot/get-snap.js index 8b19a4d5a..cb3eda36b 100644 --- a/snapshot/get-snap.js +++ b/snapshot/get-snap.js @@ -1,122 +1,122 @@ -const { app, BrowserWindow } = require("electron"); -var argv = require("yargs").argv; -var fs = require("fs"); -var cp = require("child_process"); - -var mainWindow = null; -var allWindowClosed = false; -var pendingTasks = 0; -var zoom = 2; - -function checkQuit() { - if (allWindowClosed && pendingTasks == 0) app.quit(); -} - -app.on("window-all-closed", function() { - allWindowClosed = true; - checkQuit(); -}); - -function combineImages(images, outfile, width, height, doubleTrim) { - var command = - "magick " + - images.join(" ") + - " -append -crop " + - width + - "x" + - height + - "+0+0 +repage -bordercolor #008000 -fuzz 5% -trim " + - (doubleTrim ? "-bordercolor " + doubleTrim + " -trim " : "") + - outfile; - console.log(command); - cp.exec(command, function(err, stdout, stderr) { - if (err) console.log(err); - images.forEach(function(file) { - fs.unlinkSync(file); - }); - pendingTasks -= 1; - checkQuit(); - }); -} - -var ipc = require("electron").ipcMain; -function GOTO(phase) { - currentPhase = phase; -} -var phases = { - prepare: function(event, arg) { - console.log(arg); - GOTO(phases["receive-rect"]); - }, - "receive-rect": function(event, rect) { - pendingTasks += 1; - console.log("Received rect."); - rect = JSON.parse(JSON.stringify(rect)); - var file = argv.dir + "/" + rect.name + ".png"; - var j = 0; - var totalFiles = Math.ceil(rect.height / rect.windowHeight); - var pendingFiles = totalFiles; - step(); - - function doneFileWrite() { - pendingFiles -= 1; - if (pendingFiles <= 0) { - var images = []; - for (var k = 0; k < j; k++) { - images.push(argv.dir + "/" + rect.name + "." + k + ".png"); - } - combineImages( - images, - file, - rect.windowWidth * rect.dpi, - rect.height * rect.dpi, - rect.doubleTrim - ); - } - } - function step() { - event.sender.send("scroll", rect.y + j * rect.windowHeight); - GOTO(function(event) { - mainWindow.capturePage().then(function(image) { - fs.writeFile( - argv.dir + "/" + rect.name + "." + j + ".png", - image.toPNG(), - doneFileWrite - ); - j += 1; - if (j >= totalFiles) { - // Move to next image - event.sender.send("complete", file); - GOTO(phases["receive-rect"]); - } else { - step(); - } - }); - }); - } - } -}; -var currentPhase = phases["prepare"]; -ipc.on("snapshot", function() { - currentPhase.apply(this, arguments); -}); -ipc.on("log", function(event, arg) { - console.log(arg); -}); - -app.on("ready", function() { - mainWindow = new BrowserWindow({ - width: 64 * 16 * zoom, - height: 1024 * zoom, - //x: 5000, y: 5000, - webPreferences: { - zoomFactor: zoom, - nodeIntegration: true - }, - show: false - }); - mainWindow.showInactive(); - mainWindow.loadURL("file://" + __dirname + "/index.html"); - mainWindow.blurWebView(); - //mainWindow.hide(); -}); +const { app, BrowserWindow } = require("electron"); +let argv = require("yargs").argv; +let fs = require("fs"); +let cp = require("child_process"); + +let mainWindow = null; +let allWindowClosed = false; +let pendingTasks = 0; +let zoom = 2; + +function checkQuit() { + if (allWindowClosed && pendingTasks == 0) app.quit(); +} + +app.on("window-all-closed", function() { + allWindowClosed = true; + checkQuit(); +}); + +function combineImages(images, outfile, width, height, doubleTrim) { + let command = + "magick " + + images.join(" ") + + " -append -crop " + + width + + "x" + + height + + "+0+0 +repage -bordercolor #008000 -fuzz 5% -trim " + + (doubleTrim ? "-bordercolor " + doubleTrim + " -trim " : "") + + outfile; + console.log(command); + cp.exec(command, function(err, stdout, stderr) { + if (err) console.log(err); + images.forEach(function(file) { + fs.unlinkSync(file); + }); + pendingTasks -= 1; + checkQuit(); + }); +} + +let ipc = require("electron").ipcMain; +function GOTO(phase) { + currentPhase = phase; +} +const phases = { + prepare: function(event, arg) { + console.log(arg); + GOTO(phases["receive-rect"]); + }, + "receive-rect": function(event, rect) { + pendingTasks += 1; + console.log("Received rect."); + rect = JSON.parse(JSON.stringify(rect)); + let file = argv.dir + "/" + rect.name + ".png"; + let j = 0; + let totalFiles = Math.ceil(rect.height / rect.windowHeight); + let pendingFiles = totalFiles; + step(); + + function doneFileWrite() { + pendingFiles -= 1; + if (pendingFiles <= 0) { + let images = []; + for (let k = 0; k < j; k++) { + images.push(argv.dir + "/" + rect.name + "." + k + ".png"); + } + combineImages( + images, + file, + rect.windowWidth * rect.dpi, + rect.height * rect.dpi, + rect.doubleTrim + ); + } + } + function step() { + event.sender.send("scroll", rect.y + j * rect.windowHeight); + GOTO(function(event) { + mainWindow.capturePage().then(function(image) { + fs.writeFile( + argv.dir + "/" + rect.name + "." + j + ".png", + image.toPNG(), + doneFileWrite + ); + j += 1; + if (j >= totalFiles) { + // Move to next image + event.sender.send("complete", file); + GOTO(phases["receive-rect"]); + } else { + step(); + } + }); + }); + } + } +}; +let currentPhase = phases["prepare"]; +ipc.on("snapshot", function() { + currentPhase.apply(this, arguments); +}); +ipc.on("log", function(event, arg) { + console.log(arg); +}); + +app.on("ready", function() { + mainWindow = new BrowserWindow({ + width: 64 * 16 * zoom, + height: 1024 * zoom, + //x: 5000, y: 5000, + webPreferences: { + zoomFactor: zoom, + nodeIntegration: true + }, + show: false + }); + mainWindow.showInactive(); + mainWindow.loadURL("file://" + __dirname + "/index.html"); + mainWindow.blurWebView(); + //mainWindow.hide(); +}); diff --git a/snapshot/index.html b/snapshot/index.html index 1b88276ef..9f387da3f 100644 --- a/snapshot/index.html +++ b/snapshot/index.html @@ -5,676 +5,767 @@
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka", DARK) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka", LIGHT) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka Slab", DARK) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka Slab", LIGHT) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
const languages = [
+ {lang: 'English', sample: 'Shaw, those twelve beige hooks are joined if I patch a young, gooey mouth.'},
+ {lang: 'IPA', sample: '[ɢʷɯʔ.nas.doːŋ.kʰlja] [ŋan.ȵʑi̯wo.ɕi̯uĕn.ɣwa]'},
+ {lang: 'Bulgarian', sample: 'Я, пазачът Вальо уж бди, а скришом хапва кюфтенца зад щайгите.'},
+ {lang: 'Czech', sample: 'Nechť již hříšné saxofony ďáblů rozezvučí síň úděsnými tóny waltzu, tanga a quickstepu.'},
+ {lang: 'Finnish', sample: 'Charles Darwin jammaili Åken hevixylofonilla Qatarin yöpub Zeligissä.'},
+ {lang: 'French', sample: 'Voix ambiguë d’un cœur qui au zéphyr préfère les jattes de kiwi.'},
+ {lang: 'German', sample: 'Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.'},
+ {lang: 'Greek', sample: 'Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός.'},
+ {lang: 'Ancient Greek', sample: 'Ἄδμηθ’, ὁρᾷς γὰρ τἀμὰ πράγμαθ’ ὡς ἔχει, λέξαι θέλω σοι πρὶν θανεῖν ἃ βούλομαι. '},
+ {lang: 'Hungarian', sample: 'Jó foxim és don Quijote húszwattos lámpánál ülve egy pár bűvös cipőt készít.'},
+ {lang: 'Icelandic', sample: 'Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa.'},
+ {lang: 'Irish', sample: 'Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig.'},
+ {lang: 'Latvian', sample: 'Muļķa hipiji mēģina brīvi nogaršot celofāna žņaudzējčūsku.'},
+ {lang: 'Lithuanian', sample: 'Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą.'},
+ {lang: 'Macedonian', sample: 'Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех.'},
+ {lang: 'Norwegian', sample: 'Jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz'},
+ {lang: 'Polish', sample: 'Pchnąć w tę łódź jeża lub ośm skrzyń fig.'},
+ {lang: 'Portuguese', sample: 'Luís argüia à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português.'},
+ {lang: 'Romanian', sample: 'Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila.'},
+ {lang: 'Russian', sample: 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.'},
+ {lang: 'Serbian', sample: 'Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу.'},
+ {lang: 'Spanish', sample: 'Benjamín pidió una bebida de kiwi y fresa; Noé, sin vergüenza, la más exquisita champaña del menú.'},
+ {lang: 'Turkish', sample: 'Pijamalı hasta yağız şoföre çabucak güvendi.'},
+ {lang: 'Ukrainian', sample: 'Чуєш їх, доцю, га? Кумедна ж ти, прощайся без ґольфів!'}
+]
+
+float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); } +
Feature Tag | Description |
---|---|
calt off | +Ligation Off | +
+ + + + + |
+ |
calt | +Default setting in text editors | +
+ + + <---------------- ----------------> <===============> a:b a::b a:::b+ := :- :+ <* <*> *> <| <|> |>+ |
+ |
XJS0, XPHP | +JavaScript, PHP | +
+ + + <---------------- ----------------> <===============> a:b a::b a:::b+ := :- :+ <* <*> *> <| <|> |>+ |
+ |
XML0, XFS0, XFST | +ML, OCaml, F#, F* | +
+ + + <---------------- ----------------> <===============> a:b a::b a:::b a\/b a/\b+ := :- :+ <* <*> *> <| <|> |>+ |
+ |
SWFT, XPTL | +Swift, PatEL | +
+ -<< -< -<-+ =<< =< =<=+ + + |
+ |
XHS0, XIDR, XELM, PURS | +Haskell, Idris, Elm, PureScript | +
+ -<< -< -<- <-- <--- <<- <- -> ->> --> ---> ->- >- >>- <-> <--> <---> <----> <!--+ =<< =< =<= <== <=== <<= <= => =>> ==> ===> =>= >= >>= <=> <==> <===> <====> <!---+ <---------------- ----------------> <===============> a:b a::b a:::b a\/b a/\b+ := :- :+ <* <*> *> <| <|> |> <. <.> .> +: -: =: <******>+ |
+ |
XV00 | +Coq | +
+ -<< -< -<- <-- <--- <<- <- -> ->> --> ---> ->- >- >>- <-> <--> <---> <----> <!--+ =<< =< =<= <== <=== <<= <= => =>> ==> ===> =>= >= >>= <=> <==> <===> <====> <!---+ <---------------- ----------------> <===============> a:b a::b a:::b a\/b a/\b+ := :- :+ <* <*> *> <| <|> |> <. <.> .> +: -: =: <******> (* comm *) == != === !==+ |
+
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka", DARK) { // The quick brown fox jumps over the lazy dog.
- const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
- RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
- ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
-}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka", LIGHT) { // The quick brown fox jumps over the lazy dog.
- const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
- RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
- ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
-}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka Slab", DARK) { // The quick brown fox jumps over the lazy dog.
- const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
- RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
- ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
-}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka Slab", LIGHT) { // The quick brown fox jumps over the lazy dog.
- const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
- RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
- ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
-}
var languages = [
- {lang: 'English', sample: 'Shaw, those twelve beige hooks are joined if I patch a young, gooey mouth.'},
- {lang: 'IPA', sample: '[ɢʷɯʔ.nas.doːŋ.kʰlja] [ŋan.ȵʑi̯wo.ɕi̯uĕn.ɣwa]'},
- {lang: 'Bulgarian', sample: 'Я, пазачът Вальо уж бди, а скришом хапва кюфтенца зад щайгите.'},
- {lang: 'Czech', sample: 'Nechť již hříšné saxofony ďáblů rozezvučí síň úděsnými tóny waltzu, tanga a quickstepu.'},
- {lang: 'Finnish', sample: 'Charles Darwin jammaili Åken hevixylofonilla Qatarin yöpub Zeligissä.'},
- {lang: 'French', sample: 'Voix ambiguë d’un cœur qui au zéphyr préfère les jattes de kiwi.'},
- {lang: 'German', sample: 'Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.'},
- {lang: 'Greek', sample: 'Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός.'},
- {lang: 'Ancient Greek', sample: 'Ἄδμηθ’, ὁρᾷς γὰρ τἀμὰ πράγμαθ’ ὡς ἔχει, λέξαι θέλω σοι πρὶν θανεῖν ἃ βούλομαι. '},
- {lang: 'Hungarian', sample: 'Jó foxim és don Quijote húszwattos lámpánál ülve egy pár bűvös cipőt készít.'},
- {lang: 'Icelandic', sample: 'Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa.'},
- {lang: 'Irish', sample: 'Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig.'},
- {lang: 'Latvian', sample: 'Muļķa hipiji mēģina brīvi nogaršot celofāna žņaudzējčūsku.'},
- {lang: 'Lithuanian', sample: 'Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą.'},
- {lang: 'Macedonian', sample: 'Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех.'},
- {lang: 'Norwegian', sample: 'Jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz'},
- {lang: 'Polish', sample: 'Pchnąć w tę łódź jeża lub ośm skrzyń fig.'},
- {lang: 'Portuguese', sample: 'Luís argüia à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português.'},
- {lang: 'Romanian', sample: 'Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila.'},
- {lang: 'Russian', sample: 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.'},
- {lang: 'Serbian', sample: 'Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу.'},
- {lang: 'Spanish', sample: 'Benjamín pidió una bebida de kiwi y fresa; Noé, sin vergüenza, la más exquisita champaña del menú.'},
- {lang: 'Turkish', sample: 'Pijamalı hasta yağız şoföre çabucak güvendi.'},
- {lang: 'Ukrainian', sample: 'Чуєш їх, доцю, га? Кумедна ж ти, прощайся без ґольфів!'}
-]
-
-default set font.name.uniqueSubFamily "\(para.family) \(para.style) \(para.version) (\(para.codename))" - hooky set font.name.uniqueSubFamily "\(para.family) \(para.style) \(para.version) (\(para.codename))" -zshaped set font.name.uniqueSubFamily "\(para.family) \(para.style) \(para.version) (\(para.codename))" -
-float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -float Fox.quick(h){ is_brown && it_jumps_over(doges.lazy); } -
Feature Tag | Designed For |
---|---|
calt | Default setting in text editors |
<---------------- ----------------> <===============> a:b a::b a:::b := :- :+ | |
XJS0, XPHP | JavaScript, PHP |
<---------------- ----------------> <===============> a:b a::b a:::b := :- :+ | |
XML0, XFS0, XFST | ML, OCaml, F#, F* |
<---------------- ----------------> <===============> a:b a::b a:::b a\/b a/\b := :- :+ | |
SWFT, XPTL | Swift, PatEL |
-<< -< -<- <-- <--- <<- <- -> ->> --> ---> ->- >- >>- <-> <--> <---> <----> <!-- =<< =< =<= <== <=== <<= <= => =>> ==> ===> =>= >= >>= <=> <==> <===> <====> <!--- <---------------- ----------------> <===============> a:b a::b a:::b := :- :+ | |
XHS0, XIDR, XELM, PURS | Haskell, Idris, Elm, PureScript |
-<< -< -<- <-- <--- <<- <- -> ->> --> ---> ->- >- >>- <-> <--> <---> <----> <!-- =<< =< =<= <== <=== <<= <= => =>> ==> ===> =>= >= >>= <=> <==> <===> <====> <!--- <---------------- ----------------> <===============> a:b a::b a:::b a\/b a/\b := :- :+ | |
XV00 | Coq |
-<< -< -<- <-- <--- <<- <- -> ->> --> ---> ->- >- >>- <-> <--> <---> <----> <!-- =<< =< =<= <== <=== <<= <= => =>> ==> ===> =>= >= >>= <=> <==> <===> <====> <!--- <---------------- ----------------> <===============> a:b a::b a:::b a\/b a/\b := :- :+ |
const languages = [
+ {lang: 'English', sample: 'Shaw, those twelve beige hooks are joined if I patch a young, gooey mouth.'},
+ {lang: 'IPA', sample: '[ɢʷɯʔ.nas.doːŋ.kʰlja] [ŋan.ȵʑi̯wo.ɕi̯uĕn.ɣwa]'},
+ {lang: 'Bulgarian', sample: 'Я, пазачът Вальо уж бди, а скришом хапва кюфтенца зад щайгите.'},
+ {lang: 'Czech', sample: 'Nechť již hříšné saxofony ďáblů rozezvučí síň úděsnými tóny waltzu, tanga a quickstepu.'},
+ {lang: 'Finnish', sample: 'Charles Darwin jammaili Åken hevixylofonilla Qatarin yöpub Zeligissä.'},
+ {lang: 'French', sample: 'Voix ambiguë d’un cœur qui au zéphyr préfère les jattes de kiwi.'},
+ {lang: 'German', sample: 'Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.'},
+ {lang: 'Greek', sample: 'Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός.'},
+ {lang: 'Ancient Greek', sample: 'Ἄδμηθ’, ὁρᾷς γὰρ τἀμὰ πράγμαθ’ ὡς ἔχει, λέξαι θέλω σοι πρὶν θανεῖν ἃ βούλομαι. '},
+ {lang: 'Hungarian', sample: 'Jó foxim és don Quijote húszwattos lámpánál ülve egy pár bűvös cipőt készít.'},
+ {lang: 'Icelandic', sample: 'Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa.'},
+ {lang: 'Irish', sample: 'Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig.'},
+ {lang: 'Latvian', sample: 'Muļķa hipiji mēģina brīvi nogaršot celofāna žņaudzējčūsku.'},
+ {lang: 'Lithuanian', sample: 'Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą.'},
+ {lang: 'Macedonian', sample: 'Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех.'},
+ {lang: 'Norwegian', sample: 'Jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz'},
+ {lang: 'Polish', sample: 'Pchnąć w tę łódź jeża lub ośm skrzyń fig.'},
+ {lang: 'Portuguese', sample: 'Luís argüia à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português.'},
+ {lang: 'Romanian', sample: 'Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila.'},
+ {lang: 'Russian', sample: 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.'},
+ {lang: 'Serbian', sample: 'Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу.'},
+ {lang: 'Spanish', sample: 'Benjamín pidió una bebida de kiwi y fresa; Noé, sin vergüenza, la más exquisita champaña del menú.'},
+ {lang: 'Turkish', sample: 'Pijamalı hasta yağız şoföre çabucak güvendi.'},
+ {lang: 'Ukrainian', sample: 'Чуєш їх, доцю, га? Кумедна ж ти, прощайся без ґольфів!'}
+]
+
Feature Tag | Description |
---|---|
<%= group.tagName || group.tag %><%= group.switch ? ' ' + group.switch : ''%> | +<%= group.desc %> | +
>
+ <%_ for(const line of ligation.samples) { _%>
+ <%_ for(let i = 0; i < line.length; i++) { _%> + <%_ const item = line[i]; _%> + <%_ if(i > 0) { _%><%= " " %><%_ } _%> + <%_ if (tagSet.has(item.ltag)) { _%><%= item.s %><%_ _%> + <%_ } else { _%>+ <%_ } _%> + |
+
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka", DARK) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka", LIGHT) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka Slab", DARK) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
SAMPLE_CODE(TestMyTypefaceCodeSnippet, "Iosevka Slab", LIGHT) { // The quick brown fox jumps over the lazy dog.
+ const wchar_t* code = L"(<#part>\\d+)(<#capture>(<section>(<&part>)))((<&capture>).){3}(<&capture>)";
+ RegexNode node = (rCapture(L"section", r_d().Some()) + rC(L'.')).Loop(3, 3) + rCapture(L"section", r_d().Some());
+ ThePatternsMustBeSame(code, node); // Clarity : [i l I 1] [0 O 8] 1234567890. {}[]()<>$*-+=/#_%^@\&|~?'"`!,.;:
+}
+<%_ for(const weight of weights) { _%>
+float Fox.quick(h){ is_brown && it_jumps_over(dogs.lazy); }
+<%_ } _%>
+