Compare commits
No commits in common. "master" and "25.0.1" have entirely different histories.
10
Makefile
10
Makefile
@ -12,17 +12,13 @@ v:
|
|||||||
|
|
||||||
dist: $(BUILD_DIR)/iosevka-prog-$(V).tar.xz
|
dist: $(BUILD_DIR)/iosevka-prog-$(V).tar.xz
|
||||||
|
|
||||||
$(BUILD_DIR)/iosevka-prog-$(V).tar.xz: $(BUILD_DIR)/IosevkaProg/TTF/iosevka-prog-$(V)/*.ttf
|
$(BUILD_DIR)/iosevka-prog-$(V).tar.xz: $(BUILD_DIR)/iosevka-prog/ttf/*.ttf
|
||||||
cd $(BUILD_DIR)/iosevka-prog/ttf/iosevka-prog-$(V); tar Jcf $(BUILD_DIR)/iosevka-prog-$(V).tar.xz *.ttf
|
cd $(BUILD_DIR)/iosevka-prog/ttf; tar Jcf $(BUILD_DIR)/iosevka-prog-$(V).tar.xz *.ttf
|
||||||
|
|
||||||
$(BUILD_DIR)/iosevka-prog-nerd-$(V).tar.xz: $(BUILD_DIR)/IosevkaProg/TTF/iosevka-prog-nerd-$(V)/*.ttf
|
|
||||||
cd $(BUILD_DIR)/iosevka-prog/ttf/iosevka-prog-nerd-$(V); tar Jcf $(BUILD_DIR)/iosevka-prog-nerd-$(V).tar.xz *.ttf
|
|
||||||
|
|
||||||
upload: dist
|
upload: dist
|
||||||
git tag $(V)
|
git tag $(V)
|
||||||
gitea-tea r c --repo f1x1t/iosevka-prog-font-builder -t $(V) --tag $(V) \
|
gitea-tea r c --repo f1x1t/iosevka-prog-font-builder -t $(V) --tag $(V) \
|
||||||
-a $(BUILD_DIR)/iosevka-prog-$(V).tar.xz \
|
-a $(BUILD_DIR)/iosevka-prog-$(V).tar.xz
|
||||||
-a $(BUILD_DIR)/iosevka-prog-nerd-$(V).tar.xz
|
|
||||||
git tag -d $(V)
|
git tag -d $(V)
|
||||||
git push
|
git push
|
||||||
|
|
||||||
|
@ -4,14 +4,13 @@
|
|||||||
В основе лежит моноширинный шрифт [Iosevka](https://github.com/be5invis/Iosevka/) и
|
В основе лежит моноширинный шрифт [Iosevka](https://github.com/be5invis/Iosevka/) и
|
||||||
встраиваемый в шрифт набор иконок [Nerd Fonts](https://www.nerdfonts.com/).
|
встраиваемый в шрифт набор иконок [Nerd Fonts](https://www.nerdfonts.com/).
|
||||||
|
|
||||||
Для сборки требуется установка [Docker](https://www.docker.com/) и библиотека
|
Для сборки требуется установка [Docker](https://www.docker.com/):
|
||||||
для работы со шрифтами [fonttools](https://pypi.org/project/fonttools/):
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get install docker.io python3-fonttools
|
sudo apt-get install docker.io
|
||||||
```
|
```
|
||||||
|
|
||||||
Сборка шрифта выполняется командой `make`, результат сохраняется в каталог `dist`.
|
Сборка шрифта выполняется командой `make`, результат сохраняется в каталог `dist`.
|
||||||
|
|
||||||
Готовый шрифт версии [31.6.1](../../../releases/download/31.6.1/iosevka-prog-31.6.1.tar.xz).
|
Готовый шрифт версии [22.1.2](../../../releases/download/22.1.2/iosevka-prog-22.1.2.tar.xz).
|
||||||
|
|
||||||
|
@ -2,46 +2,32 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
IOSEVKA_VERSION=31.6.1
|
IOSEVKA_VERSION=22.1.2
|
||||||
FONT_NAME=IosevkaProg
|
FONT_NAME=iosevka-prog
|
||||||
FILE=$( readlink -f "${BASH_SOURCE[0]}" )
|
FILE=$( readlink -f "${BASH_SOURCE[0]}" )
|
||||||
DIR=$( dirname "${FILE}" )
|
DIR=$( dirname "${FILE}" )
|
||||||
DIST="${DIR}/dist"
|
DIST="${DIR}/dist"
|
||||||
OBLIQUE="${DIST}/Oblique"
|
OBLIQUE="${DIST}/oblique"
|
||||||
REGULAR="${DIST}/Regular"
|
REGULAR="${DIST}/regular"
|
||||||
CONFIG="${DIR}/private-build-plans.toml"
|
CONFIG="${DIR}/private-build-plans.toml"
|
||||||
OUT_DIR="${DIST}/${FONT_NAME}/TTF"
|
OUT_DIR="${DIST}/${FONT_NAME}/ttf"
|
||||||
|
|
||||||
if [ -r "${CONFIG}" ]; then
|
if [ -r "${CONFIG}" ]; then
|
||||||
if command -v docker >/dev/null 2>&1; then
|
if command -v docker >/dev/null 2>&1; then
|
||||||
wget -c https://github.com/be5invis/Iosevka/archive/refs/tags/v${IOSEVKA_VERSION}.tar.gz
|
docker pull avivace/iosevka-build
|
||||||
tar axf v${IOSEVKA_VERSION}.tar.gz
|
docker pull nerdfonts/patcher
|
||||||
pushd Iosevka-${IOSEVKA_VERSION}/docker
|
docker run -e FONT_VERSION="${IOSEVKA_VERSION}" -it -v "$DIR":/build avivace/iosevka-build ttf::${FONT_NAME}
|
||||||
docker build -t=iosevka-builder .
|
|
||||||
popd
|
|
||||||
rm -rf Iosevka-${IOSEVKA_VERSION} v${IOSEVKA_VERSION}.tar.gz
|
|
||||||
docker pull cdalvaro/docker-nerd-fonts-patcher:latest
|
|
||||||
docker run -e FONT_VERSION="${IOSEVKA_VERSION}" -it -v "$DIR":/work iosevka-builder ttf::${FONT_NAME}
|
|
||||||
sudo chown -R "$(id -u)":"$(id -g)" "${DIST}"
|
sudo chown -R "$(id -u)":"$(id -g)" "${DIST}"
|
||||||
mkdir -p "${OBLIQUE}"
|
mkdir -p "${OBLIQUE}"
|
||||||
cp -af "${OUT_DIR}/${FONT_NAME}-Oblique.ttf" "${OBLIQUE}"
|
cp -af "${OUT_DIR}/${FONT_NAME}-oblique.ttf" "${OBLIQUE}"
|
||||||
docker run --rm -v "${OBLIQUE}":/in -v "${OUT_DIR}":/out nerdfonts/patcher --complete --adjust-line-height --makegroups 1
|
docker run -v "${OBLIQUE}":/in -v "${OUT_DIR}":/out nerdfonts/patcher --complete --careful --adjust-line-height --makegroups || true
|
||||||
mkdir -p "${REGULAR}"
|
mkdir -p "${REGULAR}"
|
||||||
cp -af "${OUT_DIR}/${FONT_NAME}-Regular.ttf" "${REGULAR}"
|
cp -af "${OUT_DIR}/${FONT_NAME}-regular.ttf" "${REGULAR}"
|
||||||
docker run --rm -v "${REGULAR}":/in -v "${OUT_DIR}":/out nerdfonts/patcher --complete --adjust-line-height --makegroups 1 --mono --removeligatures
|
docker run -v "${REGULAR}":/in -v "${OUT_DIR}":/out nerdfonts/patcher --complete --careful --adjust-line-height --makegroups --mono --removeligatures || true
|
||||||
sudo chown -R "$(id -u)":"$(id -g)" "${DIST}"
|
|
||||||
cd "${OUT_DIR}"
|
cd "${OUT_DIR}"
|
||||||
python3 "${DIR}/fontname.py" "Iosevka Prog Nerd Font" IosevkaProgNerdFont-Oblique.ttf
|
tar acf "${DIST}/fonts-iosevka-prog-nerd_${IOSEVKA_VERSION}.orig.tar.xz" Iosevka*Nerd*ttf
|
||||||
python3 "${DIR}/fontname.py" "Iosevka Prog Nerd Font Mono" IosevkaProgNerdFontMono-Regular.ttf
|
tar acf "${DIST}/fonts-iosevka-prog_${IOSEVKA_VERSION}.orig.tar.xz" iosevka*ttf
|
||||||
mkdir -p "iosevka-prog-nerd-$IOSEVKA_VERSION"
|
tar acf "${DIST}/iosevka-prog-${IOSEVKA_VERSION}.tar.xz" *ttf
|
||||||
mv Iosevka*Nerd*ttf "iosevka-prog-nerd-$IOSEVKA_VERSION"
|
|
||||||
tar acf "${DIST}/iosevka-prog-nerd-${IOSEVKA_VERSION}.tar.xz" "iosevka-prog-nerd-$IOSEVKA_VERSION"
|
|
||||||
mkdir -p "iosevka-prog-$IOSEVKA_VERSION"
|
|
||||||
mv Iosevka*ttf "iosevka-prog-$IOSEVKA_VERSION"
|
|
||||||
tar acf "${DIST}/iosevka-prog-${IOSEVKA_VERSION}.tar.xz" "iosevka-prog-$IOSEVKA_VERSION"
|
|
||||||
cd "${DIST}"
|
|
||||||
ln -s "iosevka-prog-nerd-${IOSEVKA_VERSION}.tar.xz" "fonts-iosevka-prog-nerd_${IOSEVKA_VERSION}.orig.tar.xz"
|
|
||||||
ln -s "iosevka-prog-${IOSEVKA_VERSION}.tar.xz" "fonts-iosevka-prog_${IOSEVKA_VERSION}.orig.tar.xz"
|
|
||||||
else
|
else
|
||||||
echo "Docker executable not found"
|
echo "Docker executable not found"
|
||||||
fi
|
fi
|
||||||
|
134
fontname.py
134
fontname.py
@ -1,134 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# ==========================================================================
|
|
||||||
# fontname.py
|
|
||||||
# Copyright 2019 Christopher Simpkins
|
|
||||||
# MIT License
|
|
||||||
#
|
|
||||||
# Dependencies:
|
|
||||||
# 1) Python 3.6+ interpreter
|
|
||||||
# 2) fonttools Python library (https://github.com/fonttools/fonttools)
|
|
||||||
# - install with `pip3 install fonttools`
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# python3 fontname.py [FONT FAMILY NAME] [FONT PATH 1] <FONT PATH ...>
|
|
||||||
#
|
|
||||||
# Notes:
|
|
||||||
# Use quotes around font family name arguments that include spaces
|
|
||||||
# ===========================================================================
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from fontTools import ttLib
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
|
||||||
# command argument tests
|
|
||||||
print(" ")
|
|
||||||
if len(argv) < 2:
|
|
||||||
sys.stderr.write(
|
|
||||||
f"[fontname.py] ERROR: you did not include enough arguments to the script.{os.linesep}"
|
|
||||||
)
|
|
||||||
sys.stderr.write(
|
|
||||||
f"Usage: python3 fontname.py [FONT FAMILY NAME] [FONT PATH 1] <FONT PATH ...>{os.linesep}"
|
|
||||||
)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# begin parsing command line arguments
|
|
||||||
try:
|
|
||||||
font_name = str(argv[0]) # the first argument is the new typeface name
|
|
||||||
except Exception as e:
|
|
||||||
sys.stderr.write(
|
|
||||||
f"[fontname.py] ERROR: Unable to convert argument to string. {e}{os.linesep}"
|
|
||||||
)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# all remaining arguments on command line are file paths to fonts
|
|
||||||
font_path_list = argv[1:]
|
|
||||||
|
|
||||||
# iterate through all paths provided on command line and rename to `font_name` defined by user
|
|
||||||
for font_path in font_path_list:
|
|
||||||
# test for existence of font file on requested file path
|
|
||||||
if not file_exists(font_path):
|
|
||||||
sys.stderr.write(
|
|
||||||
f"[fontname.py] ERROR: the path '{font_path}' does not appear to be a valid file path.{os.linesep}"
|
|
||||||
)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
tt = ttLib.TTFont(font_path)
|
|
||||||
namerecord_list = tt["name"].names
|
|
||||||
|
|
||||||
style = ""
|
|
||||||
|
|
||||||
# determine font style for this file path from name record nameID 2
|
|
||||||
for record in namerecord_list:
|
|
||||||
if record.nameID == 2:
|
|
||||||
style = str(record)
|
|
||||||
break
|
|
||||||
|
|
||||||
# test that a style name was found in the OpenType tables of the font
|
|
||||||
if len(style) == 0:
|
|
||||||
sys.stderr.write(
|
|
||||||
f"[fontname.py] Unable to detect the font style from the OpenType name table in '{font_path}'. {os.linesep}"
|
|
||||||
)
|
|
||||||
sys.stderr.write("Unable to complete execution of the script.")
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
# used for the Postscript name in the name table (no spaces allowed)
|
|
||||||
postscript_font_name = font_name.replace(" ", "")
|
|
||||||
# font family name
|
|
||||||
nameID1_string = font_name
|
|
||||||
nameID16_string = font_name
|
|
||||||
# full font name
|
|
||||||
nameID4_string = f"{font_name} {style}"
|
|
||||||
# Postscript name
|
|
||||||
# - no spaces allowed in family name or the PostScript suffix. should be dash delimited
|
|
||||||
nameID6_string = f"{postscript_font_name}-{style.replace(' ', '')}"
|
|
||||||
# nameID6_string = postscript_font_name + "-" + style.replace(" ", "")
|
|
||||||
|
|
||||||
# modify the opentype table data in memory with updated values
|
|
||||||
for record in namerecord_list:
|
|
||||||
if record.nameID == 1:
|
|
||||||
record.string = nameID1_string
|
|
||||||
elif record.nameID == 4:
|
|
||||||
record.string = nameID4_string
|
|
||||||
elif record.nameID == 6:
|
|
||||||
record.string = nameID6_string
|
|
||||||
elif record.nameID == 16:
|
|
||||||
record.string = nameID16_string
|
|
||||||
|
|
||||||
# CFF table naming for CFF fonts (only)
|
|
||||||
if "CFF " in tt:
|
|
||||||
try:
|
|
||||||
cff = tt["CFF "]
|
|
||||||
cff.cff[0].FamilyName = nameID1_string
|
|
||||||
cff.cff[0].FullName = nameID4_string
|
|
||||||
cff.cff.fontNames = [nameID6_string]
|
|
||||||
except Exception as e:
|
|
||||||
sys.stderr.write(
|
|
||||||
f"[fontname.py] ERROR: unable to write new names to CFF table: {e}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# write changes to the font file
|
|
||||||
try:
|
|
||||||
tt.save(font_path)
|
|
||||||
print(f"[OK] Updated '{font_path}' with the name '{nameID4_string}'")
|
|
||||||
except Exception as e:
|
|
||||||
sys.stderr.write(
|
|
||||||
f"[fontname.py] ERROR: unable to write new name to OpenType name table for '{font_path}'. {os.linesep}"
|
|
||||||
)
|
|
||||||
sys.stderr.write(f"{e}{os.linesep}")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
# Utilities
|
|
||||||
|
|
||||||
|
|
||||||
def file_exists(filepath):
|
|
||||||
"""Tests for existence of a file on the string filepath"""
|
|
||||||
return os.path.exists(filepath) and os.path.isfile(filepath)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main(sys.argv[1:])
|
|
@ -1,34 +1,34 @@
|
|||||||
[buildPlans.IosevkaProg]
|
[buildPlans.iosevka-prog]
|
||||||
family = "Iosevka Prog"
|
family = "Iosevka Prog"
|
||||||
spacing = "fontconfig-mono"
|
spacing = "fontconfig-mono"
|
||||||
serifs = "sans"
|
serifs = "sans"
|
||||||
noCvSs = false
|
no-cv-ss = false
|
||||||
noLigation = true
|
no-ligation = true
|
||||||
exportGlyphNames = true
|
export-glyph-names = true
|
||||||
|
|
||||||
[buildPlans.IosevkaProg.variants]
|
[buildPlans.iosevka-prog.variants]
|
||||||
inherits = "ss08"
|
inherits = "ss08"
|
||||||
|
|
||||||
[buildPlans.IosevkaProg.metricOverride]
|
[buildPlans.iosevka-prog.metric-override]
|
||||||
sb = 55
|
sb = 55
|
||||||
leading = 1200
|
leading = 1200
|
||||||
|
|
||||||
[buildPlans.IosevkaProg.widths.Normal]
|
[buildPlans.iosevka-prog.widths.normal]
|
||||||
shape = 420
|
shape = 420
|
||||||
menu = 5
|
menu = 5
|
||||||
css = "normal"
|
css = "normal"
|
||||||
|
|
||||||
[buildPlans.IosevkaProg.weights.Thin]
|
[buildPlans.iosevka-prog.weights.thin]
|
||||||
shape = 100
|
shape = 100
|
||||||
menu = 100
|
menu = 100
|
||||||
css = 100
|
css = 100
|
||||||
|
|
||||||
[buildPlans.IosevkaProg.weights.Regular]
|
[buildPlans.iosevka-prog.weights.regular]
|
||||||
shape = 400
|
shape = 400
|
||||||
menu = 400
|
menu = 400
|
||||||
css = 400
|
css = 400
|
||||||
|
|
||||||
[buildPlans.IosevkaProg.weights.Bold]
|
[buildPlans.iosevka-prog.weights.bold]
|
||||||
shape = 700
|
shape = 700
|
||||||
menu = 700
|
menu = 700
|
||||||
css = 700
|
css = 700
|
||||||
|
Loading…
Reference in New Issue
Block a user