├── .python-version ├── requirements-test.in ├── AUTHORS.txt ├── CONTRIBUTORS.txt ├── documentation ├── image1.jpg ├── image2.png ├── image3.png ├── static1.png ├── static2.png ├── static3.png ├── static4.png ├── static5.png ├── static6.png ├── video1.mp4 ├── video2.mp4 ├── video3.mp4 ├── video4.mp4 ├── video5.mp4 ├── video6.mp4 ├── images-license.txt ├── ARTICLE.en_us.html ├── image1.py └── image2.py ├── fonts ├── otf │ ├── Savate-Black.otf │ ├── Savate-Bold.otf │ ├── Savate-Light.otf │ ├── Savate-Italic.otf │ ├── Savate-Medium.otf │ ├── Savate-Regular.otf │ ├── Savate-BoldItalic.otf │ ├── Savate-ExtraBold.otf │ ├── Savate-ExtraLight.otf │ ├── Savate-SemiBold.otf │ ├── Savate-BlackItalic.otf │ ├── Savate-LightItalic.otf │ ├── Savate-MediumItalic.otf │ ├── Savate-ExtraBoldItalic.otf │ ├── Savate-SemiBoldItalic.otf │ └── Savate-ExtraLightItalic.otf ├── ttf │ ├── Savate-Black.ttf │ ├── Savate-Bold.ttf │ ├── Savate-Light.ttf │ ├── Savate-Italic.ttf │ ├── Savate-Medium.ttf │ ├── Savate-Regular.ttf │ ├── Savate-BoldItalic.ttf │ ├── Savate-ExtraBold.ttf │ ├── Savate-ExtraLight.ttf │ ├── Savate-SemiBold.ttf │ ├── Savate-BlackItalic.ttf │ ├── Savate-LightItalic.ttf │ ├── Savate-MediumItalic.ttf │ ├── Savate-ExtraBoldItalic.ttf │ ├── Savate-SemiBoldItalic.ttf │ └── Savate-ExtraLightItalic.ttf ├── variable │ ├── Savate[wght].ttf │ └── Savate-Italic[wght].ttf └── webfonts │ ├── Savate-Black.woff2 │ ├── Savate-Bold.woff2 │ ├── Savate-Light.woff2 │ ├── Savate[wght].woff2 │ ├── Savate-Italic.woff2 │ ├── Savate-Medium.woff2 │ ├── Savate-Regular.woff2 │ ├── Savate-SemiBold.woff2 │ ├── Savate-BoldItalic.woff2 │ ├── Savate-ExtraBold.woff2 │ ├── Savate-ExtraLight.woff2 │ ├── Savate-BlackItalic.woff2 │ ├── Savate-Italic[wght].woff2 │ ├── Savate-LightItalic.woff2 │ ├── Savate-MediumItalic.woff2 │ ├── Savate-ExtraBoldItalic.woff2 │ ├── Savate-SemiBoldItalic.woff2 │ └── Savate-ExtraLightItalic.woff2 ├── requirements-test.txt ├── requirements.in ├── renovate.json ├── scripts ├── update-custom-filter.py ├── index.html ├── read-config.py └── customize.py ├── .gitignore ├── sources ├── config.yaml └── CustomFilter_GF_Latin_All.plist ├── Makefile ├── requirements.txt ├── OFL.txt ├── .github └── workflows │ └── build.yaml └── README.md /.python-version: -------------------------------------------------------------------------------- 1 | 3.9.19 2 | -------------------------------------------------------------------------------- /requirements-test.in: -------------------------------------------------------------------------------- 1 | fontbakery[googlefonts]>=0.9.2 2 | gftools[qa]>=0.9.23 3 | -------------------------------------------------------------------------------- /AUTHORS.txt: -------------------------------------------------------------------------------- 1 | Max Esnée 2 | Plomb Type 3 | 4 | -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | Max Esnée 2 | Emma Marichal -------------------------------------------------------------------------------- /documentation/image1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/image1.jpg -------------------------------------------------------------------------------- /documentation/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/image2.png -------------------------------------------------------------------------------- /documentation/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/image3.png -------------------------------------------------------------------------------- /documentation/static1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/static1.png -------------------------------------------------------------------------------- /documentation/static2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/static2.png -------------------------------------------------------------------------------- /documentation/static3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/static3.png -------------------------------------------------------------------------------- /documentation/static4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/static4.png -------------------------------------------------------------------------------- /documentation/static5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/static5.png -------------------------------------------------------------------------------- /documentation/static6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/static6.png -------------------------------------------------------------------------------- /documentation/video1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/video1.mp4 -------------------------------------------------------------------------------- /documentation/video2.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/video2.mp4 -------------------------------------------------------------------------------- /documentation/video3.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/video3.mp4 -------------------------------------------------------------------------------- /documentation/video4.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/video4.mp4 -------------------------------------------------------------------------------- /documentation/video5.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/video5.mp4 -------------------------------------------------------------------------------- /documentation/video6.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/documentation/video6.mp4 -------------------------------------------------------------------------------- /fonts/otf/Savate-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-Black.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-Bold.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-Light.otf -------------------------------------------------------------------------------- /fonts/ttf/Savate-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-Black.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-Bold.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-Light.ttf -------------------------------------------------------------------------------- /fonts/otf/Savate-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-Italic.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-Medium.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-Regular.otf -------------------------------------------------------------------------------- /fonts/ttf/Savate-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-Italic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-Medium.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-Regular.ttf -------------------------------------------------------------------------------- /fonts/otf/Savate-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-BoldItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-ExtraBold.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-ExtraLight.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-SemiBold.otf -------------------------------------------------------------------------------- /fonts/ttf/Savate-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-ExtraBold.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-ExtraLight.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-SemiBold.ttf -------------------------------------------------------------------------------- /fonts/variable/Savate[wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/variable/Savate[wght].ttf -------------------------------------------------------------------------------- /fonts/otf/Savate-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-BlackItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-LightItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-MediumItalic.otf -------------------------------------------------------------------------------- /fonts/ttf/Savate-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-BlackItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-LightItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-MediumItalic.ttf -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Black.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Bold.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Light.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate[wght].woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate[wght].woff2 -------------------------------------------------------------------------------- /fonts/otf/Savate-ExtraBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-ExtraBoldItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Savate-SemiBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-SemiBoldItalic.otf -------------------------------------------------------------------------------- /fonts/ttf/Savate-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Savate-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Italic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Medium.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Regular.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-SemiBold.woff2 -------------------------------------------------------------------------------- /requirements-test.txt: -------------------------------------------------------------------------------- 1 | # Placeholder file, update the requirements by running `make update`. 2 | -r requirements-test.in 3 | -------------------------------------------------------------------------------- /fonts/otf/Savate-ExtraLightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/otf/Savate-ExtraLightItalic.otf -------------------------------------------------------------------------------- /fonts/ttf/Savate-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/ttf/Savate-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /fonts/variable/Savate-Italic[wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/variable/Savate-Italic[wght].ttf -------------------------------------------------------------------------------- /fonts/webfonts/Savate-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-BoldItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-ExtraBold.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-ExtraLight.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-BlackItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-Italic[wght].woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-Italic[wght].woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-LightItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-MediumItalic.woff2 -------------------------------------------------------------------------------- /documentation/images-license.txt: -------------------------------------------------------------------------------- 1 | The images in this repository are licensed under the CC https://creativecommons.org/licenses/by-sa/4.0/ -------------------------------------------------------------------------------- /fonts/webfonts/Savate-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Savate-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxesnee/savate/HEAD/fonts/webfonts/Savate-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /requirements.in: -------------------------------------------------------------------------------- 1 | fontmake>=3.9.0 2 | gftools[qa]>=0.9.54 3 | drawbot-skia>=0.5.0 4 | sh>=2.0.6 5 | bumpfontversion>=0.4.1 6 | diffenator2>=0.3.8 7 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ], 6 | "rangeStrategy": "bump" 7 | } 8 | -------------------------------------------------------------------------------- /scripts/update-custom-filter.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | GF_Latin_All = "https://github.com/googlefonts/glyphsets/raw/main/GF_glyphsets/Latin/glyphs/CustomFilter_GF_Latin.plist" 4 | dest = "sources/CustomFilter_GF_Latin_All.plist" 5 | 6 | r = requests.get(GF_Latin_All) 7 | with open(dest, "wb") as f: 8 | f.write(r.content) 9 | -------------------------------------------------------------------------------- /scripts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | My Font development 7 | 8 | 9 |

My Font testing pages

10 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | venv 3 | venv-test 4 | build.stamp 5 | proof 6 | node_modules 7 | package-lock.json 8 | package.json 9 | master_ufo 10 | instance_ufos 11 | .ninja_log 12 | build.ninja 13 | 14 | # OS generated files # 15 | ###################### 16 | .DS_Store 17 | .DS_Store? 18 | ._* 19 | .Spotlight-V100 20 | .Trashes 21 | ehthumbs.db 22 | Thumbs.db 23 | 24 | # Autosaved by application when editing 25 | ###################### 26 | *(تم الحفظ تلقائيًا).* 27 | *(automaticky uloženo).* 28 | *(Automatisch gesichert).* 29 | *(Autosaved).* 30 | *(guardado automáticamente).* 31 | *(enregistré automatiquement).* 32 | *(salvato automaticamente).* 33 | *(自動保存).* 34 | *(자동 저장됨).* 35 | *(Salvo Automaticamente).* 36 | *(Автосохранение).* 37 | *(Otomatik Kaydedildi).* 38 | *(自动存储).* 39 | *(已自動儲存).* 40 | -------------------------------------------------------------------------------- /sources/config.yaml: -------------------------------------------------------------------------------- 1 | sources: 2 | - Savate.glyphs 3 | - Savate-Italic.glyphs 4 | axisOrder: 5 | - wght 6 | - ital 7 | familyName: "Savate" 8 | cleanUp: true 9 | stat: 10 | Savate[wght].ttf: 11 | - name: Weight 12 | tag: wght 13 | values: 14 | - name: ExtraLight 15 | value: 200 16 | - name: Light 17 | value: 300 18 | - name: Regular 19 | value: 400 20 | linkedValue: 700 21 | flags: 2 22 | - name: Medium 23 | value: 500 24 | - name: SemiBold 25 | value: 600 26 | - name: Bold 27 | value: 700 28 | - name: ExtraBold 29 | value: 800 30 | - name: Black 31 | value: 900 32 | - name: Italic 33 | tag: ital 34 | values: 35 | - name: Roman 36 | value: 0 37 | linkedValue: 1 38 | flags: 2 39 | Savate-Italic[wght].ttf: 40 | - name: Weight 41 | tag: wght 42 | values: 43 | - name: ExtraLight 44 | value: 200 45 | - name: Light 46 | value: 300 47 | - name: Regular 48 | value: 400 49 | linkedValue: 700 50 | flags: 2 51 | - name: Medium 52 | value: 500 53 | - name: SemiBold 54 | value: 600 55 | - name: Bold 56 | value: 700 57 | - name: ExtraBold 58 | value: 800 59 | - name: Black 60 | value: 900 61 | - name: Italic 62 | tag: ital 63 | values: 64 | - name: Italic 65 | value: 1 66 | -------------------------------------------------------------------------------- /scripts/read-config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # Yes, this is a Bad YAML Parser, but at this stage we are not in the 3 | # venv and do not know what modules the user has available, so for 4 | # maximum compatibility, we are just assuming a plain Python distribution. 5 | import argparse 6 | import re 7 | import sys 8 | import os 9 | 10 | parser = argparse.ArgumentParser() 11 | group = parser.add_mutually_exclusive_group(required=True) 12 | group.add_argument("--sources", action="store_true") 13 | group.add_argument("--family", action="store_true") 14 | args = parser.parse_args() 15 | 16 | with open(os.path.join("sources", "config.yaml")) as config: 17 | data = config.read() 18 | 19 | if args.family: 20 | m = re.search(r"(?m)^familyName: (.*)", data) 21 | if m: 22 | print(m[1]) 23 | sys.exit(0) 24 | else: 25 | print("Could not determine family name from config file!") 26 | sys.exit(1) 27 | 28 | toggle = False 29 | sources = [] 30 | for line in data.splitlines(): 31 | if re.match("^sources:", line): 32 | toggle = True 33 | continue 34 | if toggle: 35 | m = re.match(r"^\s*-\s*(.*)", line) 36 | if m: 37 | sources.append("sources/" + m[1]) 38 | else: 39 | toggle = False 40 | if sources: 41 | print(" ".join(sources)) 42 | sys.exit(0) 43 | else: 44 | print("Could not determine sources from config file!") 45 | sys.exit(1) 46 | -------------------------------------------------------------------------------- /documentation/ARTICLE.en_us.html: -------------------------------------------------------------------------------- 1 |

Savate is a humanist sans-serif typeface with reverse contrast. Its name, borrowed from the French martial art, reflects the typeface’s sense of motion. Its open, generous curves and assertive forms evoke wide gestures and dynamic rhythm. Designed with both flexibility and impact in mind, Savate comes in a full range of weights from Extralight to Black, with matching italics, making it well-suited for everything from bold headlines to confident, readable text.

2 | 3 |

To contribute, see github.com/maxesnee/savate.

4 | 5 |
6 | 7 | 8 |

This new release is a complete redraw of the original Savate, first published in 2016 by the We.ch collective (Max Esnée and Hadrien Bulliat) through Velvetyne. While it stays true to the spirit of the original design, every glyph has been refined to improve rhythm, structure, and overall cohesion. The family has also been significantly expanded, now offering a full palette of styles and expanded language support, including Latin Pan-African, making Savate a versatile tool for a broad range of typographic needs.

9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 26 | 27 | 31 | 32 | 33 | 34 | 38 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SOURCES=$(shell python3 scripts/read-config.py --sources ) 2 | FAMILY=$(shell python3 scripts/read-config.py --family ) 3 | DRAWBOT_SCRIPTS=$(shell ls documentation/*.py) 4 | DRAWBOT_OUTPUT=$(shell ls documentation/*.py | sed 's/\.py/.png/g') 5 | 6 | help: 7 | @echo "###" 8 | @echo "# Build targets for $(FAMILY)" 9 | @echo "###" 10 | @echo 11 | @echo " make build: Builds the fonts and places them in the fonts/ directory" 12 | @echo " make test: Tests the fonts with fontbakery" 13 | @echo " make proof: Creates HTML proof documents in the proof/ directory" 14 | @echo " make images: Creates PNG specimen images in the documentation/ directory" 15 | @echo 16 | 17 | build: build.stamp 18 | 19 | venv: venv/touchfile 20 | 21 | venv-test: venv-test/touchfile 22 | 23 | customize: venv 24 | . venv/bin/activate; python3 scripts/customize.py 25 | 26 | build.stamp: venv sources/config.yaml $(SOURCES) 27 | rm -rf fonts 28 | (for config in sources/config*.yaml; do . venv/bin/activate; gftools builder $$config; done) && touch build.stamp 29 | 30 | venv/touchfile: requirements.txt 31 | test -d venv || python3 -m venv venv 32 | . venv/bin/activate; pip install -Ur requirements.txt 33 | touch venv/touchfile 34 | 35 | venv-test/touchfile: requirements-test.txt 36 | test -d venv-test || python3 -m venv venv-test 37 | . venv-test/bin/activate; pip install -Ur requirements-test.txt 38 | touch venv-test/touchfile 39 | 40 | test: venv-test build.stamp 41 | TOCHECK=$$(find fonts/variable -type f 2>/dev/null); if [ -z "$$TOCHECK" ]; then TOCHECK=$$(find fonts/ttf -type f 2>/dev/null); fi ; . venv-test/bin/activate; mkdir -p out/ out/fontbakery; fontbakery check-googlefonts -l WARN --full-lists --succinct --badges out/badges --html out/fontbakery/fontbakery-report.html --ghmarkdown out/fontbakery/fontbakery-report.md $$TOCHECK || echo '::warning file=sources/config.yaml,title=Fontbakery failures::The fontbakery QA check reported errors in your font. Please check the generated report.' 42 | 43 | proof: venv build.stamp 44 | TOCHECK=$$(find fonts/variable -type f 2>/dev/null); if [ -z "$$TOCHECK" ]; then TOCHECK=$$(find fonts/ttf -type f 2>/dev/null); fi ; . venv/bin/activate; mkdir -p out/ out/proof; diffenator2 proof $$TOCHECK -o out/proof 45 | 46 | images: venv $(DRAWBOT_OUTPUT) 47 | 48 | %.png: %.py build.stamp 49 | . venv/bin/activate; python3 $< --output $@ 50 | 51 | clean: 52 | rm -rf venv 53 | find . -name "*.pyc" -delete 54 | 55 | update-project-template: 56 | npx update-template https://github.com/googlefonts/googlefonts-project-template/ 57 | 58 | update: venv venv-test 59 | venv/bin/pip install --upgrade pip-tools 60 | # See https://pip-tools.readthedocs.io/en/latest/#a-note-on-resolvers for 61 | # the `--resolver` flag below. 62 | venv/bin/pip-compile --upgrade --verbose --resolver=backtracking requirements.in 63 | venv/bin/pip-sync requirements.txt 64 | 65 | venv-test/bin/pip install --upgrade pip-tools 66 | venv-test/bin/pip-compile --upgrade --verbose --resolver=backtracking requirements-test.in 67 | venv-test/bin/pip-sync requirements-test.txt 68 | 69 | git commit -m "Update requirements" requirements.txt requirements-test.txt 70 | git push 71 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==2.1.0 2 | afdko==4.0.2 3 | appdirs==1.4.4 4 | attrs==25.1.0 5 | axisregistry==0.4.12 6 | babelfont==3.1.2 7 | beautifulsoup4==4.13.3 8 | beziers==0.6.0 9 | black==24.4.2 10 | blackrenderer==0.6.0 11 | booleanOperations==0.9.0 12 | Brotli==1.1.0 13 | bump2version==1.0.1 14 | bumpfontversion==0.4.1 15 | cattrs==24.1.2 16 | certifi==2025.1.31 17 | cffi==1.17.1 18 | cffsubr==0.3.0 19 | charset-normalizer==3.4.1 20 | click==8.1.7 21 | cmarkgfm==2024.11.20 22 | collidoscope==0.6.5 23 | colorlog==6.9.0 24 | commandlines==0.4.1 25 | compreffor==0.5.6 26 | convert==0.1.2 27 | cryptography==44.0.0 28 | defcon==0.10.3 29 | dehinter==4.0.0 30 | Deprecated==1.2.18 31 | diffenator2==0.4.5 32 | docopt==0.6.2 33 | et-xmlfile==1.1.0 34 | filelock==3.17.0 35 | font-v==2.1.0 36 | fontbakery==1.0.0 37 | fontFeatures==1.8.0 38 | fontmake==3.10.0 39 | fontMath==0.9.4 40 | fontParts==0.12.3 41 | fontPens==0.2.4 42 | fonttools==4.55.8 43 | freetype-py==2.3.0 44 | fs==2.4.16 45 | gflanguages==0.7.2 46 | gfsubsets==2024.9.25 47 | gftools==0.9.81 48 | gitdb==4.0.12 49 | GitPython==3.1.44 50 | glyphsets==1.1.0 51 | glyphsLib==6.10.1 52 | h11==0.14.0 53 | hyperglot==0.7.1 54 | idna==3.10 55 | importlib_resources==6.5.2 56 | Jinja2==3.1.5 57 | kurbopy==0.11.1 58 | lxml==5.3.0 59 | markdown-it-py==3.0.0 60 | MarkupSafe==3.0.2 61 | mdurl==0.1.2 62 | munkres==1.1.4 63 | MutatorMath==3.0.1 64 | mypy-extensions==1.0.0 65 | nanoemoji==0.15.1 66 | networkx==3.4.2 67 | ninja==1.11.1.3 68 | num2words==0.5.13 69 | numpy==2.2.2 70 | openpyxl==3.1.4 71 | openstep_plist==0.5.0 72 | opentype-sanitizer==9.2.0 73 | opentypespec==1.9.2 74 | orjson==3.10.15 75 | outcome==1.3.0.post0 76 | packaging==24.2 77 | panda==0.3.1 78 | pandas==2.2.2 79 | pathspec==0.12.1 80 | picosvg==0.22.1 81 | pillow==11.1.0 82 | pip-api==0.0.34 83 | platformdirs==4.2.2 84 | pngquant-cli==3.0.3 85 | protobuf==3.20.3 86 | pyahocorasick==2.1.0 87 | pybind11==2.13.6 88 | pycairo==1.27.0 89 | pyclipper==1.3.0.post6 90 | pycparser==2.22 91 | pygit2==1.15.0 92 | PyGithub==2.5.0 93 | Pygments==2.19.1 94 | PyJWT==2.10.1 95 | PyNaCl==1.5.0 96 | pyparsing==3.2.1 97 | PySocks==1.7.1 98 | python-bidi==0.4.2 99 | python-dateutil==2.9.0.post0 100 | pytz==2024.1 101 | PyYAML==6.0.2 102 | regex==2024.11.6 103 | requests==2.32.3 104 | resvg-cli==0.44.0 105 | rich==13.9.4 106 | rstr==3.2.2 107 | ruamel.yaml==0.18.10 108 | ruamel.yaml.clib==0.2.8 109 | selenium==4.28.1 110 | setuptools==75.8.0 111 | shaperglot==1.0.0a1 112 | six==1.17.0 113 | skia-pathops==0.8.0.post2 114 | skia-python==134.0b12 115 | smmap==5.0.2 116 | sniffio==1.3.1 117 | sortedcontainers==2.4.0 118 | soupsieve==2.6 119 | sre-yield==1.2 120 | statmake==1.0.1 121 | strictyaml==1.7.3 122 | stringbrewer==0.0.1 123 | tabulate==0.9.0 124 | termcolor==2.4.0 125 | toml==0.10.2 126 | tqdm==4.67.1 127 | trio==0.28.0 128 | trio-websocket==0.11.1 129 | ttfautohint-py==0.5.1 130 | typing_extensions==4.12.2 131 | tzdata==2024.1 132 | ufo2ft==3.4.1 133 | ufoLib2==0.17.1 134 | ufolint==1.2.0 135 | ufomerge==1.8.2 136 | ufonormalizer==0.6.2 137 | ufoProcessor==1.13.3 138 | uharfbuzz==0.45.0 139 | unicodedata2==15.1.0 140 | Unidecode==1.3.8 141 | urllib3==2.3.0 142 | vfbLib==0.7.0 143 | vharfbuzz==0.3.1 144 | vttLib==0.12.0 145 | websocket-client==1.8.0 146 | wrapt==1.17.2 147 | wsproto==1.2.0 148 | youseedee==0.5.3 149 | zopfli==0.2.3.post1 150 | -------------------------------------------------------------------------------- /scripts/customize.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # This script is run by the user using `make customize` after the repository 4 | # is cloned. If you are reading this because `make customize` failed, 5 | # skip down to the section headed "INITIALIZATION STEPS". 6 | 7 | from sh import git 8 | import datetime 9 | import re 10 | import sys 11 | from urllib.parse import quote 12 | import subprocess 13 | import requests 14 | 15 | BASE_OWNER = "googlefonts" 16 | BASE_REPONAME = "googlefonts-project-template" 17 | DUMMY_URL = "https://yourname.github.io/your-font-repository-name" 18 | LATEST_OFL = "https://raw.githubusercontent.com/googlefonts/googlefonts-project-template/main/OFL.txt" 19 | 20 | 21 | def repo_url(owner, name): 22 | return f"https://github.com/{owner}/{name}" 23 | 24 | 25 | def web_url(owner, name): 26 | return f"https://{owner}.github.io/{name}" 27 | 28 | 29 | def raw_url(owner, name): 30 | return f"https://raw.githubusercontent.com/{owner}/{name}" 31 | 32 | 33 | def lose(msg, e=None): 34 | print(msg) 35 | print("You will need to do the initialization steps manually.") 36 | print("Read scripts/customize.py for more instructions how to do this.") 37 | if e: 38 | print( 39 | "\nHere's an additional error message which may help diagnose the problem." 40 | ) 41 | raise e 42 | sys.exit(1) 43 | 44 | 45 | try: 46 | my_repo_url = git.remote("get-url", "origin") 47 | except Exception as e: 48 | lose("Could not use git to find my own repository URL", e) 49 | 50 | m = re.match(r"(?:https://github.com/|git@github.com:)(.*)/(.*)/?", str(my_repo_url)) 51 | if not m: 52 | lose( 53 | f"My git repository URL ({my_repo_url}) didn't look what I expected - are you hosting this on github?" 54 | ) 55 | 56 | owner, reponame = m[1], m[2] 57 | 58 | if owner == BASE_OWNER and reponame == BASE_REPONAME: 59 | print("I am being run on the upstream repository; don't do that") 60 | sys.exit() 61 | 62 | # INITIALIZATION STEPS 63 | 64 | # First, the README file contains URLs to pages in the `gh-pages` branch of the 65 | # repo. When initially cloned, these URLs will point to the 66 | # googlefonts/Unified-Font-Repository itself. But downstream users want links 67 | # and badges about their own font, not ours! So any URLs need to be adjusted to 68 | # refer to the end user's repository. 69 | 70 | # We will also pin the dependencies so future builds are reproducible. 71 | 72 | readme = open("README.md").read() 73 | ghpages_url = web_url(owner, reponame) 74 | project_url = repo_url(owner, reponame) 75 | 76 | print("Fixing URLs:", web_url(BASE_OWNER, BASE_REPONAME), "->", ghpages_url) 77 | 78 | readme = readme.replace(web_url(BASE_OWNER, BASE_REPONAME), ghpages_url) 79 | # In the badges, the URLs to raw.githubusercontent.com are URL-encoded as they 80 | # are passed to shields.io. 81 | readme = readme.replace( 82 | quote(raw_url(BASE_OWNER, BASE_REPONAME), safe=""), 83 | quote(raw_url(owner, reponame), safe=""), 84 | ) 85 | 86 | print("Fixing URLs:", DUMMY_URL, "->", ghpages_url) 87 | readme = readme.replace(f"`{DUMMY_URL}`", ghpages_url) 88 | 89 | with open("README.md", "w") as fh: 90 | fh.write(readme) 91 | 92 | git.add("README.md") 93 | 94 | # Fix the OFL 95 | year = datetime.date.today().year 96 | title = reponame.title() 97 | copyright = f"Copyright {year} The {title} Project Authors ({project_url})\n" 98 | print("Fetching the latest OFL..") 99 | ofl = requests.get(LATEST_OFL).text.splitlines() 100 | print("Writing an OFL for you") 101 | print(copyright) 102 | with open("OFL.txt", "w") as fh: 103 | fh.write(copyright) 104 | fh.write("\n".join(ofl[1:])) 105 | 106 | git.add("OFL.txt") 107 | 108 | # Pin the dependencies 109 | print("Pinning dependencies") 110 | dependencies = subprocess.check_output(["pip", "freeze"]) 111 | with open("requirements.txt", "wb") as dependency_file: 112 | dependency_file.write(dependencies) 113 | git.add("requirements.txt") 114 | 115 | # Did anything change? 116 | result = git.status("--porcelain") 117 | if any(line.startswith("M ") for line in result.splitlines()): 118 | git.commit("-m", "Customize repository") 119 | 120 | print("Pushing changes to GitHub") 121 | git.push() 122 | else: 123 | print("Nothing changed, no need to push") 124 | -------------------------------------------------------------------------------- /OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2024 The Savate.Git Project Authors (https://github.com/maxesnee/savate.git) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | https://openfontlicense.org 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Build font and specimen 2 | 3 | on: push 4 | 5 | jobs: 6 | build: 7 | name: Build and test 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - name: Set up Python 3.10 12 | uses: actions/setup-python@v5 13 | with: 14 | python-version: "3.10" 15 | - name: Install sys tools/deps 16 | run: | 17 | sudo apt-get update 18 | sudo apt-get install ttfautohint libcairo2-dev python3-cairo-dev pkg-config python3-dev 19 | sudo snap install yq 20 | - uses: actions/cache@v4 21 | with: 22 | path: ./venv/ 23 | key: ${{ runner.os }}-venv-${{ hashFiles('**/requirements*.txt') }} 24 | restore-keys: | 25 | ${{ runner.os }}-venv- 26 | - name: gen zip file name 27 | id: zip-name 28 | shell: bash 29 | # Set the archive name to repo name + "-assets" e.g "MavenPro-assets" 30 | run: echo "ZIP_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-fonts" >> $GITHUB_ENV 31 | 32 | # If a new release is cut, use the release tag to auto-bump the source files 33 | # - name: Bump release 34 | # if: github.event_name == 'release' 35 | # run: | 36 | # . venv/bin/activate 37 | # SRCS=$(yq e ".sources[]" sources/config.yaml) 38 | # TAG_NAME=${GITHUB_REF/refs\/tags\//} 39 | # echo "Bumping $SRCS to $TAG_NAME" 40 | # for src in $SRCS 41 | # do 42 | # bumpfontversion sources/$src --new-version $TAG_NAME; 43 | # done 44 | 45 | - name: Build font 46 | run: make build 47 | - name: Check with fontbakery 48 | run: make test 49 | continue-on-error: true 50 | - name: proof 51 | run: make proof 52 | - name: setup site 53 | run: cp scripts/index.html out/index.html 54 | - name: Deploy 55 | uses: peaceiris/actions-gh-pages@v4 56 | if: ${{ github.ref == 'refs/heads/main' }} 57 | with: 58 | github_token: ${{ secrets.GITHUB_TOKEN }} 59 | publish_dir: ./out 60 | - name: Archive artifacts 61 | uses: actions/upload-artifact@v4 62 | with: 63 | name: ${{ env.ZIP_NAME }} 64 | path: | 65 | fonts 66 | out 67 | outputs: 68 | zip_name: ${{ env.ZIP_NAME }} 69 | 70 | # There are two ways a release can be created: either by pushing a tag, or by 71 | # creating a release from the GitHub UI. Pushing a tag does not automatically 72 | # create a release, so we have to do that ourselves. However, creating a 73 | # release from the GitHub UI *does* push a tag, and we don't want to create 74 | # a new release in that case because one already exists! 75 | 76 | release: 77 | name: Create and populate release 78 | needs: build 79 | runs-on: ubuntu-latest 80 | if: contains(github.ref, 'refs/tags/') 81 | env: 82 | ZIP_NAME: ${{ needs.build.outputs.zip_name }} 83 | GH_TOKEN: ${{ github.token }} 84 | steps: 85 | - uses: actions/checkout@v4 86 | - name: Download font artefact files 87 | uses: actions/download-artifact@v4 88 | with: 89 | name: ${{ env.ZIP_NAME }} 90 | path: ${{ env.ZIP_NAME }} 91 | - name: Copy DESCRIPTION.en_us.html to artefact directory 92 | run: cp documentation/DESCRIPTION.en_us.html ${{ env.ZIP_NAME }}/DESCRIPTION.en_us.html 93 | - name: Copy ARTICLE.en_us.html to artefact directory 94 | run: cp documentation/ARTICLE.en_us.html ${{ env.ZIP_NAME }}/ARTICLE.en_us.html 95 | continue-on-error: true 96 | - name: Copy OFL.txt to artefact directory 97 | run: cp OFL.txt ${{ env.ZIP_NAME }}/OFL.txt 98 | - name: Remove proof/fontbakery stuff from release 99 | run: rm -rf ${{ env.ZIP_NAME }}/out 100 | - name: gen release file name 101 | shell: bash 102 | run: echo "RELEASE_ZIP_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-${{github.ref_name}}" >> $GITHUB_ENV 103 | - name: Create release bundle 104 | run: mv ${{ env.ZIP_NAME }} ${{ env.RELEASE_ZIP_NAME }}; zip -r ${{ env.RELEASE_ZIP_NAME }}.zip ${{ env.RELEASE_ZIP_NAME }} 105 | - name: Check for release 106 | id: create_release 107 | run: | 108 | if ! gh release view ${{ github.ref_name }}; then 109 | git show -s --format=%B ${{ github.ref_name }} | tail -n +4 | gh release create ${{ github.ref_name }} -t ${{ github.ref_name }} -F - 110 | fi 111 | - name: Populate release 112 | run: | 113 | gh release upload ${{ github.ref_name }} ${{ env.RELEASE_ZIP_NAME }}.zip --clobber 114 | - name: Set release live 115 | run: | 116 | gh release edit ${{ github.ref_name }} --draft=false 117 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Savate 2 | 3 | [![][Fontbakery]](https://maxesnee.github.io/savate.git/fontbakery/fontbakery-report.html) 4 | [![][Universal]](https://maxesnee.github.io/savate.git/fontbakery/fontbakery-report.html) 5 | [![][GF Profile]](https://maxesnee.github.io/savate.git/fontbakery/fontbakery-report.html) 6 | [![][Shaping]](https://maxesnee.github.io/savate.git/fontbakery/fontbakery-report.html) 7 | 8 | [Fontbakery]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaxesnee%2Fsavate.git%2Fgh-pages%2Fbadges%2Foverall.json 9 | [GF Profile]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaxesnee%2Fsavate.git%2Fgh-pages%2Fbadges%2FGoogleFonts.json 10 | [Outline Correctness]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaxesnee%2Fsavate.git%2Fgh-pages%2Fbadges%2FOutlineCorrectnessChecks.json 11 | [Shaping]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaxesnee%2Fsavate.git%2Fgh-pages%2Fbadges%2FShapingChecks.json 12 | [Universal]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaxesnee%2Fsavate.git%2Fgh-pages%2Fbadges%2FUniversal.json 13 | 14 | ![Sample Image](documentation/image1.jpg) 15 | 16 | Savate is a humanist sans-serif typeface with reverse contrast. Its name, borrowed from the French martial art, reflects the typeface’s sense of motion. Its open, generous curves and assertive forms evoke wide gestures and dynamic rhythm. Designed with both flexibility and impact in mind, Savate comes in a full range of weights from Extralight to Black, with matching italics, making it well-suited for everything from bold headlines to confident, readable text. 17 | 18 | ![Sample Image](documentation/static1.png) 19 | 20 | This new release is a complete redraw of the original Savate, first published in 2016 by the We.ch collective (Max Esnée and Hadrien Bulliat) through Velvetyne. While it stays true to the spirit of the original design, every glyph has been refined to improve rhythm, structure, and overall cohesion. The family has also been significantly expanded, now offering a full palette of styles and expanded language support, including Latin Pan-African, making Savate a versatile tool for a broad range of typographic needs. 21 | 22 | ![Sample Image](documentation/static2.png) 23 | ![Sample Image](documentation/image2.png) 24 | ![Sample Image](documentation/static3.png) 25 | ![Sample Image](documentation/image3.png) 26 | ![Sample Image](documentation/static4.png) 27 | ![Sample Image](documentation/static5.png) 28 | 29 | 30 | 31 | 32 | 33 | ## About 34 | 35 | [Max Esnée](https://www.max-esnee.com/) is a typeface designer, graphic designer, and web developer. Graduating from EPSAA in 2014, he works independently, crafting visual identities and websites for a diverse range of clients. In 2019, he joined the EsadType program at Esad Amiens to further his skills in typeface design. In 2021, he released the Gamuth typeface family at Production Type. Concurrently to his profesionnal practice, he pursues various personal projects, ranging from designing new typefaces to creating web tools, such as the Stack & Justify application, launched in early 2024. 36 | 37 | 38 | [Plomb Type](https://www.plombtype.com/) is an independent type foundry created by Max Esnée and [Emma Marichal](https://emmamarichal.fr/), based in Lyon, France. The foundry creates a variety of typefaces with distinct voices, and also enjoys working closely with clients on custom designs. Alongside its font catalogue, Plomb Type offers typographic advice and support for brands of all kinds. 39 | 40 | 41 | ![Sample Image](documentation/static6.png) 42 | 43 | ## Building 44 | 45 | Fonts are built automatically by GitHub Actions - take a look in the "Actions" tab for the latest build. 46 | 47 | If you want to build fonts manually on your own computer: 48 | 49 | * `make build` will produce font files. 50 | * `make test` will run [FontBakery](https://github.com/googlefonts/fontbakery)'s quality assurance tests. 51 | * `make proof` will generate HTML proof files. 52 | 53 | The proof files and QA tests are also available automatically via GitHub Actions - look at https://maxesnee.github.io/savate.git. 54 | 55 | ## Changelog 56 | 57 | When you update your font (new version or new release), please report all notable changes here, with a date. 58 | [Font Versioning](https://github.com/googlefonts/gf-docs/tree/main/Spec#font-versioning) is based on semver. 59 | Changelog example: 60 | 61 | **14 May 2025. Version 2.000** 62 | - MAJOR Font turned to a variable font. 63 | - Pan African support added. 64 | - Design Space extented: ExtraLight to Black. 65 | 66 | ## License 67 | 68 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 69 | This license is available with a FAQ at https://openfontlicense.org 70 | 71 | ## Repository Layout 72 | 73 | This font repository structure is inspired by [Unified Font Repository v0.3](https://github.com/unified-font-repository/Unified-Font-Repository), modified for the Google Fonts workflow. 74 | -------------------------------------------------------------------------------- /documentation/image1.py: -------------------------------------------------------------------------------- 1 | # This script is meant to be run from the root level 2 | # of your font's git repository. For example, from a Unix terminal: 3 | # $ git clone my-font 4 | # $ cd my-font 5 | # $ python3 documentation/image1.py --output documentation/image1.png 6 | 7 | # Import moduels from external python packages: https://pypi.org/ 8 | from drawbot_skia.drawbot import * 9 | from fontTools.ttLib import TTFont 10 | from fontTools.misc.fixedTools import floatToFixedToStr 11 | 12 | # Import moduels from the Python Standard Library: https://docs.python.org/3/library/ 13 | import subprocess 14 | import sys 15 | import argparse 16 | 17 | # Constants, these are the main "settings" for the image 18 | WIDTH, HEIGHT, MARGIN, FRAMES = 2048, 1024, 128, 1 19 | FONT_PATH = "fonts/ttf/Savate-SemiBold.ttf" 20 | FONT_LICENSE = "OFL v1.1" 21 | AUXILIARY_FONT = "Helvetica" 22 | AUXILIARY_FONT_SIZE = 48 23 | 24 | BIG_TEXT = "AaBb" 25 | BIG_TEXT_FONT_SIZE = 730 26 | BIG_TEXT_SIDE_MARGIN = MARGIN * 1 27 | BIG_TEXT_BOTTOM_MARGIN = MARGIN * 2 28 | 29 | GRID_VIEW = False # Toggle this for a grid overlay 30 | 31 | # Handel the "--output" flag 32 | # For example: $ python3 documentation/image1.py --output documentation/image1.png 33 | parser = argparse.ArgumentParser() 34 | parser.add_argument("--output", metavar="PNG", help="where to write the PNG file") 35 | args = parser.parse_args() 36 | 37 | # Load the font with the parts of fonttools that are imported with the line: 38 | # from fontTools.ttLib import TTFont 39 | # Docs Link: https://fonttools.readthedocs.io/en/latest/ttLib/ttFont.html 40 | ttFont = TTFont(FONT_PATH) 41 | 42 | # Constants that are worked out dynamically 43 | MY_URL = subprocess.check_output("git remote get-url origin", shell=True).decode() 44 | MY_HASH = subprocess.check_output("git rev-parse --short HEAD", shell=True).decode() 45 | FONT_NAME = ttFont["name"].getDebugName(4) 46 | FONT_VERSION = "v%s" % floatToFixedToStr(ttFont["head"].fontRevision, 16) 47 | 48 | 49 | # Draws a grid 50 | def grid(): 51 | stroke(1, 0, 0, 0.75) 52 | strokeWidth(2) 53 | STEP_X, STEP_Y = 0, 0 54 | INCREMENT_X, INCREMENT_Y = MARGIN / 2, MARGIN / 2 55 | rect(MARGIN, MARGIN, WIDTH - (MARGIN * 2), HEIGHT - (MARGIN * 2)) 56 | for x in range(29): 57 | polygon((MARGIN + STEP_X, MARGIN), (MARGIN + STEP_X, HEIGHT - MARGIN)) 58 | STEP_X += INCREMENT_X 59 | for y in range(29): 60 | polygon((MARGIN, MARGIN + STEP_Y), (WIDTH - MARGIN, MARGIN + STEP_Y)) 61 | STEP_Y += INCREMENT_Y 62 | polygon((WIDTH / 2, 0), (WIDTH / 2, HEIGHT)) 63 | polygon((0, HEIGHT / 2), (WIDTH, HEIGHT / 2)) 64 | 65 | 66 | # Remap input range to VF axis range 67 | # This is useful for animation 68 | # (E.g. sinewave(-1,1) to wght(100,900)) 69 | def remap(value, inputMin, inputMax, outputMin, outputMax): 70 | inputSpan = inputMax - inputMin # FIND INPUT RANGE SPAN 71 | outputSpan = outputMax - outputMin # FIND OUTPUT RANGE SPAN 72 | valueScaled = float(value - inputMin) / float(inputSpan) 73 | return outputMin + (valueScaled * outputSpan) 74 | 75 | 76 | # Draw the page/frame and a grid if "GRID_VIEW" is set to "True" 77 | def draw_background(): 78 | newPage(WIDTH, HEIGHT) 79 | fill(0) 80 | rect(-2, -2, WIDTH + 2, HEIGHT + 2) 81 | if GRID_VIEW: 82 | grid() 83 | else: 84 | pass 85 | 86 | 87 | # Draw main text 88 | def draw_main_text(): 89 | fill(1) 90 | stroke(None) 91 | font(FONT_PATH) 92 | fontSize(BIG_TEXT_FONT_SIZE) 93 | # Adjust this line to center main text manually. 94 | # TODO: This should be done automatically when drawbot-skia 95 | # has support for textBox() and FormattedString 96 | #text(BIG_TEXT, ((WIDTH / 2) - MARGIN * 4.75, (HEIGHT / 2) - MARGIN * 2.5)) 97 | text(BIG_TEXT, (BIG_TEXT_SIDE_MARGIN, BIG_TEXT_BOTTOM_MARGIN)) 98 | 99 | 100 | # Divider lines 101 | def draw_divider_lines(): 102 | stroke(1) 103 | strokeWidth(5) 104 | lineCap("round") 105 | line((MARGIN, HEIGHT - (MARGIN * 1.5)), (WIDTH - MARGIN, HEIGHT - (MARGIN * 1.5))) 106 | line((MARGIN, MARGIN + (MARGIN / 2)), (WIDTH - MARGIN, MARGIN + (MARGIN / 2))) 107 | stroke(None) 108 | 109 | 110 | # Draw text describing the font and it's git status & repo URL 111 | def draw_auxiliary_text(): 112 | # Setup 113 | font(AUXILIARY_FONT) 114 | fontSize(AUXILIARY_FONT_SIZE) 115 | POS_TOP_LEFT = (MARGIN, HEIGHT - MARGIN * 1.25) 116 | POS_TOP_RIGHT = (WIDTH - MARGIN, HEIGHT - MARGIN * 1.25) 117 | POS_BOTTOM_LEFT = (MARGIN, MARGIN) 118 | POS_BOTTOM_RIGHT = (WIDTH - MARGIN * 0.95, MARGIN) 119 | URL_AND_HASH = MY_URL + "at commit " + MY_HASH 120 | URL_AND_HASH = URL_AND_HASH.replace("\n", " ") 121 | # Draw Text 122 | text(FONT_NAME, POS_TOP_LEFT, align="left") 123 | text(FONT_VERSION, POS_TOP_RIGHT, align="right") 124 | text(URL_AND_HASH, POS_BOTTOM_LEFT, align="left") 125 | text(FONT_LICENSE, POS_BOTTOM_RIGHT, align="right") 126 | 127 | 128 | # Build and save the image 129 | if __name__ == "__main__": 130 | draw_background() 131 | draw_main_text() 132 | draw_divider_lines() 133 | draw_auxiliary_text() 134 | # Save output, using the "--output" flag location 135 | saveImage(args.output) 136 | # Print done in the terminal 137 | print("DrawBot: Done") 138 | -------------------------------------------------------------------------------- /documentation/image2.py: -------------------------------------------------------------------------------- 1 | # This script is meant to be run from the root level 2 | # of your font's git repository. For example, from a Unix terminal: 3 | # $ git clone my-font 4 | # $ cd my-font 5 | # $ python3 documentation/image1.py --output documentation/image1.png 6 | 7 | # Import moduels from external python packages: https://pypi.org/ 8 | from drawbot_skia.drawbot import * 9 | from fontTools.ttLib import TTFont 10 | from fontTools.misc.fixedTools import floatToFixedToStr 11 | 12 | # Import moduels from the Python Standard Library: https://docs.python.org/3/library/ 13 | import subprocess 14 | import sys 15 | import argparse 16 | 17 | # Constants, these are the main "settings" for the image 18 | WIDTH, HEIGHT, MARGIN, FRAMES = 2048, 1024, 128, 1 19 | FONT_PATH = "fonts/ttf/Savate-SemiBold.ttf" 20 | FONT_LICENSE = "OFL v1.1" 21 | AUXILIARY_FONT = "Helvetica" 22 | AUXILIARY_FONT_SIZE = 48 23 | 24 | LINE_ONE = "ABCDEFGHIJKLMNOPQ" 25 | LINE_TWO = "RSTUVWXYZ123456789" 26 | LINE_THREE = "abcdefghijklmnopqrstu" 27 | LINE_FOUR = "vwxyz,.;:!@#$%^&*(){}[]" 28 | BIG_TEXT_FONT_SIZE = 160 29 | BIG_TEXT_SIDE_MARGIN = MARGIN * 1 30 | BIG_TEXT_BOTTOM_MARGIN = MARGIN * 5.45 31 | 32 | GRID_VIEW = False # Toggle this for a grid overlay 33 | 34 | # Handel the "--output" flag 35 | # For example: $ python3 documentation/image1.py --output documentation/image1.png 36 | parser = argparse.ArgumentParser() 37 | parser.add_argument("--output", metavar="PNG", help="where to write the PNG file") 38 | args = parser.parse_args() 39 | 40 | # Load the font with the parts of fonttools that are imported with the line: 41 | # from fontTools.ttLib import TTFont 42 | # Docs Link: https://fonttools.readthedocs.io/en/latest/ttLib/ttFont.html 43 | ttFont = TTFont(FONT_PATH) 44 | 45 | # Constants that are worked out dynamically 46 | MY_URL = subprocess.check_output("git remote get-url origin", shell=True).decode() 47 | MY_HASH = subprocess.check_output("git rev-parse --short HEAD", shell=True).decode() 48 | FONT_NAME = ttFont["name"].getDebugName(4) 49 | FONT_VERSION = "v%s" % floatToFixedToStr(ttFont["head"].fontRevision, 16) 50 | 51 | 52 | # Draws a grid 53 | def grid(): 54 | stroke(1, 0, 0, 0.75) 55 | strokeWidth(2) 56 | STEP_X, STEP_Y = 0, 0 57 | INCREMENT_X, INCREMENT_Y = MARGIN / 2, MARGIN / 2 58 | rect(MARGIN, MARGIN, WIDTH - (MARGIN * 2), HEIGHT - (MARGIN * 2)) 59 | for x in range(29): 60 | polygon((MARGIN + STEP_X, MARGIN), (MARGIN + STEP_X, HEIGHT - MARGIN)) 61 | STEP_X += INCREMENT_X 62 | for y in range(29): 63 | polygon((MARGIN, MARGIN + STEP_Y), (WIDTH - MARGIN, MARGIN + STEP_Y)) 64 | STEP_Y += INCREMENT_Y 65 | polygon((WIDTH / 2, 0), (WIDTH / 2, HEIGHT)) 66 | polygon((0, HEIGHT / 2), (WIDTH, HEIGHT / 2)) 67 | 68 | 69 | # Remap input range to VF axis range 70 | # This is useful for animation 71 | # (E.g. sinewave(-1,1) to wght(100,900)) 72 | def remap(value, inputMin, inputMax, outputMin, outputMax): 73 | inputSpan = inputMax - inputMin # FIND INPUT RANGE SPAN 74 | outputSpan = outputMax - outputMin # FIND OUTPUT RANGE SPAN 75 | valueScaled = float(value - inputMin) / float(inputSpan) 76 | return outputMin + (valueScaled * outputSpan) 77 | 78 | 79 | # Draw the page/frame and a grid if "GRID_VIEW" is set to "True" 80 | def draw_background(): 81 | newPage(WIDTH, HEIGHT) 82 | fill(0) 83 | rect(-2, -2, WIDTH + 2, HEIGHT + 2) 84 | if GRID_VIEW: 85 | grid() 86 | else: 87 | pass 88 | 89 | 90 | # Draw main text 91 | def draw_main_text(): 92 | fill(1) 93 | stroke(None) 94 | font(FONT_PATH) 95 | fontSize(BIG_TEXT_FONT_SIZE) 96 | # Adjust this line to center main text manually. 97 | # TODO: This should be done automatically when drawbot-skia 98 | # has support for textBox() and FormattedString 99 | LEADING = 1.2 100 | text(LINE_ONE, (BIG_TEXT_SIDE_MARGIN, BIG_TEXT_BOTTOM_MARGIN)) 101 | text(LINE_TWO, (BIG_TEXT_SIDE_MARGIN, BIG_TEXT_BOTTOM_MARGIN - (MARGIN * LEADING))) 102 | text(LINE_THREE, (BIG_TEXT_SIDE_MARGIN, BIG_TEXT_BOTTOM_MARGIN - (MARGIN * (LEADING * 2)))) 103 | text(LINE_FOUR, (BIG_TEXT_SIDE_MARGIN, BIG_TEXT_BOTTOM_MARGIN - (MARGIN * (LEADING * 3)))) 104 | 105 | 106 | # Divider lines 107 | def draw_divider_lines(): 108 | stroke(1) 109 | strokeWidth(5) 110 | lineCap("round") 111 | line((MARGIN, HEIGHT - (MARGIN * 1.5)), (WIDTH - MARGIN, HEIGHT - (MARGIN * 1.5))) 112 | line((MARGIN, MARGIN + (MARGIN / 2)), (WIDTH - MARGIN, MARGIN + (MARGIN / 2))) 113 | stroke(None) 114 | 115 | 116 | # Draw text describing the font and it's git status & repo URL 117 | def draw_auxiliary_text(): 118 | # Setup 119 | font(AUXILIARY_FONT) 120 | fontSize(AUXILIARY_FONT_SIZE) 121 | POS_TOP_LEFT = (MARGIN, HEIGHT - MARGIN * 1.25) 122 | POS_TOP_RIGHT = (WIDTH - MARGIN, HEIGHT - MARGIN * 1.25) 123 | POS_BOTTOM_LEFT = (MARGIN, MARGIN) 124 | POS_BOTTOM_RIGHT = (WIDTH - MARGIN * 0.95, MARGIN) 125 | #URL_AND_HASH = "github.com/googlefonts/googlefonts-project-template " + "at commit " + MY_HASH 126 | URL_AND_HASH = MY_URL + "at commit " + MY_HASH 127 | URL_AND_HASH = URL_AND_HASH.replace("\n", " ") 128 | # Draw Text 129 | #text("Your Font Regular", POS_TOP_LEFT, align="left") 130 | text(FONT_NAME, POS_TOP_LEFT, align="left") 131 | text(FONT_VERSION, POS_TOP_RIGHT, align="right") 132 | text(URL_AND_HASH, POS_BOTTOM_LEFT, align="left") 133 | text(FONT_LICENSE, POS_BOTTOM_RIGHT, align="right") 134 | 135 | 136 | # Build and save the image 137 | if __name__ == "__main__": 138 | draw_background() 139 | draw_main_text() 140 | draw_divider_lines() 141 | draw_auxiliary_text() 142 | # Save output, using the "--output" flag location 143 | saveImage(args.output) 144 | # Print done in the terminal 145 | print("DrawBot: Done") 146 | -------------------------------------------------------------------------------- /sources/CustomFilter_GF_Latin_All.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | list 7 | 8 | apostrophemod 9 | Acaron 10 | Acircumflexdotbelow 11 | Adblgrave 12 | Adieresismacron 13 | Adotaccent 14 | Adotmacron 15 | Ainvertedbreve 16 | Alpha-latin 17 | Aringbelow 18 | Astroke 19 | AEmacron 20 | Bdotaccent 21 | Bdotbelow 22 | Beta-latin 23 | Bhook 24 | Bmacronbelow 25 | Bstroke 26 | Ccedillaacute 27 | Chi-latin 28 | Chook 29 | Cstroke 30 | Dcedilla 31 | Dcircumflexbelow 32 | Ddotaccent 33 | Ddotbelow 34 | Dhook 35 | Dmacronbelow 36 | Dtail 37 | Ecedilla 38 | Ecedillabreve 39 | Ecircumflexbelow 40 | Ecircumflexdotbelow 41 | Edblgrave 42 | Edotbelow 43 | Einvertedbreve 44 | Emacronacute 45 | Emacrongrave 46 | Eopen 47 | Ereversed 48 | Esh 49 | Estroke 50 | Etilde 51 | Etildebelow 52 | Schwa 53 | Ezh 54 | Ezhcaron 55 | Ezhreversed 56 | Fdotaccent 57 | Fhook 58 | Gacute 59 | Gcaron 60 | Ghook 61 | Glottalstop 62 | Gmacron 63 | Gstroke 64 | Hbrevebelow 65 | Hcaron 66 | Hcedilla 67 | Hdieresis 68 | Hdotaccent 69 | Hdotbelow 70 | Heng 71 | Hhook 72 | Hturned 73 | Icaron 74 | Idblgrave 75 | Idieresisacute 76 | Idotbelow 77 | Iinvertedbreve 78 | Iota-latin 79 | Istroke 80 | Itilde 81 | Itildebelow 82 | Jcrossedtail 83 | Jstroke 84 | Kacute 85 | Kcaron 86 | Kdotbelow 87 | Khook 88 | Kmacronbelow 89 | Kstroke 90 | Lbar 91 | Lbelt 92 | Lcircumflexbelow 93 | Ldotbelow 94 | Ldotbelowmacron 95 | Ldoublebar 96 | Lmacronbelow 97 | Lmiddletilde 98 | Macute 99 | Mdotaccent 100 | Mdotbelow 101 | Mturned 102 | Ncircumflexbelow 103 | Ndotaccent 104 | Ndotbelow 105 | Ngrave 106 | Nhookleft 107 | Nlongrightleg 108 | Nmacronbelow 109 | OU 110 | Ocaron 111 | Ocenteredtilde 112 | Ocircumflexdotbelow 113 | Odblgrave 114 | Odieresismacron 115 | Odotaccent 116 | Odotaccentmacron 117 | Odotbelow 118 | Oinvertedbreve 119 | Omacronacute 120 | Omacrongrave 121 | Omega-latin 122 | Oogonek 123 | Oogonekmacron 124 | Oopen 125 | Oslashacute 126 | Otildeacute 127 | Otildedieresis 128 | Otildemacron 129 | Pacute 130 | Pdotaccent 131 | Phook 132 | Pstroke 133 | Qhooktail 134 | Rdblgrave 135 | Rdotaccent 136 | Rdotbelow 137 | Rdotbelowmacron 138 | Rinvertedbreve 139 | Rmacronbelow 140 | Rstroke 141 | Rtail 142 | Sacutedotaccent 143 | Saltillo 144 | Scarondotaccent 145 | Sdotaccent 146 | Sdotbelow 147 | Sdotbelowdotaccent 148 | Sobliquestroke 149 | Tcircumflexbelow 150 | Tdiagonalstroke 151 | Tdotaccent 152 | Tdotbelow 153 | Thook 154 | Tmacronbelow 155 | Tretroflexhook 156 | Ubar 157 | Ucaron 158 | Ucircumflexbelow 159 | Udblgrave 160 | Udieresisacute 161 | Udieresisbelow 162 | Udieresiscaron 163 | Udieresisgrave 164 | Udieresismacron 165 | Udotbelow 166 | Uinvertedbreve 167 | Umacrondieresis 168 | Upsilon-latin 169 | Utilde 170 | Utildeacute 171 | Utildebelow 172 | Gamma-latin 173 | Vdotbelow 174 | Vhook 175 | Vtilde 176 | Vturned 177 | Wdotaccent 178 | Wdotbelow 179 | Whook 180 | Xdieresis 181 | Xdotaccent 182 | Ydotaccent 183 | Yhook 184 | Ymacron 185 | Ystroke 186 | Zcircumflex 187 | Zdotbelow 188 | Zmacronbelow 189 | Zstroke 190 | Ismall 191 | acaron 192 | acircumflexdotbelow 193 | adblgrave 194 | adieresismacron 195 | adotaccent 196 | adotbelow 197 | adotmacron 198 | ainvertedbreve 199 | alpha-latin 200 | aringbelow 201 | astroke 202 | aemacron 203 | bdotaccent 204 | bdotbelow 205 | beta-latin 206 | bhook 207 | bilabialclick 208 | bmacronbelow 209 | bstroke 210 | ccedillaacute 211 | chi-latin 212 | chook 213 | cstroke 214 | dcedilla 215 | dcircumflexbelow 216 | ddotaccent 217 | ddotbelow 218 | dhook 219 | dmacronbelow 220 | dtail 221 | ecedilla 222 | ecedillabreve 223 | ecircumflexbelow 224 | ecircumflexdotbelow 225 | edblgrave 226 | edotbelow 227 | einvertedbreve 228 | emacronacute 229 | emacrongrave 230 | eopen 231 | esh 232 | estroke 233 | etilde 234 | etildebelow 235 | eturned 236 | schwa 237 | ezh 238 | ezhcaron 239 | ezhreversed 240 | fdotaccent 241 | gacute 242 | gamma-latin 243 | gcaron 244 | ghook 245 | glottalstop 246 | glottalstopreversed 247 | glottalstopsmall 248 | gmacron 249 | gstroke 250 | hbrevebelow 251 | hcaron 252 | hcedilla 253 | hdieresis 254 | hdotaccent 255 | hdotbelow 256 | heng 257 | hhook 258 | hturned 259 | icaron 260 | idblgrave 261 | idieresisacute 262 | idotbelow 263 | iinvertedbreve 264 | iota-latin 265 | istroke 266 | itilde 267 | itildebelow 268 | jcrossedtail 269 | jstroke 270 | kacute 271 | kcaron 272 | kdotbelow 273 | khook 274 | kmacronbelow 275 | kstroke 276 | lambdastroke 277 | lbar 278 | lbelt 279 | lcircumflexbelow 280 | ldotbelow 281 | ldotbelowmacron 282 | ldoublebar 283 | lmacronbelow 284 | lmiddletilde 285 | macute 286 | mdotaccent 287 | mdotbelow 288 | mturned 289 | ncircumflexbelow 290 | ndotaccent 291 | ndotbelow 292 | ngrave 293 | nhookleft 294 | nlegrightlong 295 | nmacronbelow 296 | obarred 297 | ocaron 298 | ocircumflexdotbelow 299 | odblgrave 300 | odieresismacron 301 | odotaccent 302 | odotaccentmacron 303 | odotbelow 304 | oinvertedbreve 305 | omacronacute 306 | omacrongrave 307 | omega-latin 308 | oogonek 309 | oogonekmacron 310 | oopen 311 | oslashacute 312 | otildeacute 313 | otildedieresis 314 | otildemacron 315 | ou 316 | pacute 317 | pdotaccent 318 | phook 319 | pstroke 320 | qhooktail 321 | rdblgrave 322 | rdotaccent 323 | rdotbelow 324 | rdotbelowmacron 325 | rfishhook 326 | rinvertedbreve 327 | rmacronbelow 328 | rstroke 329 | rtail 330 | sacutedotaccent 331 | saltillo 332 | scarondotaccent 333 | sdotaccent 334 | sdotbelow 335 | sdotbelowdotaccent 336 | sobliquestroke 337 | tcircumflexbelow 338 | tdiagonalstroke 339 | tdotaccent 340 | tdotbelow 341 | thook 342 | tmacronbelow 343 | tretroflexhook 344 | ubar 345 | ucaron 346 | ucircumflexbelow 347 | udblgrave 348 | udieresisacute 349 | udieresisbelow 350 | udieresiscaron 351 | udieresisgrave 352 | udieresismacron 353 | udotbelow 354 | uinvertedbreve 355 | umacrondieresis 356 | upsilon-latin 357 | utilde 358 | utildeacute 359 | utildebelow 360 | vdotbelow 361 | vhook 362 | vtilde 363 | vturned 364 | wdotaccent 365 | wdotbelow 366 | whook 367 | xdieresis 368 | xdotaccent 369 | ydotaccent 370 | yhook 371 | ymacron 372 | ystroke 373 | zcircumflex 374 | zdotbelow 375 | zmacronbelow 376 | zstroke 377 | hmod 378 | nmod 379 | wmod 380 | clickalveolar 381 | clickdental 382 | clicklateral 383 | clickretroflex 384 | umod 385 | vmod 386 | zmod 387 | florin 388 | colonmod 389 | doubleapostrophemod 390 | minusmod 391 | shortequalmod 392 | kip 393 | rbelowcomb 394 | gravecomb_macroncomb 395 | acutecomb_macroncomb 396 | macroncomb_gravecomb 397 | macroncomb_acutecomb 398 | verticallineabovecomb 399 | dblgravecomb 400 | candraBinducomb 401 | breveinvertedcomb 402 | commaabovecomb 403 | ringbelowcomb 404 | verticallinebelowcomb 405 | circumflexbelowcomb 406 | breveinvertedbelowcomb 407 | tildebelowcomb 408 | macronbelowcomb 409 | lowlinecomb 410 | tildeoverlaycomb 411 | dotaboverightcomb 412 | acutemacroncomb 413 | gravemacroncomb 414 | macronacutecomb 415 | macrongravecomb 416 | secondtonechinese 417 | fourthtonechinese 418 | commaturnedmod 419 | glottalstopmod 420 | ringhalfleft 421 | ringhalfright 422 | uniA7AE 423 | uniA7B8 424 | uniA7B9 425 | 426 | name 427 | GF_Latin_African 428 | 429 | 430 | list 431 | 432 | apostrophemod 433 | lambda 434 | chi 435 | dotbelowcomb 436 | Acaron 437 | Astroke 438 | Cstroke 439 | Emacronacute 440 | Emacrongrave 441 | Eopen 442 | Etilde 443 | Schwa 444 | Ezh 445 | Ezhcaron 446 | Gcaron 447 | Glottalstop 448 | Gmacron 449 | Gstroke 450 | Hdotbelow 451 | Icaron 452 | Idotbelow 453 | Istroke 454 | Itilde 455 | Kacute 456 | Kcaron 457 | Kdotbelow 458 | Kmacronbelow 459 | Lbar 460 | Ldotbelow 461 | Lmiddletilde 462 | Mdotbelow 463 | Ndotbelow 464 | Nmacronbelow 465 | Ocaron 466 | Omacronacute 467 | Omacrongrave 468 | Oogonek 469 | Oogonekmacron 470 | Oopen 471 | Saltillo 472 | Sdotbelow 473 | Tdiagonalstroke 474 | Tmacronbelow 475 | Ucaron 476 | Upsilon-latin 477 | Utilde 478 | Gamma-latin 479 | Zcircumflex 480 | Zmacronbelow 481 | Ismall 482 | acaron 483 | astroke 484 | chi-latin 485 | cstroke 486 | emacronacute 487 | emacrongrave 488 | eopen 489 | etilde 490 | schwa 491 | ezh 492 | ezhcaron 493 | gamma-latin 494 | gcaron 495 | glottalstop 496 | glottalstopreversed 497 | gmacron 498 | gstroke 499 | hdotbelow 500 | icaron 501 | idotbelow 502 | iota-latin 503 | istroke 504 | itilde 505 | kacute 506 | kcaron 507 | kdotbelow 508 | kmacronbelow 509 | lambdastroke 510 | lbar 511 | lbelt 512 | ldotbelow 513 | lmiddletilde 514 | mdotbelow 515 | ndotbelow 516 | nmacronbelow 517 | ocaron 518 | omacronacute 519 | omacrongrave 520 | oogonek 521 | oogonekmacron 522 | oopen 523 | saltillo 524 | sdotbelow 525 | tdiagonalstroke 526 | tmacronbelow 527 | ucaron 528 | upsilon-latin 529 | utilde 530 | zcircumflex 531 | zmacronbelow 532 | wmod 533 | clickalveolar 534 | zmod 535 | commaabovecomb 536 | macronbelowcomb 537 | lowlinecomb 538 | commaturnedmod 539 | glottalstopmod 540 | Ccircumflex 541 | Gcircumflex 542 | Hcircumflex 543 | Jcircumflex 544 | Scircumflex 545 | Tbar 546 | Tcedilla 547 | Ytilde 548 | ccircumflex 549 | gcircumflex 550 | hcircumflex 551 | idotless_ogonek 552 | jcaron 553 | jcircumflex 554 | kgreenlandic 555 | scircumflex 556 | tbar 557 | tcedilla 558 | ytilde 559 | ymod 560 | thetamod 561 | degree 562 | YturnedSansSerif 563 | commaaboverightcomb 564 | strokeshortcomb 565 | primemod 566 | verticallinemod 567 | 568 | name 569 | GF_Latin_Beyond 570 | 571 | 572 | list 573 | 574 | zero 575 | one 576 | two 577 | three 578 | four 579 | five 580 | six 581 | seven 582 | eight 583 | nine 584 | space 585 | nbspace 586 | period 587 | colon 588 | ellipsis 589 | exclam 590 | asterisk 591 | numbersign 592 | slash 593 | backslash 594 | hyphen 595 | parenleft 596 | parenright 597 | braceleft 598 | braceright 599 | bracketleft 600 | bracketright 601 | quotedblleft 602 | quotedblright 603 | quoteleft 604 | quoteright 605 | guillemetleft 606 | guillemetright 607 | quotedbl 608 | quotesingle 609 | bar 610 | plus 611 | multiply 612 | divide 613 | equal 614 | greater 615 | less 616 | percent 617 | dieresiscomb 618 | gravecomb 619 | acutecomb 620 | hungarumlautcomb 621 | macroncomb 622 | dotaccent 623 | degree 624 | A 625 | Aacute 626 | Abreve 627 | Acircumflex 628 | Adieresis 629 | Agrave 630 | Amacron 631 | Aogonek 632 | Aring 633 | Atilde 634 | AE 635 | B 636 | C 637 | Cacute 638 | Ccaron 639 | Ccedilla 640 | Cdotaccent 641 | D 642 | Eth 643 | Dcaron 644 | Dcroat 645 | E 646 | Eacute 647 | Ecaron 648 | Ecircumflex 649 | Edieresis 650 | Edotaccent 651 | Egrave 652 | Emacron 653 | Eogonek 654 | F 655 | G 656 | Gbreve 657 | Gcommaaccent 658 | Gdotaccent 659 | H 660 | Hbar 661 | I 662 | Iacute 663 | Icircumflex 664 | Idieresis 665 | Idotaccent 666 | Igrave 667 | Imacron 668 | Iogonek 669 | J 670 | K 671 | Kcommaaccent 672 | L 673 | Lacute 674 | Lcaron 675 | Lcommaaccent 676 | Lslash 677 | M 678 | N 679 | Nacute 680 | Ncaron 681 | Ncommaaccent 682 | Ntilde 683 | Eng 684 | O 685 | Oacute 686 | Ocircumflex 687 | Odieresis 688 | Ograve 689 | Ohungarumlaut 690 | Omacron 691 | Oslash 692 | Otilde 693 | OE 694 | P 695 | Thorn 696 | Q 697 | R 698 | Racute 699 | Rcaron 700 | Rcommaaccent 701 | S 702 | Sacute 703 | Scaron 704 | Scedilla 705 | Scommaaccent 706 | Germandbls 707 | T 708 | Tcaron 709 | Tcommaaccent 710 | U 711 | Uacute 712 | Ubreve 713 | Ucircumflex 714 | Udieresis 715 | Ugrave 716 | Uhungarumlaut 717 | Umacron 718 | Uogonek 719 | Uring 720 | V 721 | W 722 | Wacute 723 | Wcircumflex 724 | Wdieresis 725 | Wgrave 726 | X 727 | Y 728 | Yacute 729 | Ycircumflex 730 | Ydieresis 731 | Ygrave 732 | Z 733 | Zacute 734 | Zcaron 735 | Zdotaccent 736 | a 737 | aacute 738 | abreve 739 | acircumflex 740 | adieresis 741 | agrave 742 | amacron 743 | aogonek 744 | aring 745 | atilde 746 | ae 747 | b 748 | c 749 | cacute 750 | ccaron 751 | ccedilla 752 | cdotaccent 753 | d 754 | eth 755 | dcaron 756 | dcroat 757 | e 758 | eacute 759 | ecaron 760 | ecircumflex 761 | edieresis 762 | edotaccent 763 | egrave 764 | emacron 765 | eogonek 766 | f 767 | g 768 | gbreve 769 | gcommaaccent 770 | gdotaccent 771 | h 772 | hbar 773 | i 774 | idotless 775 | iacute 776 | icircumflex 777 | idieresis 778 | idotaccent 779 | igrave 780 | imacron 781 | iogonek 782 | j 783 | jdotless 784 | k 785 | kcommaaccent 786 | l 787 | lacute 788 | lcaron 789 | lcommaaccent 790 | lslash 791 | m 792 | n 793 | nacute 794 | ncaron 795 | ncommaaccent 796 | ntilde 797 | eng 798 | o 799 | oacute 800 | ocircumflex 801 | odieresis 802 | ograve 803 | ohungarumlaut 804 | omacron 805 | oslash 806 | otilde 807 | oe 808 | p 809 | thorn 810 | q 811 | r 812 | racute 813 | rcaron 814 | rcommaaccent 815 | s 816 | sacute 817 | scaron 818 | scedilla 819 | scommaaccent 820 | germandbls 821 | t 822 | tcaron 823 | tcommaaccent 824 | u 825 | uacute 826 | ubreve 827 | ucircumflex 828 | udieresis 829 | ugrave 830 | uhungarumlaut 831 | umacron 832 | uogonek 833 | uring 834 | v 835 | w 836 | wacute 837 | wcircumflex 838 | wdieresis 839 | wgrave 840 | x 841 | y 842 | yacute 843 | ycircumflex 844 | ydieresis 845 | ygrave 846 | z 847 | zacute 848 | zcaron 849 | zdotaccent 850 | ordfeminine 851 | ordmasculine 852 | .notdef 853 | comma 854 | semicolon 855 | exclamdown 856 | question 857 | questiondown 858 | periodcentered 859 | bullet 860 | periodcentered.loclCAT 861 | periodcentered.loclCAT.case 862 | endash 863 | emdash 864 | underscore 865 | quotesinglbase 866 | quotedblbase 867 | guilsinglleft 868 | guilsinglright 869 | at 870 | ampersand 871 | paragraph 872 | section 873 | copyright 874 | registered 875 | trademark 876 | cent 877 | dollar 878 | euro 879 | sterling 880 | yen 881 | minus 882 | asciitilde 883 | asciicircum 884 | dotaccentcomb 885 | caroncomb.alt 886 | circumflexcomb 887 | caroncomb 888 | brevecomb 889 | ringcomb 890 | tildecomb 891 | commaturnedabovecomb 892 | commaaccentcomb 893 | cedillacomb 894 | ogonekcomb 895 | dieresis 896 | grave 897 | acute 898 | hungarumlaut 899 | circumflex 900 | caron 901 | breve 902 | ring 903 | tilde 904 | macron 905 | cedilla 906 | ogonek 907 | 908 | name 909 | GF_Latin_Core 910 | 911 | 912 | list 913 | 914 | zero 915 | one 916 | two 917 | three 918 | four 919 | five 920 | six 921 | seven 922 | eight 923 | nine 924 | space 925 | nbspace 926 | period 927 | colon 928 | ellipsis 929 | exclam 930 | asterisk 931 | numbersign 932 | slash 933 | backslash 934 | hyphen 935 | parenleft 936 | parenright 937 | braceleft 938 | braceright 939 | bracketleft 940 | bracketright 941 | quotedblleft 942 | quotedblright 943 | quoteleft 944 | quoteright 945 | quotedbl 946 | quotesingle 947 | bar 948 | plus 949 | multiply 950 | divide 951 | equal 952 | greater 953 | less 954 | percent 955 | degree 956 | A 957 | B 958 | C 959 | D 960 | E 961 | F 962 | G 963 | H 964 | I 965 | J 966 | K 967 | L 968 | M 969 | N 970 | O 971 | P 972 | Q 973 | R 974 | S 975 | T 976 | U 977 | V 978 | W 979 | X 980 | Y 981 | Z 982 | a 983 | b 984 | c 985 | d 986 | e 987 | f 988 | g 989 | h 990 | i 991 | j 992 | k 993 | l 994 | m 995 | n 996 | o 997 | p 998 | q 999 | r 1000 | s 1001 | t 1002 | u 1003 | v 1004 | w 1005 | x 1006 | y 1007 | z 1008 | .notdef 1009 | comma 1010 | semicolon 1011 | question 1012 | periodcentered 1013 | bullet 1014 | endash 1015 | emdash 1016 | underscore 1017 | at 1018 | ampersand 1019 | copyright 1020 | registered 1021 | trademark 1022 | cent 1023 | dollar 1024 | euro 1025 | sterling 1026 | yen 1027 | minus 1028 | asciitilde 1029 | asciicircum 1030 | grave 1031 | 1032 | name 1033 | GF_Latin_Kernel 1034 | 1035 | 1036 | list 1037 | 1038 | numero 1039 | hryvnia 1040 | tenge 1041 | tugrik 1042 | whiteSquare 1043 | pi 1044 | dblverticalbar 1045 | kip 1046 | zero.zero 1047 | zero.tf 1048 | one.tf 1049 | two.tf 1050 | three.tf 1051 | four.tf 1052 | five.tf 1053 | six.tf 1054 | seven.tf 1055 | eight.tf 1056 | nine.tf 1057 | zero.dnom 1058 | one.dnom 1059 | two.dnom 1060 | three.dnom 1061 | four.dnom 1062 | five.dnom 1063 | six.dnom 1064 | seven.dnom 1065 | eight.dnom 1066 | nine.dnom 1067 | zero.numr 1068 | one.numr 1069 | two.numr 1070 | three.numr 1071 | four.numr 1072 | five.numr 1073 | six.numr 1074 | seven.numr 1075 | eight.numr 1076 | nine.numr 1077 | fraction 1078 | onehalf 1079 | onethird 1080 | twothirds 1081 | onequarter 1082 | threequarters 1083 | oneinferior 1084 | twoinferior 1085 | threeinferior 1086 | fourinferior 1087 | fiveinferior 1088 | sixinferior 1089 | seveninferior 1090 | eightinferior 1091 | nineinferior 1092 | onesuperior 1093 | twosuperior 1094 | threesuperior 1095 | foursuperior 1096 | fivesuperior 1097 | sixsuperior 1098 | sevensuperior 1099 | eightsuperior 1100 | ninesuperior 1101 | leftanglebracket-math 1102 | rightanglebracket-math 1103 | baht 1104 | minute 1105 | second 1106 | brokenbar 1107 | dagger 1108 | literSign 1109 | daggerdbl 1110 | estimated 1111 | bitcoin 1112 | cedi 1113 | colonsign 1114 | dong 1115 | guarani 1116 | lari 1117 | liraTurkish 1118 | manat 1119 | naira 1120 | peso 1121 | ruble 1122 | rupee 1123 | rupeeIndian 1124 | sheqel 1125 | won 1126 | notequal 1127 | greaterequal 1128 | lessequal 1129 | plusminus 1130 | approxequal 1131 | logicalnot 1132 | emptyset 1133 | infinity 1134 | integral 1135 | Ohm 1136 | increment 1137 | product 1138 | summation 1139 | radical 1140 | partialdiff 1141 | micro 1142 | perthousand 1143 | upArrow 1144 | northEastArrow 1145 | rightArrow 1146 | southEastArrow 1147 | downArrow 1148 | southWestArrow 1149 | leftArrow 1150 | northWestArrow 1151 | leftRightArrow 1152 | upDownArrow 1153 | blackCircle 1154 | whiteCircle 1155 | whiteBullet 1156 | blackDiamond 1157 | whiteDiamond 1158 | lozenge 1159 | blackSquare 1160 | blackSmallSquare 1161 | whiteSmallSquare 1162 | upBlackTriangle 1163 | rightBlackTriangle 1164 | downBlackTriangle 1165 | leftBlackTriangle 1166 | upWhiteTriangle 1167 | rightWhiteTriangle 1168 | downWhiteTriangle 1169 | leftWhiteTriangle 1170 | upBlackSmallTriangle 1171 | rightBlackSmallTriangle 1172 | downBlackSmallTriangle 1173 | leftBlackSmallTriangle 1174 | upWhiteSmallTriangle 1175 | rightWhiteSmallTriangle 1176 | downWhiteSmallTriangle 1177 | leftWhiteSmallTriangle 1178 | 1179 | name 1180 | GF_Latin_Plus 1181 | 1182 | 1183 | list 1184 | 1185 | dotbelowcomb 1186 | Acircumflexdotbelow 1187 | Ecircumflexdotbelow 1188 | Edotbelow 1189 | Etilde 1190 | Idotbelow 1191 | Itilde 1192 | Ocircumflexdotbelow 1193 | Odotbelow 1194 | Udotbelow 1195 | Utilde 1196 | acircumflexdotbelow 1197 | adotbelow 1198 | ecircumflexdotbelow 1199 | edotbelow 1200 | etilde 1201 | idotbelow 1202 | itilde 1203 | ocircumflexdotbelow 1204 | odotbelow 1205 | udotbelow 1206 | utilde 1207 | Ytilde 1208 | ytilde 1209 | Abreveacute 1210 | Abrevedotbelow 1211 | Abrevegrave 1212 | Abrevehookabove 1213 | Abrevetilde 1214 | Acircumflexacute 1215 | Acircumflexgrave 1216 | Acircumflexhookabove 1217 | Acircumflextilde 1218 | Adotbelow 1219 | Ahookabove 1220 | Ecircumflexacute 1221 | Ecircumflexgrave 1222 | Ecircumflexhookabove 1223 | Ecircumflextilde 1224 | Ehookabove 1225 | Ihookabove 1226 | Ocircumflexacute 1227 | Ocircumflexgrave 1228 | Ocircumflexhookabove 1229 | Ocircumflextilde 1230 | Ohookabove 1231 | Ohorn 1232 | Ohornacute 1233 | Ohorndotbelow 1234 | Ohorngrave 1235 | Ohornhookabove 1236 | Ohorntilde 1237 | Uhookabove 1238 | Uhorn 1239 | Uhornacute 1240 | Uhorndotbelow 1241 | Uhorngrave 1242 | Uhornhookabove 1243 | Uhorntilde 1244 | Ydotbelow 1245 | Yhookabove 1246 | abreveacute 1247 | abrevedotbelow 1248 | abrevegrave 1249 | abrevehookabove 1250 | abrevetilde 1251 | acircumflexacute 1252 | acircumflexgrave 1253 | acircumflexhookabove 1254 | acircumflextilde 1255 | ahookabove 1256 | ecircumflexacute 1257 | ecircumflexgrave 1258 | ecircumflexhookabove 1259 | ecircumflextilde 1260 | ehookabove 1261 | ihookabove 1262 | ocircumflexacute 1263 | ocircumflexgrave 1264 | ocircumflexhookabove 1265 | ocircumflextilde 1266 | ohookabove 1267 | ohorn 1268 | ohornacute 1269 | ohorndotbelow 1270 | ohorngrave 1271 | ohornhookabove 1272 | ohorntilde 1273 | uhookabove 1274 | uhorn 1275 | uhornacute 1276 | uhorndotbelow 1277 | uhorngrave 1278 | uhornhookabove 1279 | uhorntilde 1280 | ydotbelow 1281 | yhookabove 1282 | brevecomb_acutecomb 1283 | brevecomb_gravecomb 1284 | brevecomb_hookabovecomb 1285 | brevecomb_tildecomb 1286 | circumflexcomb_acutecomb 1287 | circumflexcomb_gravecomb 1288 | circumflexcomb_hookabovecomb 1289 | circumflexcomb_tildecomb 1290 | hookabovecomb 1291 | horncomb 1292 | 1293 | name 1294 | GF_Latin_Vietnamese 1295 | 1296 | 1297 | 1298 | --------------------------------------------------------------------------------