VERSION II.
4
.gitignore
vendored
|
@ -39,7 +39,8 @@ ref/
|
|||
pages/
|
||||
releases/
|
||||
release-archives/
|
||||
snapshot/assets/
|
||||
testdrive/iosevka*
|
||||
snapshot/iosevka*
|
||||
snapshot/index.css
|
||||
|
||||
# Generated scripts
|
||||
|
@ -57,7 +58,6 @@ support/utils.js
|
|||
meta/*.js
|
||||
meta/feature/*.js
|
||||
glyphs/*.js
|
||||
testdrive/assets
|
||||
|
||||
package-lock.json
|
||||
private.toml
|
||||
|
|
73
README.md
|
@ -46,63 +46,35 @@ Iosevka supports Language-Specific Ligations, which is the ligation set enabled
|
|||
|
||||
To build Iosevka you should:
|
||||
|
||||
1. Ensure that [`nodejs`](http://nodejs.org) (≥ 8.4), [`ttfautohint`](http://www.freetype.org/ttfautohint/), [`otfcc`](https://github.com/caryll/otfcc) (≥ 0.9.3) and GNU `make` (≥ 4.1; BSD `make` may not work) are runnable in your terminal.
|
||||
- Windows users may need to install MinGW and make POSIX utilities accessible (`mkdir.exe`, `cp.exe`, `cat.exe` and `rm.exe`, in particular) from Command Prompt. Utilities provided by [Git for Windows](https://git-for-windows.github.io/) or MSYS2 works fine.
|
||||
1. Ensure that [`nodejs`](http://nodejs.org) (≥ 8.4), [`ttfautohint`](http://www.freetype.org/ttfautohint/), [`otfcc`](https://github.com/caryll/otfcc) (≥ 0.9.3).
|
||||
2. Install necessary libs by `npm install`. If you’ve installed them, upgrade to the latest.
|
||||
3. `make` (or `gmake`).
|
||||
3. `npm run build -- contents:iosevka`.
|
||||
|
||||
|
||||
You will find TTFs in the `dist/` directory.
|
||||
|
||||
### Building the Web Font
|
||||
|
||||
The `webfonts/` directory is used to build Iosevka for web font uses. To build the web fonts you should:
|
||||
|
||||
1. Build Iosevka.
|
||||
2. Ensure that `sfnt2woff` and `woff2_compress` are installed and runnable.
|
||||
3. Run `make web` .
|
||||
|
||||
The web fonts will be generated into `dist/iosevka/web` and `dist/iosevka-slab/web`.
|
||||
You will find TTFs, as well as WOFF(2) web fonts and one Webfont CSS in the `dist/` directory.
|
||||
|
||||
## Build Your Own Style
|
||||
|
||||

|
||||
Since version 2.0, Iosevka would no longer support building via `makefile`. To initialize a custom build, you need:
|
||||
|
||||
Iosevka comes with several visual styles, however they are inactive using the default build. To build these variants, you should perform custom build:
|
||||
1. Add a new term into `buildPlans` in `build-plans.toml`, following this format:
|
||||
|
||||
1. `make custom-config [set=<name>]` with the parameters listed below to create a configuration. The `set=<name>` part is optional, it will be set to `custom` when absent.
|
||||
2. `make custom [set=<name>]` to acquire your custom font.
|
||||
- `make custom-web [set=<name>]` is for web fonts.
|
||||
```toml
|
||||
[buildPlans.iosevka-custom] # <iosevka-custom> is your plan name
|
||||
family = "Iosevka Custom" # Font menu family name
|
||||
design = ["common styles"] # Common styles
|
||||
upright = ["upright-only", "styles"] # Upright-only styles
|
||||
italic = ["italic-only", "styles"] # Italic-only styles
|
||||
oblique = ["oblique-only", "styles"] # Oblique-only styles
|
||||
```
|
||||
|
||||
The first step, `make custom-config` takes following parameters to set styles of your custom build. All of them are optional, and would default to Iosevka’s default configuration:
|
||||
2. Run `npm run build -- contents:<your plan name>` and the built fonts would be avaliable in `dist/`. Aside from `contents:<plan>`, other options are:
|
||||
|
||||
* `design='<styles>'`, styles for your custom font set.
|
||||
* `upright='<styles>'`, styles for uprights only.
|
||||
* `italic='<styles>'`, styles for italics only.
|
||||
* `oblique='<styles>'`, styles for obliques only.
|
||||
|
||||
You can add arbitrary styles for these variables.
|
||||
|
||||
You can also customize the font family and target weights:
|
||||
|
||||
* `family='<Font Family>'`, for a customized font family name.
|
||||
* `weights='<list of weights>'`, a space-separated list, indicates the specific weights needed to be built. The candidates are:
|
||||
* `thin`
|
||||
* `extralight`
|
||||
* `light`
|
||||
* `book` (regular)
|
||||
* `medium`
|
||||
* `bold`
|
||||
* `heavy`
|
||||
|
||||
For example,
|
||||
|
||||
```bash
|
||||
make custom-config upright='v-l-zshaped v-i-zshaped' family='Iosevka X' weights='book bold'
|
||||
make custom
|
||||
```
|
||||
|
||||
will create a variant with Z-shaped letter `l` and `i` for uprights, and it would be named as '`Iosevka X`' after installation, and only Regular and Bold weights would be created.
|
||||
1. `contents:<plan>` : TTF (Hinted and Unhinted), WOFF(2) and Webfont CSS;
|
||||
2. `ttf:<plan>` : TTF;
|
||||
3. `ttf-unhinted:<plan>` : Unhinted TTF only;
|
||||
4. `woff:<plan>` : TTF and WOFF only;
|
||||
5. `woff2:<plan>` : TTF and WOFF2 only;
|
||||
|
||||
The current available styles for `design`/`upright`/`italic`/`oblique` options are:
|
||||
|
||||
|
@ -127,6 +99,13 @@ The current available styles for `design`/`upright`/`italic`/`oblique` options a
|
|||
* `ligset-fstar`: Default ligation set would be assigned to F\*.
|
||||
* `ligset-swift`: Default ligation set would be assigned to Swift.
|
||||
* `ligset-purescript`: Default ligation set would be assigned to PureScript.
|
||||
* Styles for changing the line space (leading):
|
||||
* `leading-750`, `leading-1000`, `leading-1250`, `leading-1500`, `leading-1750`, `leading-2000`: Change the line space. Default is `leading-1250`.
|
||||
* Styles for changing Powerline symbols' position:
|
||||
* `powerline-scale-y-750`, `powerline-scale-y-875`, `powerline-scale-y-1000`, `powerline-scale-y-1125`, `powerline-scale-y-1250`, `powerline-scale-y-1375`, `powerline-scale-y-1500`: Resize the Powerline symbols vertically, from 75% to 150%.
|
||||
* `powerline-scale-x-750`, `powerline-scale-x-875`, `powerline-scale-x-1000`, `powerline-scale-x-1125`, `powerline-scale-x-1250`, `powerline-scale-x-1375`, `powerline-scale-x-1500`: Resize the Powerline symbols horizontally, from 75% to 150%.
|
||||
* `powerline-shift-y-n500`, `powerline-shift-y-n450`, `powerline-shift-y-n400`, `powerline-shift-y-n350`, `powerline-shift-y-n300`, `powerline-shift-y-n250`, `powerline-shift-y-n200`, `powerline-shift-y-n150`, `powerline-shift-y-n100`, `powerline-shift-y-n50`, `powerline-shift-y-0`, `powerline-shift-y-p50`, `powerline-shift-y-p100`, `powerline-shift-y-p150`, `powerline-shift-y-p200`, `powerline-shift-y-p250`, `powerline-shift-y-p300`, `powerline-shift-y-p350`, `powerline-shift-y-p400`, `powerline-shift-y-p450`, `powerline-shift-y-p500`: Shift the Powerline symbols vertically, from -0.5em to +0.5em.
|
||||
* `powerline-shift-x-n500`, `powerline-shift-x-n450`, `powerline-shift-x-n400`, `powerline-shift-x-n350`, `powerline-shift-x-n300`, `powerline-shift-x-n250`, `powerline-shift-x-n200`, `powerline-shift-x-n150`, `powerline-shift-x-n100`, `powerline-shift-x-n50`, `powerline-shift-x-0`, `powerline-shift-x-p50`, `powerline-shift-x-p100`, `powerline-shift-x-p150`, `powerline-shift-x-p200`, `powerline-shift-x-p250`, `powerline-shift-x-p300`, `powerline-shift-x-p350`, `powerline-shift-x-p400`, `powerline-shift-x-p450`, `powerline-shift-x-p500`: Shift the Powerline symbols horizontally, from -0.5em to +0.5em.
|
||||
* Styles for individual characters. They are easy-to-understand names of the `cv##` styles, including:
|
||||
* Styles for letter `l`:
|
||||
* `v-l-hooky` : Hooky `l`.
|
||||
|
|
210
build-plans.toml
Normal file
|
@ -0,0 +1,210 @@
|
|||
# Building plans
|
||||
# Sans
|
||||
[buildPlans.iosevka]
|
||||
family = "Iosevka"
|
||||
|
||||
[buildPlans.iosevka-term]
|
||||
family = "Iosevka Term"
|
||||
design = ["term"]
|
||||
|
||||
[buildPlans.iosevka-type]
|
||||
family = "Iosevka Type"
|
||||
design = ["type"]
|
||||
|
||||
[buildPlans.iosevka-cc]
|
||||
family = "IosevkaCC"
|
||||
design = ["cc"]
|
||||
|
||||
# Slab
|
||||
[buildPlans.iosevka-slab]
|
||||
family = "Iosevka Slab"
|
||||
design = ["slab"]
|
||||
|
||||
[buildPlans.iosevka-term-slab]
|
||||
family = "Iosevka Term Slab"
|
||||
design = ["term", "slab"]
|
||||
|
||||
[buildPlans.iosevka-type-slab]
|
||||
family = "Iosevka Type Slab"
|
||||
design = ["type", "slab"]
|
||||
|
||||
[buildPlans.iosevka-cc-slab]
|
||||
family = "IosevkaCC Slab"
|
||||
design = ["cc", "slab"]
|
||||
|
||||
# SSxx
|
||||
[buildPlans.iosevka-ss01]
|
||||
family = "Iosevka SS01"
|
||||
design = ["ss01"]
|
||||
|
||||
[buildPlans.iosevka-term-ss01]
|
||||
family = "Iosevka Term SS01"
|
||||
design = ["term", "ss01"]
|
||||
|
||||
[buildPlans.iosevka-ss02]
|
||||
family = "Iosevka SS02"
|
||||
design = ["ss02"]
|
||||
|
||||
[buildPlans.iosevka-term-ss02]
|
||||
family = "Iosevka Term SS02"
|
||||
design = ["term", "ss02"]
|
||||
|
||||
[buildPlans.iosevka-ss03]
|
||||
family = "Iosevka SS03"
|
||||
design = ["ss03"]
|
||||
|
||||
[buildPlans.iosevka-term-ss03]
|
||||
family = "Iosevka Term SS03"
|
||||
design = ["term", "ss03"]
|
||||
|
||||
[buildPlans.iosevka-ss04]
|
||||
family = "Iosevka SS04"
|
||||
design = ["ss04"]
|
||||
|
||||
[buildPlans.iosevka-term-ss04]
|
||||
family = "Iosevka Term SS04"
|
||||
design = ["term", "ss04"]
|
||||
|
||||
[buildPlans.iosevka-ss05]
|
||||
family = "Iosevka SS05"
|
||||
design = ["ss05"]
|
||||
|
||||
[buildPlans.iosevka-term-ss05]
|
||||
family = "Iosevka Term SS05"
|
||||
design = ["term", "ss05"]
|
||||
|
||||
[buildPlans.iosevka-ss06]
|
||||
family = "Iosevka SS06"
|
||||
design = ["ss06"]
|
||||
|
||||
[buildPlans.iosevka-term-ss06]
|
||||
family = "Iosevka Term SS06"
|
||||
design = ["term", "ss06"]
|
||||
|
||||
[buildPlans.iosevka-ss07]
|
||||
family = "Iosevka SS07"
|
||||
design = ["ss07"]
|
||||
|
||||
[buildPlans.iosevka-term-ss07]
|
||||
family = "Iosevka Term SS07"
|
||||
design = ["term", "ss07"]
|
||||
|
||||
[buildPlans.iosevka-ss08]
|
||||
family = "Iosevka SS08"
|
||||
design = ["ss08"]
|
||||
|
||||
[buildPlans.iosevka-term-ss08]
|
||||
family = "Iosevka Term SS08"
|
||||
design = ["term", "ss08"]
|
||||
|
||||
[buildPlans.iosevka-ss09]
|
||||
family = "Iosevka SS09"
|
||||
design = ["ss09"]
|
||||
|
||||
[buildPlans.iosevka-term-ss09]
|
||||
family = "Iosevka Term SS09"
|
||||
design = ["term", "ss09"]
|
||||
|
||||
[buildPlans.iosevka-ss10]
|
||||
family = "Iosevka SS10"
|
||||
design = ["ss10"]
|
||||
|
||||
[buildPlans.iosevka-term-ss10]
|
||||
family = "Iosevka Term SS10"
|
||||
design = ["term", "ss10"]
|
||||
|
||||
[buildPlans.iosevka-ss11]
|
||||
family = "Iosevka SS11"
|
||||
design = ["ss11"]
|
||||
|
||||
[buildPlans.iosevka-term-ss11]
|
||||
family = "Iosevka Term SS11"
|
||||
design = ["term", "ss11"]
|
||||
|
||||
|
||||
# Export plans
|
||||
# This mapping affects the process of creating ZIP archives only
|
||||
[exportPlans]
|
||||
01-iosevka = "iosevka"
|
||||
02-iosevka-term = "iosevka-term"
|
||||
03-iosevka-type = "iosevka-type"
|
||||
04-iosevka-cc = "iosevka-cc"
|
||||
05-iosevka-slab = "iosevka-slab"
|
||||
06-iosevka-term-slab = "iosevka-term-slab"
|
||||
07-iosevka-type-slab = "iosevka-type-slab"
|
||||
08-iosevka-cc-slab = "iosevka-cc-slab"
|
||||
iosevka-ss01 = "iosevka-ss01"
|
||||
iosevka-term-ss01 = "iosevka-term-ss01"
|
||||
iosevka-ss02 = "iosevka-ss02"
|
||||
iosevka-term-ss02 = "iosevka-term-ss02"
|
||||
iosevka-ss03 = "iosevka-ss03"
|
||||
iosevka-term-ss03 = "iosevka-term-ss03"
|
||||
iosevka-ss04 = "iosevka-ss04"
|
||||
iosevka-term-ss04 = "iosevka-term-ss04"
|
||||
iosevka-ss05 = "iosevka-ss05"
|
||||
iosevka-term-ss05 = "iosevka-term-ss05"
|
||||
iosevka-ss06 = "iosevka-ss06"
|
||||
iosevka-term-ss06 = "iosevka-term-ss06"
|
||||
iosevka-ss07 = "iosevka-ss07"
|
||||
iosevka-term-ss07 = "iosevka-term-ss07"
|
||||
iosevka-ss08 = "iosevka-ss08"
|
||||
iosevka-term-ss08 = "iosevka-term-ss08"
|
||||
iosevka-ss09 = "iosevka-ss09"
|
||||
iosevka-term-ss09 = "iosevka-term-ss09"
|
||||
iosevka-ss10 = "iosevka-ss10"
|
||||
iosevka-term-ss10 = "iosevka-term-ss10"
|
||||
iosevka-ss11 = "iosevka-ss11"
|
||||
iosevka-term-ss11 = "iosevka-term-ss11"
|
||||
|
||||
# TTC collection plans
|
||||
[collectPlans.iosevka]
|
||||
from = [
|
||||
"iosevka",
|
||||
"iosevka-term",
|
||||
"iosevka-type",
|
||||
"iosevka-cc"
|
||||
]
|
||||
|
||||
[collectPlans.iosevka-slab]
|
||||
from = [
|
||||
"iosevka-slab",
|
||||
"iosevka-term-slab",
|
||||
"iosevka-type-slab",
|
||||
"iosevka-cc-slab"
|
||||
]
|
||||
|
||||
# Weight mappings (style => CSS)
|
||||
# Comment the lines to build less weights
|
||||
# NOTE: This mapping does NOT affect the font's metadata, only affects
|
||||
# the webfont CSS. Change `parameters.toml` instead.
|
||||
[weights]
|
||||
thin = 100
|
||||
extralight = 200
|
||||
light = 300
|
||||
book = 400
|
||||
medium = 500
|
||||
semibold = 600
|
||||
bold = 700
|
||||
extrabold = 800
|
||||
heavy = 900
|
||||
|
||||
# Slant mappings (style => CSS)
|
||||
# NOTE: This mapping does NOT affect the font's metadata, only affects
|
||||
# the webfont CSS. Change `parameters.toml` instead.
|
||||
[slants]
|
||||
upright = "normal"
|
||||
italic = "italic"
|
||||
oblique = "oblique"
|
||||
|
||||
|
||||
################################################
|
||||
# To define your custom build #
|
||||
# Add a new term into buildPlans #
|
||||
# and run `npm run build -- fonts:<plan name>` #
|
||||
################################################
|
||||
# [buildPlans.iosevka-custom] # <iosevka-custom> is your plan name
|
||||
# family = "Iosevka Custom" # Font menu family name
|
||||
# design = ["common styles"] # Common styles
|
||||
# upright = ["upright-only", "styles"] # Upright-only styles
|
||||
# italic = ["italic-only", "styles"] # Italic-only styles
|
||||
# oblique = ["oblique-only", "styles"] # Oblique-only styles
|
|
@ -100,7 +100,7 @@ uniqueSubFamily = "node-sfnt blank font"
|
|||
version = "Version 1.0"
|
||||
|
||||
[post]
|
||||
format = 2
|
||||
version = 2
|
||||
isFixedPitch = false
|
||||
italicAngle = 0
|
||||
maxMemType1 = 1
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
import './support/glyph' as Glyph
|
||||
import './support/point' as Point
|
||||
import './support/spirokit' as spirokit
|
||||
import './support/transform' as : Transform && [object [transformPoint tp] [untransform utp] inverse]
|
||||
import './support/anchor' as Anchor
|
||||
import './support/monotonic-interpolate' as smoothreg
|
||||
import './support/fairify' as fairify
|
||||
import '../support/glyph' as Glyph
|
||||
import '../support/point' as Point
|
||||
import '../support/spirokit' as spirokit
|
||||
import '../support/transform' as : Transform && [object [transformPoint tp] [untransform utp] inverse]
|
||||
import '../support/anchor' as Anchor
|
||||
import '../support/monotonic-interpolate' as smoothreg
|
||||
import '../support/fairify' as fairify
|
||||
|
||||
import [mix linreg clamp fallback TempFont includeGlyphPart compsiteMarkSet] from './support/utils'
|
||||
import [calculateMetrics setFontMetrics] from './meta/aesthetics'
|
||||
import [assignFontNames] from './meta/naming'
|
||||
import './meta/features' as Features
|
||||
import [mix linreg clamp fallback TempFont includeGlyphPart compsiteMarkSet] from '../support/utils'
|
||||
import [calculateMetrics setFontMetrics] from '../meta/aesthetics'
|
||||
import [assignFontNames] from '../meta/naming'
|
||||
import '../meta/features' as Features
|
||||
|
||||
$$include 'meta/macros.ptl'
|
||||
$$include '../meta/macros.ptl'
|
||||
|
||||
define [$NamedParameterPair$ l r] : begin
|
||||
set this.left l
|
||||
|
@ -190,26 +190,26 @@ export as build : define [buildFont para recursive recursiveCodes] : begin
|
|||
define capture : object [metrics : Object.create metrics] $NamedParameterPair$ $donothing$ para recursive recursiveCodes variantSelector font glyphs glyphList unicodeGlyphs create-glyph $save$ save-glyph spirofns markset MARK BASE AS_BASE ALSO_METRICS pickHash dependencyProfile getDependencyProfile buildFont newtemp tagged TempFont includeGlyphPart compsiteMarkSet
|
||||
|
||||
### HERE WE GO
|
||||
set capture.commonShapes : [import './glyphs/common-shapes.js'].apply.call capture
|
||||
set capture.overmarks : [import './glyphs/overmarks.js'].apply.call capture
|
||||
set capture.commonShapes : [import '../glyphs/common-shapes.js'].apply.call capture
|
||||
set capture.overmarks : [import '../glyphs/overmarks.js'].apply.call capture
|
||||
|
||||
# Unified letters
|
||||
set capture.letterBasic : [import './glyphs/letters-unified-basic.js'].apply.call capture
|
||||
set capture.letterExt : [import './glyphs/letters-unified-extended.js'].apply.call capture
|
||||
set capture.letterBasic : [import '../glyphs/letters-unified-basic.js'].apply.call capture
|
||||
set capture.letterExt : [import '../glyphs/letters-unified-extended.js'].apply.call capture
|
||||
|
||||
# Numbers
|
||||
[import './glyphs/numbers.js'].apply.call capture
|
||||
[import '../glyphs/numbers.js'].apply.call capture
|
||||
|
||||
# Symbols
|
||||
[import './glyphs/symbol-punctuation.js'].apply.call capture
|
||||
set capture.geometricSymbols : [import './glyphs/symbol-geometric.js'].apply.call capture
|
||||
[import './glyphs/symbol-math.js'].apply.call capture
|
||||
[import './glyphs/symbol-letter.js'].apply.call capture
|
||||
[import './glyphs/symbol-braille.js'].apply.call capture
|
||||
[import './glyphs/symbol-other.js'].apply.call capture
|
||||
[import '../glyphs/symbol-punctuation.js'].apply.call capture
|
||||
set capture.geometricSymbols : [import '../glyphs/symbol-geometric.js'].apply.call capture
|
||||
[import '../glyphs/symbol-math.js'].apply.call capture
|
||||
[import '../glyphs/symbol-letter.js'].apply.call capture
|
||||
[import '../glyphs/symbol-braille.js'].apply.call capture
|
||||
[import '../glyphs/symbol-other.js'].apply.call capture
|
||||
|
||||
# Autobuilds
|
||||
[import './glyphs/autobuilds.js'].apply.call capture
|
||||
[import '../glyphs/autobuilds.js'].apply.call capture
|
||||
|
||||
if [not recursive] : begin
|
||||
set {.GSUB font.GSUB .GPOS font.GPOS .GDEF font.GDEF} : Features.apply para glyphs glyphList unicodeGlyphs
|
|
@ -1,18 +1,20 @@
|
|||
let fs = require("fs");
|
||||
let path = require("path");
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
// let TTFWriter = require('node-sfnt').TTFWriter;
|
||||
let argv = require("yargs").argv;
|
||||
let buildGlyphs = require("./buildglyphs.js");
|
||||
let parameters = require("./support/parameters");
|
||||
let toml = require("toml");
|
||||
const argv = require("yargs").argv;
|
||||
const buildGlyphs = require("./buildglyphs.js");
|
||||
const parameters = require("../support/parameters");
|
||||
const toml = require("toml");
|
||||
|
||||
let Glyph = require("./support/glyph");
|
||||
let autoref = require("./support/autoref");
|
||||
const Glyph = require("../support/glyph");
|
||||
const autoref = require("../support/autoref");
|
||||
const objectAssign = require("object-assign");
|
||||
|
||||
let caryllShapeOps = require("caryll-shapeops");
|
||||
let c2q = require("megaminx").geometry.c2q;
|
||||
const caryllShapeOps = require("caryll-shapeops");
|
||||
const c2q = require("megaminx").geometry.c2q;
|
||||
|
||||
function hasv(obj) {
|
||||
if (!obj) return false;
|
||||
|
@ -88,28 +90,32 @@ function byGlyphPriority(a, b) {
|
|||
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
|
||||
}
|
||||
|
||||
const PARAMETERS_TOML = path.resolve(__dirname, "../parameters.toml");
|
||||
const PRIVATE_TOML = path.resolve(__dirname, "../private.toml");
|
||||
const VARIANTS_TOML = path.resolve(__dirname, "../variants.toml");
|
||||
const EMPTYFONT_TOML = path.resolve(__dirname, "../emptyfont.toml");
|
||||
|
||||
function getParameters(argv) {
|
||||
const parametersData = Object.assign(
|
||||
{},
|
||||
toml.parse(fs.readFileSync(path.join(__dirname, "parameters.toml"), "utf-8")),
|
||||
fs.existsSync(path.join(__dirname, "private.toml"))
|
||||
? toml.parse(fs.readFileSync(path.join(__dirname, "private.toml"), "utf-8"))
|
||||
: []
|
||||
toml.parse(fs.readFileSync(PARAMETERS_TOML, "utf-8")),
|
||||
fs.existsSync(PRIVATE_TOML) ? toml.parse(fs.readFileSync(PRIVATE_TOML, "utf-8")) : []
|
||||
);
|
||||
const variantData = toml.parse(fs.readFileSync(path.join(__dirname, "variants.toml"), "utf-8"));
|
||||
const variantData = toml.parse(fs.readFileSync(VARIANTS_TOML, "utf-8"));
|
||||
|
||||
const para = parameters.build(parametersData, argv._);
|
||||
const vsdata = formVariantData(variantData, para);
|
||||
para.variants = vsdata;
|
||||
para.variantSelector = parameters.build(vsdata, argv._);
|
||||
para.defaultVariant = vsdata.default;
|
||||
const variantsData = formVariantData(variantData, para);
|
||||
para.variants = variantsData;
|
||||
para.variantSelector = parameters.build(variantsData, argv._);
|
||||
para.defaultVariant = variantsData.default;
|
||||
if (argv.family) para.family = argv.family;
|
||||
if (argv.ver) para.version = argv.ver;
|
||||
return para;
|
||||
}
|
||||
|
||||
// Font building
|
||||
const font = (function() {
|
||||
const emptyFont = toml.parse(fs.readFileSync(path.join(__dirname, "emptyfont.toml"), "utf-8"));
|
||||
const emptyFont = toml.parse(fs.readFileSync(EMPTYFONT_TOML, "utf-8"));
|
||||
const para = getParameters(argv);
|
||||
const font = buildGlyphs.build.call(emptyFont, para);
|
||||
|
||||
|
@ -164,7 +170,7 @@ if (argv.o) {
|
|||
if (origx === origx0) continue;
|
||||
for (let poff = offJ; poff < p; poff++) {
|
||||
contour[poff].x =
|
||||
(contour[poff].x - origx0) / (origx - origx0) * (rx - rx0) + rx0;
|
||||
((contour[poff].x - origx0) / (origx - origx0)) * (rx - rx0) + rx0;
|
||||
}
|
||||
}
|
||||
mx = contour[p].x;
|
||||
|
@ -191,7 +197,8 @@ if (argv.o) {
|
|||
}
|
||||
}
|
||||
|
||||
const skew = (argv.uprightify ? 1 : 0) * Math.tan((font.post.italicAngle || 0) / 180 * Math.PI);
|
||||
const skew =
|
||||
(argv.uprightify ? 1 : 0) * Math.tan(((font.post.italicAngle || 0) / 180) * Math.PI);
|
||||
// autoref
|
||||
autoref(font.glyf);
|
||||
// regulate
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 123 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 417 KiB After Width: | Height: | Size: 422 KiB |
Before Width: | Height: | Size: 322 KiB After Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 359 KiB After Width: | Height: | Size: 356 KiB |
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 805 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 266 KiB After Width: | Height: | Size: 342 KiB |
72
makefile
|
@ -1,72 +0,0 @@
|
|||
VERSION = 1.15.0
|
||||
export VERSION
|
||||
|
||||
start : __start
|
||||
|
||||
include utility/dirs.mk
|
||||
|
||||
# Standard
|
||||
$(BUILD)/targets.mk : maker.js | $(BUILD)/
|
||||
node maker.js > $@
|
||||
|
||||
__start : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk __default
|
||||
|
||||
web : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk web
|
||||
|
||||
sans : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk fonts-sans
|
||||
|
||||
release : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk release
|
||||
|
||||
test : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk test
|
||||
|
||||
fw : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk archive-ttc
|
||||
|
||||
scripts :
|
||||
@$(MAKE) -f utility/scripts.mk scripts
|
||||
|
||||
sample-images : $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/standard.mk sample-images
|
||||
|
||||
# Custom
|
||||
ifndef set
|
||||
set = custom
|
||||
endif
|
||||
ifndef design
|
||||
design = sans
|
||||
endif
|
||||
ifndef upright
|
||||
upright = normal
|
||||
endif
|
||||
ifndef italic
|
||||
italic = normal
|
||||
endif
|
||||
ifndef oblique
|
||||
oblique = normal
|
||||
endif
|
||||
ifndef prestyle
|
||||
prestyle = nothing
|
||||
endif
|
||||
|
||||
CREATECONFIG = node maker.js --custom $(set) --design '$(design)' --upright '$(upright)' --italic '$(italic)' --oblique '$(oblique)' --prestyle '$(prestyle)' --family '$(family)' --weights '$(weights)' > $(BUILD)/targets-$(set).mk
|
||||
|
||||
custom-config : maker.js | $(BUILD)/
|
||||
$(CREATECONFIG)
|
||||
|
||||
export set
|
||||
custom : $(BUILD)/targets-$(set).mk $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/custom.mk fonts-customized-$(set) __IOSEVKA_CUSTOM_BUILD__=true
|
||||
custom-web : $(BUILD)/targets-$(set).mk $(BUILD)/targets.mk
|
||||
@$(MAKE) -f utility/custom.mk web-customized-$(set) __IOSEVKA_CUSTOM_BUILD__=true
|
||||
|
||||
# Cleaning
|
||||
clean :
|
||||
@$(MAKE) -f utility/scripts.mk cleanscripts
|
||||
@-rm -rf $(BUILD)
|
||||
@-rm -rf $(DIST)
|
||||
@-rm -rf $(ARCHIVEDIR)
|
288
maker.js
|
@ -1,288 +0,0 @@
|
|||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const argv = require("yargs").argv;
|
||||
const pad = require("pad");
|
||||
|
||||
const possibleWeights = new Set([
|
||||
"thin",
|
||||
"extralight",
|
||||
"light",
|
||||
"book",
|
||||
"medium",
|
||||
"semibold",
|
||||
"bold",
|
||||
"extrabold",
|
||||
"heavy"
|
||||
]);
|
||||
const weights = argv.weights
|
||||
? argv.weights.split(/ +/g).filter(w => possibleWeights.has(w))
|
||||
: [...possibleWeights];
|
||||
const slantnesses = ["upright", "italic", "oblique"];
|
||||
const widths = ["term", "normal", "cc"];
|
||||
const designs = ["sans", "slab"];
|
||||
|
||||
function present(x) {
|
||||
return !!x;
|
||||
}
|
||||
|
||||
function tofn(a) {
|
||||
return a.filter(present).join("-");
|
||||
}
|
||||
|
||||
function getMapping(options) {
|
||||
options = options || {
|
||||
design: [],
|
||||
width: "normal",
|
||||
weight: "book",
|
||||
slantness: "upright",
|
||||
styles: {},
|
||||
dirPrefix: "",
|
||||
dirSuffix: "",
|
||||
filePrefix: "",
|
||||
infix: "",
|
||||
fileSuffix: ""
|
||||
};
|
||||
let design = options.design || [];
|
||||
let prestyle = options.prestyle || [];
|
||||
let weight = options.weight || "book";
|
||||
let slantness = options.slantness || "upright";
|
||||
let hives = ["iosevka"].concat(
|
||||
prestyle,
|
||||
["w-" + weight, "s-" + slantness],
|
||||
(options.styles || {})[slantness] || [],
|
||||
design
|
||||
);
|
||||
let dir = [
|
||||
options.dirPrefix || "",
|
||||
"iosevka",
|
||||
options.infix || tofn(design),
|
||||
options.dirSuffix || ""
|
||||
]
|
||||
.filter(present)
|
||||
.join("-");
|
||||
let filename = [
|
||||
options.filePrefix || "",
|
||||
"iosevka",
|
||||
options.infix || tofn(design),
|
||||
options.fileSuffix || "",
|
||||
(weight === "book" ? (slantness === "upright" ? "regular" : "") : weight) +
|
||||
(slantness === "upright" ? "" : slantness)
|
||||
]
|
||||
.filter(present)
|
||||
.join("-");
|
||||
return { hives, dir, filename, custom: options.custom };
|
||||
}
|
||||
|
||||
let definedBuildSeqs = {};
|
||||
|
||||
function createMake(mapping) {
|
||||
const { hives, dir, filename, cm, custom } = mapping;
|
||||
const tfname = `$(BUILD)/${filename}.0.otd`;
|
||||
const cmTarget = `$(BUILD)/${filename}.charmap`;
|
||||
|
||||
const target = `$(DIST)/${dir}/ttf/${filename}.ttf`;
|
||||
const unhintedTarget = `$(DIST)/${dir}/ttf-unhinted/${filename}.ttf`;
|
||||
const woffTarget = `$(DIST)/${dir}/woff/${filename}.woff`;
|
||||
const woff2Target = `$(DIST)/${dir}/woff2/${filename}.woff2`;
|
||||
|
||||
let buf = "";
|
||||
if (!definedBuildSeqs[tfname]) {
|
||||
const output = `-o $@`;
|
||||
const charmapOutput = cm ? "--charmap $(BUILD)/" + filename + ".charmap" : "";
|
||||
const familyDirective = argv.family ? `--family '${argv.family}'` : "";
|
||||
|
||||
buf += `
|
||||
${tfname} : ${custom || ""} $(SCRIPTS) | $(BUILD) $(DIST)/${dir}/
|
||||
@echo Building ${filename}, with ${hives.join(" ")}
|
||||
$(GENERATE) ${hives.join(" ")} ${familyDirective} ${output} ${charmapOutput}
|
||||
`;
|
||||
definedBuildSeqs[tfname] = true;
|
||||
}
|
||||
buf += `
|
||||
${target} : ${tfname} | $(DIST)/${dir}/ttf/
|
||||
@echo Hinting and optimizing ${tfname} '->' $@
|
||||
@otfccbuild ${tfname} -o $(BUILD)/${filename}.1.ttf -O3 --keep-average-char-width
|
||||
@ttfautohint -c $(BUILD)/${filename}.1.ttf $@
|
||||
@rm $(BUILD)/${filename}.1.ttf
|
||||
${unhintedTarget} : ${tfname} | $(DIST)/${dir}/ttf-unhinted/
|
||||
@otfccbuild ${tfname} -o $@ -O3 --keep-average-char-width
|
||||
${woffTarget} : ${target} | $(DIST)/${dir}/woff/
|
||||
sfnt2woff $<
|
||||
mv $(subst .ttf,.woff,$<) $@
|
||||
${woff2Target} : ${target} | $(DIST)/${dir}/woff2/
|
||||
woff2_compress $<
|
||||
mv $(subst .ttf,.woff2,$<) $@`;
|
||||
|
||||
return { buf, target, unhintedTarget, woffTarget, woff2Target, cmTarget };
|
||||
}
|
||||
|
||||
let designGroups = [];
|
||||
if (argv.custom) {
|
||||
designGroups = [
|
||||
{
|
||||
custom: "$(BUILD)/targets-" + argv.custom + ".mk",
|
||||
name: "customized-" + argv.custom,
|
||||
design: argv.design.trim().split(/ +/),
|
||||
prestyle: argv.prestyle.trim().split(/ +/),
|
||||
width: argv.width,
|
||||
infix: argv.custom,
|
||||
styles: {
|
||||
upright: argv.upright.trim().split(/ +/),
|
||||
italic: argv.italic.trim().split(/ +/),
|
||||
oblique: argv.oblique.trim().split(/ +/)
|
||||
}
|
||||
}
|
||||
];
|
||||
} else {
|
||||
designGroups = [
|
||||
{ name: "sans", design: [], dirPrefix: "" },
|
||||
{ name: "slab", design: ["slab"], dirPrefix: "" },
|
||||
{ name: "r-sans", design: [], dirPrefix: "01" },
|
||||
{ name: "r-sans-term", design: ["term"], dirPrefix: "02" },
|
||||
{ name: "r-sans-type", design: ["type"], dirPrefix: "03" },
|
||||
{ name: "r-sans-cc", design: ["cc"], dirPrefix: "04" },
|
||||
{ name: "r-slab", design: ["slab"], dirPrefix: "05" },
|
||||
{ name: "r-slab-term", design: ["term", "slab"], dirPrefix: "06" },
|
||||
{ name: "r-slab-type", design: ["type", "slab"], dirPrefix: "07" },
|
||||
{ name: "r-slab-cc", design: ["cc", "slab"], dirPrefix: "08" }
|
||||
];
|
||||
for (let j = 1; j <= 11; j++) {
|
||||
const tag = "ss" + pad(2, "" + j, "0");
|
||||
designGroups.push({
|
||||
name: `r-sans-${tag}`,
|
||||
design: [tag],
|
||||
dirPrefix: ``
|
||||
});
|
||||
designGroups.push({
|
||||
name: `r-sans-term-${tag}`,
|
||||
design: ["term", tag],
|
||||
dirPrefix: ``
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let makes = [];
|
||||
|
||||
for (let dg of designGroups) {
|
||||
let groupTargets = {
|
||||
ttf: [],
|
||||
upright: [],
|
||||
italic: [],
|
||||
oblique: [],
|
||||
ttf_unhinted: [],
|
||||
woff: [],
|
||||
woff2: []
|
||||
};
|
||||
const groupMapping = getMapping(dg);
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/${groupMapping.dir}/ : | $(DIST)/
|
||||
-@mkdir -p $@`
|
||||
);
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/${groupMapping.dir}/ttf/ : | $(DIST)/${groupMapping.dir}/
|
||||
-@mkdir -p $@`
|
||||
);
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/${groupMapping.dir}/ttf-unhinted/ : | $(DIST)/${groupMapping.dir}/
|
||||
-@mkdir -p $@`
|
||||
);
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/${groupMapping.dir}/woff/ : | $(DIST)/${groupMapping.dir}/
|
||||
-@mkdir -p $@`
|
||||
);
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/${groupMapping.dir}/woff2/ : | $(DIST)/${groupMapping.dir}/
|
||||
-@mkdir -p $@`
|
||||
);
|
||||
for (let weight of weights)
|
||||
for (let slantness of slantnesses) {
|
||||
let config = Object.create(dg);
|
||||
config.weight = weight;
|
||||
config.slantness = slantness;
|
||||
const mapping = getMapping(config);
|
||||
if (weight === "book" && slantness === "upright") {
|
||||
mapping.cm = true;
|
||||
}
|
||||
|
||||
let { buf, target, unhintedTarget, woffTarget, woff2Target, cmTarget } = createMake(
|
||||
mapping
|
||||
);
|
||||
makes.push(buf);
|
||||
groupTargets.ttf.push(target);
|
||||
groupTargets[slantness].push(target);
|
||||
groupTargets.ttf_unhinted.push(unhintedTarget);
|
||||
groupTargets.woff.push(woffTarget);
|
||||
groupTargets.woff2.push(woff2Target);
|
||||
}
|
||||
|
||||
makes.push(
|
||||
`fonts-${dg.name} : ${[...groupTargets.ttf, ...groupTargets.ttf_unhinted].join(" ")}`
|
||||
);
|
||||
makes.push(`fonts-${dg.name}-upright : ${groupTargets.upright.join(" ")}`);
|
||||
makes.push(`fonts-${dg.name}-italic : ${groupTargets.italic.join(" ")}`);
|
||||
makes.push(`fonts-${dg.name}-oblique : ${groupTargets.oblique.join(" ")}`);
|
||||
makes.push(`web-${dg.name} : ${groupTargets.woff.join(" ")} ${groupTargets.woff2.join(" ")}`);
|
||||
makes.push(
|
||||
`$(ARCHIVEDIR)/${groupMapping.dir}-$(VERSION).zip : fonts-${dg.name} web-${
|
||||
dg.name
|
||||
} | $(ARCHIVEDIR)/
|
||||
cd $(DIST)/${groupMapping.dir}/ && 7z a -tzip -r -mx=9 ../../$@ ./`
|
||||
);
|
||||
makes.push(`archive-${dg.name} : $(ARCHIVEDIR)/${groupMapping.dir}-$(VERSION).zip`);
|
||||
}
|
||||
|
||||
if (argv.custom) {
|
||||
} else {
|
||||
const ttcgroups = [
|
||||
{ groups: [designGroups[2], designGroups[3], designGroups[4], designGroups[5]] },
|
||||
{ groups: [designGroups[6], designGroups[7], designGroups[8], designGroups[9]] }
|
||||
];
|
||||
// ttc
|
||||
let ttcs = [];
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/ttc/ : | $(DIST)/
|
||||
-@mkdir -p $@`
|
||||
);
|
||||
for (let tg of ttcgroups) {
|
||||
for (let weight of weights) {
|
||||
let ttctargets = [];
|
||||
for (let slantness of slantnesses) {
|
||||
for (let dg of tg.groups) {
|
||||
let config = Object.create(dg);
|
||||
config.weight = weight;
|
||||
config.slantness = slantness;
|
||||
const mapping = getMapping(config);
|
||||
ttctargets.push(createMake(mapping).target);
|
||||
}
|
||||
}
|
||||
let config = Object.create(tg.groups[0]);
|
||||
config.weight = weight;
|
||||
config.slantness = "upright";
|
||||
const mapping = getMapping(config);
|
||||
ttcs.push(`$(DIST)/ttc/${mapping.filename}.ttc`);
|
||||
makes.push(
|
||||
`
|
||||
$(DIST)/ttc/${mapping.filename}.ttc : ${ttctargets.join(" ")} | $(DIST)/ttc/
|
||||
otfcc-ttcize -o $@ ${ttctargets.join(" ")}
|
||||
`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
makes.push(`ttc : ${ttcs.join(" ")}`);
|
||||
makes.push(
|
||||
`$(ARCHIVEDIR)/iosevka-pack-$(VERSION).zip : ttc | $(ARCHIVEDIR)/
|
||||
cd $(DIST)/ttc/ && 7z a -tzip -mx=9 ../../$@ ./*.ttc`
|
||||
);
|
||||
makes.push(`archive-ttc : $(ARCHIVEDIR)/iosevka-pack-$(VERSION).zip`);
|
||||
makes.push(`__default : fonts-sans fonts-slab`);
|
||||
makes.push(`__release : archive-ttc ${designGroups.map(g => "archive-" + g.name).join(" ")}`);
|
||||
}
|
||||
|
||||
console.log(makes.join("\n\n"));
|
|
@ -51,7 +51,7 @@ export : define [assignFontNames para metrics font] : begin
|
|||
nameFont font FAMILY : para.family + ' ' + compatFamilySuffix
|
||||
nameFont font STYLE compatStyle
|
||||
|
||||
nameFont font UNIQUE_NAME "\(para.family) \(para.style) \(para.version) (\(para.codename))" # Unique Name
|
||||
nameFont font UNIQUE_NAME "\(para.family) \(para.style) \(para.version)" # Unique Name
|
||||
|
||||
local fontfullName : if (para.style != 'Regular') (para.family + ' ' + para.style) para.family
|
||||
nameFont font FULL_NAME fontfullName # Full Name
|
||||
|
|
46
package.json
|
@ -1,21 +1,29 @@
|
|||
{
|
||||
"name": "iosevka",
|
||||
"version": "1.14.3",
|
||||
"main": "./generate.js",
|
||||
"engines": {
|
||||
"node": ">=8.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"bezier-js": "^2.2.3",
|
||||
"caryll-shapeops": "^0.3.1",
|
||||
"libspiro-js": "^0.3.1",
|
||||
"megaminx": "^0.3.3",
|
||||
"object-assign": "^4.1.1",
|
||||
"pad": "^1.1.0",
|
||||
"patel": "^0.32.1",
|
||||
"toml": "^2.3.2",
|
||||
"topsort": "0.0.2",
|
||||
"unorm": "^1.4.1",
|
||||
"yargs": "^8.0.2"
|
||||
}
|
||||
"name": "iosevka",
|
||||
"version": "2.0.0",
|
||||
"main": "./generate.js",
|
||||
"engines": {
|
||||
"node": ">=8.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "verda -f verdafile.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"bezier-js": "^2.2.3",
|
||||
"caryll-shapeops": "^0.3.1",
|
||||
"change-case": "^3.0.2",
|
||||
"libspiro-js": "^0.3.1",
|
||||
"megaminx": "^0.3.3",
|
||||
"object-assign": "^4.1.1",
|
||||
"otfcc-ttcize": "^0.8.0",
|
||||
"pad": "^1.1.0",
|
||||
"patel": "^0.32.1",
|
||||
"toml": "^2.3.2",
|
||||
"topsort": "0.0.2",
|
||||
"ttf2woff": "^2.0.1",
|
||||
"ttf2woff2": "^2.0.3",
|
||||
"unorm": "^1.4.1",
|
||||
"verda": "^0.1.4",
|
||||
"yargs": "^12.0.0"
|
||||
}
|
||||
}
|
||||
|
|
156
parameters.toml
|
@ -1,7 +1,4 @@
|
|||
[iosevka]
|
||||
family = 'Iosevka'
|
||||
version = '1.15.0'
|
||||
codename = 'Olivida'
|
||||
copyright = 'Copyright (c) 2015-2017 Belleve Invis.'
|
||||
licence = '''This font software is licenced under the SIL Open Font Licence, Version 1.1. This is licence is avaliable with a FAQ at: http://scripts.sil.org/OFL. This font software is distributes on an 'AS IS' basis, without warranties or conditions of any kind, either express or implied. See the SIL Open Font licence fot the specific language, premissions and limitations governing your use of this font software.'''
|
||||
manufacturer = 'Belleve Invis'
|
||||
|
@ -252,48 +249,33 @@ onebalance = 10
|
|||
overshootx = -16
|
||||
[slab.multiplies]
|
||||
sb = 1.1
|
||||
[slab.adds]
|
||||
family = " Slab"
|
||||
|
||||
### Spacings
|
||||
|
||||
[term]
|
||||
spacing = 0
|
||||
disableLigation = true
|
||||
|
||||
[term.adds]
|
||||
family = ' Term'
|
||||
|
||||
# Term variant with ligations
|
||||
[termlig]
|
||||
spacing = 0
|
||||
|
||||
[termlig.adds]
|
||||
family = ' Term-Lig'
|
||||
|
||||
[type]
|
||||
inherits = ["xx-type"]
|
||||
spacing = 2
|
||||
|
||||
[type.adds]
|
||||
family = " Type"
|
||||
|
||||
[cc]
|
||||
inherits = ["xx-cc"]
|
||||
spacing = 3
|
||||
|
||||
[cc.adds]
|
||||
family = 'CC'
|
||||
|
||||
### Widths
|
||||
###### Widths
|
||||
# NOTE: this section is highly experimental
|
||||
# HANDLE WITH EXTREME CARE
|
||||
# Expanded : I heard someone want it being wider...
|
||||
[wd-expanded.multiplies]
|
||||
width = 1.15
|
||||
sb = 1.15
|
||||
[expanded]
|
||||
inherits = ['wd-expanded']
|
||||
[expanded.adds]
|
||||
family = ' Expanded'
|
||||
|
||||
# Compressed : And someone else want it being narrower
|
||||
[wd-compressed.multiplies]
|
||||
|
@ -301,8 +283,6 @@ width = 0.9
|
|||
sb = 0.9
|
||||
[compressed]
|
||||
inherits = ['wd-compressed']
|
||||
[compressed.adds]
|
||||
family = ' Compressed'
|
||||
|
||||
###### Full-width codes
|
||||
[xx-type]
|
||||
|
@ -371,8 +351,6 @@ fullwidth_codes = [
|
|||
# stress-fw : force distinguish full-widths
|
||||
[stress-fw]
|
||||
stressFW = true
|
||||
[stress-fw.adds]
|
||||
family = " StFW"
|
||||
|
||||
# Default ligation set configuration
|
||||
[ligset-haskell]
|
||||
|
@ -402,6 +380,134 @@ defLigSet = "PURS"
|
|||
[ligset-coq]
|
||||
defLigSet = "XV00"
|
||||
|
||||
###### Leading
|
||||
[leading-750]
|
||||
leading = 750
|
||||
[leading-1000]
|
||||
leading = 1000
|
||||
[leading-1250]
|
||||
leading = 1250
|
||||
[leading-1500]
|
||||
leading = 1500
|
||||
[leading-1750]
|
||||
leading = 1750
|
||||
[leading-2000]
|
||||
leading = 2000
|
||||
|
||||
###### Powerline
|
||||
[powerline-scale-y-750]
|
||||
powerlineScaleY = 0.75
|
||||
[powerline-scale-y-875]
|
||||
powerlineScaleY = 0.875
|
||||
[powerline-scale-y-1000]
|
||||
powerlineScaleY = 1
|
||||
[powerline-scale-y-1125]
|
||||
powerlineScaleY = 1.125
|
||||
[powerline-scale-y-1250]
|
||||
powerlineScaleY = 1.25
|
||||
[powerline-scale-y-1375]
|
||||
powerlineScaleY = 1.375
|
||||
[powerline-scale-y-1500]
|
||||
powerlineScaleY = 1.5
|
||||
[powerline-scale-x-750]
|
||||
powerlineScaleX = 0.75
|
||||
[powerline-scale-x-875]
|
||||
powerlineScaleX = 0.875
|
||||
[powerline-scale-x-1000]
|
||||
powerlineScaleX = 1
|
||||
[powerline-scale-x-1125]
|
||||
powerlineScaleX = 1.125
|
||||
[powerline-scale-x-1250]
|
||||
powerlineScaleX = 1.25
|
||||
[powerline-scale-x-1375]
|
||||
powerlineScaleX = 1.375
|
||||
[powerline-scale-x-1500]
|
||||
powerlineScaleX = 1.5
|
||||
[powerline-shift-y-n500]
|
||||
powerlineShiftY = -500
|
||||
[powerline-shift-y-n450]
|
||||
powerlineShiftY = -450
|
||||
[powerline-shift-y-n400]
|
||||
powerlineShiftY = -400
|
||||
[powerline-shift-y-n350]
|
||||
powerlineShiftY = -350
|
||||
[powerline-shift-y-n300]
|
||||
powerlineShiftY = -300
|
||||
[powerline-shift-y-n250]
|
||||
powerlineShiftY = -250
|
||||
[powerline-shift-y-n200]
|
||||
powerlineShiftY = -200
|
||||
[powerline-shift-y-n150]
|
||||
powerlineShiftY = -150
|
||||
[powerline-shift-y-n100]
|
||||
powerlineShiftY = -100
|
||||
[powerline-shift-y-n50]
|
||||
powerlineShiftY = -50
|
||||
[powerline-shift-y-0]
|
||||
powerlineShiftY = 0
|
||||
[powerline-shift-y-p50]
|
||||
powerlineShiftY = 50
|
||||
[powerline-shift-y-p100]
|
||||
powerlineShiftY = 100
|
||||
[powerline-shift-y-p150]
|
||||
powerlineShiftY = 150
|
||||
[powerline-shift-y-p200]
|
||||
powerlineShiftY = 200
|
||||
[powerline-shift-y-p250]
|
||||
powerlineShiftY = 250
|
||||
[powerline-shift-y-p300]
|
||||
powerlineShiftY = 300
|
||||
[powerline-shift-y-p350]
|
||||
powerlineShiftY = 350
|
||||
[powerline-shift-y-p400]
|
||||
powerlineShiftY = 400
|
||||
[powerline-shift-y-p450]
|
||||
powerlineShiftY = 450
|
||||
[powerline-shift-y-p500]
|
||||
powerlineShiftY = 500
|
||||
[powerline-shift-x-n500]
|
||||
powerlineShiftX = -500
|
||||
[powerline-shift-x-n450]
|
||||
powerlineShiftX = -450
|
||||
[powerline-shift-x-n400]
|
||||
powerlineShiftX = -400
|
||||
[powerline-shift-x-n350]
|
||||
powerlineShiftX = -350
|
||||
[powerline-shift-x-n300]
|
||||
powerlineShiftX = -300
|
||||
[powerline-shift-x-n250]
|
||||
powerlineShiftX = -250
|
||||
[powerline-shift-x-n200]
|
||||
powerlineShiftX = -200
|
||||
[powerline-shift-x-n150]
|
||||
powerlineShiftX = -150
|
||||
[powerline-shift-x-n100]
|
||||
powerlineShiftX = -100
|
||||
[powerline-shift-x-n50]
|
||||
powerlineShiftX = -50
|
||||
[powerline-shift-x-0]
|
||||
powerlineShiftX = 0
|
||||
[powerline-shift-x-p50]
|
||||
powerlineShiftX = 50
|
||||
[powerline-shift-x-p100]
|
||||
powerlineShiftX = 100
|
||||
[powerline-shift-x-p150]
|
||||
powerlineShiftX = 150
|
||||
[powerline-shift-x-p200]
|
||||
powerlineShiftX = 200
|
||||
[powerline-shift-x-p250]
|
||||
powerlineShiftX = 250
|
||||
[powerline-shift-x-p300]
|
||||
powerlineShiftX = 300
|
||||
[powerline-shift-x-p350]
|
||||
powerlineShiftX = 350
|
||||
[powerline-shift-x-p400]
|
||||
powerlineShiftX = 400
|
||||
[powerline-shift-x-p450]
|
||||
powerlineShiftX = 450
|
||||
[powerline-shift-x-p500]
|
||||
powerlineShiftX = 500
|
||||
|
||||
# Compatibility PUA ligature sample
|
||||
# [[iosevka.compLig]]
|
||||
# unicode = 57600 # 0xE100
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
@import url(iosevka.css)
|
||||
@import url(iosevka-slab.css)
|
||||
@import url(iosevka/webfont.css)
|
||||
@import url(iosevka-slab/webfont.css)
|
||||
|
||||
.thin { font-weight: 100 }
|
||||
.extralight { font-weight: 200 }
|
||||
|
@ -11,19 +11,19 @@
|
|||
.heavy { font-weight: 900 }
|
||||
.italic { font-style: italic }
|
||||
.oblique { font-style: oblique }
|
||||
.slab { font-family: "Iosevka Slab", monospace }
|
||||
.slab { font-family: "Iosevka Slab Web", monospace }
|
||||
|
||||
html,body{
|
||||
margin: 0
|
||||
padding:0
|
||||
}
|
||||
body {
|
||||
font-family: "Iosevka"
|
||||
font-family: "Iosevka Web"
|
||||
background: #008000
|
||||
padding-bottom: 60em
|
||||
font-size: 15px
|
||||
}
|
||||
pre, code { font-family: "Iosevka"; }
|
||||
pre, code { font-family: "Iosevka Web"; }
|
||||
|
||||
::-webkit-scrollbar {display: none;}
|
||||
|
||||
|
|
|
@ -1,150 +0,0 @@
|
|||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 100;
|
||||
src: url('assets/iosevka-slab-thin.woff2') format('woff2'), url('assets/iosevka-slab-thin.woff') format('woff'), url('assets/iosevka-slab-thin.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-thinitalic.woff2') format('woff2'), url('assets/iosevka-slab-thinitalic.woff') format('woff'), url('assets/iosevka-slab-thinitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 100;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-thinoblique.woff2') format('woff2'), url('assets/iosevka-slab-thinoblique.woff') format('woff'), url('assets/iosevka-slab-thinoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 200;
|
||||
src: url('assets/iosevka-slab-extralight.woff2') format('woff2'), url('assets/iosevka-slab-extralight.woff') format('woff'), url('assets/iosevka-slab-extralight.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-extralightitalic.woff2') format('woff2'), url('assets/iosevka-slab-extralightitalic.woff') format('woff'), url('assets/iosevka-slab-extralightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 200;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-extralightoblique.woff2') format('woff2'), url('assets/iosevka-slab-extralightoblique.woff') format('woff'), url('assets/iosevka-slab-extralightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 300;
|
||||
src: url('assets/iosevka-slab-light.woff2') format('woff2'), url('assets/iosevka-slab-light.woff') format('woff'), url('assets/iosevka-slab-light.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-lightitalic.woff2') format('woff2'), url('assets/iosevka-slab-lightitalic.woff') format('woff'), url('assets/iosevka-slab-lightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 300;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-lightoblique.woff2') format('woff2'), url('assets/iosevka-slab-lightoblique.woff') format('woff'), url('assets/iosevka-slab-lightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
src: url('assets/iosevka-slab-regular.woff2') format('woff2'), url('assets/iosevka-slab-regular.woff') format('woff'), url('assets/iosevka-slab-regular.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-italic.woff2') format('woff2'), url('assets/iosevka-slab-italic.woff') format('woff'), url('assets/iosevka-slab-italic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-oblique.woff2') format('woff2'), url('assets/iosevka-slab-oblique.woff') format('woff'), url('assets/iosevka-slab-oblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-medium.woff2') format('woff2'), url('assets/iosevka-slab-medium.woff') format('woff'), url('assets/iosevka-slab-medium.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-mediumitalic.woff2') format('woff2'), url('assets/iosevka-slab-mediumitalic.woff') format('woff'), url('assets/iosevka-slab-mediumitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-mediumoblique.woff2') format('woff2'), url('assets/iosevka-slab-mediumoblique.woff') format('woff'), url('assets/iosevka-slab-mediumoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-slab-semibold.woff2') format('woff2'), url('assets/iosevka-slab-semibold.woff') format('woff'), url('assets/iosevka-slab-semibold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-slab-semibolditalic.woff2') format('woff2'), url('assets/iosevka-slab-semibolditalic.woff') format('woff'), url('assets/iosevka-slab-semibolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-slab-semiboldoblique.woff2') format('woff2'), url('assets/iosevka-slab-semiboldoblique.woff') format('woff'), url('assets/iosevka-slab-semiboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-bold.woff2') format('woff2'), url('assets/iosevka-slab-bold.woff') format('woff'), url('assets/iosevka-slab-bold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-bolditalic.woff2') format('woff2'), url('assets/iosevka-slab-bolditalic.woff') format('woff'), url('assets/iosevka-slab-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-boldoblique.woff2') format('woff2'), url('assets/iosevka-slab-boldoblique.woff') format('woff'), url('assets/iosevka-slab-boldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-slab-extrabold.woff2') format('woff2'), url('assets/iosevka-slab-extrabold.woff') format('woff'), url('assets/iosevka-slab-extrabold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-slab-extrabolditalic.woff2') format('woff2'), url('assets/iosevka-slab-extrabolditalic.woff') format('woff'), url('assets/iosevka-slab-extrabolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-slab-extraboldoblique.woff2') format('woff2'), url('assets/iosevka-slab-extraboldoblique.woff') format('woff'), url('assets/iosevka-slab-extraboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavy.woff2') format('woff2'), url('assets/iosevka-slab-heavy.woff') format('woff'), url('assets/iosevka-slab-heavy.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavyitalic.woff2') format('woff2'), url('assets/iosevka-slab-heavyitalic.woff') format('woff'), url('assets/iosevka-slab-heavyitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavyoblique.woff2') format('woff2'), url('assets/iosevka-slab-heavyoblique.woff') format('woff'), url('assets/iosevka-slab-heavyoblique.ttf') format('truetype');
|
||||
}
|
|
@ -1,150 +0,0 @@
|
|||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 100;
|
||||
src: url('assets/iosevka-thin.woff2') format('woff2'), url('assets/iosevka-thin.woff') format('woff'), url('assets/iosevka-thin.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-thinitalic.woff2') format('woff2'), url('assets/iosevka-thinitalic.woff') format('woff'), url('assets/iosevka-thinitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 100;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-thinoblique.woff2') format('woff2'), url('assets/iosevka-thinoblique.woff') format('woff'), url('assets/iosevka-thinoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 200;
|
||||
src: url('assets/iosevka-extralight.woff2') format('woff2'), url('assets/iosevka-extralight.woff') format('woff'), url('assets/iosevka-extralight.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-extralightitalic.woff2') format('woff2'), url('assets/iosevka-extralightitalic.woff') format('woff'), url('assets/iosevka-extralightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 200;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-extralightoblique.woff2') format('woff2'), url('assets/iosevka-extralightoblique.woff') format('woff'), url('assets/iosevka-extralightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 300;
|
||||
src: url('assets/iosevka-light.woff2') format('woff2'), url('assets/iosevka-light.woff') format('woff'), url('assets/iosevka-light.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-lightitalic.woff2') format('woff2'), url('assets/iosevka-lightitalic.woff') format('woff'), url('assets/iosevka-lightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 300;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-lightoblique.woff2') format('woff2'), url('assets/iosevka-lightoblique.woff') format('woff'), url('assets/iosevka-lightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
src: url('assets/iosevka-regular.woff2') format('woff2'), url('assets/iosevka-regular.woff') format('woff'), url('assets/iosevka-regular.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-italic.woff2') format('woff2'), url('assets/iosevka-italic.woff') format('woff'), url('assets/iosevka-italic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-oblique.woff2') format('woff2'), url('assets/iosevka-oblique.woff') format('woff'), url('assets/iosevka-oblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-medium.woff2') format('woff2'), url('assets/iosevka-medium.woff') format('woff'), url('assets/iosevka-medium.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-mediumitalic.woff2') format('woff2'), url('assets/iosevka-mediumitalic.woff') format('woff'), url('assets/iosevka-mediumitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-mediumoblique.woff2') format('woff2'), url('assets/iosevka-mediumoblique.woff') format('woff'), url('assets/iosevka-mediumoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-semibold.woff2') format('woff2'), url('assets/iosevka-semibold.woff') format('woff'), url('assets/iosevka-semibold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-semibolditalic.woff2') format('woff2'), url('assets/iosevka-semibolditalic.woff') format('woff'), url('assets/iosevka-semibolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-semiboldoblique.woff2') format('woff2'), url('assets/iosevka-semiboldoblique.woff') format('woff'), url('assets/iosevka-semiboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-bold.woff2') format('woff2'), url('assets/iosevka-bold.woff') format('woff'), url('assets/iosevka-bold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-bolditalic.woff2') format('woff2'), url('assets/iosevka-bolditalic.woff') format('woff'), url('assets/iosevka-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-boldoblique.woff2') format('woff2'), url('assets/iosevka-boldoblique.woff') format('woff'), url('assets/iosevka-boldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-extrabold.woff2') format('woff2'), url('assets/iosevka-extrabold.woff') format('woff'), url('assets/iosevka-extrabold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-extrabolditalic.woff2') format('woff2'), url('assets/iosevka-extrabolditalic.woff') format('woff'), url('assets/iosevka-extrabolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-extraboldoblique.woff2') format('woff2'), url('assets/iosevka-extraboldoblique.woff') format('woff'), url('assets/iosevka-extraboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavy.woff2') format('woff2'), url('assets/iosevka-heavy.woff') format('woff'), url('assets/iosevka-heavy.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavyitalic.woff2') format('woff2'), url('assets/iosevka-heavyitalic.woff') format('woff'), url('assets/iosevka-heavyitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavyoblique.woff2') format('woff2'), url('assets/iosevka-heavyoblique.woff') format('woff'), url('assets/iosevka-heavyoblique.ttf') format('truetype');
|
||||
}
|
|
@ -1,312 +0,0 @@
|
|||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 100;
|
||||
src: url('assets/iosevka-thin.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-thinitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 100;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-thinoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 200;
|
||||
src: url('assets/iosevka-extralight.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-extralightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 200;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-extralightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 300;
|
||||
src: url('assets/iosevka-light.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-lightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 300;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-lightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
src: url('assets/iosevka-regular.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-italic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-oblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-medium.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-mediumitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-mediumoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-semibold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-semibolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-semiboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-bold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-boldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-extrabold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-extrabolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-extraboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavy.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavyitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavyoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 100;
|
||||
src: url('assets/iosevka-slab-thin.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-thinitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 100;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-thinoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 200;
|
||||
src: url('assets/iosevka-slab-extralight.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-extralightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 200;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-extralightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 300;
|
||||
src: url('assets/iosevka-slab-light.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-lightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 300;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-lightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
src: url('assets/iosevka-slab-regular.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-italic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-oblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-medium.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-mediumitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-mediumoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-slab-semibold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-slab-semibolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 600;
|
||||
src: url('assets/iosevka-slab-semiboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-bold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-boldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-slab-extrabold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-slab-extrabolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 800;
|
||||
src: url('assets/iosevka-slab-extraboldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavy.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavyitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: IosevkaSlabWEB;
|
||||
font-style: oblique;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavyoblique.ttf') format('truetype');
|
||||
}
|
||||
|
||||
.thin { font-weight: 100 }
|
||||
.extralight { font-weight: 200 }
|
||||
.light { font-weight: 300 }
|
||||
.medium { font-weight: 500 }
|
||||
.semibold { font-weight: 600 }
|
||||
.bold { font-weight: 700 }
|
||||
.extrabold { font-weight: 800 }
|
||||
.heavy { font-weight: 900 }
|
||||
.italic { font-style: italic }
|
||||
.oblique { font-style: oblique }
|
||||
.slab { font-family: "IosevkaSlabWEB", monospace }
|
|
@ -1,49 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Iosevka</title>
|
||||
<style>
|
||||
|
||||
</style>
|
||||
<script src="https://cdn.bootcss.com/vue/2.1.8/vue.min.js"></script>
|
||||
<link rel="stylesheet" href="specimen.css">
|
||||
<link rel="stylesheet" href="http://maxcdn.icons8.com/fonts/icons8_win10/1.0./styles.min.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="picker">
|
||||
<span class="title pp" v-bind:class="[current.cls]">Iosevka {{current.display}} Specimen<span class="icon icons8-angle-down"></span></span>
|
||||
<div class="menu">
|
||||
<div class="group" v-for="group in fonts">
|
||||
<a href="#" v-for="item in group" v-on:click.prevent="choose(item)" class="pp" v-bind:class="[item.cls, item === current ? 'active' : '']">{{item.display}}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="display">
|
||||
<div id="waiting" v-show="(!!waiting)"></div>
|
||||
<div class="show" v-bind:class="[currentFont.cls]">
|
||||
<p class="waterfall" v-for="size in waterfall" v-bind:style="{fontSize: (size / 14 + 'rem')}">float Fox.quick(h){!isBrown && jumpO̶̸ver(dogeś̠̣.lazy)}</p>
|
||||
<pre class="langs"><code class=patel><span class=keyword>define</span> samples : <span class=keyword>object</span><template v-for="sample in samples">
|
||||
{<span class=qualifier>.lang</span> <span class=string>'{{sample.lang}}'</span>{{sample.spaces}}<span class=qualifier>.sample</span> <span class=string lang="{{sample.code}}">'<span v-html="sample.sample"></span>'</span>}<span class=comment>{{sample.comment}}</span></template></code></pre>
|
||||
</div>
|
||||
<div v-for="block in blocks" class="usheet show" v-bind:class="[block.font.cls]">
|
||||
<h3><span>{{block.name}}</span></h3>
|
||||
<table class="block">
|
||||
<tr class="row" v-for="row in block.rows">
|
||||
<td class="indicator"><s>x</s>
|
||||
<n>U+{{row.startIndex}}</n>
|
||||
</td>
|
||||
<td v-for="char in row.chars" v-bind:class="[char.name ? 'present' : 'missing']" v-bind:title="char.name">
|
||||
<d v-bind:class="[(char.isMark ? 'mark' : char.isTie ? 'tie' : 'simple')]">{{char.char}}</d>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<script src="specimen.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,279 +0,0 @@
|
|||
@import url(fonts.css);
|
||||
html {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: black;
|
||||
background-image: linear-gradient(white 50%, #888 50%);
|
||||
background-position: 0px 1.075em;
|
||||
background-repeat: repeat-x;
|
||||
background-size: 2px 2px;
|
||||
text-decoration: none;
|
||||
text-shadow: white -1px 0px 0px, white 1px 0px 0px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
background-image: linear-gradient(white 50%, black 50%);
|
||||
}
|
||||
|
||||
body {
|
||||
width: 68rem;
|
||||
margin: 0 auto;
|
||||
padding: 4rem 0;
|
||||
}
|
||||
|
||||
body, .show, .show samp, .pp {
|
||||
font-family: "IosevkaWEB", monospace;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.langs {
|
||||
-moz-font-feature-settings: "locl";
|
||||
-ms-font-feature-settings: "locl";
|
||||
-webkit-font-feature-settings: "locl";
|
||||
font-feature-settings: "locl";
|
||||
}
|
||||
|
||||
.cc, .cc samp {
|
||||
font-family: "IosevkaCCWEB", monospace!important
|
||||
}
|
||||
|
||||
.slab, .slab samp {
|
||||
font-family: "IosevkaSlabWEB", monospace!important
|
||||
}
|
||||
|
||||
.cc.slab, .cc.slab samp {
|
||||
font-family: "IosevkaCCSlabWEB", monospace!important
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.5rem 0;
|
||||
}
|
||||
|
||||
.show {
|
||||
font-size: 2rem;
|
||||
width: 68rem;
|
||||
}
|
||||
|
||||
.show table.block {
|
||||
width: 68rem;
|
||||
border: none;
|
||||
table-layout: fixed;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.show table.block td {
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
line-height: 2rem;
|
||||
padding: 1rem;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
cursor: default;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.show table.block td.missing {
|
||||
opacity: 0.1
|
||||
}
|
||||
|
||||
.show table.block td > d.mark:before {
|
||||
content: "\E09E";
|
||||
color: #ddd;
|
||||
margin-right: -0.5em;
|
||||
}
|
||||
|
||||
.show table.block td > d.tie:before, .show table.block td > d.tie:after {
|
||||
content: "\E09E";
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
.show table.block td.indicator > n {
|
||||
display: block;
|
||||
margin-top: -2rem;
|
||||
margin-left: -0.5em;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.show table.block td.indicator > s {
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 2rem;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.show table.block td.indicator > s:after {
|
||||
display: inline-block;
|
||||
content: '';
|
||||
position: relative;
|
||||
top: -1em;
|
||||
left: 3rem;
|
||||
width: 64rem;
|
||||
height: calc(0.52em - 2px);
|
||||
margin-right: -2em;
|
||||
border-top: 1px dashed rgba(0, 0, 255, 0.1);
|
||||
border-bottom: 1px dashed rgba(255, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.show .lipsum {
|
||||
font-size: 1rem;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
#picker {
|
||||
display: block;
|
||||
position: fixed;
|
||||
z-index: 9999;
|
||||
top: 0;
|
||||
left: 50%;
|
||||
font-size: 3rem;
|
||||
height: 4rem;
|
||||
margin-left: -34.5rem;
|
||||
width: 69rem;
|
||||
}
|
||||
|
||||
#picker .menu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 4rem;
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
#picker:hover .menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#picker .menu .group {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#picker .menu .group a {
|
||||
display: block;
|
||||
padding: 0.5rem;
|
||||
flex: 1;
|
||||
min-width: 10rem;
|
||||
background: #eee;
|
||||
text-shadow: none;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
#picker .menu .group a.italic, #picker .menu .group a.oblique {
|
||||
flex: 2
|
||||
}
|
||||
|
||||
#picker .menu .group a.slab {
|
||||
flex: 5
|
||||
}
|
||||
|
||||
#picker .menu .group a.slab.italic, #picker .menu .group a.slab.oblique {
|
||||
flex: 7
|
||||
}
|
||||
|
||||
#picker .menu .group a:hover {
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
#picker .title {
|
||||
background: black;
|
||||
color: white;
|
||||
display: block;
|
||||
line-height: 3rem;
|
||||
height: 3rem;
|
||||
padding: 0.5rem;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#picker .title .icon {
|
||||
position: absolute;
|
||||
right: 0.75rem;
|
||||
top: 0.5rem;
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
.usheet h3 {
|
||||
height: 0;
|
||||
position: relative;
|
||||
font-size: 1rem;
|
||||
font-weight: inherit;
|
||||
margin: 0 0 -1px;
|
||||
text-align: right;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
.usheet h3 span {
|
||||
display: block;
|
||||
position: absolute;
|
||||
right: 100%;
|
||||
background: black;
|
||||
color: white;
|
||||
padding: 0 0.25em;
|
||||
}
|
||||
|
||||
#waiting {
|
||||
position: fixed;
|
||||
font-size: 2.5rem;
|
||||
bottom: 0.4em;
|
||||
left: 0.4em;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
border: 0.15em dotted black;
|
||||
background: white;
|
||||
border-radius: 1em;
|
||||
-webkit-animation: spin 1s infinite linear;
|
||||
-moz-animation: spin 1s infinite linear;
|
||||
-ms-animation: spin 1s infinite linear;
|
||||
animation: spin 1s infinite linear;
|
||||
}
|
||||
|
||||
@-moz-keyframes spin {
|
||||
from {
|
||||
-moz-transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
-moz-transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes spin {
|
||||
from {
|
||||
-webkit-transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
-webkit-transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
pre, code, pre span, code span {
|
||||
font-size: 1rem;
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
.keyword {
|
||||
color: blue
|
||||
}
|
||||
|
||||
.string {
|
||||
color: green
|
||||
}
|
||||
|
||||
.qualifier {
|
||||
color: #419
|
||||
}
|
||||
|
||||
.comment {
|
||||
color: #999
|
||||
}
|
|
@ -1,654 +0,0 @@
|
|||
function padzero(s, n) {
|
||||
while (s.length < n) s = "0" + s;
|
||||
return s;
|
||||
}
|
||||
var BLOCKSIZE = 16 * 4;
|
||||
var fonts = [
|
||||
[
|
||||
{ name: "iosevka-thin", cls: "thin", display: "Thin" },
|
||||
{ name: "iosevka-slab-thin", cls: "slab thin", display: "Slab Thin" },
|
||||
{ name: "iosevka-thinitalic", cls: "thin italic", display: "Thin Italic" },
|
||||
{ name: "iosevka-slab-thinitalic", cls: "slab thin italic", display: "Slab Thin Italic" },
|
||||
{ name: "iosevka-thinoblique", cls: "thin oblique", display: "Thin Oblique" },
|
||||
{ name: "iosevka-slab-thinoblique", cls: "slab thin oblique", display: "Slab Thin Oblique" }
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-extralight", cls: "extralight", display: "Extralight" },
|
||||
{ name: "iosevka-slab-extralight", cls: "slab extralight", display: "Slab Extralight" },
|
||||
{
|
||||
name: "iosevka-extralightitalic",
|
||||
cls: "extralight italic",
|
||||
display: "Extralight Italic"
|
||||
},
|
||||
{
|
||||
name: "iosevka-slab-extralightitalic",
|
||||
cls: "slab extralight italic",
|
||||
display: "Slab Extralight Italic"
|
||||
},
|
||||
{
|
||||
name: "iosevka-extralightoblique",
|
||||
cls: "extralight oblique",
|
||||
display: "Extralight Oblique"
|
||||
},
|
||||
{
|
||||
name: "iosevka-slab-extralightoblique",
|
||||
cls: "slab extralight oblique",
|
||||
display: "Slab Extralight Oblique"
|
||||
}
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-light", cls: "light", display: "Light" },
|
||||
{ name: "iosevka-slab-light", cls: "slab light", display: "Slab Light" },
|
||||
{ name: "iosevka-lightitalic", cls: "light italic", display: "Light Italic" },
|
||||
{
|
||||
name: "iosevka-slab-lightitalic",
|
||||
cls: "slab light italic",
|
||||
display: "Slab Light Italic"
|
||||
},
|
||||
{ name: "iosevka-lightoblique", cls: "light oblique", display: "Light Oblique" },
|
||||
{
|
||||
name: "iosevka-slab-lightoblique",
|
||||
cls: "slab light oblique",
|
||||
display: "Slab Light Oblique"
|
||||
}
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-regular", cls: "", display: "Regular" },
|
||||
{ name: "iosevka-slab-regular", cls: "slab", display: "Slab" },
|
||||
{ name: "iosevka-italic", cls: "italic", display: "Italic" },
|
||||
{ name: "iosevka-slab-italic", cls: "slab italic", display: "Slab Italic" },
|
||||
{ name: "iosevka-oblique", cls: "oblique", display: "Oblique" },
|
||||
{ name: "iosevka-slab-oblique", cls: "slab oblique", display: "Slab Oblique" }
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-medium", cls: "medium", display: "Medium" },
|
||||
{ name: "iosevka-slab-medium", cls: "slab medium", display: "Slab Medium" },
|
||||
{ name: "iosevka-mediumitalic", cls: "medium italic", display: "Medium Italic" },
|
||||
{
|
||||
name: "iosevka-slab-mediumitalic",
|
||||
cls: "slab medium italic",
|
||||
display: "Slab Medium Italic"
|
||||
},
|
||||
{ name: "iosevka-mediumoblique", cls: "medium oblique", display: "Medium Oblique" },
|
||||
{
|
||||
name: "iosevka-slab-mediumoblique",
|
||||
cls: "slab medium oblique",
|
||||
display: "Slab Medium Oblique"
|
||||
}
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-semibold", cls: "semibold", display: "Semibold" },
|
||||
{ name: "iosevka-slab-semibold", cls: "slab semibold", display: "Slab Semibold" },
|
||||
{ name: "iosevka-semibolditalic", cls: "semibold italic", display: "Semibold Italic" },
|
||||
{
|
||||
name: "iosevka-slab-semibolditalic",
|
||||
cls: "slab semibold italic",
|
||||
display: "Slab Semibold Italic"
|
||||
},
|
||||
{ name: "iosevka-semiboldoblique", cls: "semibold oblique", display: "Semibold Oblique" },
|
||||
{
|
||||
name: "iosevka-slab-semiboldoblique",
|
||||
cls: "slab semibold oblique",
|
||||
display: "Slab Semibold Oblique"
|
||||
}
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-bold", cls: "bold", display: "Bold" },
|
||||
{ name: "iosevka-slab-bold", cls: "slab bold", display: "Slab Bold" },
|
||||
{ name: "iosevka-bolditalic", cls: "bold italic", display: "Bold Italic" },
|
||||
{ name: "iosevka-slab-bolditalic", cls: "slab bold italic", display: "Slab Bold Italic" },
|
||||
{ name: "iosevka-boldoblique", cls: "bold oblique", display: "Bold Oblique" },
|
||||
{ name: "iosevka-slab-boldoblique", cls: "slab bold oblique", display: "Slab Bold Oblique" }
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-extrabold", cls: "extrabold", display: "Extrabold" },
|
||||
{ name: "iosevka-slab-extrabold", cls: "slab extrabold", display: "Slab Extrabold" },
|
||||
{ name: "iosevka-extrabolditalic", cls: "extrabold italic", display: "Extrabold Italic" },
|
||||
{
|
||||
name: "iosevka-slab-extrabolditalic",
|
||||
cls: "slab extrabold italic",
|
||||
display: "Slab Extrabold Italic"
|
||||
},
|
||||
{
|
||||
name: "iosevka-extraboldoblique",
|
||||
cls: "extrabold oblique",
|
||||
display: "Extrabold Oblique"
|
||||
},
|
||||
{
|
||||
name: "iosevka-slab-extraboldoblique",
|
||||
cls: "slab extrabold oblique",
|
||||
display: "Slab Extrabold Oblique"
|
||||
}
|
||||
],
|
||||
[
|
||||
{ name: "iosevka-heavy", cls: "heavy", display: "Heavy" },
|
||||
{ name: "iosevka-slab-heavy", cls: "slab heavy", display: "Slab Heavy" },
|
||||
{ name: "iosevka-heavyitalic", cls: "heavy italic", display: "Heavy Italic" },
|
||||
{
|
||||
name: "iosevka-slab-heavyitalic",
|
||||
cls: "slab heavy italic",
|
||||
display: "Slab Heavy Italic"
|
||||
},
|
||||
{ name: "iosevka-heavyoblique", cls: "heavy oblique", display: "Heavy Oblique" },
|
||||
{
|
||||
name: "iosevka-slab-heavyoblique",
|
||||
cls: "slab heavy oblique",
|
||||
display: "Slab Heavy Oblique"
|
||||
}
|
||||
]
|
||||
];
|
||||
var REGULAR = 3;
|
||||
var lipsums = [
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur semper ipsum quam, at molestie libero euismod vitae. Etiam vehicula felis mi, et ultricies libero consequat at. Donec consequat, nunc id elementum tempor, lectus orci vulputate leo, eget lobortis lectus nulla sed orci. Donec in dolor non orci aliquet gravida. Nulla volutpat magna et nulla pretium, quis consequat nibh euismod. Suspendisse eget metus enim. Fusce vulputate scelerisque eros et consequat. Quisque dapibus accumsan augue, et semper lectus vehicula sit amet. Ut ornare venenatis tortor, non gravida tellus mattis interdum. In hac habitasse platea dictumst. Donec interdum commodo ex eu tincidunt. Curabitur non fermentum enim. Proin luctus orci ut commodo auctor. Pellentesque accumsan id sem eu semper. Sed non pharetra nibh. Vivamus mattis luctus arcu, a rutrum dui venenatis sit amet. aja ojo ojoined",
|
||||
"Troh tper es sos, bo slisxil spôrtjư uzx, cxital posteluf hrvatzem ili bi. Tenis lubôvijm roksăfnâvơi da din. Bo cxtir dajte lubim onă, dev ti silăju môrkva vecxer. Din om leto glfădju problêm. Sâm slơzxju răzumim vnimanie na, vsê ăzia kưdrju prôgram nô. Slôzxju zavoduf nơ den, hcê licơ sxkol toplju so. Vi knigis sidili polozxij bil, ne polnfju ovơcxjư dla, es ônâ mamâ pisajut mălôstis.",
|
||||
"Жят эним либриз аюдиам ад. Мыа ан одео нонумй опортэры, но дуо вэре эчжынт ыпикурэи. Ан вим алёквюам пыртенакж. Эжт но оратио факэтэ, дольорэ индоктум дыфинитеоным эжт ты.",
|
||||
"Κυεμ ορατιο δολορες υσυ εα, θε φιξ βωνορυμ σωνσεπθαμ, αδχυς δεφινιθιονεμ ιν εσθ. Υθ εσε ινιμισυς περ, περ ποσθυλανθ ινστρυσθιορ εα. Ναμ μυνδι θαθιων φερθερεμ νο, εσε ινερμις περφεσθο ετ μεα. Θε νες θωτα ρεφορμιδανς, ινερμις φασιλισις ετ σεα. Μελ λυδυς ταντας δελενιτι υθ, φις λιβερ σονγυε ηομερω ατ. Σεδ θριθανι συαφιθαθε γυβεργρεν ευ, ινθελλεγαμ συσιπιαντυρ δεφινιθιονεμ εα υσυ, ει κυο θαλε φερι ινθελλεγαμ. Φερο ασεντιορ θε μει, μαιορυμ γυβεργρεν αδ φιξ."
|
||||
];
|
||||
var sampleSentences = [
|
||||
{
|
||||
code: "en",
|
||||
lang: "English",
|
||||
sample: "Provide examples of how Jacky cheated on the big quiz. 1234567890"
|
||||
},
|
||||
{
|
||||
lang: "Powerline",
|
||||
sample:
|
||||
'<span style="background:black;color:white"> NORMAL </span><span style="background:#ccc;color:black;font-style:normal">\uE0B0</span><span style="background:#ccc;color:black"> <span style="font-style:normal">\uE0A0</span> master <span style="font-style:normal">\uE0B1</span> glyphs/powerline.patel </span><span style="background:#eee;color:#ccc;font-style:normal">\uE0B0</span><span style="background:#eee;color:#555"> dos <span style="font-style:normal">\uE0B3</span> utf-8 <span style="font-style:normal">\uE0B3</span> PatEL </span><span style="background:#eee;color:#ccc;font-style:normal">\uE0B2</span><span style="background:#ccc;color:black"> 2% </span><span style="background:#ccc;color:black;font-style:normal">\uE0B2</span><span style="color:white;background:black"> \uE0A1 1:1 </span>'
|
||||
},
|
||||
{ lang: "IPA", sample: "[ɢʷɯʔ.nas.doːŋ.kʰlja] [ŋan.ȵʑi̯wo.ɕi̯uĕn.ɣwa]" },
|
||||
{
|
||||
code: "bg",
|
||||
lang: "Bulgarian",
|
||||
sample: "Я, пазачът Вальо уж бди, а скришом хапва кюфтенца зад щайгите."
|
||||
},
|
||||
{
|
||||
code: "cs",
|
||||
lang: "Czech",
|
||||
sample:
|
||||
"Nechť již hříšné saxofony ďáblů rozezvučí síň úděsnými tóny waltzu, tanga a quickstepu."
|
||||
},
|
||||
{
|
||||
code: "fi",
|
||||
lang: "Finnish",
|
||||
sample: "Charles Darwin jammaili Åken hevixylofonilla Qatarin yöpub Zeligissä."
|
||||
},
|
||||
{
|
||||
code: "fr",
|
||||
lang: "French",
|
||||
sample: "Voix ambiguë d’un cœur qui au zéphyr préfère les jattes de kiwi."
|
||||
},
|
||||
{
|
||||
code: "de",
|
||||
lang: "German",
|
||||
sample: "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. Waſſerschloſʒ"
|
||||
},
|
||||
{
|
||||
code: "el",
|
||||
lang: "Greek",
|
||||
sample: "Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός."
|
||||
},
|
||||
{
|
||||
code: "el",
|
||||
lang: "Ancient Greek",
|
||||
sample: "Ἄδμηθ’, ὁρᾷς γὰρ τἀμὰ πράγμαθ' ὡς ἔχει, λέξαι θέλω σοι πρὶν θανεῖν ἃ βούλομαι. "
|
||||
},
|
||||
{
|
||||
code: "hu",
|
||||
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."
|
||||
},
|
||||
{
|
||||
code: "is",
|
||||
lang: "Icelandic",
|
||||
sample: "Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa."
|
||||
},
|
||||
{
|
||||
code: "ga",
|
||||
lang: "Irish",
|
||||
sample: "Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig."
|
||||
},
|
||||
{
|
||||
code: "lv",
|
||||
lang: "Latvian",
|
||||
sample: "Muļķa hipiji mēģina brīvi nogaršot celofāna žņaudzējčūsku."
|
||||
},
|
||||
{
|
||||
code: "lt",
|
||||
lang: "Lithuanian",
|
||||
sample: "Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą."
|
||||
},
|
||||
{
|
||||
code: "mk",
|
||||
lang: "Macedonian",
|
||||
sample: "Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех."
|
||||
},
|
||||
{
|
||||
code: "nb",
|
||||
lang: "Norwegian",
|
||||
sample: "Jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz"
|
||||
},
|
||||
{ code: "pl", lang: "Polish", sample: "Pchnąć w tę łódź jeża lub ośm skrzyń fig." },
|
||||
{
|
||||
code: "pt",
|
||||
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."
|
||||
},
|
||||
{
|
||||
code: "ro",
|
||||
lang: "Romanian",
|
||||
sample: "Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila."
|
||||
},
|
||||
{
|
||||
code: "ru",
|
||||
lang: "Russian",
|
||||
sample:
|
||||
"Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства."
|
||||
},
|
||||
{
|
||||
code: "sr",
|
||||
lang: "Serbian",
|
||||
sample: "Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу.",
|
||||
comment: " # Yes, we have Serbian variants!"
|
||||
},
|
||||
{
|
||||
code: "es",
|
||||
lang: "Spainish",
|
||||
sample:
|
||||
"Benjamín pidió una bebida de kiwi y fresa; Noé, sin vergüenza, la más exquisita champaña del menú."
|
||||
},
|
||||
{ code: "tr", lang: "Turkish", sample: "Pijamalı hasta yağız şoföre çabucak güvendi." },
|
||||
{
|
||||
code: "uk",
|
||||
lang: "Ukranian",
|
||||
sample: "Чуєш їх, доцю, га? Кумедна ж ти, прощайся без ґольфів!"
|
||||
}
|
||||
];
|
||||
|
||||
var blockData = [
|
||||
{ from: 0x0000, to: 0x007f, name: "Basic Latin" },
|
||||
{ from: 0x0080, to: 0x00ff, name: "Latin‑1 Supplement" },
|
||||
{ from: 0x0100, to: 0x017f, name: "Latin Extended‑A" },
|
||||
{ from: 0x0180, to: 0x024f, name: "Latin Extended‑B" },
|
||||
{ from: 0x0250, to: 0x02af, name: "IPA Extensions" },
|
||||
{ from: 0x02b0, to: 0x02ff, name: "Spacing Modifier Letters" },
|
||||
{ from: 0x0300, to: 0x036f, name: "Combining Diacritical Marks" },
|
||||
{ from: 0x0370, to: 0x03ff, name: "Greek\xA0and Coptic" },
|
||||
{ from: 0x0400, to: 0x04ff, name: "Cyrillic" },
|
||||
{ from: 0x0500, to: 0x052f, name: "Cyrillic Supplement" },
|
||||
{ from: 0x0530, to: 0x058f, name: "Armenian" },
|
||||
{ from: 0x0590, to: 0x05ff, name: "Hebrew" },
|
||||
{ from: 0x0600, to: 0x06ff, name: "Arabic" },
|
||||
{ from: 0x0700, to: 0x074f, name: "Syriac" },
|
||||
{ from: 0x0750, to: 0x077f, name: "Arabic Supplement" },
|
||||
{ from: 0x0780, to: 0x07bf, name: "Thaana" },
|
||||
{ from: 0x07c0, to: 0x07ff, name: "NKo" },
|
||||
{ from: 0x0800, to: 0x083f, name: "Samaritan" },
|
||||
{ from: 0x0840, to: 0x085f, name: "Mandaic" },
|
||||
{ from: 0x08a0, to: 0x08ff, name: "Arabic Extended‑A" },
|
||||
{ from: 0x0900, to: 0x097f, name: "Devanagari" },
|
||||
{ from: 0x0980, to: 0x09ff, name: "Bengali" },
|
||||
{ from: 0x0a00, to: 0x0a7f, name: "Gurmukhi" },
|
||||
{ from: 0x0a80, to: 0x0aff, name: "Gujarati" },
|
||||
{ from: 0x0b00, to: 0x0b7f, name: "Oriya" },
|
||||
{ from: 0x0b80, to: 0x0bff, name: "Tamil" },
|
||||
{ from: 0x0c00, to: 0x0c7f, name: "Telugu" },
|
||||
{ from: 0x0c80, to: 0x0cff, name: "Kannada" },
|
||||
{ from: 0x0d00, to: 0x0d7f, name: "Malayalam" },
|
||||
{ from: 0x0d80, to: 0x0dff, name: "Sinhala" },
|
||||
{ from: 0x0e00, to: 0x0e7f, name: "Thai" },
|
||||
{ from: 0x0e80, to: 0x0eff, name: "Lao" },
|
||||
{ from: 0x0f00, to: 0x0fff, name: "Tibetan" },
|
||||
{ from: 0x1000, to: 0x109f, name: "Myanmar" },
|
||||
{ from: 0x10a0, to: 0x10ff, name: "Georgian" },
|
||||
{ from: 0x1100, to: 0x11ff, name: "Hangul Jamo" },
|
||||
{ from: 0x1200, to: 0x137f, name: "Ethiopic" },
|
||||
{ from: 0x1380, to: 0x139f, name: "Ethiopic Supplement" },
|
||||
{ from: 0x13a0, to: 0x13ff, name: "Cherokee" },
|
||||
{ from: 0x1400, to: 0x167f, name: "Unified Canadian Aboriginal Syllabics" },
|
||||
{ from: 0x1680, to: 0x169f, name: "Ogham" },
|
||||
{ from: 0x16a0, to: 0x16ff, name: "Runic" },
|
||||
{ from: 0x1700, to: 0x171f, name: "Tagalog" },
|
||||
{ from: 0x1720, to: 0x173f, name: "Hanunoo" },
|
||||
{ from: 0x1740, to: 0x175f, name: "Buhid" },
|
||||
{ from: 0x1760, to: 0x177f, name: "Tagbanwa" },
|
||||
{ from: 0x1780, to: 0x17ff, name: "Khmer" },
|
||||
{ from: 0x1800, to: 0x18af, name: "Mongolian" },
|
||||
{ from: 0x18b0, to: 0x18ff, name: "Unified Canadian Aboriginal Syllabics Extended" },
|
||||
{ from: 0x1900, to: 0x194f, name: "Limbu" },
|
||||
{ from: 0x1950, to: 0x197f, name: "Tai Le" },
|
||||
{ from: 0x1980, to: 0x19df, name: "New Tai Lue" },
|
||||
{ from: 0x19e0, to: 0x19ff, name: "Khmer Symbols" },
|
||||
{ from: 0x1a00, to: 0x1a1f, name: "Buginese" },
|
||||
{ from: 0x1a20, to: 0x1aaf, name: "Tai Tham" },
|
||||
{ from: 0x1ab0, to: 0x1aff, name: "Combining Diacritical Marks Extended" },
|
||||
{ from: 0x1b00, to: 0x1b7f, name: "Balinese" },
|
||||
{ from: 0x1b80, to: 0x1bbf, name: "Sundanese" },
|
||||
{ from: 0x1bc0, to: 0x1bff, name: "Batak" },
|
||||
{ from: 0x1c00, to: 0x1c4f, name: "Lepcha" },
|
||||
{ from: 0x1c50, to: 0x1c7f, name: "Ol Chiki" },
|
||||
{ from: 0x1cc0, to: 0x1ccf, name: "Sundanese Supplement" },
|
||||
{ from: 0x1cd0, to: 0x1cff, name: "Vedic Extensions" },
|
||||
{ from: 0x1d00, to: 0x1d7f, name: "Phonetic Extensions" },
|
||||
{ from: 0x1d80, to: 0x1dbf, name: "Phonetic Extensions Supplement" },
|
||||
{ from: 0x1dc0, to: 0x1dff, name: "Combining Diacritical Marks Supplement" },
|
||||
{ from: 0x1e00, to: 0x1eff, name: "Latin Extended Additional" },
|
||||
{ from: 0x1f00, to: 0x1fff, name: "Greek Extended" },
|
||||
{ from: 0x2000, to: 0x206f, name: "General Punctuation" },
|
||||
{ from: 0x2070, to: 0x209f, name: "Superscripts\xA0and Subscripts" },
|
||||
{ from: 0x20a0, to: 0x20cf, name: "Currency Symbols" },
|
||||
{ from: 0x20d0, to: 0x20ff, name: "Combining Diacritical Marks for Symbols" },
|
||||
{ from: 0x2100, to: 0x214f, name: "Letterlike Symbols" },
|
||||
{ from: 0x2150, to: 0x218f, name: "Number Forms" },
|
||||
{ from: 0x2190, to: 0x21ff, name: "Arrows" },
|
||||
{ from: 0x2200, to: 0x22ff, name: "Mathematical Operators" },
|
||||
{ from: 0x2300, to: 0x23ff, name: "Miscellaneous Technical" },
|
||||
{ from: 0x2400, to: 0x243f, name: "Control Pictures" },
|
||||
{ from: 0x2440, to: 0x245f, name: "Optical Character Recognition" },
|
||||
{ from: 0x2460, to: 0x24ff, name: "Enclosed Alphanumerics" },
|
||||
{ from: 0x2500, to: 0x257f, name: "Box Drawing" },
|
||||
{ from: 0x2580, to: 0x259f, name: "Block Elements" },
|
||||
{ from: 0x25a0, to: 0x25ff, name: "Geometric Shapes" },
|
||||
{ from: 0x2600, to: 0x26ff, name: "Miscellaneous Symbols" },
|
||||
{ from: 0x2700, to: 0x27bf, name: "Dingbats" },
|
||||
{ from: 0x27c0, to: 0x27ef, name: "Miscellaneous Mathematical Symbols‑A" },
|
||||
{ from: 0x27f0, to: 0x27ff, name: "Supplemental Arrows‑A" },
|
||||
{ from: 0x2800, to: 0x28ff, name: "Braille Patterns" },
|
||||
{ from: 0x2900, to: 0x297f, name: "Supplemental Arrows‑B" },
|
||||
{ from: 0x2980, to: 0x29ff, name: "Miscellaneous Mathematical Symbols‑B" },
|
||||
{ from: 0x2a00, to: 0x2aff, name: "Supplemental Mathematical Operators" },
|
||||
{ from: 0x2b00, to: 0x2bff, name: "Miscellaneous Symbols\xA0and Arrows" },
|
||||
{ from: 0x2c00, to: 0x2c5f, name: "Glagolitic" },
|
||||
{ from: 0x2c60, to: 0x2c7f, name: "Latin Extended‑C" },
|
||||
{ from: 0x2c80, to: 0x2cff, name: "Coptic" },
|
||||
{ from: 0x2d00, to: 0x2d2f, name: "Georgian Supplement" },
|
||||
{ from: 0x2d30, to: 0x2d7f, name: "Tifinagh" },
|
||||
{ from: 0x2d80, to: 0x2ddf, name: "Ethiopic Extended" },
|
||||
{ from: 0x2de0, to: 0x2dff, name: "Cyrillic Extended‑A" },
|
||||
{ from: 0x2e00, to: 0x2e7f, name: "Supplemental Punctuation" },
|
||||
{ from: 0x2e80, to: 0x2eff, name: "CJK Radicals Supplement" },
|
||||
{ from: 0x2f00, to: 0x2fdf, name: "Kangxi Radicals" },
|
||||
{ from: 0x2ff0, to: 0x2fff, name: "Ideographic Description Characters" },
|
||||
{ from: 0x3000, to: 0x303f, name: "CJK Symbols\xA0and Punctuation" },
|
||||
{ from: 0x3040, to: 0x309f, name: "Hiragana" },
|
||||
{ from: 0x30a0, to: 0x30ff, name: "Katakana" },
|
||||
{ from: 0x3100, to: 0x312f, name: "Bopomofo" },
|
||||
{ from: 0x3130, to: 0x318f, name: "Hangul Compatibility Jamo" },
|
||||
{ from: 0x3190, to: 0x319f, name: "Kanbun" },
|
||||
{ from: 0x31a0, to: 0x31bf, name: "Bopomofo Extended" },
|
||||
{ from: 0x31c0, to: 0x31ef, name: "CJK Strokes" },
|
||||
{ from: 0x31f0, to: 0x31ff, name: "Katakana Phonetic Extensions" },
|
||||
{ from: 0x3200, to: 0x32ff, name: "Enclosed CJK Letters\xA0and Months" },
|
||||
{ from: 0x3300, to: 0x33ff, name: "CJK Compatibility" },
|
||||
{ from: 0x3400, to: 0x4dbf, name: "CJK Unified Ideographs Extension A" },
|
||||
{ from: 0x4dc0, to: 0x4dff, name: "Yijing Hexagram Symbols" },
|
||||
{ from: 0x4e00, to: 0x9fff, name: "CJK Unified Ideographs" },
|
||||
{ from: 0xa000, to: 0xa48f, name: "Yi Syllables" },
|
||||
{ from: 0xa490, to: 0xa4cf, name: "Yi Radicals" },
|
||||
{ from: 0xa4d0, to: 0xa4ff, name: "Lisu" },
|
||||
{ from: 0xa500, to: 0xa63f, name: "Vai" },
|
||||
{ from: 0xa640, to: 0xa69f, name: "Cyrillic Extended‑B" },
|
||||
{ from: 0xa6a0, to: 0xa6ff, name: "Bamum" },
|
||||
{ from: 0xa700, to: 0xa71f, name: "Modifier Tone Letters" },
|
||||
{ from: 0xa720, to: 0xa7ff, name: "Latin Extended‑D" },
|
||||
{ from: 0xa800, to: 0xa82f, name: "Syloti Nagri" },
|
||||
{ from: 0xa830, to: 0xa83f, name: "Common Indic Number Forms" },
|
||||
{ from: 0xa840, to: 0xa87f, name: "Phags‑pa" },
|
||||
{ from: 0xa880, to: 0xa8df, name: "Saurashtra" },
|
||||
{ from: 0xa8e0, to: 0xa8ff, name: "Devanagari Extended" },
|
||||
{ from: 0xa900, to: 0xa92f, name: "Kayah Li" },
|
||||
{ from: 0xa930, to: 0xa95f, name: "Rejang" },
|
||||
{ from: 0xa960, to: 0xa97f, name: "Hangul Jamo Extended‑A" },
|
||||
{ from: 0xa980, to: 0xa9df, name: "Javanese" },
|
||||
{ from: 0xa9e0, to: 0xa9ff, name: "Myanmar Extended‑B" },
|
||||
{ from: 0xaa00, to: 0xaa5f, name: "Cham" },
|
||||
{ from: 0xaa60, to: 0xaa7f, name: "Myanmar Extended‑A" },
|
||||
{ from: 0xaa80, to: 0xaadf, name: "Tai Viet" },
|
||||
{ from: 0xaae0, to: 0xaaff, name: "Meetei Mayek Extensions" },
|
||||
{ from: 0xab00, to: 0xab2f, name: "Ethiopic Extended‑A" },
|
||||
{ from: 0xab30, to: 0xab6f, name: "Latin Extended‑E" },
|
||||
{ from: 0xab70, to: 0xabbf, name: "Cherokee Supplement" },
|
||||
{ from: 0xabc0, to: 0xabff, name: "Meetei Mayek" },
|
||||
{ from: 0xac00, to: 0xd7af, name: "Hangul Syllables" },
|
||||
{ from: 0xd7b0, to: 0xd7ff, name: "Hangul Jamo Extended‑B" },
|
||||
{ from: 0xd800, to: 0xdb7f, name: "High Surrogates" },
|
||||
{ from: 0xdb80, to: 0xdbff, name: "High Private Use Surrogates" },
|
||||
{ from: 0xdc00, to: 0xdfff, name: "Low Surrogates" },
|
||||
{ from: 0xe000, to: 0xf8ff, name: "Private Use Area", compact: true },
|
||||
{ from: 0xf900, to: 0xfaff, name: "CJK Compatibility Ideographs" },
|
||||
{ from: 0xfb00, to: 0xfb4f, name: "Alphabetic Presentation Forms" },
|
||||
{ from: 0xfb50, to: 0xfdff, name: "Arabic Presentation Forms‑A" },
|
||||
{ from: 0xfe00, to: 0xfe0f, name: "Variation Selectors" },
|
||||
{ from: 0xfe10, to: 0xfe1f, name: "Vertical Forms" },
|
||||
{ from: 0xfe20, to: 0xfe2f, name: "Combining Half Marks" },
|
||||
{ from: 0xfe30, to: 0xfe4f, name: "CJK Compatibility Forms" },
|
||||
{ from: 0xfe50, to: 0xfe6f, name: "Small Form Variants" },
|
||||
{ from: 0xfe70, to: 0xfeff, name: "Arabic Presentation Forms‑B" },
|
||||
{ from: 0xff00, to: 0xffef, name: "Halfwidth\xA0and Fullwidth Forms" },
|
||||
{ from: 0xfff0, to: 0xffff, name: "Specials" },
|
||||
{ from: 0x10000, to: 0x1007f, name: "Linear B Syllabary" },
|
||||
{ from: 0x10080, to: 0x100ff, name: "Linear B Ideograms" },
|
||||
{ from: 0x10100, to: 0x1013f, name: "Aegean Numbers" },
|
||||
{ from: 0x10140, to: 0x1018f, name: "Ancient Greek Numbers" },
|
||||
{ from: 0x10190, to: 0x101cf, name: "Ancient Symbols" },
|
||||
{ from: 0x101d0, to: 0x101ff, name: "Phaistos Disc" },
|
||||
{ from: 0x10280, to: 0x1029f, name: "Lycian" },
|
||||
{ from: 0x102a0, to: 0x102df, name: "Carian" },
|
||||
{ from: 0x102e0, to: 0x102ff, name: "Coptic Epact Numbers" },
|
||||
{ from: 0x10300, to: 0x1032f, name: "Old Italic" },
|
||||
{ from: 0x10330, to: 0x1034f, name: "Gothic" },
|
||||
{ from: 0x10350, to: 0x1037f, name: "Old Permic" },
|
||||
{ from: 0x10380, to: 0x1039f, name: "Ugaritic" },
|
||||
{ from: 0x103a0, to: 0x103df, name: "Old Persian" },
|
||||
{ from: 0x10400, to: 0x1044f, name: "Deseret" },
|
||||
{ from: 0x10450, to: 0x1047f, name: "Shavian" },
|
||||
{ from: 0x10480, to: 0x104af, name: "Osmanya" },
|
||||
{ from: 0x10500, to: 0x1052f, name: "Elbasan" },
|
||||
{ from: 0x10530, to: 0x1056f, name: "Caucasian Albanian" },
|
||||
{ from: 0x10600, to: 0x1077f, name: "Linear A" },
|
||||
{ from: 0x10800, to: 0x1083f, name: "Cypriot Syllabary" },
|
||||
{ from: 0x10840, to: 0x1085f, name: "Imperial Aramaic" },
|
||||
{ from: 0x10860, to: 0x1087f, name: "Palmyrene" },
|
||||
{ from: 0x10880, to: 0x108af, name: "Nabataean" },
|
||||
{ from: 0x108e0, to: 0x108ff, name: "Hatran" },
|
||||
{ from: 0x10900, to: 0x1091f, name: "Phoenician" },
|
||||
{ from: 0x10920, to: 0x1093f, name: "Lydian" },
|
||||
{ from: 0x10980, to: 0x1099f, name: "Meroitic Hieroglyphs" },
|
||||
{ from: 0x109a0, to: 0x109ff, name: "Meroitic Cursive" },
|
||||
{ from: 0x10a00, to: 0x10a5f, name: "Kharoshthi" },
|
||||
{ from: 0x10a60, to: 0x10a7f, name: "Old South Arabian" },
|
||||
{ from: 0x10a80, to: 0x10a9f, name: "Old North Arabian" },
|
||||
{ from: 0x10ac0, to: 0x10aff, name: "Manichaean" },
|
||||
{ from: 0x10b00, to: 0x10b3f, name: "Avestan" },
|
||||
{ from: 0x10b40, to: 0x10b5f, name: "Inscriptional Parthian" },
|
||||
{ from: 0x10b60, to: 0x10b7f, name: "Inscriptional Pahlavi" },
|
||||
{ from: 0x10b80, to: 0x10baf, name: "Psalter Pahlavi" },
|
||||
{ from: 0x10c00, to: 0x10c4f, name: "Old Turkic" },
|
||||
{ from: 0x10c80, to: 0x10cff, name: "Old Hungarian" },
|
||||
{ from: 0x10e60, to: 0x10e7f, name: "Rumi Numeral Symbols" },
|
||||
{ from: 0x11000, to: 0x1107f, name: "Brahmi" },
|
||||
{ from: 0x11080, to: 0x110cf, name: "Kaithi" },
|
||||
{ from: 0x110d0, to: 0x110ff, name: "Sora Sompeng" },
|
||||
{ from: 0x11100, to: 0x1114f, name: "Chakma" },
|
||||
{ from: 0x11150, to: 0x1117f, name: "Mahajani" },
|
||||
{ from: 0x11180, to: 0x111df, name: "Sharada" },
|
||||
{ from: 0x111e0, to: 0x111ff, name: "Sinhala Archaic Numbers" },
|
||||
{ from: 0x11200, to: 0x1124f, name: "Khojki" },
|
||||
{ from: 0x11280, to: 0x112af, name: "Multani" },
|
||||
{ from: 0x112b0, to: 0x112ff, name: "Khudawadi" },
|
||||
{ from: 0x11300, to: 0x1137f, name: "Grantha" },
|
||||
{ from: 0x11480, to: 0x114df, name: "Tirhuta" },
|
||||
{ from: 0x11580, to: 0x115ff, name: "Siddham" },
|
||||
{ from: 0x11600, to: 0x1165f, name: "Modi" },
|
||||
{ from: 0x11680, to: 0x116cf, name: "Takri" },
|
||||
{ from: 0x11700, to: 0x1173f, name: "Ahom" },
|
||||
{ from: 0x118a0, to: 0x118ff, name: "Warang Citi" },
|
||||
{ from: 0x11ac0, to: 0x11aff, name: "Pau Cin Hau" },
|
||||
{ from: 0x12000, to: 0x123ff, name: "Cuneiform" },
|
||||
{ from: 0x12400, to: 0x1247f, name: "Cuneiform Numbers\xA0and Punctuation" },
|
||||
{ from: 0x12480, to: 0x1254f, name: "Early Dynastic Cuneiform" },
|
||||
{ from: 0x13000, to: 0x1342f, name: "Egyptian Hieroglyphs" },
|
||||
{ from: 0x14400, to: 0x1467f, name: "Anatolian Hieroglyphs" },
|
||||
{ from: 0x16800, to: 0x16a3f, name: "Bamum Supplement" },
|
||||
{ from: 0x16a40, to: 0x16a6f, name: "Mro" },
|
||||
{ from: 0x16ad0, to: 0x16aff, name: "Bassa Vah" },
|
||||
{ from: 0x16b00, to: 0x16b8f, name: "Pahawh Hmong" },
|
||||
{ from: 0x16f00, to: 0x16f9f, name: "Miao" },
|
||||
{ from: 0x1b000, to: 0x1b0ff, name: "Kana Supplement" },
|
||||
{ from: 0x1bc00, to: 0x1bc9f, name: "Duployan" },
|
||||
{ from: 0x1bca0, to: 0x1bcaf, name: "Shorthand Format Controls" },
|
||||
{ from: 0x1d000, to: 0x1d0ff, name: "Byzantine Musical Symbols" },
|
||||
{ from: 0x1d100, to: 0x1d1ff, name: "Musical Symbols" },
|
||||
{ from: 0x1d200, to: 0x1d24f, name: "Ancient Greek Musical Notation" },
|
||||
{ from: 0x1d300, to: 0x1d35f, name: "Tai Xuan Jing Symbols" },
|
||||
{ from: 0x1d360, to: 0x1d37f, name: "Counting Rod Numerals" },
|
||||
{ from: 0x1d400, to: 0x1d7ff, name: "Mathematical Alphanumeric Symbols" },
|
||||
{ from: 0x1d800, to: 0x1daaf, name: "Sutton SignWriting" },
|
||||
{ from: 0x1e800, to: 0x1e8df, name: "Mende Kikakui" },
|
||||
{ from: 0x1ee00, to: 0x1eeff, name: "Arabic Mathematical Alphabetic Symbols" },
|
||||
{ from: 0x1f000, to: 0x1f02f, name: "Mahjong Tiles" },
|
||||
{ from: 0x1f030, to: 0x1f09f, name: "Domino Tiles" },
|
||||
{ from: 0x1f0a0, to: 0x1f0ff, name: "Playing Cards" },
|
||||
{ from: 0x1f100, to: 0x1f1ff, name: "Enclosed Alphanumeric Supplement" },
|
||||
{ from: 0x1f200, to: 0x1f2ff, name: "Enclosed Ideographic Supplement" },
|
||||
{ from: 0x1f300, to: 0x1f5ff, name: "Miscellaneous Symbols\xA0and Pictographs" },
|
||||
{ from: 0x1f600, to: 0x1f64f, name: "Emoticons" },
|
||||
{ from: 0x1f650, to: 0x1f67f, name: "Ornamental Dingbats" },
|
||||
{ from: 0x1f680, to: 0x1f6ff, name: "Transport\xA0and Map Symbols" },
|
||||
{ from: 0x1f700, to: 0x1f77f, name: "Alchemical Symbols" },
|
||||
{ from: 0x1f780, to: 0x1f7ff, name: "Geometric Shapes Extended" },
|
||||
{ from: 0x1f800, to: 0x1f8ff, name: "Supplemental Arrows‑C" },
|
||||
{ from: 0x1f900, to: 0x1f9ff, name: "Supplemental Symbols\xA0and Pictographs" },
|
||||
{ from: 0x20000, to: 0x2a6df, name: "CJK Unified Ideographs Extension B" },
|
||||
{ from: 0x2a700, to: 0x2b73f, name: "CJK Unified Ideographs Extension C" },
|
||||
{ from: 0x2b740, to: 0x2b81f, name: "CJK Unified Ideographs Extension D" },
|
||||
{ from: 0x2b820, to: 0x2ceaf, name: "CJK Unified Ideographs Extension E" },
|
||||
{ from: 0x2f800, to: 0x2fa1f, name: "CJK Compatibility Ideographs Supplement" },
|
||||
{ from: 0xe0000, to: 0xe007f, name: "Tags" },
|
||||
{ from: 0xe0100, to: 0xe01ef, name: "Variation Selectors Supplement" },
|
||||
{ from: 0xf0000, to: 0xfffff, name: "Supplementary Private Use Area‑A" },
|
||||
{ from: 0x100000, to: 0x10ffff, name: "Supplementary Private Use Area‑B" }
|
||||
];
|
||||
|
||||
var display = new Vue({
|
||||
el: "#display",
|
||||
data: {
|
||||
charsHTML: "",
|
||||
samples: (function(ss) {
|
||||
var langlen = 0;
|
||||
for (var j = 0; j < ss.length; j++) {
|
||||
if (ss[j].lang.length > langlen) langlen = ss[j].lang.length;
|
||||
}
|
||||
for (var j = 0; j < ss.length; j++) {
|
||||
ss[j].spaces = new Array(langlen - ss[j].lang.length + 2).join(" ");
|
||||
}
|
||||
return ss;
|
||||
})(sampleSentences),
|
||||
currentFont: fonts[REGULAR][0],
|
||||
waterfall: [36, 28, 24, 20, 18, 16, 14, 12, 11, 10],
|
||||
blocks: [],
|
||||
waiting: 0
|
||||
},
|
||||
methods: {
|
||||
updateFont: function(item) {
|
||||
this.waiting += 1;
|
||||
display.currentFont = item;
|
||||
var nblocks = 0;
|
||||
var t = this;
|
||||
requestAnimationFrame(function fn() {
|
||||
if (nblocks < t.blocks.length) {
|
||||
t.blocks[nblocks].font = item;
|
||||
nblocks += 1;
|
||||
requestAnimationFrame(fn);
|
||||
} else {
|
||||
t.waiting -= 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
created: function() {
|
||||
console.log("Ready to show up.");
|
||||
this.waiting += 1;
|
||||
var t = this;
|
||||
fetch("assets/" + this.currentFont.name + ".charmap")
|
||||
.then(function(response) {
|
||||
return response.json();
|
||||
})
|
||||
.then(function(data) {
|
||||
var blocks = [];
|
||||
var uhash = [];
|
||||
var whash = [];
|
||||
for (var j = 0; j < data.length; j++) {
|
||||
var unicodes = data[j][1];
|
||||
if (unicodes && unicodes.length)
|
||||
for (var k = 0; k < unicodes.length; k++) {
|
||||
uhash[unicodes[k]] = data[j][0].trim();
|
||||
whash[unicodes[k]] = data[j][2];
|
||||
}
|
||||
}
|
||||
for (var blockid = 0; blockid < blockData.length; blockid++) {
|
||||
var block = blockData[blockid];
|
||||
var hasGlyphInThisBlock = false;
|
||||
var min = block.to;
|
||||
var max = block.from;
|
||||
for (var j = block.from; j <= block.to; j++)
|
||||
if (uhash[j]) {
|
||||
hasGlyphInThisBlock = true;
|
||||
if (j < min) min = j;
|
||||
if (j > max) max = j;
|
||||
}
|
||||
if (!hasGlyphInThisBlock) continue;
|
||||
var bs = Math.floor((block.compact ? min : block.from) / 16) * 16;
|
||||
var be = Math.floor((block.compact ? max : block.to) / 16) * 16 + 0x10;
|
||||
var rows = [];
|
||||
var row = null;
|
||||
for (var j = bs; j < be; j++) {
|
||||
if (j % 16 === 0) {
|
||||
if (row) rows.push(row);
|
||||
row = {
|
||||
startIndex: padzero(j.toString(16).toUpperCase(), 4),
|
||||
chars: []
|
||||
};
|
||||
}
|
||||
row.chars.push({
|
||||
name: uhash[j],
|
||||
char: (whash[j] === 1 ? "\u00A0" : "") + String.fromCharCode(j),
|
||||
isMark: whash[j] === 1,
|
||||
isTie: whash[j] === 2
|
||||
});
|
||||
}
|
||||
if (row) rows.push(row);
|
||||
var block = {
|
||||
name: block.name,
|
||||
rows: rows,
|
||||
font: display.currentFont
|
||||
};
|
||||
blocks.push(block);
|
||||
}
|
||||
|
||||
var nblocks = 0;
|
||||
requestAnimationFrame(function fn() {
|
||||
if (nblocks < blocks.length) {
|
||||
Vue.set(t.blocks, nblocks, blocks[nblocks]);
|
||||
nblocks += 1;
|
||||
requestAnimationFrame(fn);
|
||||
} else {
|
||||
t.waiting -= 1;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
var picker = new Vue({
|
||||
el: "#picker",
|
||||
data: {
|
||||
fonts: fonts,
|
||||
current: fonts[REGULAR][0] // regular
|
||||
},
|
||||
methods: {
|
||||
choose: function(item) {
|
||||
this.current = item;
|
||||
display.updateFont(item);
|
||||
}
|
||||
}
|
||||
});
|
|
@ -1,6 +0,0 @@
|
|||
include utility/dirs.mk
|
||||
include utility/scripts.mk
|
||||
|
||||
GENERATE = @node --expose-gc generator
|
||||
|
||||
include $(BUILD)/targets-$(set).mk
|
|
@ -1,10 +0,0 @@
|
|||
BUILD = build
|
||||
DIST = dist
|
||||
ARCHIVEDIR = release-archives
|
||||
|
||||
$(BUILD)/ :
|
||||
-@mkdir -p $@
|
||||
$(DIST)/ :
|
||||
-@mkdir -p $@
|
||||
$(ARCHIVEDIR)/ :
|
||||
-@mkdir -p $@
|
19
utility/make-webfont-css.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
const fs = require("fs");
|
||||
|
||||
module.exports = function(output, family, hs, formats) {
|
||||
let ans = ``;
|
||||
for (const term of hs) {
|
||||
let src = formats
|
||||
.map(([ext, format]) => `url('${ext}/${term.name}.${ext}') format('${format}')`)
|
||||
.join(", ");
|
||||
ans += `
|
||||
@font-face {
|
||||
font-family: '${family + " Web"}';
|
||||
font-weight: ${term.cssWeight};
|
||||
font-style: ${term.cssStyle};
|
||||
src: ${src};
|
||||
}
|
||||
`;
|
||||
}
|
||||
fs.writeFileSync(output, ans);
|
||||
};
|
|
@ -1,21 +0,0 @@
|
|||
###################################################################################################
|
||||
# Support Files
|
||||
# DO NOT CHANGE
|
||||
|
||||
PATELC = node ./node_modules/patel/bin/patel-c
|
||||
|
||||
GLYPH_SEGMENTS = glyphs/common-shapes.js glyphs/overmarks.js glyphs/letters-unified-basic.js glyphs/letters-unified-extended.js glyphs/numbers.js glyphs/symbol-punctuation.js glyphs/symbol-math.js glyphs/symbol-letter.js glyphs/symbol-geometric.js glyphs/symbol-other.js glyphs/symbol-braille.js glyphs/autobuilds.js buildglyphs.js
|
||||
SUPPORT_FILES_FROM_PTL = support/glyph.js support/spiroexpand.js support/spirokit.js support/parameters.js support/anchor.js support/point.js support/transform.js support/utils.js meta/aesthetics.js meta/naming.js meta/features.js meta/feature/ligation.js meta/feature/opbd.js meta/feature/ccmp.js
|
||||
SUPPORT_FILES_JS = generator.js emptyfont.toml parameters.toml variants.toml support/fairify.js support/autoref.js
|
||||
SUPPORT_FILES = $(SUPPORT_FILES_FROM_PTL) $(SUPPORT_FILES_JS)
|
||||
SCRIPTS = $(SUPPORT_FILES) $(GLYPH_SEGMENTS)
|
||||
SCRIPTS_FROM_PTL = $(SUPPORT_FILES_FROM_PTL) $(GLYPH_SEGMENTS)
|
||||
|
||||
$(SUPPORT_FILES_FROM_PTL) : %.js : %.ptl meta/macros.ptl
|
||||
$(PATELC) --optimize --strict $< -o $@
|
||||
$(GLYPH_SEGMENTS) : %.js : %.ptl meta/macros.ptl $(SUPPORT_FILES_FROM_PTL) $(SUPPORT_FILES_JS)
|
||||
$(PATELC) --optimize --strict $< -o $@
|
||||
|
||||
cleanscripts :
|
||||
-@rm $(SCRIPTS_FROM_PTL)
|
||||
scripts : $(SCRIPTS)
|
|
@ -1,65 +0,0 @@
|
|||
start : __default
|
||||
|
||||
include utility/dirs.mk
|
||||
include utility/scripts.mk
|
||||
|
||||
GENERATE = @node --expose-gc generator
|
||||
|
||||
.SECONDARY : scripts
|
||||
.PHONY : pages test release sample-images _start web fw custom custom-web custom-config
|
||||
|
||||
|
||||
include $(BUILD)/targets.mk
|
||||
|
||||
web : web-sans web-slab
|
||||
|
||||
release : __release pages sample-images
|
||||
|
||||
testdrive/assets/:
|
||||
-@ mkdir -p $@
|
||||
|
||||
test : fonts-sans fonts-slab | testdrive/assets/
|
||||
cp dist/iosevka/ttf/* testdrive/assets/
|
||||
cp dist/iosevka-slab/ttf/* testdrive/assets/
|
||||
cp build/iosevka-regular.charmap testdrive/assets/
|
||||
cp build/iosevka-slab-regular.charmap testdrive/assets/
|
||||
|
||||
pages : fonts-sans fonts-slab web-sans web-slab
|
||||
cp dist/iosevka/ttf/* pages/assets/
|
||||
cp dist/iosevka/woff/* pages/assets/
|
||||
cp dist/iosevka/woff2/* pages/assets/
|
||||
cp dist/iosevka-slab/ttf/* pages/assets/
|
||||
cp dist/iosevka-slab/woff/* pages/assets/
|
||||
cp dist/iosevka-slab/woff2/* pages/assets/
|
||||
cp build/iosevka-regular.charmap pages/assets/
|
||||
cp build/iosevka-slab-regular.charmap pages/assets/
|
||||
|
||||
fw : ttc
|
||||
|
||||
d-snapshot : fonts-sans fonts-slab web-sans web-slab
|
||||
cp dist/iosevka/ttf/* snapshot/assets/
|
||||
cp dist/iosevka/woff/* snapshot/assets/
|
||||
cp dist/iosevka/woff2/* snapshot/assets/
|
||||
cp dist/iosevka-slab/ttf/* snapshot/assets/
|
||||
cp dist/iosevka-slab/woff/* snapshot/assets/
|
||||
cp dist/iosevka-slab/woff2/* snapshot/assets/
|
||||
cp build/iosevka-regular.charmap snapshot/assets/
|
||||
cp build/iosevka-slab-regular.charmap snapshot/assets/
|
||||
electronsnaps1: d-snapshot
|
||||
cd snapshot && stylus index.styl -c
|
||||
cd snapshot && electron getsnap.js --dir ../images
|
||||
images/languages.png: electronsnaps1
|
||||
optipng $@
|
||||
images/preview-all.png: electronsnaps1
|
||||
optipng $@
|
||||
images/weights.png: electronsnaps1
|
||||
optipng $@
|
||||
images/variants.png: electronsnaps1
|
||||
optipng $@
|
||||
images/matrix.png: electronsnaps1
|
||||
optipng $@
|
||||
images/family.png: electronsnaps1
|
||||
optipng $@
|
||||
|
||||
sample-images: images/family.png images/matrix.png images/weights.png images/variants.png images/languages.png images/preview-all.png
|
||||
|
10
utility/ttf-to-woff.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
"use strict";
|
||||
const fs = require("fs");
|
||||
const ttf2woff = require("ttf2woff");
|
||||
|
||||
module.exports = function(from, to) {
|
||||
const input = fs.readFileSync(from);
|
||||
var ttf = new Uint8Array(input);
|
||||
var woff = new Buffer(ttf2woff(ttf, {}).buffer);
|
||||
fs.writeFileSync(to, woff);
|
||||
};
|
9
utility/ttf-to-woff2.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
"use strict";
|
||||
const fs = require("fs");
|
||||
const ttf2woff2 = require("ttf2woff2");
|
||||
|
||||
module.exports = function(from, to) {
|
||||
const input = fs.readFileSync(from);
|
||||
var woff = ttf2woff2(input);
|
||||
fs.writeFileSync(to, woff);
|
||||
};
|
454
verdafile.js
|
@ -1,103 +1,419 @@
|
|||
"use strict";
|
||||
const {
|
||||
want,
|
||||
rule: { task, file, variable },
|
||||
rule: { task, file, oracle, phony },
|
||||
macro: { FileList },
|
||||
action: { run },
|
||||
action: { run, node, cd, cp, rm },
|
||||
journal,
|
||||
argv
|
||||
} = require("verda");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const toml = require("toml");
|
||||
|
||||
journal("build/.verda-journal.json");
|
||||
want(...argv._);
|
||||
const BUILD = "build";
|
||||
const DIST = "dist";
|
||||
const ARCHIVE_DIR = "release-archives";
|
||||
|
||||
const PATEL_C = ["node", "./node_modules/patel/bin/patel-c"];
|
||||
const GENERATE = ["node", "--expose-gc", "generator"];
|
||||
const WEIGHTS = [
|
||||
"thin",
|
||||
"extralight",
|
||||
"light",
|
||||
"book",
|
||||
"medium",
|
||||
"semibold",
|
||||
"bold",
|
||||
"extrabold",
|
||||
"heavy"
|
||||
];
|
||||
const SLANTS = ["upright", "italic", "oblique"];
|
||||
const GENERATE = ["node", "gen/generator"];
|
||||
const webfontFormats = [["woff2", "woff2"], ["woff", "woff"], ["ttf", "truetype"]];
|
||||
|
||||
const weightSlantMap = (function() {
|
||||
let o = {};
|
||||
for (const w of WEIGHTS) {
|
||||
for (const s of SLANTS) {
|
||||
// Save journal to build/
|
||||
journal(`${BUILD}/.verda-journal`);
|
||||
want(...argv._);
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
////// Oracles //////
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
oracle(`o:version`).def(async target => {
|
||||
const package_json = JSON.parse(fs.readFileSync(path.join(__dirname, "package.json")));
|
||||
return package_json.version;
|
||||
});
|
||||
|
||||
oracle(`o:raw-plans`).def(async target => {
|
||||
const t = toml.parse(fs.readFileSync(path.resolve(__dirname, "build-plans.toml")));
|
||||
for (const prefix in t.buildPlans) {
|
||||
const plan = t.buildPlans[prefix];
|
||||
plan.prefix = prefix;
|
||||
|
||||
// Style groups
|
||||
if (!plan.pre) plan.pre = {};
|
||||
if (!plan.post) plan.post = {};
|
||||
if (!plan.pre.design) plan.pre.design = plan.design || [];
|
||||
if (!plan.pre.upright) plan.pre.upright = plan.upright || [];
|
||||
if (!plan.pre.italic) plan.pre.italic = plan.italic || [];
|
||||
if (!plan.pre.oblique) plan.pre.oblique = plan.oblique || [];
|
||||
if (!plan.post.design) plan.post.design = [];
|
||||
if (!plan.post.upright) plan.post.upright = [];
|
||||
if (!plan.post.italic) plan.post.italic = [];
|
||||
if (!plan.post.oblique) plan.post.oblique = [];
|
||||
}
|
||||
for (const prefix in t.collectPlans) {
|
||||
t.collectPlans[prefix].prefix = prefix;
|
||||
}
|
||||
return t;
|
||||
});
|
||||
|
||||
oracle("o:build-plans").def(async target => {
|
||||
const [rp] = await target.need(`o:raw-plans`);
|
||||
return rp.buildPlans;
|
||||
});
|
||||
oracle("o:export-plans").def(async target => {
|
||||
const [rp] = await target.need(`o:raw-plans`);
|
||||
return rp.exportPlans;
|
||||
});
|
||||
oracle("o:raw-collect-plans").def(async target => {
|
||||
const [rp] = await target.need(`o:raw-plans`);
|
||||
return rp.collectPlans;
|
||||
});
|
||||
oracle("o:weights").def(async target => {
|
||||
const [rp] = await target.need(`o:raw-plans`);
|
||||
return rp.weights;
|
||||
});
|
||||
oracle("o:slants").def(async target => {
|
||||
const [rp] = await target.need(`o:raw-plans`);
|
||||
return rp.slants;
|
||||
});
|
||||
|
||||
oracle(`o:suffixes`).def(async target => {
|
||||
const [weights, slants] = await target.need(`o:weights`, `o:slants`);
|
||||
const mapping = {};
|
||||
for (const w in weights) {
|
||||
for (const s in slants) {
|
||||
const suffix =
|
||||
(w === "book" ? (s === "upright" ? "regular" : "") : w) +
|
||||
(s === "upright" ? "" : s);
|
||||
o[suffix] = { weight: w, slant: s };
|
||||
mapping[suffix] = {
|
||||
hives: [`w-${w}`, `s-${s}`],
|
||||
weight: w,
|
||||
slant: s,
|
||||
cssWeight: weights[w],
|
||||
cssStyle: slants[s]
|
||||
};
|
||||
}
|
||||
}
|
||||
return o;
|
||||
})();
|
||||
|
||||
//////////////////////////
|
||||
////// Font building
|
||||
//////////////////////////
|
||||
|
||||
file("build/iosevka-*-*.otd").def(async (target, width, suffix) => {
|
||||
const { weight, slant } = weightSlantMap[suffix];
|
||||
await target.need("scripts", "dir:build", "parameters.toml");
|
||||
await run(GENERATE, "iosevka", width, `w-${weight}`, `s-${slant}`, "-o", target);
|
||||
return mapping;
|
||||
});
|
||||
file("build/iosevka-*-*.ttf").def(async (target, width, suffix) => {
|
||||
const [otd] = await target.need(`build/iosevka-${width}-${suffix}.otd`);
|
||||
await run("otfccbuild", otd.path, "-o", target);
|
||||
|
||||
oracle(`o:font-building-parameters`).def(async target => {
|
||||
const [buildPlans, suffixMapping] = await target.need(`o:build-plans`, `o:suffixes`);
|
||||
const fontInfos = {};
|
||||
const bp = {};
|
||||
for (const p in buildPlans) {
|
||||
const { pre, post, prefix, family } = buildPlans[p];
|
||||
const targets = [];
|
||||
for (const suffix in suffixMapping) {
|
||||
const fileName = [prefix, suffix].join("-");
|
||||
const preHives = [...pre.design, ...pre[suffixMapping[suffix].slant]];
|
||||
const postHives = [...post.design, ...post[suffixMapping[suffix].slant]];
|
||||
fontInfos[fileName] = {
|
||||
name: fileName,
|
||||
family,
|
||||
hives: ["iosevka", ...preHives, ...suffixMapping[suffix].hives, ...postHives],
|
||||
cssWeight: suffixMapping[suffix].cssWeight,
|
||||
cssStyle: suffixMapping[suffix].cssStyle
|
||||
};
|
||||
targets.push(fileName);
|
||||
}
|
||||
bp[prefix] = {
|
||||
family,
|
||||
prefix,
|
||||
targets
|
||||
};
|
||||
}
|
||||
return { fontInfos, buildPlans: bp };
|
||||
});
|
||||
task("default").def(async target => {
|
||||
await target.need(
|
||||
Object.keys(weightSlantMap).map(suffix => `build/iosevka-normal-${suffix}.ttf`)
|
||||
|
||||
oracle(`o:collect-plans`).def(async target => {
|
||||
const [rawCollectPlans, suffixMapping] = await target.need(`o:raw-collect-plans`, `o:suffixes`);
|
||||
const composition = {},
|
||||
groups = {};
|
||||
for (const gid in rawCollectPlans) {
|
||||
groups[gid] = [];
|
||||
const collect = rawCollectPlans[gid];
|
||||
for (const suffix in suffixMapping) {
|
||||
const fileName = `${collect.prefix}-${suffix}`;
|
||||
composition[fileName] = [];
|
||||
for (const prefix of collect.from) {
|
||||
composition[fileName].push({
|
||||
dir: prefix,
|
||||
file: `${prefix}-${suffix}`
|
||||
});
|
||||
}
|
||||
groups[gid].push(fileName);
|
||||
}
|
||||
}
|
||||
return { composition, groups };
|
||||
});
|
||||
|
||||
oracle("hives-of:***").def(async (target, gid) => {
|
||||
const [{ fontInfos }] = await target.need("o:font-building-parameters");
|
||||
return fontInfos[gid];
|
||||
});
|
||||
|
||||
oracle("group-info:***").def(async (target, gid) => {
|
||||
const [{ buildPlans }] = await target.need("o:font-building-parameters");
|
||||
return buildPlans[gid];
|
||||
});
|
||||
|
||||
oracle("group-fonts-of:***").def(async (target, gid) => {
|
||||
const [plan] = await target.need(`group-info:${gid}`);
|
||||
return plan.targets;
|
||||
});
|
||||
|
||||
oracle("collection-parts-of:*").def(async (target, id) => {
|
||||
const [{ composition }] = await target.need("o:collect-plans");
|
||||
return composition[id];
|
||||
});
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
////// Font Building //////
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
file(`${BUILD}/*/*.ttf`).def(async (target, prefix, suffix) => {
|
||||
const [{ hives, family }, version] = await target.need(`hives-of:${suffix}`, `o:version`);
|
||||
const otd = target.path.dir + "/" + target.path.name + ".otd";
|
||||
const charmap = target.path.dir + "/" + target.path.name + ".charmap";
|
||||
await target.need("scripts", "parameters.toml", `dir:${target.path.dir}`);
|
||||
await run(
|
||||
GENERATE,
|
||||
hives,
|
||||
["-o", otd],
|
||||
["--charmap", charmap],
|
||||
["--family", family],
|
||||
["--ver", version]
|
||||
);
|
||||
await run("otfccbuild", otd, "-o", target.path.full, "-O3", "--keep-average-char-width");
|
||||
await rm(otd);
|
||||
});
|
||||
|
||||
file(`${BUILD}/*/*.charmap`).def(async target => {
|
||||
await target.need(target.path.dir + "/" + target.path.name + ".ttf");
|
||||
});
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
////// Font Distribution //////
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
// Per group file
|
||||
file(`${DIST}/*/ttf-unhinted/*.ttf`).def(async (target, dir, file) => {
|
||||
const [from] = await target.need(`${BUILD}/${dir}/${file}.ttf`, `dir:${target.path.dir}`);
|
||||
await cp(from.full, target.path.full);
|
||||
});
|
||||
file(`${DIST}/*/ttf/*.ttf`).def(async (target, dir, file) => {
|
||||
const [from] = await target.need(
|
||||
`${DIST}/${dir}/ttf-unhinted/${file}.ttf`,
|
||||
`dir:${target.path.dir}`
|
||||
);
|
||||
await run("ttfautohint", "-c", from.full, target.path.full);
|
||||
});
|
||||
file(`${DIST}/*/woff/*.woff`).def(async (target, dir, file) => {
|
||||
const [from] = await target.need(`${DIST}/${dir}/ttf/${file}.ttf`, `dir:${target.path.dir}`);
|
||||
await node(`utility/ttf-to-woff.js`, from.full, target.path.full);
|
||||
});
|
||||
file(`${DIST}/*/woff2/*.woff2`).def(async (target, dir, file) => {
|
||||
const [from] = await target.need(`${DIST}/${dir}/ttf/${file}.ttf`, `dir:${target.path.dir}`);
|
||||
await node(`utility/ttf-to-woff2.js`, from.full, target.path.full);
|
||||
});
|
||||
|
||||
// TTC
|
||||
file(`${DIST}/collections/*/*.ttc`).def(async (target, cid, fileName) => {
|
||||
const [parts] = await target.need(`collection-parts-of:${fileName}`);
|
||||
await target.need(`dir:${target.path.dir}`);
|
||||
const [ttfs] = await target.need(parts.map(part => `${DIST}/${part.dir}/ttf/${part.file}.ttf`));
|
||||
await run(`otfcc-ttcize`, ttfs.map(p => p.full), "-o", target.path.full);
|
||||
});
|
||||
|
||||
// Group-level
|
||||
task("ttf:***").def(async (target, gid) => {
|
||||
const [ts] = await target.need(`group-fonts-of:${gid}`);
|
||||
await target.need(ts.map(tn => `${DIST}/${gid}/ttf/${tn}.ttf`));
|
||||
});
|
||||
task("ttf-unhinted:***").def(async (target, gid) => {
|
||||
const [ts] = await target.need(`group-fonts-of:${gid}`);
|
||||
await target.need(ts.map(tn => `${DIST}/${gid}/ttf-unhinted/${tn}.ttf`));
|
||||
});
|
||||
task("woff:***").def(async (target, gid) => {
|
||||
const [ts] = await target.need(`group-fonts-of:${gid}`);
|
||||
await target.need(ts.map(tn => `${DIST}/${gid}/woff/${tn}.woff`));
|
||||
});
|
||||
task("woff2:***").def(async (target, gid) => {
|
||||
const [ts] = await target.need(`group-fonts-of:${gid}`);
|
||||
await target.need(ts.map(tn => `${DIST}/${gid}/woff2/${tn}.woff2`));
|
||||
});
|
||||
task("fonts:***").def(async (target, gid) => {
|
||||
await target.need(`ttf:${gid}`, `ttf-unhinted:${gid}`, `woff:${gid}`, `woff2:${gid}`);
|
||||
});
|
||||
|
||||
// Charmap (for specimen)
|
||||
file(`${DIST}/*/*.charmap`).def(async (target, gid, suffix) => {
|
||||
const [src] = await target.need(`${BUILD}/${gid}/${suffix}.charmap`, `dir:${target.path.dir}`);
|
||||
await cp(src.full, target.path.full);
|
||||
});
|
||||
|
||||
// Webfont CSS
|
||||
file(`${DIST}/*/webfont.css`).def(async (target, gid) => {
|
||||
// Note: this target does NOT depend on the font files.
|
||||
const [gr, ts] = await target.need(
|
||||
`group-info:${gid}`,
|
||||
`group-fonts-of:${gid}`,
|
||||
`dir:${target.path.dir}`
|
||||
);
|
||||
const hs = await target.need(...ts.map(t => `hives-of:${t}`));
|
||||
await node(
|
||||
"utility/make-webfont-css.js",
|
||||
`${DIST}/${gid}/webfont.css`,
|
||||
gr.family,
|
||||
hs,
|
||||
webfontFormats
|
||||
);
|
||||
});
|
||||
|
||||
//////////////////////////
|
||||
////// Script building
|
||||
//////////////////////////
|
||||
task("contents:***").def(async (target, gid) => {
|
||||
const [gr] = await target.need(`group-info:${gid}`);
|
||||
await target.need(
|
||||
`fonts:${gid}`,
|
||||
`${DIST}/${gid}/webfont.css`,
|
||||
`${DIST}/${gid}/${gr.prefix}-regular.charmap`
|
||||
);
|
||||
return gid;
|
||||
});
|
||||
|
||||
variable("files:PTL").def(
|
||||
FileList({
|
||||
under: ".",
|
||||
pattern: "*.ptl|glyphs/**/*.ptl|support/**/*.ptl|meta/**/*.ptl"
|
||||
})
|
||||
// Archive
|
||||
task(`${ARCHIVE_DIR}/*-*.zip`).def(async (target, gid, version) => {
|
||||
// Note: this target does NOT depend on the font files.
|
||||
const [exportPlans] = await target.need(`o:export-plans`, `dir:${target.path.dir}`);
|
||||
await target.need(`contents:${exportPlans[gid]}`);
|
||||
await cd(`${DIST}/${exportPlans[gid]}`).run(
|
||||
["7z", "a"],
|
||||
["-tzip", "-r", "-mx=9"],
|
||||
`../../${target.path.full}`,
|
||||
`./`
|
||||
);
|
||||
});
|
||||
task(`archive:***`).def(async (target, gid) => {
|
||||
const [version] = await target.need(`o:version`);
|
||||
await target.need(`${ARCHIVE_DIR}/${gid}-${version}.zip`);
|
||||
});
|
||||
|
||||
// Collection-level
|
||||
task("collection-fonts:***").def(async (target, cid) => {
|
||||
const [{ groups }] = await target.need("o:collect-plans");
|
||||
await target.need(groups[cid].map(file => `${DIST}/collections/${cid}/${file}.ttc`));
|
||||
});
|
||||
task(`${ARCHIVE_DIR}/ttc-*-*.zip`).def(async (target, cid, version) => {
|
||||
// Note: this target does NOT depend on the font files.
|
||||
await target.need(`dir:${target.path.dir}`);
|
||||
await target.need(`collection-fonts:${cid}`);
|
||||
await cd(`${DIST}/collections/${cid}`).run(
|
||||
["7z", "a"],
|
||||
["-tzip", "-r", "-mx=9"],
|
||||
`../../../${target.path.full}`,
|
||||
`./`
|
||||
);
|
||||
});
|
||||
task(`collection-archive:***`).def(async (target, cid) => {
|
||||
const [version] = await target.need(`o:version`);
|
||||
await target.need(`${ARCHIVE_DIR}/ttc-${cid}-${version}.zip`);
|
||||
});
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
////// Root Tasks //////
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
task(`pages`).def(async target => {
|
||||
const [sans, slab] = await target.need(`contents:iosevka`, `contents:iosevka-slab`);
|
||||
await cp(`${DIST}/${sans}`, `pages/${sans}`);
|
||||
await cp(`${DIST}/${slab}`, `pages/${slab}`);
|
||||
});
|
||||
|
||||
task(`sample-images:pre`).def(async target => {
|
||||
const [sans, slab] = await target.need(`contents:iosevka`, `contents:iosevka-slab`);
|
||||
await cp(`${DIST}/${sans}`, `snapshot/${sans}`);
|
||||
await cp(`${DIST}/${slab}`, `snapshot/${slab}`);
|
||||
});
|
||||
file(`snapshot/index.css`).def(async target => {
|
||||
await target.need(`snapshot/index.styl`);
|
||||
await cd(`snapshot`).run(`stylus`, `index.styl`, `-c`);
|
||||
});
|
||||
task(`sample-images:take`).def(async target => {
|
||||
await target.need(`sample-images:pre`, `snapshot/index.css`);
|
||||
await cd(`snapshot`).run("npx", "electron", "get-snap.js", ["--dir", "../images"]);
|
||||
});
|
||||
file(`images/*.png`).def(async target => {
|
||||
await target.need(`sample-images:take`);
|
||||
await run("optipng", target.path.full);
|
||||
});
|
||||
task(`sample-images`).def(async target => {
|
||||
await target.need(`sample-images:take`);
|
||||
await target.need(
|
||||
`images/charvars.png`,
|
||||
`images/download-options.png`,
|
||||
`images/family.png`,
|
||||
`images/languages.png`,
|
||||
`images/ligations.png`,
|
||||
`images/matrix.png`,
|
||||
`images/preview-all.png`,
|
||||
`images/stylesets.png`,
|
||||
`images/variants.png`,
|
||||
`images/weights.png`
|
||||
);
|
||||
});
|
||||
|
||||
task(`all:archives`).def(async target => {
|
||||
const [exportPlans, collectPlans] = await target.need("o:export-plans", "o:collect-plans");
|
||||
await target.need(
|
||||
Object.keys(exportPlans).map(gid => `archive:${gid}`),
|
||||
Object.keys(collectPlans.groups).map(cid => `collection-archive:${cid}`)
|
||||
);
|
||||
});
|
||||
|
||||
phony(`clean`).def(async target => {
|
||||
await rm(`build`);
|
||||
await rm(`dist`);
|
||||
await rm(`release-archives`);
|
||||
});
|
||||
phony(`release`).def(async target => {
|
||||
await target.need(`all:archives`, `sample-images`, `pages`);
|
||||
});
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
////// Script Building //////
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
oracle("{ptl|js}-scripts-under:***").def((target, $ext, $1) =>
|
||||
FileList({ under: $1, pattern: `**/*.${$ext}` })(target)
|
||||
);
|
||||
|
||||
variable("files:JS").def(
|
||||
FileList({
|
||||
under: ".",
|
||||
pattern: "*.js|glyphs/**/*.js|support/**/*.js|meta/**/*.js"
|
||||
})
|
||||
);
|
||||
|
||||
variable("files:JS_FROM_PTL").def(async target => {
|
||||
const [ptl] = await target.need("files:PTL");
|
||||
oracle("scripts:{ptl|js}").def(async (target, ext) => {
|
||||
const [gen, meta, glyphs, support] = await target.need(
|
||||
`${ext}-scripts-under:gen`,
|
||||
`${ext}-scripts-under:meta`,
|
||||
`${ext}-scripts-under:glyphs`,
|
||||
`${ext}-scripts-under:support`
|
||||
);
|
||||
return [...gen, ...meta, ...glyphs, ...support];
|
||||
});
|
||||
oracle("scripts:js-from-ptl").def(async target => {
|
||||
const [ptl] = await target.need("scripts:ptl");
|
||||
return target.trackModification(ptl.map(x => x.replace(/\.ptl$/g, ".js")));
|
||||
});
|
||||
|
||||
file("*.js|glyphs/**/*.js|support/**/*.js|meta/**/*.js").def(async target => {
|
||||
const [jsFromPtl] = await target.need("files:JS_FROM_PTL");
|
||||
if (jsFromPtl.indexOf(target.id) >= 0) {
|
||||
const ptl = target.id.replace(/\.js$/g, ".ptl");
|
||||
file(`{gen|glyphs|support|meta}/**/*.js`).def(async target => {
|
||||
const [jsFromPtl] = await target.need("scripts:js-from-ptl");
|
||||
if (jsFromPtl.indexOf(target.path.full) >= 0) {
|
||||
const ptl = target.path.full.replace(/\.js$/g, ".ptl");
|
||||
await target.need(`file-updated:${ptl}`);
|
||||
await run(PATEL_C, "--optimize", "--strict", ptl, "-o", target.id);
|
||||
await run(PATEL_C, "--optimize", "--strict", ptl, "-o", target.path.full);
|
||||
} else {
|
||||
await target.need(`file-updated:${target.id}`);
|
||||
await target.need(`file-updated:${target.path.full}`);
|
||||
}
|
||||
});
|
||||
task("scripts").def(async target => {
|
||||
const [jsFromPtl] = await target.need("files:JS_FROM_PTL");
|
||||
const [jsFromPtl] = await target.need("scripts:js-from-ptl");
|
||||
await target.need(jsFromPtl);
|
||||
const [js] = await target.need("files:JS");
|
||||
const [js] = await target.need("scripts:js");
|
||||
await target.need(js);
|
||||
});
|
||||
|
||||
task("wrong").def(async target => {
|
||||
throw new Error("Wrong!");
|
||||
await target.need(`parameters.toml`, `variants.toml`, `emptyfont.toml`);
|
||||
});
|
||||
|
|
|
@ -1,116 +0,0 @@
|
|||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 100;
|
||||
src: url('assets/iosevka-slab-thin.woff2') format('woff2'), url('assets/iosevka-slab-thin.woff') format('woff'), url('assets/iosevka-slab-thin.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-thinitalic.woff2') format('woff2'), url('assets/iosevka-slab-thinitalic.woff') format('woff'), url('assets/iosevka-slab-thinitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 100;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-thinoblique.woff2') format('woff2'), url('assets/iosevka-slab-thinoblique.woff') format('woff'), url('assets/iosevka-slab-thinoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 200;
|
||||
src: url('assets/iosevka-slab-extralight.woff2') format('woff2'), url('assets/iosevka-slab-extralight.woff') format('woff'), url('assets/iosevka-slab-extralight.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-extralightitalic.woff2') format('woff2'), url('assets/iosevka-slab-extralightitalic.woff') format('woff'), url('assets/iosevka-slab-extralightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 200;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-extralightoblique.woff2') format('woff2'), url('assets/iosevka-slab-extralightoblique.woff') format('woff'), url('assets/iosevka-slab-extralightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 300;
|
||||
src: url('assets/iosevka-slab-light.woff2') format('woff2'), url('assets/iosevka-slab-light.woff') format('woff'), url('assets/iosevka-slab-light.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-lightitalic.woff2') format('woff2'), url('assets/iosevka-slab-lightitalic.woff') format('woff'), url('assets/iosevka-slab-lightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 300;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-lightoblique.woff2') format('woff2'), url('assets/iosevka-slab-lightoblique.woff') format('woff'), url('assets/iosevka-slab-lightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
src: url('assets/iosevka-slab-regular.woff2') format('woff2'), url('assets/iosevka-slab-regular.woff') format('woff'), url('assets/iosevka-slab-regular.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-slab-italic.woff2') format('woff2'), url('assets/iosevka-slab-italic.woff') format('woff'), url('assets/iosevka-slab-italic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-slab-oblique.woff2') format('woff2'), url('assets/iosevka-slab-oblique.woff') format('woff'), url('assets/iosevka-slab-oblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-medium.woff2') format('woff2'), url('assets/iosevka-slab-medium.woff') format('woff'), url('assets/iosevka-slab-medium.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-mediumitalic.woff2') format('woff2'), url('assets/iosevka-slab-mediumitalic.woff') format('woff'), url('assets/iosevka-slab-mediumitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-slab-mediumoblique.woff2') format('woff2'), url('assets/iosevka-slab-mediumoblique.woff') format('woff'), url('assets/iosevka-slab-mediumoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-bold.woff2') format('woff2'), url('assets/iosevka-slab-bold.woff') format('woff'), url('assets/iosevka-slab-bold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-bolditalic.woff2') format('woff2'), url('assets/iosevka-slab-bolditalic.woff') format('woff'), url('assets/iosevka-slab-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-slab-boldoblique.woff2') format('woff2'), url('assets/iosevka-slab-boldoblique.woff') format('woff'), url('assets/iosevka-slab-boldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavy.woff2') format('woff2'), url('assets/iosevka-slab-heavy.woff') format('woff'), url('assets/iosevka-slab-heavy.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavyitalic.woff2') format('woff2'), url('assets/iosevka-slab-heavyitalic.woff') format('woff'), url('assets/iosevka-slab-heavyitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka Slab';
|
||||
font-style: oblique;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-slab-heavyoblique.woff2') format('woff2'), url('assets/iosevka-slab-heavyoblique.woff') format('woff'), url('assets/iosevka-slab-heavyoblique.ttf') format('truetype');
|
||||
}
|
|
@ -1,116 +0,0 @@
|
|||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 100;
|
||||
src: url('assets/iosevka-thin.woff2') format('woff2'), url('assets/iosevka-thin.woff') format('woff'), url('assets/iosevka-thin.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-thinitalic.woff2') format('woff2'), url('assets/iosevka-thinitalic.woff') format('woff'), url('assets/iosevka-thinitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 100;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-thinoblique.woff2') format('woff2'), url('assets/iosevka-thinoblique.woff') format('woff'), url('assets/iosevka-thinoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 200;
|
||||
src: url('assets/iosevka-extralight.woff2') format('woff2'), url('assets/iosevka-extralight.woff') format('woff'), url('assets/iosevka-extralight.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-extralightitalic.woff2') format('woff2'), url('assets/iosevka-extralightitalic.woff') format('woff'), url('assets/iosevka-extralightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 200;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-extralightoblique.woff2') format('woff2'), url('assets/iosevka-extralightoblique.woff') format('woff'), url('assets/iosevka-extralightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 300;
|
||||
src: url('assets/iosevka-light.woff2') format('woff2'), url('assets/iosevka-light.woff') format('woff'), url('assets/iosevka-light.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-lightitalic.woff2') format('woff2'), url('assets/iosevka-lightitalic.woff') format('woff'), url('assets/iosevka-lightitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 300;
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-lightoblique.woff2') format('woff2'), url('assets/iosevka-lightoblique.woff') format('woff'), url('assets/iosevka-lightoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
src: url('assets/iosevka-regular.woff2') format('woff2'), url('assets/iosevka-regular.woff') format('woff'), url('assets/iosevka-regular.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
src: url('assets/iosevka-italic.woff2') format('woff2'), url('assets/iosevka-italic.woff') format('woff'), url('assets/iosevka-italic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
src: url('assets/iosevka-oblique.woff2') format('woff2'), url('assets/iosevka-oblique.woff') format('woff'), url('assets/iosevka-oblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-medium.woff2') format('woff2'), url('assets/iosevka-medium.woff') format('woff'), url('assets/iosevka-medium.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-mediumitalic.woff2') format('woff2'), url('assets/iosevka-mediumitalic.woff') format('woff'), url('assets/iosevka-mediumitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 500;
|
||||
src: url('assets/iosevka-mediumoblique.woff2') format('woff2'), url('assets/iosevka-mediumoblique.woff') format('woff'), url('assets/iosevka-mediumoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-bold.woff2') format('woff2'), url('assets/iosevka-bold.woff') format('woff'), url('assets/iosevka-bold.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-bolditalic.woff2') format('woff2'), url('assets/iosevka-bolditalic.woff') format('woff'), url('assets/iosevka-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 700;
|
||||
src: url('assets/iosevka-boldoblique.woff2') format('woff2'), url('assets/iosevka-boldoblique.woff') format('woff'), url('assets/iosevka-boldoblique.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavy.woff2') format('woff2'), url('assets/iosevka-heavy.woff') format('woff'), url('assets/iosevka-heavy.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavyitalic.woff2') format('woff2'), url('assets/iosevka-heavyitalic.woff') format('woff'), url('assets/iosevka-heavyitalic.ttf') format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Iosevka';
|
||||
font-style: oblique;
|
||||
font-weight: 900;
|
||||
src: url('assets/iosevka-heavyoblique.woff2') format('woff2'), url('assets/iosevka-heavyoblique.woff') format('woff'), url('assets/iosevka-heavyoblique.ttf') format('truetype');
|
||||
}
|