diff --git a/.gitignore b/.gitignore index 478a9385..bceed29a 100755 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,10 @@ Thumbs.db ###################### node_modules +# Python # +###################### +.venv + # Full font files for analysis only # ##################################### fonts/resources/monolisa/monolisa.ttf diff --git a/Makefile b/Makefile index 4a8082da..7d842523 100644 --- a/Makefile +++ b/Makefile @@ -2,19 +2,21 @@ default: install lint test fonts/stylesheets/stylesheet.css install: npm install + cd tools && python3 -m venv .venv + cd tools && .venv/bin/python -m pip --require-virtualenv install -r requirements.txt lint: npx eslint *.js modules/*.js test: npx jsonschema validate fonts-schema.json fonts.json - node validate.js + cd tools && .venv/bin/python validate.py fonts/stylesheets/stylesheet.css: fonts/stylesheets/fonts.less npx lessc $^ $@ list: - python3 listing.py + cd tools && .venv/bin/python listing.py serve: open "http://localhost:8000" diff --git a/README.md b/README.md index 5bfb0417..963256e6 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Please feel free to make a little donation via to keep this labour of love runni - Which adheres to [a schema](https://github.com/braver/programmingfonts/blob/gh-pages/fonts-schema.json). - Font files are stored in [fonts/resources](https://github.com/braver/programmingfonts/tree/gh-pages/fonts/resources). - We store only 4 variants (if available), in `.woff2` format: regular, italic, bold, bold+italic. - - If you don't have a `.woff2` you can use `convert.py` to create them off the ttf/otf file. + - If you don't have a `.woff2` you can use `tools/convert.py` to create them off the ttf/otf file. - All font files (and directories) are normalized to lowercase, without `-mono` unless it's really part of the name. - Each font lives in a directory named after its alias, and the variant files within follow a consistent naming scheme based on that alias: - regular: no suffix, e.g. `iosevka/iosevka.woff2` @@ -34,8 +34,8 @@ Please feel free to make a little donation via to keep this labour of love runni - Running `make` installs dependencies, lints, validates `fonts.json` (against [fonts-schema.json](https://github.com/braver/programmingfonts/blob/gh-pages/fonts-schema.json) and `validate.js`), and builds the stylesheet. - The stylesheet [stylesheet.css](https://github.com/braver/programmingfonts/blob/gh-pages/fonts/stylesheets/stylesheet.css) is generated from `fonts.less` via `npx lessc` — don't edit it by hand; edit `fonts.less` and rebuild. - Run `make serve` to preview the site locally (`python3 -m http.server`). -- Run `make list` (or `python3 listing.py`) to print an updated list of all the fonts, be sure to update this README with your addition. -- Run `python3 info.py --name yourfont` to add glyph, character and language counts. +- Run `make list` to print an updated list of all the fonts, be sure to update this README with your addition. +- Run `python3 tools/info.py --name yourfont` to add glyph, character and language counts. ## Limitations of this project @@ -109,12 +109,6 @@ Some bitmap fonts are only available in (Windows) FON files. Sometimes conversio For "the world's biggest collection of classic text mode fonts, system fonts and BIOS fonts from DOS-era IBM PCs and compatibles", please have a look here: https://int10h.org/oldschool-pc-fonts/. -### Mixed fonts - -These fonts combine different fonts, that are mostly already featured on this website, to create a complete set of characters for both latin script, and CJK: -- Ricty Diminished: https://github.com/edihbrandon/RictyDiminished (combines Inconsolata for Latin script with M+ for others) -- Sarasa-Gothic: https://github.com/be5invis/Sarasa-Gothic A CJK programming font based on Iosevka and Source Han Sans. - The PICO-8 project combines and tweaks several fonts for PICO-8 programming: https://github.com/juanitogan/p8-programming-fonts ## All the fonts @@ -145,7 +139,8 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [CamingoCode](http://www.janfromm.de/typefaces/camingomono/camingocode) _CC BY-ND 3.0_ ([view](https://www.programmingfonts.org/#camingocode)) - [Cartograph](https://connary.com/cartograph.html) _commercial_ ([view](https://www.programmingfonts.org/#cartograph)) - [Cascadia Code](https://github.com/microsoft/cascadia-code) _SIL OFL_ ([view](https://www.programmingfonts.org/#cascadia-code)) -- [Chivo Mono](https://www.omnibus-type.com/variable-fonts/#chivo-mono) _SIL OFL_ ([view](https://www.programmingfonts.org/#chivo)) +- [Chivo Mono](https://www.omnibus-type.com/fonts/chivo/) _SIL OFL_ ([view](https://www.programmingfonts.org/#chivo)) +- [Cilantro Code Mono](https://github.com/DraftingDreamer/FontCilantroCode) _SIL OFL_ ([view](https://www.programmingfonts.org/#cilantro-code-mono)) - [Computer Modern Unicode Typewriter](https://cm-unicode.sourceforge.io) _SIL OFL_ ([view](https://www.programmingfonts.org/#cm-unicode)) - [Code New Roman](https://fontlibrary.org/en/font/code-new-roman) _SIL OFL_ ([view](https://www.programmingfonts.org/#code-new-roman)) - [Comic Mono](https://dtinth.github.io/comic-mono-font/) _MIT_ ([view](https://www.programmingfonts.org/#comic-mono)) @@ -153,7 +148,11 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [Commit Mono](https://commitmono.com) _SIL OFL_ ([view](https://www.programmingfonts.org/#commit-mono)) - [Consola Mono](http://openfontlibrary.org/en/font/consolamono) _SIL OFL_ ([view](https://www.programmingfonts.org/#consolamono)) - [IBM Courier](https://github.com/dse/font-og-courier) _permissive_ ([view](https://www.programmingfonts.org/#courier-ibm)) +- [IBM Courier (dot)](https://github.com/dse/font-og-courier) _permissive_ ([view](https://www.programmingfonts.org/#courier-ibm-dotted)) +- [IBM Courier (slash)](https://github.com/dse/font-og-courier) _permissive_ ([view](https://www.programmingfonts.org/#courier-ibm-slashed)) - [Courier Prime](https://quoteunquoteapps.com/courierprime) _SIL OFL_ ([view](https://www.programmingfonts.org/#courier-prime)) +- [Courier Prime Code](https://quoteunquoteapps.com/courierprime) _SIL OFL_ ([view](https://www.programmingfonts.org/#courier-prime-code)) +- [Courier Prime Sans](https://quoteunquoteapps.com/courierprime) _SIL OFL_ ([view](https://www.programmingfonts.org/#courier-prime-sans)) - [Cousine](http://www.fontsquirrel.com/fonts/cousine) _Apache_ ([view](https://www.programmingfonts.org/#cousine)) - [Cozette](https://github.com/slavfox/Cozette) _MIT_ ([view](https://www.programmingfonts.org/#cozette)) - [Cutive Mono](https://fonts.google.com/specimen/Cutive+Mono) _SIL OFL_ ([view](https://www.programmingfonts.org/#cutive)) @@ -171,9 +170,13 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [Eirian](https://ggbot.itch.io/eirian-font) _SIL OFL_ ([view](https://www.programmingfonts.org/#eirian)) - [Ellograph CF](https://connary.com/ellograph.html) _commercial_ ([view](https://www.programmingfonts.org/#ellograph)) - [Envy Code B](https://damieng.com/blog/2006/11/06/envy-code-b-font-available-in-ttf-format/) _none_ ([view](https://www.programmingfonts.org/#envy-code-b)) -- [Envy Code R](https://damieng.com/blog/2008/05/26/envy-code-r-preview-7-coding-font-released) _SIL OFL_ ([view](https://www.programmingfonts.org/#envy-code-r)) +- [Envy Code R](https://damieng.com/blog/2008/envy-code-r-preview-7-coding-font-released/) _SIL OFL_ ([view](https://www.programmingfonts.org/#envy-code-r)) - [Fairfax](http://www.kreativekorp.com/software/fonts/fairfax.shtml) _SIL OFL_ ([view](https://www.programmingfonts.org/#fairfax)) +- [Fairfax Hax](http://www.kreativekorp.com/software/fonts/fairfax.shtml) _SIL OFL_ ([view](https://www.programmingfonts.org/#fairfax-hax)) - [Fairfax HD](http://www.kreativekorp.com/software/fonts/fairfaxhd.shtml) _SIL OFL_ ([view](https://www.programmingfonts.org/#fairfax-hd)) +- [Fairfax Hax HD](http://www.kreativekorp.com/software/fonts/fairfaxhd.shtml) _SIL OFL_ ([view](https://www.programmingfonts.org/#fairfax-hd-hax)) +- [Fairfax Serif](https://www.kreativekorp.com/software/fonts/fairfax/) _SIL OFL_ ([view](https://www.programmingfonts.org/#fairfax-serif)) +- [Fairfax Serif Hax](https://www.kreativekorp.com/software/fonts/fairfax/) _SIL OFL_ ([view](https://www.programmingfonts.org/#fairfax-serif-hax)) - [Fantasque Sans Mono](https://github.com/belluzj/fantasque-sans) _SIL OFL_ ([view](https://www.programmingfonts.org/#fantasque-sans)) - [Fifteen](http://openfontlibrary.org/en/font/fifteen) _SIL OFL_ ([view](https://www.programmingfonts.org/#fifteen)) - [Fira Mono](https://github.com/mozilla/Fira) _SIL OFL_ ([view](https://www.programmingfonts.org/#fira)) @@ -199,10 +202,18 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [IBM VGA 9x16](https://int10h.org/oldschool-pc-fonts/fontlist/font?ibm_vga_9x16) _CC BY-SA 4.0_ ([view](https://www.programmingfonts.org/#ibm-vga)) - [Inconsolata](https://levien.com/type/myfonts/inconsolata.html) _SIL OFL_ ([view](https://www.programmingfonts.org/#inconsolata)) - [Inconsolata-g](http://leonardo-m.livejournal.com/77079.html) _SIL OFL_ ([view](https://www.programmingfonts.org/#inconsolata-g)) +- [InconsolataGo](https://levien.com/type/myfonts/inconsolata.html) _SIL OFL_ ([view](https://www.programmingfonts.org/#inconsolata-go)) +- [Inconsolata OTF](https://levien.com/type/myfonts/inconsolata.html) _SIL OFL_ ([view](https://www.programmingfonts.org/#inconsolata-otf)) - [Indicate Mono](https://jonastype.com/indicate-mono) _commercial_ ([view](https://www.programmingfonts.org/#indicate)) - [Input Mono](https://input.djr.com) _commercial_ ([view](https://www.programmingfonts.org/#input)) +- [Input Mono Compressed](https://input.djr.com) _commercial_ ([view](https://www.programmingfonts.org/#input-compressed)) +- [Input Mono Condensed](https://input.djr.com) _commercial_ ([view](https://www.programmingfonts.org/#input-condensed)) +- [Input Mono Narrow](https://input.djr.com) _commercial_ ([view](https://www.programmingfonts.org/#input-narrow)) - [Intel One Mono](https://github.com/intel/intel-one-mono) _SIL OFL_ ([view](https://www.programmingfonts.org/#intel-one-mono)) - [Iosevka](http://be5invis.github.io/Iosevka/) _SIL OFL_ ([view](https://www.programmingfonts.org/#iosevka)) +- [Iosevka Extended](http://be5invis.github.io/Iosevka/) _SIL OFL_ ([view](https://www.programmingfonts.org/#iosevka-extended)) +- [Iosevka Slab](http://be5invis.github.io/Iosevka/) _SIL OFL_ ([view](https://www.programmingfonts.org/#iosevka-slab)) +- [Iosevka Slab Extended](http://be5invis.github.io/Iosevka/) _SIL OFL_ ([view](https://www.programmingfonts.org/#iosevka-slab-extended)) - [Ioskeley Mono](https://github.com/ahatem/IoskeleyMono) _SIL OFL_ ([view](https://www.programmingfonts.org/#ioskeley)) - [JetBrains Mono](https://www.jetbrains.com/lp/mono/) _SIL OFL_ ([view](https://www.programmingfonts.org/#jetbrainsmono)) - [JuliaMono](https://juliamono.netlify.app) _SIL OFL_ ([view](https://www.programmingfonts.org/#julia-mono)) @@ -239,7 +250,7 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [Nanum Gothic Coding](https://github.com/naver/nanumfont) _SIL OFL_ ([view](https://www.programmingfonts.org/#nanum-gothic-coding)) - [Nimbus Mono PS](https://www.fontsquirrel.com/fonts/nimbus-mono) _GNU GPL_ ([view](https://www.programmingfonts.org/#nimbus-mono)) - [NK57 Monospace](https://www.dafont.com/nk57-monospace.font) _public domain_ ([view](https://www.programmingfonts.org/#nk57)) -- [Nordwand Mono](https://github.com/tywr/Nordwand-Mono) _public domain_ ([view](https://www.programmingfonts.org/#nordwand-mono)) +- [Nordwand Mono](https://github.com/tywr/Nordwand-Mono) _SIL OFL_ ([view](https://www.programmingfonts.org/#nordwand-mono)) - [NotCourierSans](http://www.fontsquirrel.com/fonts/NotCourierSans) _GNU GPL_ ([view](https://www.programmingfonts.org/#notcouriersans)) - [Noto Sans Mono](https://www.google.com/get/noto/) _SIL OFL_ ([view](https://www.programmingfonts.org/#noto)) - [Nova Mono](https://fonts.google.com/specimen/Nova+Mono) _SIL OFL_ ([view](https://www.programmingfonts.org/#nova)) @@ -261,7 +272,10 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [Recursive](https://www.recursive.design) _SIL OFL_ ([view](https://www.programmingfonts.org/#recursive-mono-linear)) - [Reddit Mono](https://redditsans.s-ings.com) _SIL OFL_ ([view](https://www.programmingfonts.org/#reddit-sans)) - [Red Hat Mono](https://www.redhat.com/en/about/brand/standards/typography) _SIL OFL_ ([view](https://www.programmingfonts.org/#redhat)) +- [Ricty Diminished](https://rictyfonts.github.io/diminished) _SIL OFL_ ([view](https://www.programmingfonts.org/#ricty-diminished)) - [Roboto Mono](https://fonts.google.com/specimen/Roboto+Mono) _Apache_ ([view](https://www.programmingfonts.org/#roboto)) +- [Sarasa Mono](https://github.com/be5invis/Sarasa-Gothic) _SIL OFL_ ([view](https://www.programmingfonts.org/#sarasa-mono)) +- [Sarasa Mono Slab](https://github.com/be5invis/Sarasa-Gothic) _SIL OFL_ ([view](https://www.programmingfonts.org/#sarasa-mono-slab)) - [saxMono](http://www.fontsquirrel.com/fonts/saxMono) _freeware_ ([view](https://www.programmingfonts.org/#sax)) - [Scientifica](https://github.com/nerdypepper/scientifica) _SIL OFL_ ([view](https://www.programmingfonts.org/#scientifica)) - [Sergamon](https://sgmonda.com/sergamon) _SIL OFL_ ([view](https://www.programmingfonts.org/#sergamon)) @@ -272,7 +286,7 @@ The PICO-8 project combines and tweaks several fonts for PICO-8 programming: htt - [Sk-Modernist](https://seankanedesign.gumroad.com/l/sk-modernist) _commercial_ ([view](https://www.programmingfonts.org/#sk-modernist)) - [Sligoil Micro](https://velvetyne.fr/fonts/sligoil/) _SIL OFL_ ([view](https://www.programmingfonts.org/#sligoil)) - [Sometype Mono](http://monospacedfont.com/) _SIL OFL_ ([view](https://www.programmingfonts.org/#sometype-mono)) -- [Sono](https://etceteratype.co/sono) _SIL OFL_ ([view](https://www.programmingfonts.org/#sono)) +- [Sono](https://etceteratype.co/pages/sono) _SIL OFL_ ([view](https://www.programmingfonts.org/#sono)) - [Source Code Pro](https://github.com/adobe-fonts/source-code-pro) _SIL OFL_ ([view](https://www.programmingfonts.org/#source-code-pro)) - [Space Mono](https://fonts.google.com/specimen/Space+Mono) _SIL OFL_ ([view](https://www.programmingfonts.org/#space)) - [Spleen](https://www.cambus.net/spleen-monospaced-bitmap-fonts/) _BSD-2-Clause_ ([view](https://www.programmingfonts.org/#spleen)) diff --git a/fonts-schema.json b/fonts-schema.json index 125af10a..9cc981c4 100644 --- a/fonts-schema.json +++ b/fonts-schema.json @@ -18,13 +18,26 @@ { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" } ] }, - "name": { "type": "string" }, "author": { "type": "string" }, + "bitmap size": { + "type": "number" + }, + "bitmap height": { + "type": "number" + }, + "characters": { "type": "integer" }, "description": { "type": "string" }, - "year": { "type": "integer" }, - "website": { + "glyphs": { "type": "integer" }, + "group": { "type": "string", - "format": "uri" + "pattern": "^[a-z][a-z0-9-]+$" + }, + "huge": { "type": "boolean" }, + "languages": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+$": { "type": "integer" } + } }, "license": { "type": "string", @@ -50,27 +63,14 @@ ] }, "ligatures": { "type": "boolean" }, - "style": { - "type": "string", - "enum": ["serif", "sans"] - }, + "name": { "type": "string" }, "rendering": { "type": "string", "enum": ["bitmap", "vector"] }, - "bitmap size": { - "type": "number" - }, - "bitmap height": { - "type": "number" - }, - "zerostyle": { - "type": "string", - "enum": ["empty", "slashed", "dotted"] - }, - "group": { + "style": { "type": "string", - "pattern": "^[a-z][a-z0-9-]+$" + "enum": ["serif", "sans"] }, "variants": { "oneOf": [ @@ -87,13 +87,14 @@ } ] }, - "glyphs": { "type": "integer" }, - "characters": { "type": "integer" }, - "languages": { - "type": "object", - "patternProperties": { - "^[a-zA-Z]+$": { "type": "integer" } - } + "website": { + "type": "string", + "format": "uri" + }, + "year": { "type": "integer" }, + "zerostyle": { + "type": "string", + "enum": ["empty", "slashed", "dotted"] } }, "additionalProperties": false, @@ -101,6 +102,7 @@ "added", "author", "description", + "glyphs", "license", "ligatures", "name", @@ -108,8 +110,7 @@ "style", "variants", "website", - "year", - "glyphs" + "year" ] } } diff --git a/fonts.json b/fonts.json index f6f8b4b9..e9456bf5 100644 --- a/fonts.json +++ b/fonts.json @@ -20,10 +20,10 @@ "glyphs": 8818, "characters": 7559, "languages": { - "Latin": 502, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 } }, "agave": { @@ -44,7 +44,7 @@ "glyphs": 1958, "characters": 1949, "languages": { - "Latin": 502, + "Latin": 509, "Cyrillic": 91, "Greek": 2 } @@ -85,7 +85,7 @@ "glyphs": 766, "characters": 728, "languages": { - "Latin": 365 + "Latin": 370 } }, "anonymous-pro": { @@ -110,7 +110,7 @@ "characters": 623, "languages": { "Latin": 289, - "Cyrillic": 12, + "Cyrillic": 13, "Greek": 1 } }, @@ -158,6 +158,7 @@ "added": "2026-01-21", "author": "Protesilaos Stavrou", "description": "A customised build of the Iosevka that optimises for inter-glyph and inter-style consistency within the overarching constraint of usability at small point sizes.", + "group": "aporetic-sans", "license": "SIL OFL", "ligatures": false, "name": "Aporetic Sans Mono", @@ -175,16 +176,18 @@ "glyphs": 33898, "characters": 7466, "languages": { - "Latin": 502, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 - } + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 + }, + "huge": true }, "aporetic-serif": { "added": "2026-01-21", "author": "Protesilaos Stavrou", "description": "A customised build of the Iosevka that optimises for inter-glyph and inter-style consistency within the overarching constraint of usability at small point sizes.", + "group": "aporetic-sans", "license": "SIL OFL", "ligatures": false, "name": "Aporetic Serif Mono", @@ -202,11 +205,12 @@ "glyphs": 33901, "characters": 7466, "languages": { - "Latin": 502, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 - } + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 + }, + "huge": true }, "atkinson-hyperlegible": { "added": "2025-02-18", @@ -224,7 +228,7 @@ "glyphs": 365, "characters": 346, "languages": { - "Latin": 260 + "Latin": 261 } }, "audio-link": { @@ -287,9 +291,9 @@ "glyphs": 4177, "characters": 4160, "languages": { - "Latin": 502, + "Latin": 510, "Cyrillic": 92, - "Arabic": 33, + "Arabic": 38, "Hebrew": 5, "Greek": 2, "Armenian": 2, @@ -312,7 +316,7 @@ "glyphs": 645, "characters": 433, "languages": { - "Latin": 294 + "Latin": 296 } }, "b612-mono": { @@ -441,8 +445,8 @@ "glyphs": 907, "characters": 871, "languages": { - "Latin": 309, - "Cyrillic": 75, + "Latin": 310, + "Cyrillic": 78, "Greek": 1 } }, @@ -488,10 +492,10 @@ "glyphs": 3296, "characters": 3244, "languages": { - "Latin": 510, - "Cyrillic": 72, - "Armenian": 2, - "Greek": 1 + "Latin": 524, + "Cyrillic": 80, + "Greek": 2, + "Armenian": 2 } }, "bront-ubuntu": { @@ -578,10 +582,10 @@ "glyphs": 3199, "characters": 1860, "languages": { - "Latin": 418, - "Cyrillic": 49, + "Latin": 421, + "Cyrillic": 50, "Arabic": 40, - "Greek": 1 + "Greek": 2 } }, "chivo": { @@ -600,13 +604,13 @@ "glyphs": 873, "characters": 642, "languages": { - "Latin": 351 + "Latin": 354 } }, "cilantro-code-mono": { "added": "2026-08-09", "author": "DraftingDreamer", - "description": "A Traditional Chinese (Taiwan) monospace coding font with exact 2:1 duospace metrics: 2 Latin characters occupy 1 Han character cell. Han glyphs from Iansui, Latin from Red Hat Mono.", + "description": "A Traditional Chinese (Taiwan) monospace coding font where 2 Latin characters (from Red Hat Mono) fit 1 Han character (from Iansui).", "license": "SIL OFL", "ligatures": false, "name": "Cilantro Code Mono", @@ -622,9 +626,11 @@ "glyphs": 15618, "characters": 12762, "languages": { - "Latin": 325, - "Cyrillic": 7 - } + "Latin": 329, + "Cyrillic": 8, + "Greek": 1 + }, + "huge": true }, "cm-unicode": { "added": "2024-01-07", @@ -650,9 +656,9 @@ "glyphs": 1868, "characters": 1832, "languages": { - "Latin": 387, - "Cyrillic": 63, - "Greek": 1 + "Latin": 390, + "Cyrillic": 64, + "Greek": 2 } }, "code-new-roman": { @@ -673,9 +679,9 @@ "glyphs": 2740, "characters": 2220, "languages": { - "Latin": 510, - "Cyrillic": 78, - "Greek": 1 + "Latin": 521, + "Cyrillic": 88, + "Greek": 2 } }, "comic-mono": { @@ -759,7 +765,7 @@ "glyphs": 1465, "characters": 1462, "languages": { - "Latin": 470, + "Latin": 476, "Cyrillic": 90, "Greek": 2 } @@ -933,10 +939,10 @@ "glyphs": 2385, "characters": 2274, "languages": { - "Latin": 498, - "Cyrillic": 81, + "Latin": 530, + "Cyrillic": 91, "Hebrew": 5, - "Greek": 1 + "Greek": 2 } }, "cozette": { @@ -1002,11 +1008,12 @@ "glyphs": 26188, "characters": 19966, "languages": { - "Latin": 304, - "Cyrillic": 70, - "Hangul": 1, - "Greek": 1 - } + "Latin": 308, + "Cyrillic": 78, + "Greek": 2, + "Hangul": 1 + }, + "huge": true }, "daddytimemono": { "added": "2019-01-22", @@ -1047,10 +1054,10 @@ "glyphs": 3377, "characters": 3322, "languages": { - "Latin": 513, - "Cyrillic": 72, - "Armenian": 2, - "Greek": 1 + "Latin": 527, + "Cyrillic": 80, + "Greek": 3, + "Armenian": 2 } }, "dejavu-markup": { @@ -1074,10 +1081,10 @@ "glyphs": 3369, "characters": 3314, "languages": { - "Latin": 513, - "Cyrillic": 72, - "Armenian": 2, - "Greek": 1 + "Latin": 527, + "Cyrillic": 80, + "Greek": 2, + "Armenian": 2 } }, "departure-mono": { @@ -1098,7 +1105,7 @@ "glyphs": 775, "characters": 682, "languages": { - "Latin": 443 + "Latin": 455 } }, "dm-mono": { @@ -1117,7 +1124,7 @@ "glyphs": 411, "characters": 381, "languages": { - "Latin": 287 + "Latin": 288 } }, "dpsdbeyond": { @@ -1158,7 +1165,7 @@ "glyphs": 597, "characters": 470, "languages": { - "Latin": 300 + "Latin": 302 } }, "droid-sans": { @@ -1249,7 +1256,7 @@ "glyphs": 613, "characters": 613, "languages": { - "Latin": 445 + "Latin": 459 } }, "ellograph": { @@ -1338,7 +1345,7 @@ "glyphs": 26946, "characters": 25827, "languages": { - "Latin": 527, + "Latin": 536, "Cyrillic": 93, "Hebrew": 5, "Greek": 3, @@ -1370,7 +1377,7 @@ "glyphs": 26946, "characters": 25827, "languages": { - "Latin": 527, + "Latin": 536, "Cyrillic": 93, "Hebrew": 5, "Greek": 3, @@ -1399,7 +1406,7 @@ "glyphs": 26633, "characters": 25516, "languages": { - "Latin": 527, + "Latin": 536, "Cyrillic": 93, "Hebrew": 5, "Greek": 3, @@ -1427,7 +1434,7 @@ "glyphs": 26633, "characters": 25516, "languages": { - "Latin": 527, + "Latin": 536, "Cyrillic": 93, "Hebrew": 5, "Greek": 3, @@ -1456,7 +1463,7 @@ "glyphs": 26946, "characters": 25827, "languages": { - "Latin": 527, + "Latin": 536, "Cyrillic": 93, "Hebrew": 5, "Greek": 3, @@ -1486,7 +1493,7 @@ "glyphs": 26946, "characters": 25827, "languages": { - "Latin": 527, + "Latin": 536, "Cyrillic": 93, "Hebrew": 5, "Greek": 3, @@ -1517,9 +1524,9 @@ "glyphs": 1046, "characters": 1042, "languages": { - "Latin": 301, - "Cyrillic": 77, - "Greek": 1 + "Latin": 304, + "Cyrillic": 87, + "Greek": 2 } }, "fifteen": { @@ -1565,9 +1572,9 @@ "glyphs": 1485, "characters": 1350, "languages": { - "Latin": 301, - "Cyrillic": 83, - "Greek": 1 + "Latin": 302, + "Cyrillic": 91, + "Greek": 2 } }, "firacode": { @@ -1593,9 +1600,9 @@ "glyphs": 2030, "characters": 1586, "languages": { - "Latin": 301, - "Cyrillic": 90, - "Greek": 1 + "Latin": 302, + "Cyrillic": 91, + "Greek": 2 } }, "fixedsys": { @@ -1641,8 +1648,8 @@ "glyphs": 6012, "characters": 5997, "languages": { - "Latin": 484, - "Cyrillic": 52, + "Latin": 498, + "Cyrillic": 54, "Armenian": 2, "Geʽez": 4, "Arabic": 4, @@ -1695,7 +1702,7 @@ "glyphs": 707, "characters": 487, "languages": { - "Latin": 283 + "Latin": 285 } }, "generic": { @@ -1735,8 +1742,8 @@ "glyphs": 833, "characters": 652, "languages": { - "Latin": 323, - "Cyrillic": 45 + "Latin": 325, + "Cyrillic": 48 } }, "gintronic": { @@ -1768,7 +1775,7 @@ "glyphs": 1001, "characters": 917, "languages": { - "Latin": 308 + "Latin": 310 } }, "gnu-freefont": { @@ -1792,13 +1799,13 @@ "glyphs": 4177, "characters": 4160, "languages": { - "Latin": 485, - "Cyrillic": 82, - "Arabic": 30, + "Latin": 510, + "Cyrillic": 92, + "Arabic": 38, + "Hebrew": 5, + "Greek": 2, "Armenian": 2, - "Hebrew": 2, - "Kayah Li": 2, - "Greek": 1 + "Kayah Li": 2 } }, "go-mono": { @@ -1887,7 +1894,7 @@ "glyphs": 687, "characters": 670, "languages": { - "Latin": 329 + "Latin": 332 } }, "hack": { @@ -1941,7 +1948,7 @@ "characters": 1548, "languages": { "Latin": 306, - "Cyrillic": 70, + "Cyrillic": 73, "Armenian": 2, "Greek": 1 } @@ -1962,9 +1969,9 @@ "glyphs": 1629, "characters": 1373, "languages": { - "Latin": 353, - "Cyrillic": 52, - "Greek": 1 + "Latin": 356, + "Cyrillic": 55, + "Greek": 2 } }, "hermit": { @@ -1983,7 +1990,7 @@ "glyphs": 393, "characters": 390, "languages": { - "Latin": 278 + "Latin": 279 } }, "heterodox-mono": { @@ -2024,8 +2031,8 @@ "glyphs": 850, "characters": 746, "languages": { - "Latin": 327, - "Cyrillic": 63 + "Latin": 328, + "Cyrillic": 68 } }, "ibm-vga": { @@ -2069,7 +2076,7 @@ "glyphs": 964, "characters": 882, "languages": { - "Latin": 339 + "Latin": 341 } }, "inconsolata-g": { @@ -2156,7 +2163,7 @@ "glyphs": 304, "characters": 300, "languages": { - "Latin": 275 + "Latin": 277 } }, "input": { @@ -2272,7 +2279,7 @@ "glyphs": 684, "characters": 622, "languages": { - "Latin": 342 + "Latin": 346 } }, "iosevka": { @@ -2292,11 +2299,12 @@ "glyphs": 46818, "characters": 7571, "languages": { - "Latin": 505, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 - } + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 + }, + "huge": true }, "iosevka-extended": { "added": "2026-06-12", @@ -2315,11 +2323,12 @@ "glyphs": 46821, "characters": 7571, "languages": { - "Latin": 505, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 - } + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 + }, + "huge": true }, "iosevka-slab": { "added": "2026-06-12", @@ -2338,11 +2347,12 @@ "glyphs": 46821, "characters": 7571, "languages": { - "Latin": 505, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 - } + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 + }, + "huge": true }, "iosevka-slab-extended": { "added": "2026-06-12", @@ -2361,11 +2371,12 @@ "glyphs": 46822, "characters": 7571, "languages": { - "Latin": 505, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 - } + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 + }, + "huge": true }, "ioskeley": { "added": "2025-09-20", @@ -2396,10 +2407,10 @@ "glyphs": 11552, "characters": 7515, "languages": { - "Latin": 502, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 } }, "jetbrainsmono": { @@ -2427,9 +2438,9 @@ "glyphs": 1743, "characters": 1363, "languages": { - "Latin": 326, - "Cyrillic": 23, - "Greek": 1 + "Latin": 331, + "Cyrillic": 25, + "Greek": 2 } }, "julia-mono": { @@ -2441,27 +2452,25 @@ "name": "JuliaMono", "rendering": "vector", "style": "sans", - "variants": [ - "black", - "bold", - "extrabold", - "light", - "medium", - "regular" - ], + "variants": "7 weights, all with italics.", "website": "https://juliamono.netlify.app", "year": 2020, "zerostyle": "dotted", - "glyphs": 9216, - "characters": 8585, + "glyphs": 12337, + "characters": 11191, "languages": { - "Latin": 504, - "Cyrillic": 86, + "Latin": 536, + "Georgian": 4, + "Cyrillic": 93, + "Arabic": 32, "Cree": 1, + "Hebrew": 5, + "Greek": 3, + "Armenian": 2, "Ojibwe Syllabics": 1, - "Inuktitut Syllabics": 1, - "Greek": 1 - } + "Inuktitut Syllabics": 1 + }, + "huge": true }, "latin-modern": { "added": "bc", @@ -2550,10 +2559,10 @@ "glyphs": 2392, "characters": 2274, "languages": { - "Latin": 498, - "Cyrillic": 81, + "Latin": 530, + "Cyrillic": 91, "Hebrew": 5, - "Greek": 1 + "Greek": 2 } }, "lilex": { @@ -2572,9 +2581,9 @@ "glyphs": 1434, "characters": 1073, "languages": { - "Latin": 330, - "Cyrillic": 64, - "Greek": 1 + "Latin": 333, + "Cyrillic": 70, + "Greek": 2 } }, "lotion": { @@ -2663,10 +2672,10 @@ "glyphs": 12156, "characters": 7561, "languages": { - "Latin": 502, - "Cyrillic": 83, - "Armenian": 2, - "Greek": 1 + "Latin": 536, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2 } }, "maple": { @@ -2722,7 +2731,7 @@ "glyphs": 557, "characters": 503, "languages": { - "Latin": 329, + "Latin": 331, "Cyrillic": 11 } }, @@ -2742,7 +2751,7 @@ "glyphs": 742, "characters": 703, "languages": { - "Latin": 413 + "Latin": 418 } }, "mensch": { @@ -2763,7 +2772,7 @@ "glyphs": 2708, "characters": 2684, "languages": { - "Latin": 513, + "Latin": 515, "Cyrillic": 76, "Greek": 2 } @@ -2789,7 +2798,7 @@ "glyphs": 2708, "characters": 2684, "languages": { - "Latin": 513, + "Latin": 515, "Cyrillic": 76, "Greek": 2 } @@ -2833,9 +2842,9 @@ "glyphs": 3570, "characters": 2460, "languages": { - "Latin": 336, - "Cyrillic": 27, - "Greek": 1 + "Latin": 338, + "Cyrillic": 28, + "Greek": 2 } }, "monaspace-krypton": { @@ -2854,9 +2863,9 @@ "glyphs": 3490, "characters": 2459, "languages": { - "Latin": 336, - "Cyrillic": 27, - "Greek": 1 + "Latin": 338, + "Cyrillic": 28, + "Greek": 2 } }, "monaspace-neon": { @@ -2875,9 +2884,9 @@ "glyphs": 3606, "characters": 2460, "languages": { - "Latin": 336, - "Cyrillic": 27, - "Greek": 1 + "Latin": 338, + "Cyrillic": 28, + "Greek": 2 } }, "monaspace-radon": { @@ -2896,9 +2905,9 @@ "glyphs": 3552, "characters": 2460, "languages": { - "Latin": 336, - "Cyrillic": 27, - "Greek": 1 + "Latin": 338, + "Cyrillic": 28, + "Greek": 2 } }, "monaspace-xenon": { @@ -2917,9 +2926,9 @@ "glyphs": 3818, "characters": 2460, "languages": { - "Latin": 336, - "Cyrillic": 27, - "Greek": 1 + "Latin": 338, + "Cyrillic": 28, + "Greek": 2 } }, "mona-sans-mono": { @@ -2938,7 +2947,7 @@ "glyphs": 768, "characters": 547, "languages": { - "Latin": 310 + "Latin": 311 } }, "monocraft": { @@ -3012,9 +3021,9 @@ "glyphs": 1122, "characters": 1077, "languages": { - "Latin": 297, - "Cyrillic": 16, - "Greek": 1 + "Latin": 300, + "Cyrillic": 17, + "Greek": 2 } }, "monofur": { @@ -3036,7 +3045,7 @@ "characters": 660, "languages": { "Latin": 282, - "Cyrillic": 12, + "Cyrillic": 13, "Greek": 1 } }, @@ -3056,9 +3065,9 @@ "glyphs": 780, "characters": 616, "languages": { - "Latin": 311, - "Cyrillic": 15, - "Greek": 1 + "Latin": 315, + "Cyrillic": 17, + "Greek": 2 } }, "monolisa": { @@ -3077,9 +3086,9 @@ "glyphs": 1651, "characters": 1330, "languages": { - "Latin": 470, - "Cyrillic": 86, - "Greek": 1 + "Latin": 488, + "Cyrillic": 88, + "Greek": 2 } }, "mononoki": { @@ -3143,7 +3152,7 @@ "glyphs": 6747, "characters": 6463, "languages": { - "Latin": 327 + "Latin": 330 } }, "nanum-gothic-coding": { @@ -3275,9 +3284,9 @@ "glyphs": 3787, "characters": 3367, "languages": { - "Latin": 524, - "Cyrillic": 92, - "Greek": 2 + "Latin": 536, + "Cyrillic": 93, + "Greek": 3 } }, "nova": { @@ -3318,7 +3327,7 @@ "glyphs": 496, "characters": 433, "languages": { - "Latin": 286 + "Latin": 287 } }, "old-timey": { @@ -3341,9 +3350,9 @@ "glyphs": 2233, "characters": 2031, "languages": { - "Latin": 343, - "Cyrillic": 22, - "Greek": 1 + "Latin": 351, + "Cyrillic": 24, + "Greek": 3 } }, "opendyslexic": { @@ -3451,7 +3460,7 @@ "glyphs": 562, "characters": 484, "languages": { - "Latin": 310 + "Latin": 311 } }, "plex-mono": { @@ -3598,9 +3607,9 @@ "glyphs": 1418, "characters": 1075, "languages": { - "Latin": 330, - "Cyrillic": 65, - "Greek": 1 + "Latin": 333, + "Cyrillic": 70, + "Greek": 2 } }, "pt": { @@ -3623,7 +3632,7 @@ "characters": 788, "languages": { "Latin": 271, - "Cyrillic": 75 + "Cyrillic": 78 } }, "quinze": { @@ -3663,7 +3672,7 @@ "glyphs": 1256, "characters": 723, "languages": { - "Latin": 342 + "Latin": 345 } }, "reddit-sans": { @@ -3685,7 +3694,7 @@ "glyphs": 1080, "characters": 724, "languages": { - "Latin": 339 + "Latin": 342 } }, "redhat": { @@ -3707,6 +3716,35 @@ "Latin": 296 } }, + "ricty-diminished": { + "added": "2026-08-25", + "author": "Yasunori Yusa", + "description": "は Linux 環境での研究・開発を想定したプログラミング用フォントです. It combines Inconsolata and Circle M+ 1m", + "license": "SIL OFL", + "ligatures": false, + "name": "Ricty Diminished", + "rendering": "vector", + "style": "sans", + "variants": [ + "bold", + "bold-italic", + "italic", + "regular" + ], + "website": "https://rictyfonts.github.io/diminished", + "year": 2012, + "zerostyle": "slashed", + "glyphs": 7466, + "characters": 7158, + "languages": { + "Latin": 467, + "Cyrillic": 24, + "Greek": 2, + "Katakana": 3, + "Kanji": 1, + "Hiragana": 2 + } + }, "roboto": { "added": "2015-06-27", "author": "Christian Robertson", @@ -3728,6 +3766,88 @@ "Greek": 1 } }, + "sarasa-mono": { + "added": "2026-08-25", + "author": "Renzhi Li", + "description": "A CJK composite font based on Inter, Iosevka and Source Han Sans.", + "group": "sarasa-mono", + "license": "SIL OFL", + "ligatures": false, + "name": "Sarasa Mono", + "rendering": "vector", + "style": "sans", + "variants": [ + "bold", + "bold-italic", + "semi-bold", + "semi-bold-italic", + "light", + "light-italic", + "extra-light", + "extra-light-italic", + "italic", + "regular" + ], + "website": "https://github.com/be5invis/Sarasa-Gothic", + "year": 2015, + "zerostyle": "slashed", + "glyphs": 56699, + "characters": 51074, + "languages": { + "Latin": 537, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2, + "Chinese": 7, + "Katakana": 3, + "Kanji": 1, + "Hiragana": 2, + "Hangul": 1, + "Hanja": 1 + }, + "huge": true + }, + "sarasa-mono-slab": { + "added": "2026-08-25", + "author": "Renzhi Li", + "description": "A CJK composite font based on Inter, Iosevka and Source Han Sans.", + "group": "sarasa-mono", + "license": "SIL OFL", + "ligatures": false, + "name": "Sarasa Mono Slab", + "rendering": "vector", + "style": "serif", + "variants": [ + "bold", + "bold-italic", + "semi-bold", + "semi-bold-italic", + "light", + "light-italic", + "extra-light", + "extra-light-italic", + "italic", + "regular" + ], + "website": "https://github.com/be5invis/Sarasa-Gothic", + "year": 2015, + "zerostyle": "slashed", + "glyphs": 56699, + "characters": 51074, + "languages": { + "Latin": 537, + "Cyrillic": 93, + "Greek": 3, + "Armenian": 2, + "Chinese": 7, + "Katakana": 3, + "Kanji": 1, + "Hiragana": 2, + "Hangul": 1, + "Hanja": 1 + }, + "huge": true + }, "sax": { "added": "bc", "author": "Robert Norton", @@ -3792,12 +3912,13 @@ "glyphs": 4227, "characters": 4226, "languages": { - "Latin": 465, + "Latin": 467, "Cyrillic": 84, + "Arabic": 37, "Devanagari": 12, + "Hebrew": 5, "Greek": 2, "Armenian": 2, - "Hebrew": 2, "Thai": 1 } }, @@ -3912,7 +4033,7 @@ "glyphs": 529, "characters": 491, "languages": { - "Latin": 306 + "Latin": 307 } }, "sligoil": { @@ -3933,7 +4054,7 @@ "glyphs": 457, "characters": 400, "languages": { - "Latin": 285 + "Latin": 287 } }, "sometype-mono": { @@ -3959,7 +4080,7 @@ "glyphs": 567, "characters": 458, "languages": { - "Latin": 300 + "Latin": 301 } }, "sono": { @@ -3978,7 +4099,7 @@ "glyphs": 750, "characters": 576, "languages": { - "Latin": 318 + "Latin": 319 } }, "source-code-pro": { @@ -3997,9 +4118,9 @@ "glyphs": 1568, "characters": 1335, "languages": { - "Latin": 353, - "Cyrillic": 52, - "Greek": 1 + "Latin": 356, + "Cyrillic": 55, + "Greek": 2 } }, "space": { @@ -4064,9 +4185,9 @@ "glyphs": 1680, "characters": 1454, "languages": { - "Latin": 442, - "Cyrillic": 35, - "Greek": 1 + "Latin": 446, + "Cyrillic": 36, + "Greek": 2 } }, "terminus-consoleet": { @@ -4281,19 +4402,21 @@ "glyphs": 58911, "characters": 58910, "languages": { - "Latin": 502, - "Georgian": 2, - "Cyrillic": 83, + "Latin": 537, + "Georgian": 4, + "Cyrillic": 93, "Devanagari": 15, - "Bengali": 6, - "Arabic": 33, + "Bengali": 8, + "Arabic": 48, "Cree": 1, "Hebrew": 5, "Lao": 1, + "Greek": 3, "Armenian": 2, "Chinese": 7, "Geʽez": 7, "Buginese": 1, + "Syriac": 1, "Burmese": 4, "Gujarati": 2, "Sinhala": 1, @@ -4305,6 +4428,7 @@ "Tham": 1, "Modern Yi": 1, "Kayah Li": 2, + "Katakana": 3, "Tibetan": 3, "Malayalam": 1, "Vai": 1, @@ -4314,16 +4438,15 @@ "Cherokee": 1, "Kanji": 1, "Hiragana": 2, - "Katakana": 2, "Hangul": 1, "Hanja": 1, - "Greek": 1, "Tamil": 1, "Telugu": 1, "Bamum": 1, "Kannada": 1, "Hanunoo": 1 - } + }, + "huge": true }, "unifontex": { "added": "2023-09-17", @@ -4344,20 +4467,21 @@ "glyphs": 65439, "characters": 65436, "languages": { - "Latin": 512, - "Georgian": 3, - "Cyrillic": 88, + "Latin": 537, + "Georgian": 4, + "Cyrillic": 93, "Devanagari": 15, - "Bengali": 6, - "Arabic": 33, + "Bengali": 8, + "Arabic": 48, "Cree": 1, "Hebrew": 5, "Lao": 1, - "Greek": 2, + "Greek": 3, "Armenian": 2, "Chinese": 7, "Geʽez": 7, "Buginese": 1, + "Syriac": 1, "Burmese": 4, "Gujarati": 2, "Sinhala": 1, @@ -4387,7 +4511,8 @@ "Chakma": 1, "Kannada": 1, "Hanunoo": 1 - } + }, + "huge": true }, "verily": { "added": "2014-11-23", @@ -4426,9 +4551,9 @@ "glyphs": 1435, "characters": 1267, "languages": { - "Latin": 315, - "Cyrillic": 80, - "Greek": 1 + "Latin": 319, + "Cyrillic": 88, + "Greek": 2 } }, "vt323": { diff --git a/fonts/resources/julia-mono/juliamono-bolditalic.woff2 b/fonts/resources/julia-mono/julia-mono-bold-italic.woff2 similarity index 100% rename from fonts/resources/julia-mono/juliamono-bolditalic.woff2 rename to fonts/resources/julia-mono/julia-mono-bold-italic.woff2 diff --git a/fonts/resources/julia-mono/julia-mono-bold.woff2 b/fonts/resources/julia-mono/julia-mono-bold.woff2 index ef799e2b..25860433 100644 Binary files a/fonts/resources/julia-mono/julia-mono-bold.woff2 and b/fonts/resources/julia-mono/julia-mono-bold.woff2 differ diff --git a/fonts/resources/julia-mono/juliamono-italic.woff2 b/fonts/resources/julia-mono/julia-mono-italic.woff2 similarity index 100% rename from fonts/resources/julia-mono/juliamono-italic.woff2 rename to fonts/resources/julia-mono/julia-mono-italic.woff2 diff --git a/fonts/resources/julia-mono/julia-mono.woff2 b/fonts/resources/julia-mono/julia-mono.woff2 index 0401a757..3eeeeaaf 100644 Binary files a/fonts/resources/julia-mono/julia-mono.woff2 and b/fonts/resources/julia-mono/julia-mono.woff2 differ diff --git a/fonts/resources/julia-mono/juliamono-bold.woff2 b/fonts/resources/julia-mono/juliamono-bold.woff2 deleted file mode 100644 index 25860433..00000000 Binary files a/fonts/resources/julia-mono/juliamono-bold.woff2 and /dev/null differ diff --git a/fonts/resources/julia-mono/juliamono.woff2 b/fonts/resources/julia-mono/juliamono.woff2 deleted file mode 100644 index 3eeeeaaf..00000000 Binary files a/fonts/resources/julia-mono/juliamono.woff2 and /dev/null differ diff --git a/fonts/resources/ricty-diminished/ricty-diminished-bold-italic.woff2 b/fonts/resources/ricty-diminished/ricty-diminished-bold-italic.woff2 new file mode 100644 index 00000000..a817785b Binary files /dev/null and b/fonts/resources/ricty-diminished/ricty-diminished-bold-italic.woff2 differ diff --git a/fonts/resources/ricty-diminished/ricty-diminished-bold.woff2 b/fonts/resources/ricty-diminished/ricty-diminished-bold.woff2 new file mode 100644 index 00000000..5e9537ad Binary files /dev/null and b/fonts/resources/ricty-diminished/ricty-diminished-bold.woff2 differ diff --git a/fonts/resources/ricty-diminished/ricty-diminished-italic.woff2 b/fonts/resources/ricty-diminished/ricty-diminished-italic.woff2 new file mode 100644 index 00000000..95a4ce7c Binary files /dev/null and b/fonts/resources/ricty-diminished/ricty-diminished-italic.woff2 differ diff --git a/fonts/resources/ricty-diminished/ricty-diminished.woff2 b/fonts/resources/ricty-diminished/ricty-diminished.woff2 new file mode 100644 index 00000000..635b814a Binary files /dev/null and b/fonts/resources/ricty-diminished/ricty-diminished.woff2 differ diff --git a/fonts/resources/sarasa-mono-slab/LICENSE.txt b/fonts/resources/sarasa-mono-slab/LICENSE.txt new file mode 100644 index 00000000..aa33b7a8 --- /dev/null +++ b/fonts/resources/sarasa-mono-slab/LICENSE.txt @@ -0,0 +1,113 @@ +Copyright (c) 2015-2025, Renzhi Li (aka. Belleve Invis, belleve@typeof.net). +Portions Copyright (c) 2016 The Inter Project Authors. +Portions Copyright (c) 2014-2021 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. +Portions Copyright (c) 2012 Google Inc. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +-------------------------- + + +SIL Open Font License v1.1 +==================================================== + + +Preamble +---------- + +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + + +Definitions +------------- + +`"Font Software"` refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +`"Reserved Font Name"` refers to any names specified as such after the +copyright statement(s). + +`"Original Version"` refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +`"Modified Version"` refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +`"Author"` refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + + +Permission & Conditions +------------------------ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1. Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + +2. Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + +3. No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + +4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + +5. The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + + + +Termination +----------- + +This license becomes null and void if any of the above conditions are +not met. + + + DISCLAIMER + + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-bold-italic.woff2 b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-bold-italic.woff2 new file mode 100644 index 00000000..4d3694db Binary files /dev/null and b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-bold-italic.woff2 differ diff --git a/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-bold.woff2 b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-bold.woff2 new file mode 100644 index 00000000..19b47b2e Binary files /dev/null and b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-bold.woff2 differ diff --git a/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-italic.woff2 b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-italic.woff2 new file mode 100644 index 00000000..44254aa0 Binary files /dev/null and b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab-italic.woff2 differ diff --git a/fonts/resources/sarasa-mono-slab/sarasa-mono-slab.woff2 b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab.woff2 new file mode 100644 index 00000000..bdc43421 Binary files /dev/null and b/fonts/resources/sarasa-mono-slab/sarasa-mono-slab.woff2 differ diff --git a/fonts/resources/sarasa-mono/LICENSE.txt b/fonts/resources/sarasa-mono/LICENSE.txt new file mode 100644 index 00000000..aa33b7a8 --- /dev/null +++ b/fonts/resources/sarasa-mono/LICENSE.txt @@ -0,0 +1,113 @@ +Copyright (c) 2015-2025, Renzhi Li (aka. Belleve Invis, belleve@typeof.net). +Portions Copyright (c) 2016 The Inter Project Authors. +Portions Copyright (c) 2014-2021 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. +Portions Copyright (c) 2012 Google Inc. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +-------------------------- + + +SIL Open Font License v1.1 +==================================================== + + +Preamble +---------- + +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + + +Definitions +------------- + +`"Font Software"` refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +`"Reserved Font Name"` refers to any names specified as such after the +copyright statement(s). + +`"Original Version"` refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +`"Modified Version"` refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +`"Author"` refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + + +Permission & Conditions +------------------------ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1. Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + +2. Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + +3. No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + +4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + +5. The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + + + +Termination +----------- + +This license becomes null and void if any of the above conditions are +not met. + + + DISCLAIMER + + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/fonts/resources/sarasa-mono/sarasa-mono-bold-italic.woff2 b/fonts/resources/sarasa-mono/sarasa-mono-bold-italic.woff2 new file mode 100644 index 00000000..7df508d5 Binary files /dev/null and b/fonts/resources/sarasa-mono/sarasa-mono-bold-italic.woff2 differ diff --git a/fonts/resources/sarasa-mono/sarasa-mono-bold.woff2 b/fonts/resources/sarasa-mono/sarasa-mono-bold.woff2 new file mode 100644 index 00000000..c996492b Binary files /dev/null and b/fonts/resources/sarasa-mono/sarasa-mono-bold.woff2 differ diff --git a/fonts/resources/sarasa-mono/sarasa-mono-italic.woff2 b/fonts/resources/sarasa-mono/sarasa-mono-italic.woff2 new file mode 100644 index 00000000..103dc5cc Binary files /dev/null and b/fonts/resources/sarasa-mono/sarasa-mono-italic.woff2 differ diff --git a/fonts/resources/sarasa-mono/sarasa-mono.woff2 b/fonts/resources/sarasa-mono/sarasa-mono.woff2 new file mode 100644 index 00000000..6a5305cd Binary files /dev/null and b/fonts/resources/sarasa-mono/sarasa-mono.woff2 differ diff --git a/fonts/stylesheets/fonts.less b/fonts/stylesheets/fonts.less index 6dac40ed..2386ead4 100755 --- a/fonts/stylesheets/fonts.less +++ b/fonts/stylesheets/fonts.less @@ -375,8 +375,10 @@ .font( 'jetbrainsmono', bold, normal, 'jetbrainsmono/jetbrainsmono-bold.woff2'); .font( 'jetbrainsmono', bold, italic, 'jetbrainsmono/jetbrainsmono-bold-italic.woff2'); -.font( 'julia-mono', bold, normal, 'julia-mono/julia-mono-bold.woff2' ); -.font( 'julia-mono', normal, normal, 'julia-mono/julia-mono.woff2' ); +.font( 'julia-mono', normal, normal, 'julia-mono/julia-mono.woff2'); +.font( 'julia-mono', normal, italic, 'julia-mono/julia-mono-italic.woff2'); +.font( 'julia-mono', bold, normal, 'julia-mono/julia-mono-bold.woff2'); +.font( 'julia-mono', bold, italic, 'julia-mono/julia-mono-bold-italic.woff2'); .font( 'latin-modern', normal, italic, 'latin-modern/latin-modern-italic.woff2' ); .font( 'latin-modern', normal, normal, 'latin-modern/latin-modern.woff2' ); @@ -571,11 +573,26 @@ .font( 'redhat', normal, italic, 'redhat/redhat-italic.woff2' ); .font( 'redhat', normal, normal, 'redhat/redhat.woff2' ); +.font( 'ricty-diminished', bold, italic, 'ricty-diminished/ricty-diminished-bold-italic.woff2' ); +.font( 'ricty-diminished', bold, normal, 'ricty-diminished/ricty-diminished-bold.woff2' ); +.font( 'ricty-diminished', normal, italic, 'ricty-diminished/ricty-diminished-italic.woff2' ); +.font( 'ricty-diminished', normal, normal, 'ricty-diminished/ricty-diminished.woff2' ); + .font( 'roboto', bold, italic, 'roboto/roboto-bold-italic.woff2' ); .font( 'roboto', bold, normal, 'roboto/roboto-bold.woff2' ); .font( 'roboto', normal, italic, 'roboto/roboto-italic.woff2' ); .font( 'roboto', normal, normal, 'roboto/roboto.woff2' ); +.font( 'sarasa-mono', bold, italic, 'sarasa-mono/sarasa-mono-bold-italic.woff2' ); +.font( 'sarasa-mono', bold, normal, 'sarasa-mono/sarasa-mono-bold.woff2' ); +.font( 'sarasa-mono', normal, italic, 'sarasa-mono/sarasa-mono-italic.woff2' ); +.font( 'sarasa-mono', normal, normal, 'sarasa-mono/sarasa-mono.woff2' ); + +.font( 'sarasa-mono-slab', bold, italic, 'sarasa-mono-slab/sarasa-mono-slab-bold-italic.woff2' ); +.font( 'sarasa-mono-slab', bold, normal, 'sarasa-mono-slab/sarasa-mono-slab-bold.woff2' ); +.font( 'sarasa-mono-slab', normal, italic, 'sarasa-mono-slab/sarasa-mono-slab-italic.woff2' ); +.font( 'sarasa-mono-slab', normal, normal, 'sarasa-mono-slab/sarasa-mono-slab.woff2' ); + .font( 'sax', normal, normal, 'sax/sax.woff2' ); .font( 'scientifica', normal, normal, 'scientifica/scientifica.woff2' ); diff --git a/fonts/stylesheets/stylesheet.css b/fonts/stylesheets/stylesheet.css index c4c3ed8d..f85fb20a 100644 --- a/fonts/stylesheets/stylesheet.css +++ b/fonts/stylesheets/stylesheet.css @@ -1632,15 +1632,27 @@ } @font-face { font-family: 'julia-mono'; - font-weight: bold; + font-weight: normal; font-style: normal; - src: url('../resources/julia-mono/julia-mono-bold.woff2'); + src: url('../resources/julia-mono/julia-mono.woff2'); } @font-face { font-family: 'julia-mono'; font-weight: normal; + font-style: italic; + src: url('../resources/julia-mono/julia-mono-italic.woff2'); +} +@font-face { + font-family: 'julia-mono'; + font-weight: bold; font-style: normal; - src: url('../resources/julia-mono/julia-mono.woff2'); + src: url('../resources/julia-mono/julia-mono-bold.woff2'); +} +@font-face { + font-family: 'julia-mono'; + font-weight: bold; + font-style: italic; + src: url('../resources/julia-mono/julia-mono-bold-italic.woff2'); } @font-face { font-family: 'latin-modern'; @@ -2488,6 +2500,30 @@ font-style: normal; src: url('../resources/redhat/redhat.woff2'); } +@font-face { + font-family: 'ricty-diminished'; + font-weight: bold; + font-style: italic; + src: url('../resources/ricty-diminished/ricty-diminished-bold-italic.woff2'); +} +@font-face { + font-family: 'ricty-diminished'; + font-weight: bold; + font-style: normal; + src: url('../resources/ricty-diminished/ricty-diminished-bold.woff2'); +} +@font-face { + font-family: 'ricty-diminished'; + font-weight: normal; + font-style: italic; + src: url('../resources/ricty-diminished/ricty-diminished-italic.woff2'); +} +@font-face { + font-family: 'ricty-diminished'; + font-weight: normal; + font-style: normal; + src: url('../resources/ricty-diminished/ricty-diminished.woff2'); +} @font-face { font-family: 'roboto'; font-weight: bold; @@ -2512,6 +2548,54 @@ font-style: normal; src: url('../resources/roboto/roboto.woff2'); } +@font-face { + font-family: 'sarasa-mono'; + font-weight: bold; + font-style: italic; + src: url('../resources/sarasa-mono/sarasa-mono-bold-italic.woff2'); +} +@font-face { + font-family: 'sarasa-mono'; + font-weight: bold; + font-style: normal; + src: url('../resources/sarasa-mono/sarasa-mono-bold.woff2'); +} +@font-face { + font-family: 'sarasa-mono'; + font-weight: normal; + font-style: italic; + src: url('../resources/sarasa-mono/sarasa-mono-italic.woff2'); +} +@font-face { + font-family: 'sarasa-mono'; + font-weight: normal; + font-style: normal; + src: url('../resources/sarasa-mono/sarasa-mono.woff2'); +} +@font-face { + font-family: 'sarasa-mono-slab'; + font-weight: bold; + font-style: italic; + src: url('../resources/sarasa-mono-slab/sarasa-mono-slab-bold-italic.woff2'); +} +@font-face { + font-family: 'sarasa-mono-slab'; + font-weight: bold; + font-style: normal; + src: url('../resources/sarasa-mono-slab/sarasa-mono-slab-bold.woff2'); +} +@font-face { + font-family: 'sarasa-mono-slab'; + font-weight: normal; + font-style: italic; + src: url('../resources/sarasa-mono-slab/sarasa-mono-slab-italic.woff2'); +} +@font-face { + font-family: 'sarasa-mono-slab'; + font-weight: normal; + font-style: normal; + src: url('../resources/sarasa-mono-slab/sarasa-mono-slab.woff2'); +} @font-face { font-family: 'sax'; font-weight: normal; diff --git a/index.js b/index.js index 2e5c4a1e..65dae6da 100644 --- a/index.js +++ b/index.js @@ -130,7 +130,6 @@ window.toggleFavorite = (alias) => { } window.location.hash = alias renderSelectList() - return false } window.onhashchange = () => { @@ -169,6 +168,6 @@ window.addEventListener('DOMContentLoaded', () => { }) renderSelectList() - new Filters(data, () => {renderSelectList(true)}).init() + new Filters(data, () => {renderSelectList()}).init() }) }) diff --git a/modules/util.js b/modules/util.js index 1d5320e2..810f6bb2 100644 --- a/modules/util.js +++ b/modules/util.js @@ -133,11 +133,16 @@ export function setDetails (data) { const box = document.querySelector('.info-wrapper') box.querySelector('h2 .name').textContent = data.name box.querySelector('h2 .license').textContent = data.license - box.querySelector('.info').textContent = data.description ?? '' box.querySelector('.variants + dd').textContent = writeVariants(data.variants) box.querySelector('.coverage + dd').innerHTML = writeCoverage(data) box.querySelector('.website + dd a').href = data.website box.querySelector('.website + dd a').textContent = data.website + + let desc = data.description ?? '' + if (data.huge ?? false) { + desc += '
Note: this font is very large and might take a while to load.' + } + box.querySelector('.info').innerHTML = desc } // ProgrammingFonts font selector diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 21fae3e8..00000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -fonttools -hyperglot -brotli diff --git a/404.py b/tools/404.py similarity index 91% rename from 404.py rename to tools/404.py index 27124c9e..6e2ec418 100644 --- a/404.py +++ b/tools/404.py @@ -10,7 +10,7 @@ def check_url_status(url, name): return print('ERROR - {}'.format(name)) -with open('fonts.json') as user_file: +with open('../fonts.json') as user_file: file_contents = user_file.read() data = json.loads(file_contents) diff --git a/convert.py b/tools/convert.py similarity index 94% rename from convert.py rename to tools/convert.py index 8fdd27e9..5c9a3da4 100644 --- a/convert.py +++ b/tools/convert.py @@ -31,7 +31,7 @@ def convert_extension(file): return re.sub(r'\.(ttf|otf|woff)$', '.woff2', file) -with open('fonts.json', 'r+') as user_file: +with open('../fonts.json', 'r+') as user_file: file_contents = user_file.read() data = json.loads(file_contents) @@ -42,7 +42,7 @@ def convert_extension(file): if not args.name and key in skip: continue - dir = path.join('.', 'fonts', 'resources', key) + dir = path.join('..', 'fonts', 'resources', key) font_files = [] for variant in ['', '-bold', '-italic', '-bold-italic']: for ext in ['.ttf', '.otf', '.woff']: diff --git a/info.py b/tools/info.py similarity index 69% rename from info.py rename to tools/info.py index 6eaeb147..c9c94d1b 100644 --- a/info.py +++ b/tools/info.py @@ -1,6 +1,7 @@ import json import argparse from os import path, unlink +import hyperglot as hyp from hyperglot.checker import FontChecker from fontTools.ttLib import TTFont, woff2 @@ -70,7 +71,7 @@ } -with open('fonts.json', 'r+') as user_file: +with open('../fonts.json', 'r+') as user_file: file_contents = user_file.read() data = json.loads(file_contents) @@ -82,9 +83,9 @@ continue print('') - print('---------- ' + key + '----------') + print(f'---------- {key} ----------') - dir = path.join('.', 'fonts', 'resources', key) + dir = path.join('..', 'fonts', 'resources', key) font_file = None for ext in ['.ttf', '.otf', '.woff', '.woff2']: if path.isfile(path.join(dir, key + ext)): @@ -95,23 +96,10 @@ print('No font file found') continue - font = TTFont(font_file) - print(font["name"].getBestFullName()) - # this isn't always the name we take, but useful to check the diff: - # data[key]['name'] = font["name"].getBestFullName() - - print(font["name"].getName(1, 3, 1)) # 1 family name - print(font["name"].getName(8, 3, 1)) # 8 manufacturer name - print(font["name"].getName(0, 3, 1)) # 0 copyright - - designer = font["name"].getName(9, 3, 1) # 9 designer - print(designer) - # this isn't always the author we take, but useful to check the diff: - # if designer: - # data[key]['author'] = str(designer) - - print(font['maxp'].numGlyphs) - data[key]['glyphs'] = int(font['maxp'].numGlyphs) + size = path.getsize(font_file) + print(f'filesize: {size}') + if size > 1000000: + data[key]['huge'] = True ''' name table: @@ -119,21 +107,37 @@ platform 1 = macos, 3 = windows encoding 0 = roman, 1 = unicode ''' + font = TTFont(font_file) + print(f'name: {font["name"].getBestFullName()}') + # this isn't always the name we take, but useful to check + + print(f'family: {font["name"].getName(1, 3, 1)}') # 1 family name + print(f'manufacturer: {font["name"].getName(8, 3, 1)}') # 8 manufacturer name + print(f'copyright: {font["name"].getName(0, 3, 1)}') # 0 copyright + print(f'designer: {font["name"].getName(9, 3, 1)}') # 9 designer + # this isn't always the author we take, but useful to check + glyph_count = font['maxp'].numGlyphs + print(f'glyphs: {glyph_count}') + data[key]['glyphs'] = int(glyph_count) + + print(f'hyperglot: {hyp.__version__}') try: woff2.decompress(font_file, 'tmp.otf') checker = FontChecker('tmp.otf') - print(len(checker.characters)) # encoded characters - data[key]['characters'] = len(checker.characters) - print('langs:') - langs = checker.get_supported_languages() + encoded_chars = len(checker.characters) + print(f'characters: {encoded_chars}') + data[key]['characters'] = encoded_chars + + print('languages:') + langs = checker.get_supported_languages(shaping=False) data[key]['languages'] = {} for lang in langs: - print(lang, len(langs[lang]), lang_count[lang]) + print(f' {lang}: {len(langs[lang])} of {lang_count[lang]}') data[key]['languages'][str(lang)] = len(langs[lang]) unlink('tmp.otf') except Exception: - print('language support could not be detected') + print('Language support could not be detected') user_file.seek(0) # roll back to start of file json.dump(data, user_file, indent=4, ensure_ascii=False) # insert the new data diff --git a/listing.py b/tools/listing.py similarity index 91% rename from listing.py rename to tools/listing.py index 8688b182..f0cd9604 100644 --- a/listing.py +++ b/tools/listing.py @@ -2,7 +2,7 @@ TEMPLATE = "- [{name}]({url}) _{license}_ ([view](https://www.programmingfonts.org/#{key}))" -with open('fonts.json') as user_file: +with open('../fonts.json') as user_file: file_contents = user_file.read() data = json.loads(file_contents) diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 00000000..cebab383 --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,3 @@ +brotli==1.2.0 +fonttools==4.63.0 +hyperglot==0.8.1 diff --git a/tools/validate.py b/tools/validate.py new file mode 100644 index 00000000..eec6a903 --- /dev/null +++ b/tools/validate.py @@ -0,0 +1,35 @@ +import json +import sys + +with open('../fonts.json', 'r') as f: + data = json.load(f) + +ok = True + +for alias, font in data.items(): + if 'group' not in font or not font['group']: + continue + + # Self-reference is valid — this font is a parent + if font['group'] == alias: + continue + + # Group key must exist + if font['group'] not in data: + print( + f'{alias}: group "{font["group"]}" does not match any font key', + file=sys.stderr, + ) + ok = False + continue + + # Target must be a parent (self-referencing), not another child — no two-level nesting + if data[font['group']].get('group') != font['group']: + print( + f'{alias}: group "{font["group"]}" is not a parent (a parent must have group equal to its own key)', + file=sys.stderr, + ) + ok = False + +if not ok: + sys.exit(1) diff --git a/validate.js b/validate.js deleted file mode 100644 index a92f0e38..00000000 --- a/validate.js +++ /dev/null @@ -1,28 +0,0 @@ -const data = require("./fonts.json"); -let ok = true; - -for (const [alias, font] of Object.entries(data)) { - if (!font.group) continue; - - // Self-reference is valid — this font is a parent - if (font.group === alias) continue; - - // Group key must exist - if (!data[font.group]) { - console.error( - `${alias}: group "${font.group}" does not match any font key`, - ); - ok = false; - continue; - } - - // Target must be a parent (self-referencing), not another child — no two-level nesting - if (data[font.group].group !== font.group) { - console.error( - `${alias}: group "${font.group}" is not a parent (a parent must have group equal to its own key)`, - ); - ok = false; - } -} - -if (!ok) process.exit(1);