mirror of
https://github.com/rsms/inter.git
synced 2024-09-11 10:55:24 +03:00
UPM 2048 and opsz axis (#462)
- UPM is adjusted to 2048 - Additional opsz VF axis (multi master) added which will eventually replace the separate Display family - New tooling that uses fontmake instead of Inter's own fontbuild toolchain. (The old toolchain is still supported, i.e. `make -f Makefile_v1.make ...`)
This commit is contained in:
parent
633839ad55
commit
0796076659
829
Makefile
829
Makefile
@ -1,239 +1,274 @@
|
||||
# To list all targets:
|
||||
# make list
|
||||
#
|
||||
# High-level make targets:
|
||||
# text Build all Inter Text fonts (default target)
|
||||
# display Build all Inter Display fonts
|
||||
# all Build everything
|
||||
# web Build all web fonts
|
||||
# var Build all variable fonts
|
||||
# test Run all test (builds fonts if needed)
|
||||
# zip Build a complete ZIP archive of all fonts
|
||||
# zip_text Build a complete ZIP archive of all Inter Text fonts
|
||||
# zip_display Build a complete ZIP archive of all Inter Display fonts
|
||||
# install Build and install all OTF files (macOS only)
|
||||
#
|
||||
# Style-specific targets:
|
||||
# STYLE_otf Build OTF file for STYLE into FONTDIR/const
|
||||
# STYLE_ttf Build TTF file for STYLE into FONTDIR/const
|
||||
# STYLE_ttf_hinted Build TTF file for STYLE with hints into
|
||||
# FONTDIR/const-hinted
|
||||
# STYLE_web Build WOFF files for STYLE into FONTDIR/const
|
||||
# STYLE_web_hinted Build WOFF files for STYLE with hints into
|
||||
# FONTDIR/const-hinted
|
||||
# STYLE_check Build & check OTF and TTF files for STYLE
|
||||
#
|
||||
# "build" directory output structure:
|
||||
# fonts
|
||||
# const
|
||||
# const-hinted
|
||||
# var
|
||||
#
|
||||
FONTDIR = build/fonts
|
||||
# List all targets with 'make list'
|
||||
SRCDIR := $(abspath $(lastword $(MAKEFILE_LIST))/..)
|
||||
FONTDIR := build/fonts
|
||||
UFODIR := build/ufo
|
||||
BIN := $(SRCDIR)/build/venv/bin
|
||||
VERSION := $(shell cat version.txt)
|
||||
MAKEFILE := $(lastword $(MAKEFILE_LIST))
|
||||
|
||||
default: text
|
||||
all: text display
|
||||
|
||||
# all fonts of given variant
|
||||
text: all_otf_text all_ttf_text all_ttf_text_hinted all_var_text web_text
|
||||
display: all_otf_display all_ttf_display all_ttf_display_hinted all_var_display web_display
|
||||
|
||||
# all fonts of a certain type
|
||||
all_otf: all_otf_text all_otf_display
|
||||
all_ttf: all_ttf_text all_ttf_display all_ttf_text_hinted all_ttf_display_hinted
|
||||
|
||||
web: web_text web_display
|
||||
web_text: all_web_text all_web_hinted_text
|
||||
web_display: all_web_display all_web_hinted_display
|
||||
|
||||
var: all_var_text all_var_display
|
||||
var_text: $(FONTDIR)/var/Inter.var.woff2 $(FONTDIR)/var/Inter.var.ttf $(FONTDIR)/var/Inter-V.var.ttf
|
||||
var_display: $(FONTDIR)/var/InterDisplay.var.woff2 $(FONTDIR)/var/InterDisplay.var.ttf $(FONTDIR)/var/InterDisplay-V.var.ttf
|
||||
all_var_text: \
|
||||
$(FONTDIR)/var/Inter.var.ttf \
|
||||
$(FONTDIR)/var/Inter.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-V.var.ttf \
|
||||
$(FONTDIR)/var/Inter-V.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-roman.var.ttf \
|
||||
$(FONTDIR)/var/Inter-roman.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-italic.var.ttf \
|
||||
$(FONTDIR)/var/Inter-italic.var.woff2
|
||||
all_var_display: \
|
||||
$(FONTDIR)/var/InterDisplay.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay.var.woff2 \
|
||||
$(FONTDIR)/var/InterDisplay-V.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay-V.var.woff2 \
|
||||
$(FONTDIR)/var/InterDisplay-roman.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay-roman.var.woff2 \
|
||||
$(FONTDIR)/var/InterDisplay-italic.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay-italic.var.woff2
|
||||
|
||||
.PHONY: all all_otf all_ttf text display
|
||||
.PHONY: web web_text web_display
|
||||
.PHONY: var var_text var_display all_var_text all_var_display
|
||||
|
||||
# Hinted variable font disabled. See https://github.com/rsms/inter/issues/75
|
||||
# all_var_hinted: $(FONTDIR)/var-hinted/Inter.var.ttf $(FONTDIR)/var-hinted/Inter.var.woff2
|
||||
|
||||
BIN := $(PWD)/build/venv/bin
|
||||
export PATH := $(BIN):$(PATH)
|
||||
|
||||
# list make targets
|
||||
# We copy the Makefile (first in MAKEFILE_LIST) and disable the include to only list
|
||||
# primary targets, avoiding the generated targets.
|
||||
.PHONY: list list_all
|
||||
list:
|
||||
@mkdir -p build/etc \
|
||||
&& cat $(firstword $(MAKEFILE_LIST)) \
|
||||
| sed 's/include /#include /g' > build/etc/Makefile-list \
|
||||
&& $(MAKE) -pRrq -f build/etc/Makefile-list : 2>/dev/null \
|
||||
| awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \
|
||||
| sort \
|
||||
| egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||
# list_all is like list, but includes generated targets
|
||||
list_all:
|
||||
@$(MAKE) -pRrq -f $(firstword $(MAKEFILE_LIST)) : 2>/dev/null \
|
||||
| awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \
|
||||
| sort \
|
||||
| egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||
|
||||
# generated.make is automatically generated by init.sh and defines depenencies for
|
||||
# all styles and alias targets
|
||||
include build/etc/generated.make
|
||||
|
||||
|
||||
# WOFF2 from TTF
|
||||
build/%.woff2: build/%.ttf
|
||||
$(BIN)/woff2_compress "$<"
|
||||
|
||||
# WOFF from TTF
|
||||
build/%.woff: build/%.ttf
|
||||
$(BIN)/ttf2woff -O -t woff "$<" "$@"
|
||||
|
||||
|
||||
|
||||
# VF OTF from UFO
|
||||
$(FONTDIR)/var/Inter.var.ttf: $(all_ufo_masters_text) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) build/ufo/Inter.designspace
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
$(FONTDIR)/var/Inter-V.var.ttf: $(FONTDIR)/var/Inter.var.ttf
|
||||
misc/fontbuild rename --family "Inter V" -o $@ $<
|
||||
|
||||
$(FONTDIR)/var/Inter-%.var.ttf: build/ufo/Inter-%.designspace $(all_ufo_masters_text) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) $<
|
||||
misc/tools/fix-vf-meta.py $@
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
|
||||
$(FONTDIR)/var/InterDisplay.var.ttf: $(all_ufo_masters_display) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) build/ufo/InterDisplay.designspace
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
$(FONTDIR)/var/InterDisplay-V.var.ttf: $(FONTDIR)/var/InterDisplay.var.ttf
|
||||
misc/fontbuild rename --family "Inter Display V" -o $@ $<
|
||||
|
||||
$(FONTDIR)/var/InterDisplay-%.var.ttf: build/ufo/InterDisplay-%.designspace $(all_ufo_masters_display) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) $<
|
||||
misc/tools/fix-vf-meta.py $@
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
|
||||
# OTF/TTF from UFO
|
||||
$(FONTDIR)/const/Inter%.otf: build/ufo/Inter%.ufo version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile -o $@ $(FONTBUILD_FLAGS) build/ufo/Inter$*.ufo
|
||||
|
||||
$(FONTDIR)/const/Inter%.ttf: build/ufo/Inter%.ufo version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile -o $@ $(FONTBUILD_FLAGS) build/ufo/Inter$*.ufo
|
||||
|
||||
|
||||
# DESIGNSPACE from GLYPHS
|
||||
build/ufo/Inter-roman.designspace: build/ufo/Inter.designspace
|
||||
build/ufo/Inter-italic.designspace: build/ufo/Inter.designspace
|
||||
build/ufo/Inter.designspace: src/Inter.glyphs
|
||||
@mkdir -p build/ufo
|
||||
misc/fontbuild glyphsync -o build/ufo src/Inter.glyphs
|
||||
build/ufo/InterDisplay-roman.designspace: build/ufo/InterDisplay.designspace
|
||||
build/ufo/InterDisplay-italic.designspace: build/ufo/InterDisplay.designspace
|
||||
build/ufo/InterDisplay.designspace: src/InterDisplay.glyphs
|
||||
@mkdir -p build/ufo
|
||||
misc/fontbuild glyphsync -o build/ufo src/InterDisplay.glyphs
|
||||
default: all
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# intermediate sources
|
||||
|
||||
# short-circuit Make for performance
|
||||
src/Inter.glyphs:
|
||||
@true
|
||||
src/InterDisplay.glyphs:
|
||||
@true
|
||||
|
||||
# make sure intermediate files are not gc'd by make
|
||||
.PRECIOUS: build/ufo/Inter-*.designspace build/ufo/InterDisplay-*.designspace
|
||||
|
||||
designspace: build/ufo/Inter.designspace build/ufo/InterDisplay.designspace
|
||||
.PHONY: designspace
|
||||
|
||||
|
||||
# features
|
||||
src/features: $(wildcard src/features/*)
|
||||
@touch "$@"
|
||||
@true
|
||||
build/ufo/features: src/features
|
||||
@mkdir -p build/ufo
|
||||
@rm -f build/ufo/features
|
||||
@ln -s ../../src/features build/ufo/features
|
||||
$(UFODIR)/features: src/features
|
||||
@mkdir -p $(UFODIR)
|
||||
@ln -sf ../../src/features $(UFODIR)/features
|
||||
|
||||
# make sure intermediate UFOs are not gc'd by make
|
||||
.PRECIOUS: build/ufo/Inter-%.ufo
|
||||
# designspace
|
||||
$(UFODIR)/Inter-roman.designspace: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/python3 misc/tools/subset-designspace.py $^ $@
|
||||
$(UFODIR)/Inter-italic.designspace: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/python3 misc/tools/subset-designspace.py $^ $@
|
||||
$(UFODIR)/%.designspace: src/%.glyphs $(UFODIR)/features
|
||||
$(BIN)/fontmake -o ufo -g $< --designspace-path $@ \
|
||||
--master-dir $(UFODIR) --instance-dir $(UFODIR)
|
||||
$(BIN)/python3 misc/tools/postprocess-designspace.py $@
|
||||
|
||||
# Note: The seemingly convoluted dependency graph above is required to
|
||||
# make sure that glyphsync and instancegen are not run in parallel.
|
||||
# master UFOs are byproducts of building Inter.designspace
|
||||
$(UFODIR)/Inter-Black.ufo: $(UFODIR)/Inter.designspace
|
||||
touch $@
|
||||
$(UFODIR)/Inter-BlackItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
touch $@
|
||||
$(UFODIR)/Inter-Regular.ufo: $(UFODIR)/Inter.designspace
|
||||
touch $@
|
||||
$(UFODIR)/Inter-Italic.ufo: $(UFODIR)/Inter.designspace
|
||||
touch $@
|
||||
$(UFODIR)/Inter-Thin.ufo: $(UFODIR)/Inter.designspace
|
||||
touch $@
|
||||
$(UFODIR)/Inter-ThinItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
touch $@
|
||||
|
||||
# instance UFOs are generated on demand
|
||||
$(UFODIR)/Inter-Light.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Light"
|
||||
$(UFODIR)/Inter-LightItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Light Italic"
|
||||
$(UFODIR)/Inter-ExtraLight.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Extra Light"
|
||||
$(UFODIR)/Inter-ExtraLightItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Extra Light Italic"
|
||||
$(UFODIR)/Inter-Medium.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Medium"
|
||||
$(UFODIR)/Inter-MediumItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Medium Italic"
|
||||
$(UFODIR)/Inter-SemiBold.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Semi Bold"
|
||||
$(UFODIR)/Inter-SemiBoldItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Semi Bold Italic"
|
||||
$(UFODIR)/Inter-Bold.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Bold"
|
||||
$(UFODIR)/Inter-BoldItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Bold Italic"
|
||||
$(UFODIR)/Inter-ExtraBold.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Extra Bold"
|
||||
$(UFODIR)/Inter-ExtraBoldItalic.ufo: $(UFODIR)/Inter.designspace
|
||||
$(BIN)/fontmake -o ufo -m $< --output-path $@ -i "Inter Extra Bold Italic"
|
||||
|
||||
# hinted TTF files via autohint
|
||||
$(FONTDIR)/const-hinted/%.ttf: $(FONTDIR)/const/%.ttf
|
||||
mkdir -p "$(dir $@)"
|
||||
$(BIN)/ttfautohint --windows-compatibility --adjust-subglyphs --no-info "$<" "$@"
|
||||
# make sure intermediate files are not gc'd by make
|
||||
.PRECIOUS: \
|
||||
$(UFODIR)/Inter-Black.ufo \
|
||||
$(UFODIR)/Inter-BlackItalic.ufo \
|
||||
$(UFODIR)/Inter-Regular.ufo \
|
||||
$(UFODIR)/Inter-Italic.ufo \
|
||||
$(UFODIR)/Inter-Thin.ufo \
|
||||
$(UFODIR)/Inter-ThinItalic.ufo \
|
||||
$(UFODIR)/Inter-Light.ufo \
|
||||
$(UFODIR)/Inter-LightItalic.ufo \
|
||||
$(UFODIR)/Inter-ExtraLight.ufo \
|
||||
$(UFODIR)/Inter-ExtraLightItalic.ufo \
|
||||
$(UFODIR)/Inter-Medium.ufo \
|
||||
$(UFODIR)/Inter-MediumItalic.ufo \
|
||||
$(UFODIR)/Inter-SemiBold.ufo \
|
||||
$(UFODIR)/Inter-SemiBoldItalic.ufo \
|
||||
$(UFODIR)/Inter-Bold.ufo \
|
||||
$(UFODIR)/Inter-BoldItalic.ufo \
|
||||
$(UFODIR)/Inter-ExtraBold.ufo \
|
||||
$(UFODIR)/Inter-ExtraBoldItalic.ufo \
|
||||
$(UFODIR)/Inter.designspace \
|
||||
$(UFODIR)/Inter-roman.designspace \
|
||||
$(UFODIR)/Inter-italic.designspace
|
||||
|
||||
# python -m ttfautohint --fallback-stem-width=256 --no-info "$<" "$@"
|
||||
# ---------------------------------------------------------------------------------
|
||||
# products
|
||||
|
||||
$(FONTDIR)/static/%.otf: $(UFODIR)/%.ufo | $(FONTDIR)/static
|
||||
$(BIN)/fontmake -u $< -o otf --output-path $@ \
|
||||
--overlaps-backend pathops --production-names
|
||||
|
||||
$(FONTDIR)/static/%.ttf: $(UFODIR)/%.ufo | $(FONTDIR)/static
|
||||
$(BIN)/fontmake -u $< -o ttf --output-path $@ \
|
||||
--overlaps-backend pathops --production-names
|
||||
|
||||
$(FONTDIR)/static-hinted/%.ttf: $(FONTDIR)/static/%.ttf | $(FONTDIR)/static-hinted
|
||||
$(BIN)/python3 $(PWD)/build/venv/lib/python/site-packages/ttfautohint \
|
||||
--no-info "$<" "$@"
|
||||
|
||||
$(FONTDIR)/var/Inter-V.var.ttf: $(FONTDIR)/var/Inter.var.ttf
|
||||
$(BIN)/python3 misc/tools/rename.py --family "Inter V" -o $@ $<
|
||||
|
||||
$(FONTDIR)/var/%.var.ttf: $(UFODIR)/%.designspace | $(FONTDIR)/var
|
||||
$(BIN)/fontmake -o variable -m $< --output-path $@ \
|
||||
--overlaps-backend pathops --production-names
|
||||
$(BIN)/python3 misc/tools/postprocess-vf.py $@
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
|
||||
$(FONTDIR)/var/%.var.otf: $(UFODIR)/%.designspace | $(FONTDIR)/var
|
||||
$(BIN)/fontmake -o variable-cff2 -m $< --output-path $@ \
|
||||
--overlaps-backend pathops --production-names
|
||||
|
||||
# $(FONTDIR)/var-hinted/%.ttf: $(FONTDIR)/var/%.ttf
|
||||
# mkdir -p "$(dir $@)"
|
||||
# ttfautohint --fallback-stem-width=256 --no-info "$<" "$@"
|
||||
|
||||
# make sure intermediate TTFs are not gc'd by make
|
||||
.PRECIOUS: $(FONTDIR)/const/%.ttf
|
||||
.PRECIOUS: $(FONTDIR)/const/%.otf
|
||||
.PRECIOUS: $(FONTDIR)/const-hinted/%.ttf
|
||||
.PRECIOUS: $(FONTDIR)/var/%.var.ttf
|
||||
# $(BIN)/python3 $(PWD)/build/venv/lib/python/site-packages/ttfautohint \
|
||||
# --no-info "$<" "$@"
|
||||
|
||||
|
||||
%.woff2: %.ttf
|
||||
$(BIN)/woff2_compress "$<"
|
||||
|
||||
# test runs all tests
|
||||
# Note: all_check_const is generated by init.sh and runs "fontbuild checkfont"
|
||||
# on all otf and ttf files.
|
||||
test: test_text test_display
|
||||
$(FONTDIR)/static:
|
||||
mkdir -p $@
|
||||
$(FONTDIR)/static-hinted:
|
||||
mkdir -p $@
|
||||
$(FONTDIR)/var:
|
||||
mkdir -p $@
|
||||
|
||||
test_text: check_text \
|
||||
build/fbreport-text-const.txt \
|
||||
build/fbreport-text-var1.txt \
|
||||
build/fbreport-text-var2.txt
|
||||
@echo "$(@): OK"
|
||||
static_otf: \
|
||||
$(FONTDIR)/static/Inter-Black.otf \
|
||||
$(FONTDIR)/static/Inter-BlackItalic.otf \
|
||||
$(FONTDIR)/static/Inter-Regular.otf \
|
||||
$(FONTDIR)/static/Inter-Italic.otf \
|
||||
$(FONTDIR)/static/Inter-Thin.otf \
|
||||
$(FONTDIR)/static/Inter-ThinItalic.otf \
|
||||
$(FONTDIR)/static/Inter-Light.otf \
|
||||
$(FONTDIR)/static/Inter-LightItalic.otf \
|
||||
$(FONTDIR)/static/Inter-ExtraLight.otf \
|
||||
$(FONTDIR)/static/Inter-ExtraLightItalic.otf \
|
||||
$(FONTDIR)/static/Inter-Medium.otf \
|
||||
$(FONTDIR)/static/Inter-MediumItalic.otf \
|
||||
$(FONTDIR)/static/Inter-SemiBold.otf \
|
||||
$(FONTDIR)/static/Inter-SemiBoldItalic.otf \
|
||||
$(FONTDIR)/static/Inter-Bold.otf \
|
||||
$(FONTDIR)/static/Inter-BoldItalic.otf \
|
||||
$(FONTDIR)/static/Inter-ExtraBold.otf \
|
||||
$(FONTDIR)/static/Inter-ExtraBoldItalic.otf
|
||||
|
||||
test_display: check_display \
|
||||
build/fbreport-display-const.txt \
|
||||
build/fbreport-display-var1.txt \
|
||||
build/fbreport-display-var2.txt
|
||||
@echo "$(@): OK"
|
||||
static_ttf: \
|
||||
$(FONTDIR)/static/Inter-Black.ttf \
|
||||
$(FONTDIR)/static/Inter-BlackItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-Regular.ttf \
|
||||
$(FONTDIR)/static/Inter-Italic.ttf \
|
||||
$(FONTDIR)/static/Inter-Thin.ttf \
|
||||
$(FONTDIR)/static/Inter-ThinItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-Light.ttf \
|
||||
$(FONTDIR)/static/Inter-LightItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-ExtraLight.ttf \
|
||||
$(FONTDIR)/static/Inter-ExtraLightItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-Medium.ttf \
|
||||
$(FONTDIR)/static/Inter-MediumItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-SemiBold.ttf \
|
||||
$(FONTDIR)/static/Inter-SemiBoldItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-Bold.ttf \
|
||||
$(FONTDIR)/static/Inter-BoldItalic.ttf \
|
||||
$(FONTDIR)/static/Inter-ExtraBold.ttf \
|
||||
$(FONTDIR)/static/Inter-ExtraBoldItalic.ttf
|
||||
|
||||
static_ttf_hinted: \
|
||||
$(FONTDIR)/static-hinted/Inter-Black.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-BlackItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-Regular.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-Italic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-Thin.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-ThinItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-Light.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-LightItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraLight.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraLightItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-Medium.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-MediumItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-SemiBold.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-SemiBoldItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-Bold.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-BoldItalic.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraBold.ttf \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraBoldItalic.ttf
|
||||
|
||||
static_web: \
|
||||
$(FONTDIR)/static/Inter-Black.woff2 \
|
||||
$(FONTDIR)/static/Inter-BlackItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-Regular.woff2 \
|
||||
$(FONTDIR)/static/Inter-Italic.woff2 \
|
||||
$(FONTDIR)/static/Inter-Thin.woff2 \
|
||||
$(FONTDIR)/static/Inter-ThinItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-Light.woff2 \
|
||||
$(FONTDIR)/static/Inter-LightItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-ExtraLight.woff2 \
|
||||
$(FONTDIR)/static/Inter-ExtraLightItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-Medium.woff2 \
|
||||
$(FONTDIR)/static/Inter-MediumItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-SemiBold.woff2 \
|
||||
$(FONTDIR)/static/Inter-SemiBoldItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-Bold.woff2 \
|
||||
$(FONTDIR)/static/Inter-BoldItalic.woff2 \
|
||||
$(FONTDIR)/static/Inter-ExtraBold.woff2 \
|
||||
$(FONTDIR)/static/Inter-ExtraBoldItalic.woff2
|
||||
|
||||
static_web_hinted: \
|
||||
$(FONTDIR)/static-hinted/Inter-Black.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-BlackItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-Regular.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-Italic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-Thin.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-ThinItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-Light.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-LightItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraLight.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraLightItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-Medium.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-MediumItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-SemiBold.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-SemiBoldItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-Bold.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-BoldItalic.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraBold.woff2 \
|
||||
$(FONTDIR)/static-hinted/Inter-ExtraBoldItalic.woff2
|
||||
|
||||
var: \
|
||||
$(FONTDIR)/var/Inter.var.ttf \
|
||||
$(FONTDIR)/var/Inter-V.var.ttf
|
||||
|
||||
var_no_slnt_axis: \
|
||||
$(FONTDIR)/var/Inter-roman.var.ttf \
|
||||
$(FONTDIR)/var/Inter-italic.var.ttf
|
||||
$(BIN)/python3 misc/tools/postprocess-single-axis-vfs.py $^
|
||||
|
||||
var_web: \
|
||||
$(FONTDIR)/var/Inter.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-V.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-roman.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-italic.var.woff2
|
||||
|
||||
all: static_otf static_ttf static_ttf_hinted static_web static_web_hinted \
|
||||
var var_web var_no_slnt_axis
|
||||
|
||||
.PHONY: all static_otf static_ttf static_ttf_hinted static_web static_web_hinted \
|
||||
var var_web var_no_slnt_axis
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# testing
|
||||
|
||||
test: build/fontbakery-report-var.txt \
|
||||
build/fontbakery-report-static.txt
|
||||
|
||||
# FBAKE_ARGS are common args for all fontbakery targets
|
||||
FBAKE_ARGS := check-universal \
|
||||
@ -241,299 +276,165 @@ FBAKE_ARGS := check-universal \
|
||||
--no-progress \
|
||||
--loglevel WARN \
|
||||
--succinct \
|
||||
--full-lists \
|
||||
-j \
|
||||
-x com.google.fonts/check/dsig \
|
||||
-x com.google.fonts/check/unitsperem \
|
||||
-x com.google.fonts/check/family/win_ascent_and_descent \
|
||||
-x com.google.fonts/check/fontbakery_version
|
||||
-x com.google.fonts/check/family/win_ascent_and_descent
|
||||
|
||||
FBAKE_STATIC_ARGS := $(FBAKE_ARGS) -x com.google.fonts/check/family/underline_thickness
|
||||
FBAKE_VAR_ARGS := $(FBAKE_ARGS) -x com.google.fonts/check/STAT_strings
|
||||
build/fontbakery-report-var.txt: $(FONTDIR)/var/Inter.var.ttf
|
||||
@echo "fontbakery Inter.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery \
|
||||
$(FBAKE_ARGS) -x com.google.fonts/check/STAT_strings \
|
||||
$^ > $@ \
|
||||
|| (cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
|
||||
# static text family
|
||||
build/fbreport-text-const.txt: $(wildcard $(FONTDIR)/const/Inter-*.otf)
|
||||
@echo "fontbakery check-universal Inter-*.otf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_STATIC_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal Inter-*.otf OK"
|
||||
build/fontbakery-report-static.txt: $(wildcard $(FONTDIR)/static/Inter-*.otf)
|
||||
@echo "fontbakery static/Inter-*.otf > $(@) ..."
|
||||
@$(BIN)/fontbakery \
|
||||
$(FBAKE_ARGS) -x com.google.fonts/check/family/underline_thickness \
|
||||
$^ > $@ \
|
||||
|| (cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
|
||||
# multi-axis VF text family
|
||||
build/fbreport-text-var2.txt: $(FONTDIR)/var/Inter.var.ttf
|
||||
@echo "fontbakery check-universal Inter.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal Inter.var.ttf"
|
||||
.PHONY: test
|
||||
|
||||
# single-axis VF text family
|
||||
build/fbreport-text-var1.txt: $(wildcard $(FONTDIR)/var/Inter-*.var.ttf)
|
||||
@echo "fontbakery check-universal Inter-*.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal Inter-*.var.ttf"
|
||||
|
||||
|
||||
# static display family
|
||||
build/fbreport-display-const.txt: $(wildcard $(FONTDIR)/const/InterDisplay-*.otf)
|
||||
@echo "fontbakery check-universal InterDisplay-*.otf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_STATIC_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal InterDisplay-*.otf"
|
||||
|
||||
# multi-axis VF display family
|
||||
build/fbreport-display-var2.txt: $(FONTDIR)/var/InterDisplay.var.ttf
|
||||
@echo "fontbakery check-universal InterDisplay.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal InterDisplay.var.ttf"
|
||||
|
||||
# single-axis VF display family
|
||||
build/fbreport-display-var1.txt: $(wildcard $(FONTDIR)/var/InterDisplay-*.var.ttf)
|
||||
@echo "fontbakery check-universal InterDisplay-*.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal InterDisplay-*.var.ttf"
|
||||
|
||||
# check does the same thing as test, but without any dependency checks, meaning
|
||||
# it will check whatever font files are already built.
|
||||
check_text: $(wildcard $(FONTDIR)/const/Inter-*.ttf) \
|
||||
$(wildcard $(FONTDIR)/const/Inter-*.otf) \
|
||||
$(wildcard $(FONTDIR)/const/Inter-*.woff2) \
|
||||
$(wildcard $(FONTDIR)/var/Inter-*.var.ttf) \
|
||||
$(wildcard $(FONTDIR)/var/Inter-*.var.woff2) \
|
||||
$(FONTDIR)/var/Inter.var.ttf \
|
||||
$(FONTDIR)/var/Inter.var.woff2
|
||||
misc/fontbuild checkfont $^
|
||||
@echo "$(@): OK"
|
||||
|
||||
check_display: $(wildcard $(FONTDIR)/const/InterDisplay-*.ttf) \
|
||||
$(wildcard $(FONTDIR)/const/InterDisplay-*.otf) \
|
||||
$(wildcard $(FONTDIR)/const/InterDisplay-*.woff2) \
|
||||
$(wildcard $(FONTDIR)/var/InterDisplay-*.var.ttf) \
|
||||
$(wildcard $(FONTDIR)/var/InterDisplay-*.var.woff2) \
|
||||
$(FONTDIR)/var/InterDisplay.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay.var.woff2
|
||||
misc/fontbuild checkfont $^
|
||||
@echo "$(@): OK"
|
||||
|
||||
check_pedantic: $(FONTDIR)/var/Inter.var.ttf
|
||||
$(BIN)/fontbakery check-universal --dark-theme --loglevel WARN -j \
|
||||
-x com.google.fonts/check/unitsperem \
|
||||
$^
|
||||
|
||||
.PHONY: test test_text test_display check_text check_display check_pedantic
|
||||
|
||||
|
||||
|
||||
|
||||
# samples renders PDF and PNG samples
|
||||
samples: $(FONTDIR)/samples all_samples_pdf all_samples_png
|
||||
|
||||
$(FONTDIR)/samples/%.pdf: $(FONTDIR)/const/%.otf $(FONTDIR)/samples
|
||||
misc/tools/fontsample/fontsample -o "$@" "$<"
|
||||
|
||||
$(FONTDIR)/samples/%.png: $(FONTDIR)/const/%.otf $(FONTDIR)/samples
|
||||
misc/tools/fontsample/fontsample -o "$@" "$<"
|
||||
|
||||
$(FONTDIR)/samples:
|
||||
mkdir -p $@
|
||||
|
||||
.PHONY: samples
|
||||
|
||||
|
||||
# load version, used by zip and dist
|
||||
VERSION := $(shell cat version.txt)
|
||||
|
||||
# distribution zip files
|
||||
ZIP_FILE_DIST := build/release/Inter-${VERSION}.zip
|
||||
# ---------------------------------------------------------------------------------
|
||||
# zip
|
||||
|
||||
zip: all
|
||||
$(MAKE) -j8 test
|
||||
bash misc/makezip.sh -all -reveal-in-finder \
|
||||
"build/release/Inter-${VERSION}-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
bash misc/makezip2.sh -reveal-in-finder \
|
||||
"build/release/Inter-$(VERSION)-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
|
||||
zip_text: text
|
||||
$(MAKE) -j4 test_text
|
||||
bash misc/makezip.sh -text -reveal-in-finder \
|
||||
"build/release/Inter-${VERSION}-text-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
.PHONY: zip
|
||||
|
||||
zip_display: display
|
||||
$(MAKE) -j4 test_display
|
||||
bash misc/makezip.sh -display -reveal-in-finder \
|
||||
"build/release/Inter-${VERSION}-display-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
# ---------------------------------------------------------------------------------
|
||||
# distribution
|
||||
# - preflight checks for existing version archive and dirty git state.
|
||||
# - step1 rebuilds from scratch, since font version & ID is based on git hash.
|
||||
# - step2 runs tests, then makes a zip archive and updates the website (docs/ dir.)
|
||||
|
||||
DIST_ZIP = build/release/Inter-${VERSION}.zip
|
||||
|
||||
dist_zip: dist_check dist_build
|
||||
$(MAKE) -j4 test_text
|
||||
bash misc/makezip.sh -text -reveal-in-finder "$(ZIP_FILE_DIST)"
|
||||
dist: dist_preflight
|
||||
@# rebuild since font version & ID is based on git hash
|
||||
$(MAKE) -f $(MAKEFILE) -j$(nproc) dist_step1
|
||||
$(MAKE) -f $(MAKEFILE) -j$(nproc) dist_step2
|
||||
$(MAKE) -f $(MAKEFILE) dist_postflight
|
||||
|
||||
dist_build: text
|
||||
misc/tools/versionize.py
|
||||
|
||||
dist_check:
|
||||
dist_preflight:
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@echo "Creating distribution for version ${VERSION}"
|
||||
@if [ -f "${ZIP_FILE_DIST}" ]; then \
|
||||
echo "${ZIP_FILE_DIST} already exists. Bump version or remove the zip file to continue." >&2; \
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@# check for existing version archive
|
||||
@if [ -f "${DIST_ZIP}" ]; then \
|
||||
echo "${DIST_ZIP} already exists. Bump version or rm zip file to continue." >&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@echo ""
|
||||
@echo " REMEMBER TO 'make clean' FIRST IF FONT FILES CHANGED"
|
||||
@echo ""
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@# check for uncommitted changes
|
||||
@git status --short | grep -qv '??' && (\
|
||||
echo "Warning: uncommitted changes:" >&2; git status --short | grep -v '??' ;\
|
||||
[ -t 1 ] || exit 1 ; \
|
||||
printf "Press ENTER to continue or ^C to cancel " ; read X) || true
|
||||
@#
|
||||
|
||||
dist: dist_zip
|
||||
# Note: "display" dep is here since the "docs" target loosely depends on it
|
||||
$(MAKE) -j8 display
|
||||
$(MAKE) -j docs
|
||||
dist_step1: clean
|
||||
$(MAKE) -f $(MAKEFILE) -j$(nproc) all
|
||||
|
||||
dist_step2: test
|
||||
$(MAKE) -f $(MAKEFILE) -j$(nproc) dist_zip dist_docs
|
||||
|
||||
dist_zip:
|
||||
$(BIN)/python3 misc/tools/patch-version.py misc/dist/inter.css
|
||||
bash misc/makezip2.sh -reveal-in-finder "$(DIST_ZIP)"
|
||||
|
||||
dist_docs:
|
||||
$(MAKE) -C docs -j$(nproc) dist
|
||||
|
||||
dist_postflight:
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@echo ""
|
||||
@echo "Next steps:"
|
||||
@echo ""
|
||||
@echo "1) Commit & push changes"
|
||||
@echo ""
|
||||
@echo "2) Create new release with ${ZIP_FILE_DIST} at"
|
||||
@echo "2) Create new release with ${DIST_ZIP} at"
|
||||
@echo " https://github.com/rsms/inter/releases/new?tag=v${VERSION}"
|
||||
@echo ""
|
||||
@echo "3) Bump version in version.txt (to the next future version)"
|
||||
@echo " and commit & push changes"
|
||||
@echo ""
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
|
||||
.PHONY: zip zip_dist pre_dist dist
|
||||
.PHONY: dist dist_preflight dist_step1 dist_step2 dist_zip dist_docs dist_postflight
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# install
|
||||
|
||||
docs: docs_fonts
|
||||
$(MAKE) -j docs_info
|
||||
INSTALLDIR := $(HOME)/Library/Fonts/Inter
|
||||
|
||||
docs_info: docs/_data/fontinfo.json \
|
||||
docs/lab/glyphinfo.json \
|
||||
docs/glyphs/metrics.json
|
||||
install: install_var \
|
||||
$(INSTALLDIR)/Inter-Black.otf \
|
||||
$(INSTALLDIR)/Inter-BlackItalic.otf \
|
||||
$(INSTALLDIR)/Inter-Regular.otf \
|
||||
$(INSTALLDIR)/Inter-Italic.otf \
|
||||
$(INSTALLDIR)/Inter-Thin.otf \
|
||||
$(INSTALLDIR)/Inter-ThinItalic.otf \
|
||||
$(INSTALLDIR)/Inter-Light.otf \
|
||||
$(INSTALLDIR)/Inter-LightItalic.otf \
|
||||
$(INSTALLDIR)/Inter-ExtraLight.otf \
|
||||
$(INSTALLDIR)/Inter-ExtraLightItalic.otf \
|
||||
$(INSTALLDIR)/Inter-Medium.otf \
|
||||
$(INSTALLDIR)/Inter-MediumItalic.otf \
|
||||
$(INSTALLDIR)/Inter-SemiBold.otf \
|
||||
$(INSTALLDIR)/Inter-SemiBoldItalic.otf \
|
||||
$(INSTALLDIR)/Inter-Bold.otf \
|
||||
$(INSTALLDIR)/Inter-BoldItalic.otf \
|
||||
$(INSTALLDIR)/Inter-ExtraBold.otf \
|
||||
$(INSTALLDIR)/Inter-ExtraBoldItalic.otf
|
||||
|
||||
docs_fonts: docs_fonts_text docs_fonts_display
|
||||
install_var: $(INSTALLDIR)/Inter-V.var.ttf
|
||||
|
||||
$(INSTALLDIR)/%.otf: $(FONTDIR)/static/%.otf | $(INSTALLDIR)
|
||||
cp -a $^ $@
|
||||
|
||||
# TODO: re-enable this when we have figured out how to make subset VFs work
|
||||
# with substitution features like ccmp.
|
||||
# docs_fonts_pre:
|
||||
# rm -rf docs/font-files
|
||||
# mkdir docs/font-files $(FONTDIR)/subset
|
||||
# python misc/tools/subset.py
|
||||
# docs_fonts_text: docs_fonts_pre
|
||||
# cp -a $(FONTDIR)/const/*.woff \
|
||||
# $(FONTDIR)/const/*.woff2 \
|
||||
# $(FONTDIR)/const/*.otf \
|
||||
# $(FONTDIR)/var/Inter.var.* \
|
||||
# $(FONTDIR)/var/InterDisplay.var.* \
|
||||
# $(FONTDIR)/var/Inter*-roman.var.* \
|
||||
# $(FONTDIR)/var/Inter*-italic.var.* \
|
||||
# $(FONTDIR)/subset/Inter-*.woff2 \
|
||||
# $(FONTDIR)/subset/Inter.*.woff2 \
|
||||
# docs/font-files/
|
||||
# docs_fonts_display: docs_fonts_pre
|
||||
# cp -a $(FONTDIR)/const/*.woff \
|
||||
# $(FONTDIR)/const/*.woff2 \
|
||||
# $(FONTDIR)/const/*.otf \
|
||||
# $(FONTDIR)/var/Inter.var.* \
|
||||
# $(FONTDIR)/var/InterDisplay.var.* \
|
||||
# $(FONTDIR)/var/Inter*-roman.var.* \
|
||||
# $(FONTDIR)/var/Inter*-italic.var.* \
|
||||
# $(FONTDIR)/subset/InterDisplay*.woff2 \
|
||||
# docs/font-files/
|
||||
$(INSTALLDIR)/%.var.ttf: $(FONTDIR)/var/%.var.ttf | $(INSTALLDIR)
|
||||
cp -a $^ $@
|
||||
|
||||
docs_fonts_pre:
|
||||
rm -rf docs/font-files
|
||||
mkdir docs/font-files
|
||||
$(INSTALLDIR):
|
||||
mkdir -p $@
|
||||
|
||||
docs_fonts_text: docs_fonts_pre
|
||||
cp -a $(FONTDIR)/const/*.woff \
|
||||
$(FONTDIR)/const/*.woff2 \
|
||||
$(FONTDIR)/const/*.otf \
|
||||
$(FONTDIR)/var/Inter.var.* \
|
||||
$(FONTDIR)/var/InterDisplay.var.* \
|
||||
$(FONTDIR)/var/Inter*-roman.var.* \
|
||||
$(FONTDIR)/var/Inter*-italic.var.* \
|
||||
docs/font-files/
|
||||
.PHONY: install install_var
|
||||
|
||||
docs_fonts_display: docs_fonts_pre
|
||||
cp -a $(FONTDIR)/const/*.woff \
|
||||
$(FONTDIR)/const/*.woff2 \
|
||||
$(FONTDIR)/const/*.otf \
|
||||
$(FONTDIR)/var/Inter.var.* \
|
||||
$(FONTDIR)/var/InterDisplay.var.* \
|
||||
$(FONTDIR)/var/Inter*-roman.var.* \
|
||||
$(FONTDIR)/var/Inter*-italic.var.* \
|
||||
docs/font-files/
|
||||
# ---------------------------------------------------------------------------------
|
||||
# misc
|
||||
|
||||
.PHONY: docs docs_info docs_fonts docs_fonts_pre docs_fonts_text docs_fonts_display
|
||||
|
||||
docs/_data/fontinfo.json: docs/font-files/Inter-Regular.otf misc/tools/fontinfo.py
|
||||
misc/tools/fontinfo.py -pretty $< > docs/_data/fontinfo.json
|
||||
|
||||
docs/lab/glyphinfo.json: misc/tools/gen-glyphinfo.py build/ufo/Inter-Regular.ufo
|
||||
misc/tools/gen-glyphinfo.py -ucd misc/UnicodeData.txt build/ufo/Inter-Regular.ufo > $@
|
||||
|
||||
docs/glyphs/metrics.json: misc/tools/gen-metrics-and-svgs.py build/ufo/Inter-Regular.ufo
|
||||
misc/tools/gen-metrics-and-svgs.py build/ufo/Inter-Regular.ufo
|
||||
|
||||
|
||||
# Helper target to download latest Unicode data. Nothing depends on this.
|
||||
ucd_version := 12.1.0
|
||||
update_UnicodeData:
|
||||
@echo "# Unicode $(ucd_version)" > misc/UnicodeData.txt
|
||||
curl '-#' "https://www.unicode.org/Public/$(ucd_version)/ucd/UnicodeData.txt" >> misc/UnicodeData.txt
|
||||
|
||||
|
||||
|
||||
# install targets
|
||||
install_ttf: all_ttf_const
|
||||
@echo "Installing TTF files locally at ~/Library/Fonts/Inter"
|
||||
rm -rf ~/'Library/Fonts/Inter'
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $(FONTDIR)/const/*.ttf ~/'Library/Fonts/Inter'
|
||||
|
||||
install_ttf_hinted: all_ttf_hinted
|
||||
@echo "Installing autohinted TTF files locally at ~/Library/Fonts/Inter"
|
||||
rm -rf ~/'Library/Fonts/Inter'
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $(FONTDIR)/const-hinted/*.ttf ~/'Library/Fonts/Inter'
|
||||
|
||||
install_text_otf: all_otf_text
|
||||
@echo "Installing OTF files locally at ~/Library/Fonts/Inter"
|
||||
rm -rf ~/'Library/Fonts/Inter'
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $(FONTDIR)/const/Inter-*.otf ~/'Library/Fonts/Inter'
|
||||
|
||||
install_display_otf: all_otf_display
|
||||
@echo "Installing OTF files locally at ~/Library/Fonts/InterDisplay"
|
||||
rm -rf ~/'Library/Fonts/InterDisplay'
|
||||
mkdir -p ~/'Library/Fonts/InterDisplay'
|
||||
cp -a $(FONTDIR)/const/InterDisplay-*.otf ~/'Library/Fonts/InterDisplay'
|
||||
|
||||
install_text_var: $(FONTDIR)/var/Inter-V.var.ttf
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $@ ~/'Library/Fonts/Inter/Inter-V.ttf'
|
||||
|
||||
install_display_var: $(FONTDIR)/var/InterDisplay-V.var.ttf
|
||||
mkdir -p ~/'Library/Fonts/InterDisplay'
|
||||
cp -a $@ ~/'Library/Fonts/InterDisplay/InterDisplay-V.ttf'
|
||||
|
||||
install: install_text install_display
|
||||
install_otf: install_text_otf install_display_otf
|
||||
install_text: install_text_otf install_text_var
|
||||
install_display: install_display_otf install_display_var
|
||||
|
||||
# deprecated aliases
|
||||
install_var_v:
|
||||
@echo 'Please use `make install_text_var` or `make install_display_var` instead.' >&2
|
||||
@exit 1
|
||||
|
||||
.PHONY: install_ttf install_ttf_hinted install_text_otf install_display_otf install_otf
|
||||
.PHONY: install_text_var install_display_var install_var_v
|
||||
.PHONY: install install_text install_display
|
||||
|
||||
|
||||
# clean removes generated and built fonts in the build directory
|
||||
clean:
|
||||
rm -rf build/tmp build/fonts build/ufo build/googlefonts
|
||||
|
||||
.PHONY: clean
|
||||
docs:
|
||||
$(MAKE) -C docs serve
|
||||
|
||||
# update_ucd downloads the latest Unicode data (Nothing depends on this target)
|
||||
ucd_version := 12.1.0
|
||||
update_ucd:
|
||||
@echo "# Unicode $(ucd_version)" > misc/UnicodeData.txt
|
||||
curl '-#' "https://www.unicode.org/Public/$(ucd_version)/ucd/UnicodeData.txt" \
|
||||
>> misc/UnicodeData.txt
|
||||
|
||||
.PHONY: clean docs update_ucd
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# list make targets
|
||||
#
|
||||
# We copy the Makefile (first in MAKEFILE_LIST) and disable the include to only list
|
||||
# primary targets, avoiding the generated targets.
|
||||
list:
|
||||
@mkdir -p build/etc \
|
||||
&& cat $(MAKEFILE) \
|
||||
| sed 's/include /#include /g' > build/etc/Makefile-list \
|
||||
&& $(MAKE) -pRrq -f build/etc/Makefile-list : 2>/dev/null \
|
||||
| awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \
|
||||
| sort \
|
||||
| egrep -v -e '^_|/' \
|
||||
| egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||
|
||||
.PHONY: list
|
||||
|
547
Makefile_v1.make
Normal file
547
Makefile_v1.make
Normal file
@ -0,0 +1,547 @@
|
||||
# To list all targets:
|
||||
# make list
|
||||
#
|
||||
# High-level make targets:
|
||||
# text Build all Inter Text fonts (default target)
|
||||
# display Build all Inter Display fonts
|
||||
# all Build everything
|
||||
# web Build all web fonts
|
||||
# var Build all variable fonts
|
||||
# test Run all test (builds fonts if needed)
|
||||
# zip Build a complete ZIP archive of all fonts
|
||||
# zip_text Build a complete ZIP archive of all Inter Text fonts
|
||||
# zip_display Build a complete ZIP archive of all Inter Display fonts
|
||||
# install Build and install all OTF files (macOS only)
|
||||
#
|
||||
# Style-specific targets:
|
||||
# STYLE_otf Build OTF file for STYLE into FONTDIR/const
|
||||
# STYLE_ttf Build TTF file for STYLE into FONTDIR/const
|
||||
# STYLE_ttf_hinted Build TTF file for STYLE with hints into
|
||||
# FONTDIR/const-hinted
|
||||
# STYLE_web Build WOFF files for STYLE into FONTDIR/const
|
||||
# STYLE_web_hinted Build WOFF files for STYLE with hints into
|
||||
# FONTDIR/const-hinted
|
||||
# STYLE_check Build & check OTF and TTF files for STYLE
|
||||
#
|
||||
# "build" directory output structure:
|
||||
# fonts
|
||||
# const
|
||||
# const-hinted
|
||||
# var
|
||||
#
|
||||
FONTDIR = build/fonts
|
||||
|
||||
default: text
|
||||
all: text display
|
||||
|
||||
# all fonts of given variant
|
||||
text: all_otf_text all_ttf_text all_ttf_text_hinted all_var_text web_text
|
||||
display: all_otf_display all_ttf_display all_ttf_display_hinted all_var_display web_display
|
||||
|
||||
# all fonts of a certain type
|
||||
all_otf: all_otf_text all_otf_display
|
||||
all_ttf: all_ttf_text all_ttf_display all_ttf_text_hinted all_ttf_display_hinted
|
||||
|
||||
web: web_text web_display
|
||||
web_text: all_web_text all_web_hinted_text
|
||||
web_display: all_web_display all_web_hinted_display
|
||||
|
||||
var: all_var_text all_var_display
|
||||
var_text: $(FONTDIR)/var/Inter.var.woff2 $(FONTDIR)/var/Inter.var.ttf $(FONTDIR)/var/Inter-V.var.ttf
|
||||
var_display: $(FONTDIR)/var/InterDisplay.var.woff2 $(FONTDIR)/var/InterDisplay.var.ttf $(FONTDIR)/var/InterDisplay-V.var.ttf
|
||||
all_var_text: \
|
||||
$(FONTDIR)/var/Inter.var.ttf \
|
||||
$(FONTDIR)/var/Inter.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-V.var.ttf \
|
||||
$(FONTDIR)/var/Inter-V.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-roman.var.ttf \
|
||||
$(FONTDIR)/var/Inter-roman.var.woff2 \
|
||||
$(FONTDIR)/var/Inter-italic.var.ttf \
|
||||
$(FONTDIR)/var/Inter-italic.var.woff2
|
||||
all_var_display: \
|
||||
$(FONTDIR)/var/InterDisplay.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay.var.woff2 \
|
||||
$(FONTDIR)/var/InterDisplay-V.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay-V.var.woff2 \
|
||||
$(FONTDIR)/var/InterDisplay-roman.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay-roman.var.woff2 \
|
||||
$(FONTDIR)/var/InterDisplay-italic.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay-italic.var.woff2
|
||||
|
||||
.PHONY: all all_otf all_ttf text display
|
||||
.PHONY: web web_text web_display
|
||||
.PHONY: var var_text var_display all_var_text all_var_display
|
||||
|
||||
# Hinted variable font disabled. See https://github.com/rsms/inter/issues/75
|
||||
# all_var_hinted: $(FONTDIR)/var-hinted/Inter.var.ttf $(FONTDIR)/var-hinted/Inter.var.woff2
|
||||
|
||||
BIN := $(PWD)/build/venv/bin
|
||||
export PATH := $(BIN):$(PATH)
|
||||
|
||||
# list make targets
|
||||
# We copy the Makefile (first in MAKEFILE_LIST) and disable the include to only list
|
||||
# primary targets, avoiding the generated targets.
|
||||
.PHONY: list list_all
|
||||
list:
|
||||
@mkdir -p build/etc \
|
||||
&& cat $(firstword $(MAKEFILE_LIST)) \
|
||||
| sed 's/include /#include /g' > build/etc/Makefile-list \
|
||||
&& $(MAKE) -pRrq -f build/etc/Makefile-list : 2>/dev/null \
|
||||
| awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \
|
||||
| sort \
|
||||
| egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||
# list_all is like list, but includes generated targets
|
||||
list_all:
|
||||
@$(MAKE) -pRrq -f $(firstword $(MAKEFILE_LIST)) : 2>/dev/null \
|
||||
| awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \
|
||||
| sort \
|
||||
| egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||
|
||||
# generated.make is automatically generated by init.sh and defines depenencies for
|
||||
# all styles and alias targets
|
||||
include build/etc/generated.make
|
||||
|
||||
|
||||
# WOFF2 from TTF
|
||||
build/%.woff2: build/%.ttf
|
||||
$(BIN)/woff2_compress "$<"
|
||||
|
||||
# WOFF from TTF
|
||||
build/%.woff: build/%.ttf
|
||||
$(BIN)/ttf2woff -O -t woff "$<" "$@"
|
||||
|
||||
|
||||
|
||||
# VF OTF from UFO
|
||||
$(FONTDIR)/var/Inter.var.ttf: $(all_ufo_masters_text) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) build/ufo/Inter.designspace
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
$(FONTDIR)/var/Inter-V.var.ttf: $(FONTDIR)/var/Inter.var.ttf
|
||||
misc/fontbuild rename --family "Inter V" -o $@ $<
|
||||
|
||||
dev-2048: $(FONTDIR)/var/Inter-V-2048.var.ttf
|
||||
@echo "Installing Inter-V-2048.var.ttf locally in ~/Library/Fonts/Inter/"
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp $(FONTDIR)/var/Inter-V-2048.var.ttf ~/'Library/Fonts/Inter'
|
||||
|
||||
$(FONTDIR)/var/Inter-V-2048.var.ttf: $(FONTDIR)/var/Inter.var.ttf
|
||||
misc/fontbuild rename --family "Inter V 2048" -o $@ $<
|
||||
|
||||
$(FONTDIR)/var/Inter-%.var.ttf: build/ufo/Inter-%.designspace $(all_ufo_masters_text) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) $<
|
||||
misc/tools/fix-vf-meta.py $@
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
|
||||
$(FONTDIR)/var/InterDisplay.var.ttf: $(all_ufo_masters_display) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) build/ufo/InterDisplay.designspace
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
$(FONTDIR)/var/InterDisplay-V.var.ttf: $(FONTDIR)/var/InterDisplay.var.ttf
|
||||
misc/fontbuild rename --family "Inter Display V" -o $@ $<
|
||||
|
||||
$(FONTDIR)/var/InterDisplay-%.var.ttf: build/ufo/InterDisplay-%.designspace $(all_ufo_masters_display) version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile-var -o $@ $(FONTBUILD_FLAGS) $<
|
||||
misc/tools/fix-vf-meta.py $@
|
||||
$(BIN)/gftools fix-unwanted-tables -t MVAR $@
|
||||
$(BIN)/gftools fix-dsig --autofix $@
|
||||
|
||||
|
||||
# OTF/TTF from UFO
|
||||
$(FONTDIR)/const/Inter%.otf: build/ufo/Inter%.ufo version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile -o $@ $(FONTBUILD_FLAGS) build/ufo/Inter$*.ufo
|
||||
|
||||
$(FONTDIR)/const/Inter%.ttf: build/ufo/Inter%.ufo version.txt
|
||||
@mkdir -p "$(dir $@)"
|
||||
misc/fontbuild compile -o $@ $(FONTBUILD_FLAGS) build/ufo/Inter$*.ufo
|
||||
|
||||
|
||||
# DESIGNSPACE from GLYPHS
|
||||
build/ufo/Inter-roman.designspace: build/ufo/Inter.designspace
|
||||
build/ufo/Inter-italic.designspace: build/ufo/Inter.designspace
|
||||
build/ufo/Inter.designspace: src/Inter.glyphs
|
||||
@mkdir -p build/ufo
|
||||
misc/fontbuild glyphsync -o build/ufo src/Inter.glyphs
|
||||
build/ufo/InterDisplay-roman.designspace: build/ufo/InterDisplay.designspace
|
||||
build/ufo/InterDisplay-italic.designspace: build/ufo/InterDisplay.designspace
|
||||
build/ufo/InterDisplay.designspace: src/InterDisplay.glyphs
|
||||
@mkdir -p build/ufo
|
||||
misc/fontbuild glyphsync -o build/ufo src/InterDisplay.glyphs
|
||||
|
||||
|
||||
# short-circuit Make for performance
|
||||
src/Inter.glyphs:
|
||||
@true
|
||||
src/InterDisplay.glyphs:
|
||||
@true
|
||||
|
||||
# make sure intermediate files are not gc'd by make
|
||||
.PRECIOUS: build/ufo/Inter-*.designspace build/ufo/InterDisplay-*.designspace
|
||||
|
||||
designspace: build/ufo/Inter.designspace build/ufo/InterDisplay.designspace
|
||||
.PHONY: designspace
|
||||
|
||||
|
||||
# features
|
||||
src/features: $(wildcard src/features/*)
|
||||
@touch "$@"
|
||||
@true
|
||||
build/ufo/features: src/features
|
||||
@mkdir -p build/ufo
|
||||
@rm -f build/ufo/features
|
||||
@ln -s ../../src/features build/ufo/features
|
||||
|
||||
# make sure intermediate UFOs are not gc'd by make
|
||||
.PRECIOUS: build/ufo/Inter-%.ufo
|
||||
|
||||
# Note: The seemingly convoluted dependency graph above is required to
|
||||
# make sure that glyphsync and instancegen are not run in parallel.
|
||||
|
||||
|
||||
# hinted TTF files via autohint
|
||||
$(FONTDIR)/const-hinted/%.ttf: $(FONTDIR)/const/%.ttf
|
||||
mkdir -p "$(dir $@)"
|
||||
$(BIN)/ttfautohint --windows-compatibility --adjust-subglyphs --no-info "$<" "$@"
|
||||
|
||||
# python -m ttfautohint --fallback-stem-width=256 --no-info "$<" "$@"
|
||||
|
||||
# $(FONTDIR)/var-hinted/%.ttf: $(FONTDIR)/var/%.ttf
|
||||
# mkdir -p "$(dir $@)"
|
||||
# ttfautohint --fallback-stem-width=256 --no-info "$<" "$@"
|
||||
|
||||
# make sure intermediate TTFs are not gc'd by make
|
||||
.PRECIOUS: $(FONTDIR)/const/%.ttf
|
||||
.PRECIOUS: $(FONTDIR)/const/%.otf
|
||||
.PRECIOUS: $(FONTDIR)/const-hinted/%.ttf
|
||||
.PRECIOUS: $(FONTDIR)/var/%.var.ttf
|
||||
|
||||
|
||||
|
||||
# test runs all tests
|
||||
# Note: all_check_const is generated by init.sh and runs "fontbuild checkfont"
|
||||
# on all otf and ttf files.
|
||||
test: test_text test_display
|
||||
|
||||
test_text: check_text \
|
||||
build/fbreport-text-const.txt \
|
||||
build/fbreport-text-var1.txt \
|
||||
build/fbreport-text-var2.txt
|
||||
@echo "$(@): OK"
|
||||
|
||||
test_display: check_display \
|
||||
build/fbreport-display-const.txt \
|
||||
build/fbreport-display-var1.txt \
|
||||
build/fbreport-display-var2.txt
|
||||
@echo "$(@): OK"
|
||||
|
||||
# FBAKE_ARGS are common args for all fontbakery targets
|
||||
FBAKE_ARGS := check-universal \
|
||||
--no-colors \
|
||||
--no-progress \
|
||||
--loglevel WARN \
|
||||
--succinct \
|
||||
-j \
|
||||
-x com.google.fonts/check/dsig \
|
||||
-x com.google.fonts/check/unitsperem \
|
||||
-x com.google.fonts/check/family/win_ascent_and_descent \
|
||||
-x com.google.fonts/check/fontbakery_version
|
||||
|
||||
FBAKE_STATIC_ARGS := $(FBAKE_ARGS) -x com.google.fonts/check/family/underline_thickness
|
||||
FBAKE_VAR_ARGS := $(FBAKE_ARGS) -x com.google.fonts/check/STAT_strings
|
||||
|
||||
# static text family
|
||||
build/fbreport-text-const.txt: $(wildcard $(FONTDIR)/const/Inter-*.otf)
|
||||
@echo "fontbakery check-universal Inter-*.otf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_STATIC_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal Inter-*.otf OK"
|
||||
|
||||
# multi-axis VF text family
|
||||
build/fbreport-text-var2.txt: $(FONTDIR)/var/Inter.var.ttf
|
||||
@echo "fontbakery check-universal Inter.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal Inter.var.ttf"
|
||||
|
||||
# single-axis VF text family
|
||||
build/fbreport-text-var1.txt: $(wildcard $(FONTDIR)/var/Inter-*.var.ttf)
|
||||
@echo "fontbakery check-universal Inter-*.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal Inter-*.var.ttf"
|
||||
|
||||
|
||||
# static display family
|
||||
build/fbreport-display-const.txt: $(wildcard $(FONTDIR)/const/InterDisplay-*.otf)
|
||||
@echo "fontbakery check-universal InterDisplay-*.otf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_STATIC_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal InterDisplay-*.otf"
|
||||
|
||||
# multi-axis VF display family
|
||||
build/fbreport-display-var2.txt: $(FONTDIR)/var/InterDisplay.var.ttf
|
||||
@echo "fontbakery check-universal InterDisplay.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal InterDisplay.var.ttf"
|
||||
|
||||
# single-axis VF display family
|
||||
build/fbreport-display-var1.txt: $(wildcard $(FONTDIR)/var/InterDisplay-*.var.ttf)
|
||||
@echo "fontbakery check-universal InterDisplay-*.var.ttf > $(@) ..."
|
||||
@$(BIN)/fontbakery $(FBAKE_VAR_ARGS) $^ > $@ || \
|
||||
(cat $@; echo "report at $@"; touch -m -t 199001010000 $@; exit 1)
|
||||
@echo "fontbakery check-universal InterDisplay-*.var.ttf"
|
||||
|
||||
# check does the same thing as test, but without any dependency checks, meaning
|
||||
# it will check whatever font files are already built.
|
||||
check_text: $(wildcard $(FONTDIR)/const/Inter-*.ttf) \
|
||||
$(wildcard $(FONTDIR)/const/Inter-*.otf) \
|
||||
$(wildcard $(FONTDIR)/const/Inter-*.woff2) \
|
||||
$(wildcard $(FONTDIR)/var/Inter-*.var.ttf) \
|
||||
$(wildcard $(FONTDIR)/var/Inter-*.var.woff2) \
|
||||
$(FONTDIR)/var/Inter.var.ttf \
|
||||
$(FONTDIR)/var/Inter.var.woff2
|
||||
misc/fontbuild checkfont $^
|
||||
@echo "$(@): OK"
|
||||
|
||||
check_display: $(wildcard $(FONTDIR)/const/InterDisplay-*.ttf) \
|
||||
$(wildcard $(FONTDIR)/const/InterDisplay-*.otf) \
|
||||
$(wildcard $(FONTDIR)/const/InterDisplay-*.woff2) \
|
||||
$(wildcard $(FONTDIR)/var/InterDisplay-*.var.ttf) \
|
||||
$(wildcard $(FONTDIR)/var/InterDisplay-*.var.woff2) \
|
||||
$(FONTDIR)/var/InterDisplay.var.ttf \
|
||||
$(FONTDIR)/var/InterDisplay.var.woff2
|
||||
misc/fontbuild checkfont $^
|
||||
@echo "$(@): OK"
|
||||
|
||||
check_pedantic: $(FONTDIR)/var/Inter.var.ttf
|
||||
$(BIN)/fontbakery check-universal --dark-theme --loglevel WARN -j \
|
||||
-x com.google.fonts/check/unitsperem \
|
||||
$^
|
||||
|
||||
.PHONY: test test_text test_display check_text check_display check_pedantic
|
||||
|
||||
|
||||
|
||||
|
||||
# samples renders PDF and PNG samples
|
||||
samples: $(FONTDIR)/samples all_samples_pdf all_samples_png
|
||||
|
||||
$(FONTDIR)/samples/%.pdf: $(FONTDIR)/const/%.otf $(FONTDIR)/samples
|
||||
misc/tools/fontsample/fontsample -o "$@" "$<"
|
||||
|
||||
$(FONTDIR)/samples/%.png: $(FONTDIR)/const/%.otf $(FONTDIR)/samples
|
||||
misc/tools/fontsample/fontsample -o "$@" "$<"
|
||||
|
||||
$(FONTDIR)/samples:
|
||||
mkdir -p $@
|
||||
|
||||
.PHONY: samples
|
||||
|
||||
|
||||
# load version, used by zip and dist
|
||||
VERSION := $(shell cat version.txt)
|
||||
|
||||
# distribution zip files
|
||||
ZIP_FILE_DIST := build/release/Inter-${VERSION}.zip
|
||||
|
||||
zip: all
|
||||
$(MAKE) -j8 test
|
||||
bash misc/makezip.sh -all -reveal-in-finder \
|
||||
"build/release/Inter-${VERSION}-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
|
||||
zip_text: text
|
||||
$(MAKE) -j4 test_text
|
||||
bash misc/makezip.sh -text -reveal-in-finder \
|
||||
"build/release/Inter-${VERSION}-text-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
|
||||
zip_display: display
|
||||
$(MAKE) -j4 test_display
|
||||
bash misc/makezip.sh -display -reveal-in-finder \
|
||||
"build/release/Inter-${VERSION}-display-$(shell git rev-parse --short=10 HEAD).zip"
|
||||
|
||||
|
||||
dist_zip: dist_check dist_build
|
||||
$(MAKE) -j4 test_text
|
||||
bash misc/makezip.sh -text -reveal-in-finder "$(ZIP_FILE_DIST)"
|
||||
|
||||
dist_build: text
|
||||
misc/tools/versionize.py
|
||||
|
||||
dist_check:
|
||||
@echo "Creating distribution for version ${VERSION}"
|
||||
@if [ -f "${ZIP_FILE_DIST}" ]; then \
|
||||
echo "${ZIP_FILE_DIST} already exists. Bump version or remove the zip file to continue." >&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@echo ""
|
||||
@echo " REMEMBER TO 'make clean' FIRST IF FONT FILES CHANGED"
|
||||
@echo ""
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
|
||||
dist: dist_zip
|
||||
# Note: "display" dep is here since the "docs" target loosely depends on it
|
||||
$(MAKE) -j8 display
|
||||
$(MAKE) -j docs
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
@echo ""
|
||||
@echo "Next steps:"
|
||||
@echo ""
|
||||
@echo "1) Commit & push changes"
|
||||
@echo ""
|
||||
@echo "2) Create new release with ${ZIP_FILE_DIST} at"
|
||||
@echo " https://github.com/rsms/inter/releases/new?tag=v${VERSION}"
|
||||
@echo ""
|
||||
@echo "3) Bump version in version.txt (to the next future version)"
|
||||
@echo ""
|
||||
@echo "——————————————————————————————————————————————————————————————————"
|
||||
|
||||
.PHONY: zip zip_dist pre_dist dist
|
||||
|
||||
|
||||
|
||||
docs: docs_fonts
|
||||
$(MAKE) -j docs_info
|
||||
|
||||
docs_info: docs/_data/fontinfo.json \
|
||||
docs/lab/glyphinfo.json \
|
||||
docs/glyphs/metrics.json
|
||||
|
||||
docs_fonts: docs_fonts_text docs_fonts_display
|
||||
|
||||
|
||||
# TODO: re-enable this when we have figured out how to make subset VFs work
|
||||
# with substitution features like ccmp.
|
||||
# docs_fonts_pre:
|
||||
# rm -rf docs/font-files
|
||||
# mkdir docs/font-files $(FONTDIR)/subset
|
||||
# python misc/tools/subset.py
|
||||
# docs_fonts_text: docs_fonts_pre
|
||||
# cp -a $(FONTDIR)/const/*.woff \
|
||||
# $(FONTDIR)/const/*.woff2 \
|
||||
# $(FONTDIR)/const/*.otf \
|
||||
# $(FONTDIR)/var/Inter.var.* \
|
||||
# $(FONTDIR)/var/InterDisplay.var.* \
|
||||
# $(FONTDIR)/var/Inter*-roman.var.* \
|
||||
# $(FONTDIR)/var/Inter*-italic.var.* \
|
||||
# $(FONTDIR)/subset/Inter-*.woff2 \
|
||||
# $(FONTDIR)/subset/Inter.*.woff2 \
|
||||
# docs/font-files/
|
||||
# docs_fonts_display: docs_fonts_pre
|
||||
# cp -a $(FONTDIR)/const/*.woff \
|
||||
# $(FONTDIR)/const/*.woff2 \
|
||||
# $(FONTDIR)/const/*.otf \
|
||||
# $(FONTDIR)/var/Inter.var.* \
|
||||
# $(FONTDIR)/var/InterDisplay.var.* \
|
||||
# $(FONTDIR)/var/Inter*-roman.var.* \
|
||||
# $(FONTDIR)/var/Inter*-italic.var.* \
|
||||
# $(FONTDIR)/subset/InterDisplay*.woff2 \
|
||||
# docs/font-files/
|
||||
|
||||
docs_fonts_pre:
|
||||
rm -rf docs/font-files
|
||||
mkdir docs/font-files
|
||||
|
||||
docs_fonts_text: docs_fonts_pre
|
||||
cp -a $(FONTDIR)/const/*.woff \
|
||||
$(FONTDIR)/const/*.woff2 \
|
||||
$(FONTDIR)/const/*.otf \
|
||||
$(FONTDIR)/var/Inter.var.* \
|
||||
$(FONTDIR)/var/InterDisplay.var.* \
|
||||
$(FONTDIR)/var/Inter*-roman.var.* \
|
||||
$(FONTDIR)/var/Inter*-italic.var.* \
|
||||
docs/font-files/
|
||||
|
||||
docs_fonts_display: docs_fonts_pre
|
||||
cp -a $(FONTDIR)/const/*.woff \
|
||||
$(FONTDIR)/const/*.woff2 \
|
||||
$(FONTDIR)/const/*.otf \
|
||||
$(FONTDIR)/var/Inter.var.* \
|
||||
$(FONTDIR)/var/InterDisplay.var.* \
|
||||
$(FONTDIR)/var/Inter*-roman.var.* \
|
||||
$(FONTDIR)/var/Inter*-italic.var.* \
|
||||
docs/font-files/
|
||||
|
||||
.PHONY: docs docs_info docs_fonts docs_fonts_pre docs_fonts_text docs_fonts_display
|
||||
|
||||
docs/_data/fontinfo.json: docs/font-files/Inter-Regular.otf misc/tools/fontinfo.py
|
||||
misc/tools/fontinfo.py -pretty $< > docs/_data/fontinfo.json
|
||||
|
||||
docs/lab/glyphinfo.json: misc/tools/gen-glyphinfo.py build/ufo/Inter-Regular.ufo
|
||||
misc/tools/gen-glyphinfo.py -ucd misc/UnicodeData.txt build/ufo/Inter-Regular.ufo > $@
|
||||
|
||||
docs/glyphs/metrics.json: misc/tools/gen-metrics-and-svgs.py build/ufo/Inter-Regular.ufo
|
||||
misc/tools/gen-metrics-and-svgs.py build/ufo/Inter-Regular.ufo
|
||||
|
||||
|
||||
# Helper target to download latest Unicode data. Nothing depends on this.
|
||||
ucd_version := 12.1.0
|
||||
update_UnicodeData:
|
||||
@echo "# Unicode $(ucd_version)" > misc/UnicodeData.txt
|
||||
curl '-#' "https://www.unicode.org/Public/$(ucd_version)/ucd/UnicodeData.txt" >> misc/UnicodeData.txt
|
||||
|
||||
|
||||
|
||||
# install targets
|
||||
install_ttf: all_ttf_const
|
||||
@echo "Installing TTF files locally at ~/Library/Fonts/Inter"
|
||||
rm -rf ~/'Library/Fonts/Inter'
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $(FONTDIR)/const/*.ttf ~/'Library/Fonts/Inter'
|
||||
|
||||
install_ttf_hinted: all_ttf_hinted
|
||||
@echo "Installing autohinted TTF files locally at ~/Library/Fonts/Inter"
|
||||
rm -rf ~/'Library/Fonts/Inter'
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $(FONTDIR)/const-hinted/*.ttf ~/'Library/Fonts/Inter'
|
||||
|
||||
install_text_otf: all_otf_text
|
||||
@echo "Installing OTF files locally at ~/Library/Fonts/Inter"
|
||||
rm -rf ~/'Library/Fonts/Inter'
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $(FONTDIR)/const/Inter-*.otf ~/'Library/Fonts/Inter'
|
||||
|
||||
install_display_otf: all_otf_display
|
||||
@echo "Installing OTF files locally at ~/Library/Fonts/InterDisplay"
|
||||
rm -rf ~/'Library/Fonts/InterDisplay'
|
||||
mkdir -p ~/'Library/Fonts/InterDisplay'
|
||||
cp -a $(FONTDIR)/const/InterDisplay-*.otf ~/'Library/Fonts/InterDisplay'
|
||||
|
||||
install_text_var: $(FONTDIR)/var/Inter-V.var.ttf
|
||||
mkdir -p ~/'Library/Fonts/Inter'
|
||||
cp -a $@ ~/'Library/Fonts/Inter/Inter-V.ttf'
|
||||
|
||||
install_display_var: $(FONTDIR)/var/InterDisplay-V.var.ttf
|
||||
mkdir -p ~/'Library/Fonts/InterDisplay'
|
||||
cp -a $@ ~/'Library/Fonts/InterDisplay/InterDisplay-V.ttf'
|
||||
|
||||
install: install_text install_display
|
||||
install_otf: install_text_otf install_display_otf
|
||||
install_text: install_text_otf install_text_var
|
||||
install_display: install_display_otf install_display_var
|
||||
|
||||
# deprecated aliases
|
||||
install_var_v:
|
||||
@echo 'Please use `make install_text_var` or `make install_display_var` instead.' >&2
|
||||
@exit 1
|
||||
|
||||
.PHONY: install_ttf install_ttf_hinted install_text_otf install_display_otf install_otf
|
||||
.PHONY: install_text_var install_display_var install_var_v
|
||||
.PHONY: install install_text install_display
|
||||
|
||||
|
||||
# clean removes generated and built fonts in the build directory
|
||||
clean:
|
||||
rm -rf build/tmp build/fonts build/ufo build/googlefonts
|
||||
|
||||
.PHONY: clean
|
35
docs/Gemfile
Normal file
35
docs/Gemfile
Normal file
@ -0,0 +1,35 @@
|
||||
source "https://rubygems.org"
|
||||
# Hello! This is where you manage which Jekyll version is used to run.
|
||||
# When you want to use a different version, change it below, save the
|
||||
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
|
||||
#
|
||||
# bundle exec jekyll serve
|
||||
#
|
||||
# This will help ensure the proper Jekyll version is running.
|
||||
# Happy Jekylling!
|
||||
gem "jekyll", "~> 4.2.2"
|
||||
# This is the default theme for new Jekyll sites. You may change this to anything you like.
|
||||
gem "minima", "~> 2.5"
|
||||
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
|
||||
# uncomment the line below. To upgrade, run `bundle update github-pages`.
|
||||
# gem "github-pages", group: :jekyll_plugins
|
||||
# If you have any plugins, put them here!
|
||||
group :jekyll_plugins do
|
||||
gem "jekyll-feed", "~> 0.12"
|
||||
end
|
||||
|
||||
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||
# and associated library.
|
||||
platforms :mingw, :x64_mingw, :mswin, :jruby do
|
||||
gem "tzinfo", "~> 1.2"
|
||||
gem "tzinfo-data"
|
||||
end
|
||||
|
||||
# Performance-booster for watching directories on Windows
|
||||
gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
|
||||
|
||||
# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem
|
||||
# do not have a Java counterpart.
|
||||
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]
|
||||
|
||||
gem "webrick", "~> 1.7"
|
83
docs/Gemfile.lock
Normal file
83
docs/Gemfile.lock
Normal file
@ -0,0 +1,83 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
colorator (1.1.0)
|
||||
concurrent-ruby (1.1.10)
|
||||
em-websocket (0.5.3)
|
||||
eventmachine (>= 0.12.9)
|
||||
http_parser.rb (~> 0)
|
||||
eventmachine (1.2.7)
|
||||
ffi (1.15.5)
|
||||
forwardable-extended (2.6.0)
|
||||
http_parser.rb (0.8.0)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
jekyll (4.2.2)
|
||||
addressable (~> 2.4)
|
||||
colorator (~> 1.0)
|
||||
em-websocket (~> 0.5)
|
||||
i18n (~> 1.0)
|
||||
jekyll-sass-converter (~> 2.0)
|
||||
jekyll-watch (~> 2.0)
|
||||
kramdown (~> 2.3)
|
||||
kramdown-parser-gfm (~> 1.0)
|
||||
liquid (~> 4.0)
|
||||
mercenary (~> 0.4.0)
|
||||
pathutil (~> 0.9)
|
||||
rouge (~> 3.0)
|
||||
safe_yaml (~> 1.0)
|
||||
terminal-table (~> 2.0)
|
||||
jekyll-feed (0.16.0)
|
||||
jekyll (>= 3.7, < 5.0)
|
||||
jekyll-sass-converter (2.2.0)
|
||||
sassc (> 2.0.1, < 3.0)
|
||||
jekyll-seo-tag (2.8.0)
|
||||
jekyll (>= 3.8, < 5.0)
|
||||
jekyll-watch (2.2.1)
|
||||
listen (~> 3.0)
|
||||
kramdown (2.4.0)
|
||||
rexml
|
||||
kramdown-parser-gfm (1.1.0)
|
||||
kramdown (~> 2.0)
|
||||
liquid (4.0.3)
|
||||
listen (3.7.1)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
mercenary (0.4.0)
|
||||
minima (2.5.1)
|
||||
jekyll (>= 3.5, < 5.0)
|
||||
jekyll-feed (~> 0.9)
|
||||
jekyll-seo-tag (~> 2.1)
|
||||
pathutil (0.16.2)
|
||||
forwardable-extended (~> 2.6)
|
||||
public_suffix (4.0.7)
|
||||
rb-fsevent (0.11.1)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
rexml (3.2.5)
|
||||
rouge (3.28.0)
|
||||
safe_yaml (1.0.5)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
terminal-table (2.0.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
unicode-display_width (1.8.0)
|
||||
webrick (1.7.0)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin-21
|
||||
|
||||
DEPENDENCIES
|
||||
http_parser.rb (~> 0.6.0)
|
||||
jekyll (~> 4.2.2)
|
||||
jekyll-feed (~> 0.12)
|
||||
minima (~> 2.5)
|
||||
tzinfo (~> 1.2)
|
||||
tzinfo-data
|
||||
wdm (~> 0.1.1)
|
||||
webrick (~> 1.7)
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.14
|
51
docs/Makefile
Normal file
51
docs/Makefile
Normal file
@ -0,0 +1,51 @@
|
||||
SRCDIR := $(abspath $(lastword $(MAKEFILE_LIST))/../..)
|
||||
BIN := $(SRCDIR)/build/venv/bin
|
||||
FONTDIR := ../build/fonts
|
||||
export PATH := $(BIN):$(PATH)
|
||||
|
||||
default:
|
||||
@echo "Please specify a target: build, serve or dist" >&2
|
||||
|
||||
build:
|
||||
rm -rf _site
|
||||
bundle exec jekyll build
|
||||
|
||||
serve:
|
||||
./_scripts/serve.sh
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
dist: fonts info
|
||||
$(BIN)/python3 ../misc/tools/patch-version.py lab/index.html
|
||||
|
||||
info: _data/fontinfo.json \
|
||||
lab/glyphinfo.json \
|
||||
glyphs/metrics.json
|
||||
|
||||
fonts:
|
||||
rm -rf font-files/Inter-* font-files/Inter.var*
|
||||
mkdir -p font-files
|
||||
cp -a $(FONTDIR)/static/Inter-*.woff2 \
|
||||
$(FONTDIR)/static/Inter-*.otf \
|
||||
$(FONTDIR)/var/Inter.var.* \
|
||||
$(FONTDIR)/var/Inter-roman.var.* \
|
||||
$(FONTDIR)/var/Inter-italic.var.* \
|
||||
font-files/
|
||||
|
||||
_data/fontinfo.json: ../misc/tools/fontinfo.py font-files/Inter-Regular.otf
|
||||
$(BIN)/python3 ../misc/tools/fontinfo.py -pretty $< > _data/fontinfo.json
|
||||
|
||||
lab/glyphinfo.json: ../misc/tools/gen-glyphinfo.py \
|
||||
../build/ufo/Inter-Regular.ufo \
|
||||
../misc/UnicodeData.txt
|
||||
$(BIN)/python3 ../misc/tools/gen-glyphinfo.py \
|
||||
-ucd ../misc/UnicodeData.txt ../build/ufo/Inter-Regular.ufo > $@
|
||||
|
||||
glyphs/metrics.json: ../misc/tools/gen-metrics-and-svgs.py \
|
||||
../build/ufo/Inter-Regular.ufo
|
||||
$(BIN)/python3 ../misc/tools/gen-metrics-and-svgs.py ../build/ufo/Inter-Regular.ufo
|
||||
@# Note: this also patches glyphs/index.html
|
||||
|
||||
font-files/Inter-Regular.otf: fonts
|
||||
|
||||
.PHONY: default build serve dist info fonts
|
@ -1 +1,2 @@
|
||||
This directory is published as a website by Github at [https://rsms.me/inter](https://rsms.me/inter/)
|
||||
This directory is published as a website by Github at
|
||||
[https://rsms.me/inter](https://rsms.me/inter/)
|
||||
|
@ -10,3 +10,6 @@ kramdown:
|
||||
hard_wrap: false
|
||||
exclude:
|
||||
- README.md
|
||||
- Makefile
|
||||
- Gemfile
|
||||
- Gemfile.lock
|
||||
|
@ -3,16 +3,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Thin.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Thin.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Thin.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-ThinItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ThinItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ThinItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -20,16 +18,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-ExtraLight.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraLight.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraLight.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-ExtraLightItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraLightItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraLightItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -37,16 +33,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Light.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Light.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Light.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-LightItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-LightItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-LightItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -54,16 +48,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Regular.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Regular.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Regular.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Italic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Italic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Italic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -71,16 +63,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Medium.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Medium.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Medium.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-MediumItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-MediumItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-MediumItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -88,16 +78,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-SemiBold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-SemiBold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-SemiBold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-SemiBoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-SemiBoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-SemiBoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -105,16 +93,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Bold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Bold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Bold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-BoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-BoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-BoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -122,16 +108,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-ExtraBold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraBold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraBold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-ExtraBoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraBoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraBoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -139,14 +123,12 @@
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-Black.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Black.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Black.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("font-files/Inter-BlackItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-BlackItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-BlackItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
@ -3,16 +3,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Thin.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Thin.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Thin.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-ThinItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-ThinItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-ThinItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -20,16 +18,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-ExtraLight.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-ExtraLight.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-ExtraLight.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-ExtraLightItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-ExtraLightItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-ExtraLightItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -37,16 +33,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Light.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Light.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Light.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-LightItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-LightItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-LightItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -54,16 +48,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Regular.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Regular.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Regular.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Italic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Italic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Italic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -71,16 +63,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Medium.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Medium.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Medium.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-MediumItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-MediumItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-MediumItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -88,16 +78,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-SemiBold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-SemiBold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-SemiBold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-SemiBoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-SemiBoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-SemiBoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -105,16 +93,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Bold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Bold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Bold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-BoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-BoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-BoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -122,16 +108,14 @@
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-ExtraBold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-ExtraBold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-ExtraBold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-ExtraBoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-ExtraBoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-ExtraBoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -139,14 +123,12 @@
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-Black.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-Black.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-Black.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'InterDisplay';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("font-files/InterDisplay-BlackItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/InterDisplay-BlackItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/InterDisplay-BlackItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
@ -2,11 +2,13 @@
|
||||
set -e
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
if [ "$1" == "-h" ]; then
|
||||
if [ "$1" = "-h" ]; then
|
||||
echo "usage: $0 [<bindaddr>]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BINDADDR=${1:-127.0.0.1}
|
||||
|
||||
if [ ! -s lab/fonts ]; then
|
||||
rm -f lab/fonts
|
||||
ln -fs ../../build/fonts lab/fonts
|
||||
@ -20,14 +22,7 @@ fi
|
||||
# For live testing with fonts, you'll instead want to use docs/lab/serve.py
|
||||
rm -rf _site
|
||||
|
||||
BINDADDR=127.0.0.1
|
||||
if [ "$1" != "" ]; then
|
||||
BINDADDR=$1
|
||||
fi
|
||||
|
||||
# --incremental
|
||||
|
||||
jekyll serve \
|
||||
bundle exec jekyll serve \
|
||||
--watch \
|
||||
--host "$BINDADDR" \
|
||||
--port 3002 \
|
||||
|
@ -15,135 +15,117 @@ Please use "inter.css" instead for new applications.
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
src: url("font-files/Inter-Thin.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Thin.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Thin.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
src: url("font-files/Inter-ThinItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ThinItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ThinItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 200;
|
||||
src: url("font-files/Inter-ExtraLight.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraLight.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraLight.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 200;
|
||||
src: url("font-files/Inter-ExtraLightItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraLightItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraLightItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url("font-files/Inter-Light.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Light.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Light.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
src: url("font-files/Inter-LightItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-LightItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-LightItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("font-files/Inter-Regular.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Regular.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Regular.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url("font-files/Inter-Italic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Italic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Italic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url("font-files/Inter-Medium.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Medium.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Medium.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url("font-files/Inter-MediumItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-MediumItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-MediumItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: url("font-files/Inter-SemiBold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-SemiBold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-SemiBold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url("font-files/Inter-SemiBoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-SemiBoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-SemiBoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url("font-files/Inter-Bold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Bold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Bold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url("font-files/Inter-BoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-BoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-BoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
src: url("font-files/Inter-ExtraBold.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraBold.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraBold.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url("font-files/Inter-ExtraBoldItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-ExtraBoldItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-ExtraBoldItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
src: url("font-files/Inter-Black.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-Black.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-Black.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter UI';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url("font-files/Inter-BlackItalic.woff2?v={{font_v}}") format("woff2"),
|
||||
url("font-files/Inter-BlackItalic.woff?v={{font_v}}") format("woff");
|
||||
src: url("font-files/Inter-BlackItalic.woff2?v={{font_v}}") format("woff2");
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
|
@ -7,7 +7,7 @@ Font families defined by this CSS:
|
||||
|
||||
- "Inter" static "traditional" fonts for older web browsers
|
||||
- "Inter var" single-axis variable fonts for all modern browsers
|
||||
- "Inter var experimental" multi-axis variable fonts for modern web browsers
|
||||
- "Inter var experimental" multi-axis variable fonts for some modern web browsers
|
||||
|
||||
Use like this in your CSS:
|
||||
|
||||
@ -21,11 +21,6 @@ Use like this in your CSS:
|
||||
|
||||
/* ----------------------- variable ----------------------- */
|
||||
|
||||
{%- comment -%}
|
||||
{% include Inter-italic.var.css %}
|
||||
{% include Inter-roman.var.css %}
|
||||
{%- endcomment %}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter var';
|
||||
font-style: normal;
|
||||
|
@ -68,10 +68,10 @@ var fontFamilyName,
|
||||
}
|
||||
|
||||
let families = [
|
||||
["Inter", "const", fontFamilyName],
|
||||
["Inter", "const-hinted", fontFamilyNameHinted],
|
||||
["InterDisplay", "const", fontFamilyNameDisplay],
|
||||
["InterDisplay", "const-hinted", fontFamilyNameDisplayHinted],
|
||||
["Inter", "static", fontFamilyName],
|
||||
["Inter", "static-hinted", fontFamilyNameHinted],
|
||||
["InterDisplay", "static", fontFamilyNameDisplay],
|
||||
["InterDisplay", "static-hinted", fontFamilyNameDisplayHinted],
|
||||
]
|
||||
|
||||
for (let [family, filepath, cssname] of families) {
|
||||
|
@ -37,7 +37,7 @@ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
<div class="options">
|
||||
|
||||
<div class="flex-x">
|
||||
<label title="Use variable font instead of constant font files">
|
||||
<label title="Use variable font instead of static font files">
|
||||
<span>VF</span>
|
||||
<input type="checkbox" name="varfont">
|
||||
</label>
|
||||
@ -64,18 +64,24 @@ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
|
||||
<!-- Variable font controls (hidden when not using variable fonts) -->
|
||||
<label class="label-and-value varfontControl">
|
||||
<span>Weight:</span>
|
||||
<span title="Weight">wght:</span>
|
||||
<input type="range" value="400" step="1" min="100" max="900" name="varWeight">
|
||||
<input type="number" value="400" step="1" min="100" max="900" name="varWeightNum">
|
||||
</label>
|
||||
|
||||
<label class="label-and-value varfontControl">
|
||||
<span>Slant:</span>
|
||||
<span title="Slant">slnt:</span>
|
||||
<input type="range" value="0" step="0.01" min="0" max="10" name="varSlant">
|
||||
<input type="number" value="0" step="0.01" min="0" max="10" name="varSlantNum">
|
||||
</label>
|
||||
|
||||
<label class="label-and-value constfontControl">
|
||||
<label class="label-and-value varfontControl">
|
||||
<span title="Optical size">opsz:</span>
|
||||
<input type="range" value="0" step="0.01" min="16" max="72" name="varOpsz">
|
||||
<input type="number" value="0" step="0.01" min="16" max="72" name="varOpszNum">
|
||||
</label>
|
||||
|
||||
<label class="label-and-value staticfontControl">
|
||||
<span>Weight:</span>
|
||||
<select name="weight" style="max-width:100px">
|
||||
<option value="100">Thin (100)</option>
|
||||
@ -828,9 +834,10 @@ function main() {
|
||||
|
||||
let usingVarFont = false
|
||||
let usingFontFamily = "text"
|
||||
var varWeightRange, varSlantRange
|
||||
var varWeightRange, varSlantRange, varOpszRange
|
||||
var varWeightSettingValueImpl = false
|
||||
var varSlantSettingValueImpl = false
|
||||
var varOpszSettingValueImpl = false
|
||||
|
||||
function getFontFamily(overrideFamily) {
|
||||
return (
|
||||
@ -866,6 +873,7 @@ function main() {
|
||||
let varState = {
|
||||
weight: 400, // 400..900
|
||||
slant: 0, // 0..-10
|
||||
opsz: 16, // 16..72
|
||||
}
|
||||
|
||||
function updateVarFont() {
|
||||
@ -880,7 +888,7 @@ function main() {
|
||||
varSlantSettingValueImpl = false
|
||||
setCSSProp(
|
||||
"font-variation-settings",
|
||||
`"wght" ${varState.weight}, "slnt" ${-varState.slant}`
|
||||
`"wght" ${varState.weight}, "slnt" ${-varState.slant}, "opsz" ${varState.opsz}`
|
||||
)
|
||||
} else {
|
||||
setCSSProp("font-variation-settings", null)
|
||||
@ -892,7 +900,7 @@ function main() {
|
||||
document.body.classList.toggle('varfont', on)
|
||||
if (on) {
|
||||
if (!isInitial) {
|
||||
// copy value of const weight to var weight
|
||||
// copy value of static weight to var weight
|
||||
let w = parseInt(varWeight.getValue())
|
||||
if (!isNaN(w) && varWeightRange && !varWeightSettingValueImpl) {
|
||||
varWeightRange.setValue(w)
|
||||
@ -904,7 +912,7 @@ function main() {
|
||||
// )
|
||||
} else {
|
||||
if (!isInitial && varWeightRange) {
|
||||
// copy value of var weight to const weight
|
||||
// copy value of var weight to static weight
|
||||
let w = varWeightRange.getValue()
|
||||
if (!isNaN(w)) {
|
||||
vars.setValue("weight", Math.round(w / 100) * 100)
|
||||
@ -920,15 +928,18 @@ function main() {
|
||||
})
|
||||
|
||||
let varWeightNum = vars.bind('varWeightNum', (e, v) => {
|
||||
if (varWeightRange && !varWeightSettingValueImpl) {
|
||||
if (varWeightRange && !varWeightSettingValueImpl)
|
||||
varWeightRange.setValue(v)
|
||||
}
|
||||
})
|
||||
|
||||
let varSlantNum = vars.bind('varSlantNum', (e, v) => {
|
||||
if (varSlantRange && !varSlantSettingValueImpl) {
|
||||
if (varSlantRange && !varSlantSettingValueImpl)
|
||||
varSlantRange.setValue(v)
|
||||
}
|
||||
})
|
||||
|
||||
let varOpszNum = vars.bind('varOpszNum', (e, v) => {
|
||||
if (varOpszRange && !varOpszSettingValueImpl)
|
||||
varOpszRange.setValue(v)
|
||||
})
|
||||
|
||||
varWeightRange = vars.bind('varWeight', (e, v) => {
|
||||
@ -961,6 +972,19 @@ function main() {
|
||||
return e.valueAsNumber !== undefined ? e.valueAsNumber : e.value
|
||||
})
|
||||
|
||||
varOpszRange = vars.bind('varOpsz', (e, v) => {
|
||||
varState.opsz = v
|
||||
varOpszSettingValueImpl = true
|
||||
varOpszNum.setValue(v)
|
||||
varOpszSettingValueImpl = false
|
||||
updateVarFont()
|
||||
}, (e, prevValue, ev) => {
|
||||
if (prevValue === undefined) {
|
||||
return 0
|
||||
}
|
||||
return e.valueAsNumber !== undefined ? e.valueAsNumber : e.value
|
||||
})
|
||||
|
||||
|
||||
// compare
|
||||
let secondarySampleClassNameAddition = null
|
||||
|
@ -543,12 +543,12 @@ body.sidebar-minimized .options {
|
||||
user-select: none; -moz-user-select: none; -webkit-user-select:none;
|
||||
}
|
||||
.options .varfontControl,
|
||||
.options .constfontControl {
|
||||
.options .staticfontControl {
|
||||
transition: all 168ms cubic-bezier(0.17, 0.65, 0.48, 1);
|
||||
transition-property: opacity, height, margin;
|
||||
}
|
||||
.options .varfontControl,
|
||||
body.varfont .options .constfontControl {
|
||||
body.varfont .options .staticfontControl {
|
||||
pointer-events:none;
|
||||
overflow: hidden;
|
||||
opacity:0;
|
||||
@ -562,7 +562,7 @@ body.sidebar-minimized .options {
|
||||
height: var(--fieldHeight);
|
||||
margin-bottom: var(--rowBottomMargin);
|
||||
}
|
||||
/*body.varfont .options .constfontControl {
|
||||
/*body.varfont .options .staticfontControl {
|
||||
display: none;
|
||||
}*/
|
||||
.options .varfontControl .label-and-value {
|
||||
|
1
init.sh
1
init.sh
@ -316,6 +316,7 @@ else
|
||||
fi
|
||||
|
||||
|
||||
# note: ttfautohint is no longer used by the new Makefile
|
||||
AUTOHINT_VERSION=1.8.2
|
||||
AUTOHINT_SRC_VERSION=1.8.2.8
|
||||
LINK=false
|
||||
|
@ -13,6 +13,7 @@ import logging
|
||||
import re
|
||||
import signal
|
||||
import subprocess
|
||||
import defcon
|
||||
|
||||
from fontTools.designspaceLib import DesignSpaceDocument
|
||||
from mutatorMath.ufo.document import DesignSpaceDocumentReader
|
||||
@ -445,7 +446,7 @@ class Main(object):
|
||||
source.styleName = "Thin Italic"
|
||||
source.name = "thinitalic"
|
||||
source.font.info.styleName = source.styleName
|
||||
else:
|
||||
elif source.styleName:
|
||||
# name "Black" => "black"
|
||||
source.name = source.styleName.lower().replace(' ', '')
|
||||
|
||||
@ -521,8 +522,9 @@ class Main(object):
|
||||
verbose=True
|
||||
)
|
||||
|
||||
designspace = DesignSpaceDocument()
|
||||
designspace.read(designspace_file)
|
||||
designspace = DesignSpaceDocument.fromfile(designspace_file)
|
||||
|
||||
master0_ufo = defcon.Font(designspace.sources[0].path)
|
||||
|
||||
# Generate UFOs for instances
|
||||
instance_weight = dict()
|
||||
@ -544,29 +546,35 @@ class Main(object):
|
||||
if len(instances) > 0:
|
||||
fatal('unknown style(s): %s' % ', '.join(list(instances)))
|
||||
|
||||
ufos = apply_instance_data(designspace_file, instance_files)
|
||||
ufos = apply_instance_data(designspace, instance_files)
|
||||
|
||||
# patch ufos (list of defcon.Font instances)
|
||||
italicAngleKey = 'com.schriftgestaltung.customParameter.' +\
|
||||
'InstanceDescriptorAsGSInstance.italicAngle'
|
||||
for font in ufos:
|
||||
for ufo in ufos:
|
||||
# set metrics
|
||||
ufo.info.ascender = master0_ufo.info.ascender
|
||||
ufo.info.capHeight = master0_ufo.info.capHeight
|
||||
ufo.info.descender = master0_ufo.info.descender
|
||||
ufo.info.xHeight = master0_ufo.info.xHeight
|
||||
|
||||
# move italicAngle from lib to info
|
||||
italicAngle = font.lib.get(italicAngleKey)
|
||||
italicAngle = ufo.lib.get(italicAngleKey)
|
||||
if italicAngle != None:
|
||||
italicAngle = float(italicAngle)
|
||||
del(font.lib[italicAngleKey])
|
||||
font.info.italicAngle = italicAngle
|
||||
del(ufo.lib[italicAngleKey])
|
||||
ufo.info.italicAngle = italicAngle
|
||||
|
||||
# clear anchors
|
||||
if EXCLUDE_ANCHORS:
|
||||
for g in font:
|
||||
for g in ufo:
|
||||
g.clearAnchors()
|
||||
|
||||
# update font info
|
||||
weight = instance_weight[basename(font.path)]
|
||||
setFontInfo(font, weight)
|
||||
weight = instance_weight[basename(ufo.path)]
|
||||
setFontInfo(ufo, weight)
|
||||
|
||||
font.save()
|
||||
ufo.save()
|
||||
|
||||
|
||||
def checkfont(self, fontfile, q):
|
||||
|
71
misc/glyphs-scripts/generate-opsz-layers.py
Normal file
71
misc/glyphs-scripts/generate-opsz-layers.py
Normal file
@ -0,0 +1,71 @@
|
||||
#MenuTitle: Generate opsz brace layers
|
||||
# -*- coding: utf-8 -*-
|
||||
import GlyphsApp
|
||||
import copy
|
||||
|
||||
Font = Glyphs.font
|
||||
selectedLayers = Font.selectedLayers
|
||||
|
||||
# Glyphs.font.selection - selected glyphs in "Font" tab
|
||||
# Glyphs.font.selectedFontMaster
|
||||
|
||||
def build_axis_coordinates(g, master):
|
||||
coordinates = {}
|
||||
for i in range(len(g.parent.axes)):
|
||||
axis = g.parent.axes[i]
|
||||
if axis.axisTag == "opsz":
|
||||
coordinates[axis.axisId] = 72
|
||||
else:
|
||||
coordinates[axis.axisId] = master.axes[i]
|
||||
return coordinates
|
||||
|
||||
|
||||
def process_glyph(g, axes):
|
||||
print("processing glyph %r" % g.name)
|
||||
|
||||
existing_opsz_layers = {}
|
||||
for layer in g.layers:
|
||||
# print("- %s (%r) %r" % (
|
||||
# layer.name, layer.associatedMasterId, layer.attributes['coordinates']))
|
||||
if layer.attributes['coordinates']:
|
||||
existing_opsz_layers[layer.associatedMasterId] = layer
|
||||
# print("existing_opsz_layers %r" % existing_opsz_layers)
|
||||
|
||||
for master in g.parent.masters:
|
||||
if master.name.startswith("Regular"):
|
||||
# Regular uses dedicated master for opsz
|
||||
continue
|
||||
layer = g.layers[master.id]
|
||||
# print("%s" % layer.name)
|
||||
if master.id in existing_opsz_layers:
|
||||
print("skip layer %s with existing opsz brace layer" % layer.name)
|
||||
continue
|
||||
|
||||
newLayer = layer.copy()
|
||||
# Note: "same name" matters for designspace generation!
|
||||
newLayer.name = "opsz"
|
||||
newLayer.associatedMasterId = master.id
|
||||
newLayer.attributes['coordinates'] = build_axis_coordinates(g, master)
|
||||
g.layers.append(newLayer)
|
||||
print("layer.guides %r" % layer.guides)
|
||||
print("created layer %s (copy of %r)" % (newLayer.name, layer.name))
|
||||
|
||||
|
||||
if Glyphs.font and Glyphs.font.selectedLayers:
|
||||
try:
|
||||
Glyphs.font.disableUpdateInterface()
|
||||
glyphs = set([l.parent for l in Glyphs.font.selectedLayers])
|
||||
print(glyphs)
|
||||
axes = {}
|
||||
for i in range(len(Glyphs.font.axes)):
|
||||
axis = Glyphs.font.axes[i]
|
||||
axes[axis.axisTag] = {"index":i, "axis":axis}
|
||||
# print("%r => %r" % (axis.axisTag, axis.axisId))
|
||||
for g in glyphs:
|
||||
try:
|
||||
g.beginUndo()
|
||||
process_glyph(g, axes)
|
||||
finally:
|
||||
g.endUndo()
|
||||
finally:
|
||||
Glyphs.font.enableUpdateInterface()
|
@ -138,6 +138,7 @@ fi
|
||||
# copy misc stuff
|
||||
cp misc/dist/install*.txt "$ZIPDIR/"
|
||||
cp LICENSE.txt "$ZIPDIR/"
|
||||
mkdir -p "$(dirname "$OUTFILE_ABS")"
|
||||
|
||||
# wait for processes to finish
|
||||
wait
|
||||
|
111
misc/makezip2.sh
Normal file
111
misc/makezip2.sh
Normal file
@ -0,0 +1,111 @@
|
||||
#!/bin/bash -e
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
OPT_HELP=false
|
||||
OPT_REVEAL_IN_FINDER=false
|
||||
OUTFILE=
|
||||
|
||||
# parse args
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-h*|--h*)
|
||||
OPT_HELP=true
|
||||
shift
|
||||
;;
|
||||
-reveal-in-finder)
|
||||
OPT_REVEAL_IN_FINDER=true
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
echo "$0: Unknown option $1" >&2
|
||||
OPT_HELP=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
if [[ "$OUTFILE" != "" ]] && ! $OPT_HELP; then
|
||||
echo "$0: Extra unexpected argument(s) after <outfile>" >&2
|
||||
OPT_HELP=true
|
||||
fi
|
||||
OUTFILE=$1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
if $OPT_HELP; then
|
||||
echo "Usage: $0 [options] <outfile>"
|
||||
echo "Options:"
|
||||
echo " -h, -help Show help."
|
||||
echo " -reveal-in-finder After creating the zip file, show it in Finder"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# tmp dir
|
||||
ZIPDIR=build/tmp/zip
|
||||
FONTDIR=build/fonts
|
||||
|
||||
# convert relative path to absolute if needed
|
||||
OUTFILE_ABS=$OUTFILE
|
||||
if [[ "$OUTFILE_ABS" != /* ]]; then
|
||||
OUTFILE_ABS=$PWD/$OUTFILE_ABS
|
||||
fi
|
||||
|
||||
# cleanup any previous build
|
||||
rm -rf "$ZIPDIR"
|
||||
rm -f build/tmp/a.zip
|
||||
|
||||
# create directories
|
||||
mkdir -p \
|
||||
"$ZIPDIR/Inter Desktop" \
|
||||
"$ZIPDIR/Inter Hinted for Windows/Desktop" \
|
||||
"$ZIPDIR/Inter Hinted for Windows/Web" \
|
||||
"$ZIPDIR/Inter Variable" \
|
||||
"$ZIPDIR/Inter Variable/Single axis" \
|
||||
"$ZIPDIR/Inter Web"
|
||||
|
||||
# copy font files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# Inter Desktop
|
||||
cp $FONTDIR/static/Inter-*.otf "$ZIPDIR/Inter Desktop/" &
|
||||
cp $FONTDIR/var/Inter-V.var.ttf "$ZIPDIR/Inter Desktop/Inter-V.ttf" &
|
||||
|
||||
# Inter Hinted for Windows
|
||||
cp "misc/dist/about hinted fonts.txt" "$ZIPDIR/Inter Hinted for Windows/" &
|
||||
cp $FONTDIR/static-hinted/Inter-*.ttf "$ZIPDIR/Inter Hinted for Windows/Desktop/" &
|
||||
cp $FONTDIR/static-hinted/Inter-*.woff* "$ZIPDIR/Inter Hinted for Windows/Web/" &
|
||||
cp misc/dist/inter.css "$ZIPDIR/Inter Hinted for Windows/Web/" &
|
||||
|
||||
# Inter Variable
|
||||
cp $FONTDIR/var/Inter.var.ttf \
|
||||
"$ZIPDIR/Inter Variable/Inter.ttf" &
|
||||
cp $FONTDIR/var/Inter-roman.var.ttf \
|
||||
"$ZIPDIR/Inter Variable/Single axis/Inter-roman.ttf" &
|
||||
cp $FONTDIR/var/Inter-italic.var.ttf \
|
||||
"$ZIPDIR/Inter Variable/Single axis/Inter-italic.ttf" &
|
||||
|
||||
# Inter Web
|
||||
cp $FONTDIR/static/Inter-*.woff* "$ZIPDIR/Inter Web/" &
|
||||
cp $FONTDIR/var/Inter.var.woff2 "$ZIPDIR/Inter Web/" &
|
||||
cp $FONTDIR/var/Inter-roman.var.woff2 "$ZIPDIR/Inter Web/" &
|
||||
cp $FONTDIR/var/Inter-italic.var.woff2 "$ZIPDIR/Inter Web/" &
|
||||
cp misc/dist/inter.css "$ZIPDIR/Inter Web/" &
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# copy misc stuff
|
||||
cp misc/dist/install*.txt "$ZIPDIR/"
|
||||
cp LICENSE.txt "$ZIPDIR/"
|
||||
mkdir -p "$(dirname "$OUTFILE_ABS")"
|
||||
|
||||
# wait for processes to finish
|
||||
wait
|
||||
|
||||
# zip
|
||||
pushd "$ZIPDIR" >/dev/null
|
||||
zip -q -X -r "$OUTFILE_ABS" *
|
||||
popd >/dev/null
|
||||
rm -rf "$ZIPDIR"
|
||||
|
||||
echo "Created $OUTFILE"
|
||||
if $OPT_REVEAL_IN_FINDER && [ -f /usr/bin/open ]; then
|
||||
/usr/bin/open --reveal "$OUTFILE"
|
||||
fi
|
32
misc/tools/patch-version.py
Normal file
32
misc/tools/patch-version.py
Normal file
@ -0,0 +1,32 @@
|
||||
# Updates "?v=x" in files
|
||||
import os, sys, re
|
||||
from os.path import dirname, basename, abspath, relpath, join as pjoin
|
||||
sys.path.append(abspath(pjoin(dirname(__file__), 'tools')))
|
||||
from common import BASEDIR, getVersion
|
||||
|
||||
version = getVersion()
|
||||
|
||||
def updateCSSFile(filename):
|
||||
regex = re.compile(r'(url\("[^"]+?v=)([^"]+)("\))')
|
||||
with open(filename, 'r') as f:
|
||||
s = f.read()
|
||||
s = regex.sub(lambda m: '%s%s%s' % (m.group(1), version, m.group(3)), s)
|
||||
with open(filename, 'w') as f:
|
||||
f.write(s)
|
||||
|
||||
|
||||
def updateHTMLFile(filename):
|
||||
regex = re.compile(r'((?:href|src)="[^"]+?v=)([^"]+)(")')
|
||||
with open(filename, 'r') as f:
|
||||
s = f.read()
|
||||
s = regex.sub(lambda m: '%s%s%s' % (m.group(1), version, m.group(3)), s)
|
||||
with open(filename, 'w') as f:
|
||||
f.write(s)
|
||||
|
||||
for fn in sys.argv[1:]:
|
||||
if fn.endswith(".css"):
|
||||
updateCSSFile(fn)
|
||||
elif fn.endswith(".html"):
|
||||
updateHTMLFile(fn)
|
||||
else:
|
||||
raise "Unexpected file type %r" % fn
|
91
misc/tools/postprocess-designspace.py
Normal file
91
misc/tools/postprocess-designspace.py
Normal file
@ -0,0 +1,91 @@
|
||||
import sys, os, os.path, re
|
||||
import defcon
|
||||
from multiprocessing import Pool
|
||||
from fontTools.designspaceLib import DesignSpaceDocument
|
||||
from datetime import datetime
|
||||
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'tools')))
|
||||
from common import getGitHash, getVersion
|
||||
|
||||
def update_version(ufo):
|
||||
version = getVersion()
|
||||
buildtag, buildtagErrs = getGitHash()
|
||||
now = datetime.utcnow()
|
||||
if buildtag == "" or len(buildtagErrs) > 0:
|
||||
buildtag = "src"
|
||||
print("warning: getGitHash() failed: %r" % buildtagErrs, file=sys.stderr)
|
||||
versionMajor, versionMinor = [int(num) for num in version.split(".")]
|
||||
ufo.info.versionMajor = versionMajor
|
||||
ufo.info.versionMinor = versionMinor
|
||||
ufo.info.year = now.year
|
||||
ufo.info.openTypeNameVersion = "Version %d.%03d;git-%s" % (versionMajor, versionMinor, buildtag)
|
||||
psFamily = re.sub(r'\s', '', ufo.info.familyName)
|
||||
psStyle = re.sub(r'\s', '', ufo.info.styleName)
|
||||
ufo.info.openTypeNameUniqueID = "%s-%s:%d:%s" % (psFamily, psStyle, now.year, buildtag)
|
||||
ufo.info.openTypeHeadCreated = now.strftime("%Y/%m/%d %H:%M:%S")
|
||||
|
||||
def fix_opsz_maximum(designspace):
|
||||
for a in designspace.axes:
|
||||
if a.tag == "opsz":
|
||||
# TODO: find maximum by looking at the source
|
||||
a.maximum = 72
|
||||
break
|
||||
return designspace
|
||||
|
||||
def should_decompose_glyph(g):
|
||||
# A trivial glyph is one that does not use components or where component transformation
|
||||
# does not include mirroring (i.e. "flipped").
|
||||
if g.components and len(g.components) > 0:
|
||||
for c in g.components:
|
||||
# has non-trivial transformation? (i.e. scaled)
|
||||
# Example of optimally trivial transformation:
|
||||
# (1, 0, 0, 1, 0, 0) no scale or offset
|
||||
# Example of scaled transformation matrix:
|
||||
# (-1.0, 0, 0.3311, 1, 1464.0, 0) flipped x axis, sheered and offset
|
||||
xScale = c.transformation[0]
|
||||
yScale = c.transformation[3]
|
||||
# If glyph is reflected along x or y axes, it won't slant well.
|
||||
if xScale < 0 or yScale < 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
def find_glyphs_to_decompose(designspace):
|
||||
source = designspace.sources[int(len(designspace.sources)/2)]
|
||||
print("find_glyphs_to_decompose sourcing from %r" % source.name)
|
||||
ufo = defcon.Font(source.path)
|
||||
return sorted([g.name for g in ufo if should_decompose_glyph(g)])
|
||||
|
||||
def set_ufo_filter(ufo, **filter_dict):
|
||||
filters = ufo.lib.setdefault("com.github.googlei18n.ufo2ft.filters", [])
|
||||
for i in range(len(filters)):
|
||||
if filters[i].get("name") == filter_dict["name"]:
|
||||
filters[i] = filter_dict
|
||||
return
|
||||
filters.append(filter_dict)
|
||||
|
||||
def update_source_ufo(ufo_file, glyphs_to_decompose):
|
||||
print("update %s" % os.path.basename(ufo_file))
|
||||
ufo = defcon.Font(ufo_file)
|
||||
update_version(ufo)
|
||||
set_ufo_filter(ufo, name="decomposeComponents", include=glyphs_to_decompose)
|
||||
ufo.save(ufo_file)
|
||||
|
||||
def update_sources(designspace):
|
||||
glyphs_to_decompose = find_glyphs_to_decompose(designspace)
|
||||
#print("glyphs marked to be decomposed: %s" % ', '.join(glyphs_to_decompose))
|
||||
sources = [source for source in designspace.sources]
|
||||
# sources = [s for s in sources if s.name == "Inter Thin"] # DEBUG
|
||||
source_files = list(set([s.path for s in sources]))
|
||||
with Pool(len(source_files)) as p:
|
||||
p.starmap(update_source_ufo, [(file, glyphs_to_decompose) for file in source_files])
|
||||
return designspace
|
||||
|
||||
def main(argv):
|
||||
designspace_file = argv[1]
|
||||
designspace = DesignSpaceDocument.fromfile(designspace_file)
|
||||
designspace = fix_opsz_maximum(designspace)
|
||||
designspace = update_sources(designspace)
|
||||
designspace.write(designspace_file)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv)
|
@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# from gftools
|
||||
# https://github.com/googlefonts/gftools/blob/
|
115
misc/tools/postprocess-vf.py
Normal file
115
misc/tools/postprocess-vf.py
Normal file
@ -0,0 +1,115 @@
|
||||
import sys, os, os.path, argparse, re
|
||||
from fontTools.ttLib import TTFont
|
||||
|
||||
# Adoptation of fonttools/blob/master/Snippets/rename-fonts.py
|
||||
|
||||
WINDOWS_ENGLISH_IDS = 3, 1, 0x409
|
||||
MAC_ROMAN_IDS = 1, 0, 0
|
||||
|
||||
LEGACY_FAMILY = 1
|
||||
SUBFAMILY_NAME = 2
|
||||
TRUETYPE_UNIQUE_ID = 3
|
||||
FULL_NAME = 4
|
||||
POSTSCRIPT_NAME = 6
|
||||
PREFERRED_FAMILY = 16
|
||||
TYPO_SUBFAMILY_NAME = 17
|
||||
WWS_FAMILY = 21
|
||||
|
||||
|
||||
FAMILY_RELATED_IDS = set([
|
||||
LEGACY_FAMILY,
|
||||
TRUETYPE_UNIQUE_ID,
|
||||
FULL_NAME,
|
||||
POSTSCRIPT_NAME,
|
||||
PREFERRED_FAMILY,
|
||||
WWS_FAMILY,
|
||||
])
|
||||
|
||||
whitespace_re = re.compile(r'\s+')
|
||||
|
||||
|
||||
def removeWhitespace(s):
|
||||
return whitespace_re.sub("", s)
|
||||
|
||||
|
||||
def set_full_name(font, fullName, fullNamePs):
|
||||
nameTable = font["name"]
|
||||
nameTable.setName(fullName, FULL_NAME, 1, 0, 0) # mac
|
||||
nameTable.setName(fullName, FULL_NAME, 3, 1, 0x409) # windows
|
||||
nameTable.setName(fullNamePs, POSTSCRIPT_NAME, 1, 0, 0) # mac
|
||||
nameTable.setName(fullNamePs, POSTSCRIPT_NAME, 3, 1, 0x409) # windows
|
||||
|
||||
|
||||
def get_family_name(font):
|
||||
nameTable = font["name"]
|
||||
r = None
|
||||
for plat_id, enc_id, lang_id in (WINDOWS_ENGLISH_IDS, MAC_ROMAN_IDS):
|
||||
for name_id in (PREFERRED_FAMILY, LEGACY_FAMILY):
|
||||
r = nameTable.getName(nameID=name_id, platformID=plat_id, platEncID=enc_id, langID=lang_id)
|
||||
if r is not None:
|
||||
break
|
||||
if r is not None:
|
||||
break
|
||||
if not r:
|
||||
raise ValueError("family name not found")
|
||||
return r.toUnicode()
|
||||
|
||||
|
||||
def fix_fullname(font):
|
||||
fullName = get_family_name(font)
|
||||
fullNamePs = removeWhitespace(fullName)
|
||||
set_full_name(font, fullName, fullNamePs)
|
||||
return fullName
|
||||
|
||||
|
||||
def clear_subfamily_name(font):
|
||||
nameTable = font["name"]
|
||||
rmrecs = []
|
||||
for rec in nameTable.names:
|
||||
if rec.nameID == SUBFAMILY_NAME or rec.nameID == TYPO_SUBFAMILY_NAME:
|
||||
rmrecs.append(rec)
|
||||
for rec in rmrecs:
|
||||
nameTable.removeNames(rec.nameID, rec.platformID, rec.platEncID, rec.langID)
|
||||
|
||||
|
||||
def fix_unique_id(font, fullName):
|
||||
fontIdRecs = []
|
||||
newId = ''
|
||||
nameTable = font["name"]
|
||||
for rec in nameTable.names:
|
||||
if rec.nameID == TRUETYPE_UNIQUE_ID:
|
||||
if newId == '':
|
||||
oldId = rec.toUnicode()
|
||||
newId = removeWhitespace(fullName)
|
||||
p = oldId.find(':')
|
||||
if p > -1:
|
||||
newId += oldId[p:]
|
||||
fontIdRecs.append(rec)
|
||||
for rec in fontIdRecs:
|
||||
nameTable.setName(newId, rec.nameID, rec.platformID, rec.platEncID, rec.langID)
|
||||
|
||||
|
||||
def main():
|
||||
argparser = argparse.ArgumentParser(description='Fix names in variable font')
|
||||
a = lambda *args, **kwargs: argparser.add_argument(*args, **kwargs)
|
||||
a('-o', '--output', metavar='<file>',
|
||||
help='Output font file. Defaults to input file (overwrite)')
|
||||
a('input', metavar='<file>',
|
||||
help='Input font file')
|
||||
args = argparser.parse_args()
|
||||
|
||||
infile = args.input
|
||||
outfile = args.output or infile
|
||||
|
||||
font = TTFont(infile, recalcBBoxes=False, recalcTimestamp=False)
|
||||
|
||||
fullName = fix_fullname(font)
|
||||
fix_unique_id(font, fullName)
|
||||
clear_subfamily_name(font)
|
||||
|
||||
font.save(outfile)
|
||||
font.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
171
misc/tools/rename.py
Normal file
171
misc/tools/rename.py
Normal file
@ -0,0 +1,171 @@
|
||||
import sys, os, os.path, argparse, re
|
||||
from fontTools.ttLib import TTFont
|
||||
|
||||
# Adoptation of fonttools/blob/master/Snippets/rename-fonts.py
|
||||
|
||||
WINDOWS_ENGLISH_IDS = 3, 1, 0x409
|
||||
MAC_ROMAN_IDS = 1, 0, 0
|
||||
|
||||
LEGACY_FAMILY = 1
|
||||
TRUETYPE_UNIQUE_ID = 3
|
||||
FULL_NAME = 4
|
||||
POSTSCRIPT_NAME = 6
|
||||
PREFERRED_FAMILY = 16
|
||||
SUBFAMILY_NAME = 17
|
||||
WWS_FAMILY = 21
|
||||
|
||||
|
||||
FAMILY_RELATED_IDS = set([
|
||||
LEGACY_FAMILY,
|
||||
TRUETYPE_UNIQUE_ID,
|
||||
FULL_NAME,
|
||||
POSTSCRIPT_NAME,
|
||||
PREFERRED_FAMILY,
|
||||
WWS_FAMILY,
|
||||
])
|
||||
|
||||
whitespace_re = re.compile(r'\s+')
|
||||
|
||||
|
||||
def removeWhitespace(s):
|
||||
return whitespace_re.sub("", s)
|
||||
|
||||
|
||||
def setFullName(font, fullName):
|
||||
nameTable = font["name"]
|
||||
nameTable.setName(fullName, FULL_NAME, 1, 0, 0) # mac
|
||||
nameTable.setName(fullName, FULL_NAME, 3, 1, 0x409) # windows
|
||||
nameTable.setName(fullName, POSTSCRIPT_NAME, 1, 0, 0) # mac
|
||||
nameTable.setName(fullName, POSTSCRIPT_NAME, 3, 1, 0x409) # windows
|
||||
|
||||
|
||||
def getFamilyName(font):
|
||||
nameTable = font["name"]
|
||||
r = None
|
||||
for plat_id, enc_id, lang_id in (WINDOWS_ENGLISH_IDS, MAC_ROMAN_IDS):
|
||||
for name_id in (PREFERRED_FAMILY, LEGACY_FAMILY):
|
||||
r = nameTable.getName(nameID=name_id, platformID=plat_id, platEncID=enc_id, langID=lang_id)
|
||||
if r is not None:
|
||||
break
|
||||
if r is not None:
|
||||
break
|
||||
if not r:
|
||||
raise ValueError("family name not found")
|
||||
return r.toUnicode()
|
||||
|
||||
|
||||
def renameStylesGoogleFonts(font):
|
||||
familyName = getFamilyName(font)
|
||||
|
||||
# collect subfamily (style) name IDs for variable font's named instances
|
||||
vfInstanceSubfamilyNameIds = set()
|
||||
if "fvar" in font:
|
||||
for namedInstance in font["fvar"].instances:
|
||||
vfInstanceSubfamilyNameIds.add(namedInstance.subfamilyNameID)
|
||||
|
||||
nameTable = font["name"]
|
||||
for rec in nameTable.names:
|
||||
rid = rec.nameID
|
||||
if rid in (FULL_NAME, LEGACY_FAMILY):
|
||||
# style part of family name
|
||||
s = rec.toUnicode()
|
||||
start = s.find(familyName)
|
||||
if start != -1:
|
||||
s = familyName + " " + removeWhitespace(s[start + len(familyName):])
|
||||
else:
|
||||
s = removeWhitespace(s)
|
||||
if s != "Italic" and s.endswith("Italic"):
|
||||
# fixup e.g. "ExtraBoldItalic" -> "ExtraBold Italic"
|
||||
s = s[:len(s) - len("Italic")] + " Italic"
|
||||
rec.string = s.strip()
|
||||
if rid in (SUBFAMILY_NAME,) or rid in vfInstanceSubfamilyNameIds:
|
||||
s = removeWhitespace(rec.toUnicode())
|
||||
if s != "Italic" and s.endswith("Italic"):
|
||||
# fixup e.g. "ExtraBoldItalic" -> "ExtraBold Italic"
|
||||
s = s[:len(s) - len("Italic")] + " Italic"
|
||||
rec.string = s.strip()
|
||||
# else: ignore standard names unrelated to style
|
||||
|
||||
|
||||
def setFamilyName(font, nextFamilyName):
|
||||
prevFamilyName = getFamilyName(font)
|
||||
if prevFamilyName == nextFamilyName:
|
||||
return
|
||||
# raise Exception("identical family name")
|
||||
|
||||
def renameRecord(nameRecord, prevFamilyName, nextFamilyName):
|
||||
# replaces prevFamilyName with nextFamilyName in nameRecord
|
||||
s = nameRecord.toUnicode()
|
||||
start = s.find(prevFamilyName)
|
||||
if start != -1:
|
||||
end = start + len(prevFamilyName)
|
||||
nextFamilyName = s[:start] + nextFamilyName + s[end:]
|
||||
nameRecord.string = nextFamilyName
|
||||
return s, nextFamilyName
|
||||
|
||||
# postcript name can't contain spaces
|
||||
psPrevFamilyName = prevFamilyName.replace(" ", "")
|
||||
psNextFamilyName = nextFamilyName.replace(" ", "")
|
||||
for rec in font["name"].names:
|
||||
name_id = rec.nameID
|
||||
if name_id not in FAMILY_RELATED_IDS:
|
||||
# leave uninteresting records unmodified
|
||||
continue
|
||||
if name_id == POSTSCRIPT_NAME:
|
||||
old, new = renameRecord(rec, psPrevFamilyName, psNextFamilyName)
|
||||
elif name_id == TRUETYPE_UNIQUE_ID:
|
||||
# The Truetype Unique ID rec may contain either the PostScript Name or the Full Name
|
||||
if psPrevFamilyName in rec.toUnicode():
|
||||
# Note: This is flawed -- a font called "Foo" renamed to "Bar Lol";
|
||||
# if this record is not a PS record, it will incorrectly be rename "BarLol".
|
||||
# However, in practice this is not abig deal since it's just an ID.
|
||||
old, new = renameRecord(rec, psPrevFamilyName, psNextFamilyName)
|
||||
else:
|
||||
old, new = renameRecord(rec, prevFamilyName, nextFamilyName)
|
||||
else:
|
||||
old, new = renameRecord(rec, prevFamilyName, nextFamilyName)
|
||||
# print(" %r: '%s' -> '%s'" % (rec, old, new))
|
||||
|
||||
|
||||
def main():
|
||||
argparser = argparse.ArgumentParser(
|
||||
description='Rename family and/or styles of font'
|
||||
)
|
||||
a = lambda *args, **kwargs: argparser.add_argument(*args, **kwargs)
|
||||
a('-o', '--output', metavar='<file>',
|
||||
help='Output font file. Defaults to input file (overwrite)')
|
||||
a('--family', metavar='<name>',
|
||||
help='Rename family to <name>')
|
||||
a('--google-style', action='store_true',
|
||||
help='Rename style names to Google Fonts standards')
|
||||
a('input', metavar='<file>',
|
||||
help='Input font file')
|
||||
args = argparser.parse_args()
|
||||
|
||||
infile = args.input
|
||||
outfile = args.output or infile
|
||||
|
||||
font = TTFont(infile, recalcBBoxes=False, recalcTimestamp=False)
|
||||
editCount = 0
|
||||
try:
|
||||
if args.family:
|
||||
editCount += 1
|
||||
setFamilyName(font, args.family)
|
||||
|
||||
if args.google_style:
|
||||
editCount += 1
|
||||
renameStylesGoogleFonts(font)
|
||||
|
||||
if editCount == 0:
|
||||
print("no rename options provided", file=sys.stderr)
|
||||
argparser.print_help(sys.stderr)
|
||||
sys.exit(1)
|
||||
return
|
||||
|
||||
font.save(outfile)
|
||||
finally:
|
||||
font.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
53
misc/tools/subset-designspace.py
Normal file
53
misc/tools/subset-designspace.py
Normal file
@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env python
|
||||
import sys, os
|
||||
from os.path import dirname, basename, abspath, relpath, join as pjoin
|
||||
from fontTools.designspaceLib import DesignSpaceDocument
|
||||
|
||||
|
||||
def subset_designspace(designspace, filename):
|
||||
italic = filename.find('italic') != -1
|
||||
|
||||
rmlist = []
|
||||
for a in designspace.axes:
|
||||
if a.tag == "slnt" or a.tag == "ital" or a.tag == "opsz":
|
||||
rmlist.append(a)
|
||||
for a in rmlist:
|
||||
designspace.axes.remove(a)
|
||||
|
||||
rmlist = []
|
||||
hasDefault = not italic
|
||||
for source in designspace.sources:
|
||||
isitalic = source.name.find('Italic') != -1
|
||||
if italic != isitalic or source.name.endswith('Display') or source.name.endswith('opsz'):
|
||||
rmlist.append(source)
|
||||
elif italic and not hasDefault:
|
||||
source.copyLib = True
|
||||
source.copyInfo = True
|
||||
source.copyGroups = True
|
||||
source.copyFeatures = True
|
||||
hasDefault = True
|
||||
for source in rmlist:
|
||||
designspace.sources.remove(source)
|
||||
|
||||
rmlist = []
|
||||
for instance in designspace.instances:
|
||||
isitalic = instance.name.find('Italic') != -1
|
||||
if italic != isitalic:
|
||||
rmlist.append(instance)
|
||||
for instance in rmlist:
|
||||
designspace.instances.remove(instance)
|
||||
|
||||
print("write %s" % relpath(filename, os.getcwd()))
|
||||
designspace.write(filename)
|
||||
|
||||
|
||||
def main(argv):
|
||||
src_designspace_file = argv[1]
|
||||
dst_designspace_file = argv[2]
|
||||
designspace = DesignSpaceDocument.fromfile(src_designspace_file)
|
||||
designspace.lib.clear()
|
||||
subset_designspace(designspace, dst_designspace_file)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv)
|
@ -1,10 +1,10 @@
|
||||
fonttools[lxml,unicode,ufo]==4.33.3
|
||||
cu2qu==1.6.7.post1
|
||||
glyphsLib==5.3.2
|
||||
glyphsLib==6.0.5
|
||||
ufo2ft[pathops]==2.27.0
|
||||
defcon[lxml]==0.8.1
|
||||
defcon[lxml]==0.10.1
|
||||
skia-pathops==0.7.2
|
||||
gftools==0.7.0
|
||||
gftools==0.9.11
|
||||
|
||||
# only used for DesignSpaceDocumentReader in fontbuild
|
||||
MutatorMath==3.0.1
|
||||
@ -13,4 +13,6 @@ MutatorMath==3.0.1
|
||||
brotli==1.0.9
|
||||
|
||||
# for QA
|
||||
fontbakery==0.7.37
|
||||
fontbakery==0.8.8
|
||||
|
||||
fontmake==3.3.0
|
||||
|
653029
src/Inter.glyphs
653029
src/Inter.glyphs
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
||||
3.19
|
||||
4.00
|
||||
|
Loading…
Reference in New Issue
Block a user