Skip to content

Commit f128e8b

Browse files
committed
Release 34.2.0
2 parents a90e82c + 60cf254 commit f128e8b

File tree

480 files changed

+3788
-3223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

480 files changed

+3788
-3223
lines changed

.dockerignore

Lines changed: 0 additions & 13 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,37 @@
11
## Modifications since last major version
22

3+
### 34.2.0
4+
5+
* Add Latin localization forms for Sámi languages.
6+
* Add IPA localization forms for Lower B and D with stroke (`ƀ`, `đ`).
7+
* Refine shape of the following characters:
8+
- LATIN CAPITAL LETTER ENG (`U+014A`).
9+
- LATIN CAPITAL LETTER TURNED M (`U+019C`).
10+
- LATIN CAPITAL LETTER N WITH LONG RIGHT LEG (`U+0220`).
11+
- LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL (`U+024A`).
12+
- LATIN LETTER SMALL CAPITAL G (`U+0262`).
13+
- LATIN LETTER SMALL CAPITAL G WITH HOOK (`U+029B`).
14+
- LATIN SMALL LETTER LS DIGRAPH (`U+02AA`) ... LATIN SMALL LETTER LZ DIGRAPH (`U+02AB`).
15+
- GREEK CAPITAL LETTER IOTA WITH TONOS (`U+038A`).
16+
- COMBINING LATIN LETTER SMALL CAPITAL G (`U+1DDB`).
17+
- GREEK CAPITAL LETTER IOTA WITH PSILI (`U+1F38`) ... GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI (`U+1F3F`).
18+
- GREEK CAPITAL LETTER IOTA WITH VARIA (`U+1FDA`) ... GREEK CAPITAL LETTER IOTA WITH OXIA (`U+1FDB`).
19+
- SCRIPT SMALL L (`U+2113`).
20+
- TELEPHONE SIGN (`U+2121`) (#3080).
21+
- FACSIMILE SIGN (`U+213B`) (#3080).
22+
- LATIN CAPITAL LETTER ALPHA (`U+2C6D`).
23+
- LATIN CAPITAL LETTER TURNED ALPHA (`U+2C70`).
24+
- LATIN CAPITAL LETTER INSULAR R (`U+A782`).
25+
- LATIN CAPITAL LETTER SCRIPT G (`U+A7AC`).
26+
- LATIN CAPITAL LETTER GLOTTAL I (`U+A7BC`).
27+
- LATIN SMALL LETTER M WITH CROSSED-TAIL (`U+AB3A`).
28+
- MODIFIER LETTER SMALL CAPITAL G (`U+10792`).
29+
- MODIFIER LETTER SMALL CAPITAL G WITH HOOK (`U+10794`).
30+
- MODIFIER LETTER SMALL LS DIGRAPH (`U+10799`) ... MODIFIER LETTER SMALL LZ DIGRAPH (`U+1079A`).
31+
- MATHEMATICAL DOUBLE-STRUCK CAPITAL G (`U+1D53E`).
32+
- LATIN LETTER SMALL CAPITAL TURNED G (`U+1DF02`).
33+
34+
335
### 34.1.0
436

537
* Add IPA localization forms for letters with caron (e.g. {`ď``Ľ``ľ``ť`} → {`d͏̌``L͏̌``l͏̌``t͏̌`}).

changes/34.2.0.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
* Add Latin localization forms for Sámi languages.
2+
* Add IPA localization forms for Lower B and D with stroke (`ƀ`, `đ`).
3+
* Refine shape of the following characters:
4+
- LATIN CAPITAL LETTER ENG (`U+014A`).
5+
- LATIN CAPITAL LETTER TURNED M (`U+019C`).
6+
- LATIN CAPITAL LETTER N WITH LONG RIGHT LEG (`U+0220`).
7+
- LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL (`U+024A`).
8+
- LATIN LETTER SMALL CAPITAL G (`U+0262`).
9+
- LATIN LETTER SMALL CAPITAL G WITH HOOK (`U+029B`).
10+
- LATIN SMALL LETTER LS DIGRAPH (`U+02AA`) ... LATIN SMALL LETTER LZ DIGRAPH (`U+02AB`).
11+
- GREEK CAPITAL LETTER IOTA WITH TONOS (`U+038A`).
12+
- COMBINING LATIN LETTER SMALL CAPITAL G (`U+1DDB`).
13+
- GREEK CAPITAL LETTER IOTA WITH PSILI (`U+1F38`) ... GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI (`U+1F3F`).
14+
- GREEK CAPITAL LETTER IOTA WITH VARIA (`U+1FDA`) ... GREEK CAPITAL LETTER IOTA WITH OXIA (`U+1FDB`).
15+
- SCRIPT SMALL L (`U+2113`).
16+
- TELEPHONE SIGN (`U+2121`) (#3080).
17+
- FACSIMILE SIGN (`U+213B`) (#3080).
18+
- LATIN CAPITAL LETTER ALPHA (`U+2C6D`).
19+
- LATIN CAPITAL LETTER TURNED ALPHA (`U+2C70`).
20+
- LATIN CAPITAL LETTER INSULAR R (`U+A782`).
21+
- LATIN CAPITAL LETTER SCRIPT G (`U+A7AC`).
22+
- LATIN CAPITAL LETTER GLOTTAL I (`U+A7BC`).
23+
- LATIN SMALL LETTER M WITH CROSSED-TAIL (`U+AB3A`).
24+
- MODIFIER LETTER SMALL CAPITAL G (`U+10792`).
25+
- MODIFIER LETTER SMALL CAPITAL G WITH HOOK (`U+10794`).
26+
- MODIFIER LETTER SMALL LS DIGRAPH (`U+10799`) ... MODIFIER LETTER SMALL LZ DIGRAPH (`U+1079A`).
27+
- MATHEMATICAL DOUBLE-STRUCK CAPITAL G (`U+1D53E`).
28+
- LATIN LETTER SMALL CAPITAL TURNED G (`U+1DF02`).

doc/PACKAGE-LIST.md

Lines changed: 137 additions & 137 deletions
Large diffs are not rendered by default.

doc/custom-build.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4101,6 +4101,20 @@ It is possible to create a customized TTC build by using the following method:
41014101
- `npm run build -- ttc::IosevkaCustom`: Create TTCs from collection `IosevkaCustom`; The file will be saved into `dist/.ttc`.
41024102
- `npm run build -- super-ttc::IosevkaCustom`: Create a single-file TTC from collection `IosevkaCustom`; The file will be saved into `dist/.super-ttc`.
41034103

4104+
#### Single-Group TTCs (SGr)
4105+
4106+
When your collection contains multiple groups (e.g. different spacing variants), you can also build separate TTCs for each group individually:
4107+
4108+
- `npm run build -- sgr-ttc::IosevkaCustom`: Create individual TTCs for each group in collection `IosevkaCustom`; Files will be saved into `dist/.ttc/SGr-<group>/`.
4109+
- `npm run build -- sgr-super-ttc::IosevkaCustom`: Create individual single-file TTCs for each group in collection `IosevkaCustom`; Files will be saved into `dist/.super-ttc/`.
4110+
4111+
To build both bundled and single-group TTCs in one command:
4112+
4113+
- `npm run build -- all-ttc::IosevkaCustom`: Create both bundled and separate SGr TTCs.
4114+
- `npm run build -- all-super-ttc::IosevkaCustom`: Create both bundled and separate SGr Super TTCs.
4115+
4116+
Note: SGR commands require the collection to have more than one group in the `from` array, since they'd otherwise be equivalent to the regular bundled TTCs.
4117+
41044118
### Baking other OpenType features
41054119

41064120
There are tools tha could be used to bake other OpenType that are not configurable with TOML files (like baking localized forms). The tools include:

doc/cv-influences.md

Lines changed: 13 additions & 13 deletions
Large diffs are not rendered by default.

docker/Dockerfile

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
FROM node:lts-slim
22

3-
ARG NPM_REG
4-
53
RUN apt-get update \
64
&& DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
75
ttfautohint \
6+
curl \
7+
ca-certificates \
88
&& rm -rf /var/lib/apt/lists/*
99

10-
# Copy source (excluding files in .dockerignore)
11-
COPY . /iosevka/
12-
13-
# Install Node.js dependencies
14-
RUN if [ -n "$NPM_REG" ]; then npm config set registry "$NPM_REG"; fi \
15-
&& cd /iosevka && npm ci && npm cache clean --force
16-
17-
COPY docker/build.sh /
10+
COPY --chmod=755 build.sh /
1811
WORKDIR /work
1912
ENTRYPOINT ["bash", "/build.sh"]

docker/README.md

Lines changed: 83 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,117 @@
22

33
## 1. Building Docker Image
44

5-
Before building the font files, we'll first need to build a Docker image. This has to be done only once for a given repo version.
5+
Before building the font files, we'll first need to build a Docker image. This has to be done only once.
6+
We're going to use the image name `iosevka-builder` here, but you can set it to whatever you want.
67

7-
### 1.1. Clone the repo (if you haven't already)
8-
9-
```
8+
```bash
109
git clone --depth 1 https://github.com/be5invis/Iosevka.git
1110
cd Iosevka
12-
```
13-
14-
If you want to use a particular version, checkout the appropriate [version tag]((../../../tags)) or branch, for example:
15-
```
16-
git checkout v34.0.0
17-
```
18-
19-
### 1.2. Build the Docker Image
20-
21-
We're going to use image name `iosevka-builder` here, but you can set it to whatever you want. To build an image, run the following from the repo root directory:
22-
23-
```
24-
docker build -f docker/Dockerfile -t iosevka-builder .
11+
docker build -t iosevka-builder docker
2512
```
2613

2714
To confirm that the docker image now exists, you can run:
28-
```
15+
```bash
2916
docker images | grep iosevka-builder
3017
```
3118
The output should be something like this:
32-
```
19+
```bash
3320
iosevka-builder latest c847d5e08886 About a minute ago 491MB
3421
```
3522

36-
#### Optional Build Arg
37-
`--build-arg NPM_REG=<npm repository mirror url>`
38-
39-
Specify `NPM_REG` to use an NPM registry mirror.
23+
At this point, you can delete the cloned repo, because the Docker container is going to download a fresh copy of the source by default. (That is, unless you want to make the Docker container use a local copy - see below.)
4024

41-
Example:
42-
```
43-
docker build -f docker/Dockerfile --build-arg NPM_REG=https://mirrors.huaweicloud.com/repository/npm -t iosevka-builder .
25+
```bash
26+
cd ..
27+
rm -rf Iosevka/
4428
```
4529

4630
## 2. Building Font Files
4731

48-
Once we have a docker image, we can build (and rebuild) font files like so:
49-
50-
```
51-
docker run -it --rm -v $PWD:/work iosevka-builder <BUILD_ARGS>
32+
```bash
33+
docker run -it --rm [-e SOURCE=<SOURCE>] [-e NPM_REG=<URL>] -v $PWD:/work iosevka-builder [<BUILD_ARGS>]
5234
```
5335

36+
Optional environment variables include:
37+
- `SOURCE` - source to download (see formats below). If unset, defaults to latest release.
38+
- `NPM_REG` - NPM registry mirror URL, e.g. https://mirrors.huaweicloud.com/repository/npm
39+
40+
`SOURCE` accepts several formats:
41+
42+
| Format | Example | Meaning |
43+
|---|---|---|
44+
| `ref` | `v34.1.0`, `main`, `abc123f` | Tag, branch or commit |
45+
| `owner/repo@ref` | `you/YourIosevkaFork@v34.1.0` | Tag, branch or commit from a specific fork repo |
46+
| `owner/repo` | `you/YourIosevkaFork` | Latest release from a specific fork repo |
47+
5448
For supported `<BUILD_ARGS>`, please refer to [Customized Build](../doc/custom-build.md).
5549

56-
## Examples
57-
### Custom Build
50+
Note that each container run will download and unpack a source tarball and install dependencies afresh. If you want to avoid re-downloading source (e.g. when iterating on a build plan) or use a local copy of the source, you'll need to override the Docker entrypoint. Check below for examples.
51+
52+
### Examples
53+
#### Default Build
54+
```bash
55+
docker run -it --rm -v $PWD:/work iosevka-builder
56+
```
57+
58+
#### Custom Build
5859

5960
This will build Iosevka `ss06` in all formats, `ss12` TTF and `ss15` webfont:
6061

61-
```
62-
docker run -it --rm -v $PWD:/work iosevka-builder contents::IosevkaSS06 ttf::IosevkaSS12 webfont::IosevkaSS15
63-
ls -lR dist/ # Recursively list build result directories
62+
```bash
63+
docker run -it --rm -e SOURCE=v34.1.0 -v $PWD:/work iosevka-builder contents::IosevkaSS06 ttf::IosevkaSS12 webfont::IosevkaSS15
6464
```
6565

66-
### Custom Build Plans
66+
#### Custom Build Plans
6767

6868
This example will:
69-
- Gather build plans from `myfont1.toml`, `myfont2.toml` and `myfont3.toml` to a single `private-build-plans.toml` file.
70-
- Build `myfont1`, `myfont2` TTF, and `myfont3` in all formats.
71-
```
69+
- Gather build plans from `myfont1.toml`, `myfont2.toml` and `myfont3.toml` into a single `private-build-plans.toml` file.
70+
- Build `MyFont1` and `MyFont2` as TTF, and `MyFont3` in all formats.
71+
```bash
7272
cat myfont1.toml myfont2.toml myfont3.toml > private-build-plans.toml
73-
docker run -it --rm -v $PWD:/work iosevka-builder ttf::myfont1 ttf::myfont2 contents::myfont3
74-
ls -lR dist/ # Recursively list build result directories
73+
docker run -it --rm -e SOURCE=v34.1.0 -v $PWD:/work iosevka-builder ttf::MyFont1 ttf::MyFont2 contents::MyFont3
74+
```
75+
76+
To prepare the custom build plans, please refer to [Configuring Custom Build](../doc/custom-build.md#configuring-custom-build) or use the [Customizer](https://be5invis.github.io/Iosevka/customizer).
77+
78+
#### Using a Fork
79+
80+
```bash
81+
docker run -it --rm -e SOURCE=you/YourIosevkaFork@v34.1.0 -v $PWD:/work iosevka-builder contents::Iosevka
82+
```
83+
84+
#### Interactive Mode (Downloaded Source)
85+
86+
To keep the downloaded source between builds, override the entrypoint to get an interactive shell.
87+
`/build.sh` keeps track of the version used for the previous run and re-downloads only if necessary.
88+
89+
```bash
90+
docker run -it --rm -v $PWD:/work --entrypoint bash iosevka-builder
91+
$ /build.sh ttf::MyFont
92+
# Make some changes and rebuild
93+
$ cat myfont1.toml myfont2.toml myfont3.toml > private-build-plans.toml
94+
$ /build.sh ttf::MyFont
95+
# Rebuild with a different source version
96+
$ SOURCE=v34.0.0 /build.sh ttf::MyFont
97+
$ exit
98+
```
99+
100+
#### Using Local Source
101+
102+
To build from a local Iosevka checkout, override the entrypoint like so:
103+
104+
```bash
105+
docker run -it --rm -v /path/to/iosevka:/work --entrypoint bash iosevka-builder -c 'npm install && npm run build -- ttf::MyFont'
106+
```
107+
108+
#### Interactive Mode (Local Source)
109+
110+
To run repeated builds from local source in interactive mode:
111+
112+
```bash
113+
docker run -it --rm -v /path/to/iosevka:/work --entrypoint bash iosevka-builder
114+
$ npm install
115+
$ npm run build -- ttf::MyFont
116+
$ exit
75117
```
76118

77-
To prepare the custom build plans, please refer to [Configuring Custom Build](https://github.com/be5invis/Iosevka/blob/main/doc/custom-build.md#configuring-custom-build) or use the [Customizer](https://be5invis.github.io/Iosevka/customizer).

docker/build.sh

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,22 @@ IOSEVKA_DIR="/iosevka"
33
WORK_DIR="/work"
44
PRIVATE_FILE="private-build-plans.toml"
55
DEFAULT_ARGS="contents::Iosevka"
6+
REPO="be5invis/Iosevka"
7+
REF=""
68
BUILD_ARGS="$@"
9+
TMP_TARGZ="/tmp/iosevka.tar.gz"
10+
TMP_HEADERS="/tmp/headers.txt"
711
set -e
812

913
[[ -z $BUILD_ARGS ]] && echo 'Usage: docker run -it --rm -v $PWD:/work <DOCKER_IMAGE> <BUILD_ARGS>'
1014

1115
[[ -f "${WORK_DIR}/${PRIVATE_FILE}" ]] && {
1216
echo "Found $PRIVATE_FILE, custom build."
13-
cp "${WORK_DIR}/${PRIVATE_FILE}" "${IOSEVKA_DIR}/"
1417
[[ -z $BUILD_ARGS ]] && {
1518
FONT_NAME=$(grep -m1 -Po '(?<=\[buildPlans\.)[^\]]+' ${WORK_DIR}/${PRIVATE_FILE})
1619
[[ -z "$FONT_NAME" ]] && {
1720
echo "$PRIVATE_FILE file format error!"
18-
exit 1
21+
exit 2
1922
}
2023
BUILD_ARGS="contents::$FONT_NAME"
2124
}
@@ -26,6 +29,62 @@ set -e
2629
}
2730
}
2831

32+
# SOURCE formats: "v34.1.0", "main", "owner/repo@ref", "owner/repo"
33+
# If unset, defaults to latest release of REPO.
34+
if [[ "$SOURCE" == *@* ]]; then
35+
REPO="${SOURCE%%@*}"
36+
REF="${SOURCE#*@}"
37+
elif [[ "$SOURCE" == */* ]]; then
38+
REPO="$SOURCE"
39+
elif [[ -n "$SOURCE" ]]; then
40+
REF="$SOURCE"
41+
fi
42+
if [[ -z "$REF" ]]; then
43+
REF=$(curl -fsSL -r 0-2047 "https://api.github.com/repos/${REPO}/releases/latest" | grep -Po '"tag_name":\s*"\Kv[\d\.]+') || true
44+
[[ -z "$REF" ]] && { echo "Failed to fetch latest release for ${REPO}"; exit 3; }
45+
echo "Latest release: ${REF}"
46+
fi
47+
# Fetch source tarball if not already downloaded using URL+ETag as unique cache ID.
48+
# REPO+REF wouldn't suffice - branch head could have changed since last run.
49+
# We could use commit SHA instead, but that would be an extra API call.
50+
TARGZ_URL="https://github.com/${REPO}/archive/${REF}.tar.gz"
51+
ETAG_FILE="$IOSEVKA_DIR/.etag"
52+
CURL_OPTS=(-sSL -D "$TMP_HEADERS" -o "$TMP_TARGZ" -w '%{http_code}')
53+
# If request URL is the same as last run, add If-None-Match header
54+
if [[ -f "$ETAG_FILE" ]] && read -r CACHED_URL CACHED_ETAG < "$ETAG_FILE" && [[ "$CACHED_URL" == "$TARGZ_URL" ]]; then
55+
CURL_OPTS+=(-H "If-None-Match: $CACHED_ETAG")
56+
fi
57+
58+
echo "Fetching ${REPO}@${REF}..."
59+
HTTP_CODE=$(curl "${CURL_OPTS[@]}" "$TARGZ_URL") || true
60+
61+
if [[ "$HTTP_CODE" == "304" ]]; then
62+
echo "Source unchanged (HTTP 304), skipping."
63+
elif [[ "$HTTP_CODE" == "200" ]]; then
64+
echo "Extracting..."
65+
rm -rf "$IOSEVKA_DIR"
66+
mkdir -p "$IOSEVKA_DIR"
67+
tar xz --strip-components=1 -C "$IOSEVKA_DIR" < "$TMP_TARGZ" || {
68+
echo "Failed to extract: $TARGZ_URL"; exit 4
69+
}
70+
# Save ETag for future conditional requests
71+
ETAG=$(grep -i '^etag:' "$TMP_HEADERS" | tail -1 | tr -d '\r' | awk '{print $2}')
72+
[[ -n "$ETAG" ]] && echo "$TARGZ_URL $ETAG" > "$ETAG_FILE"
73+
else
74+
echo "Failed to download: $TARGZ_URL (HTTP $HTTP_CODE)"; exit 5
75+
fi
76+
rm -f "$TMP_TARGZ" "$TMP_HEADERS"
77+
78+
if [[ -d "$IOSEVKA_DIR/node_modules" ]]; then
79+
echo "Dependencies already installed, skipping npm ci."
80+
else
81+
echo "Installing npm dependencies..."
82+
[[ -n "$NPM_REG" ]] && npm config set registry "$NPM_REG"
83+
cd "$IOSEVKA_DIR" && npm ci
84+
fi
85+
86+
[[ -f "${WORK_DIR}/${PRIVATE_FILE}" ]] && cp "${WORK_DIR}/${PRIVATE_FILE}" "${IOSEVKA_DIR}/"
87+
2988
echo "Building fonts with: $BUILD_ARGS"
3089

3190
cd "$IOSEVKA_DIR"

images/button-release.dark.svg

Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)