Full Code of hakatashi/unicode-map for AI

master d474139e5b02 cached
46 files
138.0 KB
54.1k tokens
1 requests
Download .txt
Repository: hakatashi/unicode-map
Branch: master
Commit: d474139e5b02
Files: 46
Total size: 138.0 KB

Directory structure:
gitextract_77ap7ofj/

├── .gitattributes
├── .gitignore
├── .travis.yml
├── README.md
├── configs/
│   ├── bmp-1.ls
│   ├── bmp-2.ls
│   ├── bmp-3.ls
│   └── index.ls
├── data/
│   ├── codepoints/
│   │   ├── 0000.yml
│   │   ├── 0800.yml
│   │   ├── 0A00.yml
│   │   ├── 0C00.yml
│   │   ├── 0E00.yml
│   │   ├── 1000.yml
│   │   ├── 1800.yml
│   │   ├── 1A00.yml
│   │   ├── 1C00.yml
│   │   ├── 1E00.yml
│   │   ├── 2000.yml
│   │   ├── 2200.yml
│   │   ├── 2C00.yml
│   │   ├── 2E00.yml
│   │   ├── 3000.yml
│   │   ├── 3200.yml
│   │   ├── 3400.yml
│   │   ├── A000.yml
│   │   ├── A500.yml
│   │   ├── A800.yml
│   │   ├── AA00.yml
│   │   └── AC00.yml
│   └── layouts/
│       ├── bmp-1.ai
│       ├── bmp-2.ai
│       └── bmp-3.ai
├── index.ls
├── lib/
│   ├── codepoint-builder.ls
│   ├── compose-poster.ls
│   ├── convert-to-pdf.ls
│   ├── convert-to-png.ls
│   ├── download-fonts.ls
│   ├── generate-svg.ls
│   ├── load-codepoints.ls
│   └── util.ls
├── package.json
└── test/
    ├── codepoint-builder.ls
    ├── expect.ls
    └── index.ls

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto

# Custom for Visual Studio
*.cs     diff=csharp

# Standard to msysgit
*.doc	 diff=astextplain
*.DOC	 diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot  diff=astextplain
*.DOT  diff=astextplain
*.pdf  diff=astextplain
*.PDF	 diff=astextplain
*.rtf	 diff=astextplain
*.RTF	 diff=astextplain

data/layouts/*.ai filter=lfs diff=lfs merge=lfs -text
data/layouts/*.svg filter=lfs diff=lfs merge=lfs -text

package-lock.json binary


================================================
FILE: .gitignore
================================================
# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directory
# Commenting this out is preferred by some people, see
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
node_modules

# Users Environment Variables
.lock-wscript

*.svg
*.png
*.jpg
*.txt
*.pdf

fonts
!data/glyphs/*.svg
!data/layouts/*.svg

# =========================
# Operating System Files
# =========================

# OSX
# =========================

.DS_Store
.AppleDouble
.LSOverride

# Thumbnails
._*

# Files that might appear on external disk
.Spotlight-V100
.Trashes

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# Windows
# =========================

# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk


================================================
FILE: .travis.yml
================================================
language: node_js

# Sudo-enabled machines have much more memory
sudo: required

node_js:
  - node

before_install:
  # Prerequisite of Nightmare.js
  # https://github.com/electron/electron/blob/master/docs/tutorial/testing-on-headless-ci.md
  - export DISPLAY=':99.0'
  - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
  # Install git-lfs
  - mkdir -p $HOME/bin
  - wget https://github.com/github/git-lfs/releases/download/v1.4.3/git-lfs-linux-amd64-1.4.3.tar.gz
  - tar xvfz git-lfs-linux-amd64-1.4.3.tar.gz
  - mv git-lfs-1.4.3/git-lfs $HOME/bin/git-lfs
  - export PATH=$PATH:$HOME/bin/

before_script: git lfs pull

script:
  - npm test
  - DEBUG=true npm run build

cache:
  directories:
    - fonts

branches:
  except:
    - /^v\d+\.\d+\.\d+$/

deploy:
  provider: releases
  api_key:
    secure: Irn5gzraLVLX2JwCIJtWcjO7mj9rj+u6EbczQYtfpif/Q7mS1L3En1IcTBwakqa1RYmIRzH/91HWMCDRIH6JMPjxdzcKsa+1BFtJys5/yzpMKT2JQIvBtydyqvCZ/vzIe1ehdvsqVEtaCGYipcEZjaS7dDNKjOAN1p1r2czxvt/5pPg2suLfse7lMEuimXDYDJUt4TbaNT1i1p6ygGZxTlBaoQ4AIWh4PqzoTAGmSJcr/pQoWycgDW60T4xujTajouWFEeW3xPOH5mLfAuwDL6egndqGMiBsFfVIJbICCjiz1Zn2p0/dcDKWT3M8qSf0QNoYk0aUzkL70Bn4roLFaqs3S0x5BRfu5o5eFbW9E6GafBjekB6uBRon68zutkCtTY+5nnrD64RtIhKbbTBY+9woO2U4AZCvv453hTd4HBpHFAlXE4J4SjprUW4cEP/6vqObD372/TwopdW/anCL7Ygj3Dd3I6HChBVsn1SPrFgCnOIiYnrNHKlyr941XSr0UUSQBsOzjGUFqjTysVAsdji6h5eQ0TD4V/wrJ1qtc+s77kDJIBP/fLNsHbfpxCzBmjkR/jR91TsJiSOev4WbkYouuQdU+nptBorpMwOuq2MFlIKbpxlix5bgnVJ1VmcRzYSiB+/WGfuxmdmcTYl48VsBxT5GolO+MV1j3grFDao=
  file:
    - bmp-1-poster.svg
    - bmp-1-poster.png
    - bmp-1-poster.pdf
    - bmp-2-poster.svg
    - bmp-2-poster.png
    - bmp-2-poster.pdf
    - bmp-3-poster.svg
    - bmp-3-poster.png
    - bmp-3-poster.pdf
  skip_cleanup: true
  on:
    tags: true

notifications:
  webhooks: http://webhook.hakatashi.com/travis


================================================
FILE: README.md
================================================
# The Unicode Map Project [![Build Status][travis-image]][travis-url] [![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]

A bunch of Unicode characters in a poster, on a [Hilbert curve](https://en.wikipedia.org/wiki/Hilbert_curve).


[travis-image]: https://travis-ci.org/hakatashi/unicode-map.svg?branch=master
[travis-url]: https://travis-ci.org/hakatashi/unicode-map
[greenkeeper-image]: https://badges.greenkeeper.io/hakatashi/unicode-map.svg
[greenkeeper-url]: https://greenkeeper.io/

![](https://i.imgur.com/cEVN9VR.jpg)

## 🆕 New in Ver3.0.0

* Full [Unicode 10.0.0](http://unicode.org/versions/Unicode10.0.0/) support
* Pipeline table characters as of [UTC #152](http://www.unicode.org/L2/L2017/17222.htm) full support
* 66 new glyphs added
* Fonts were updated. Especially in Kanji, we now uses [Noto Serif CJK](https://www.google.com/get/noto/help/cjk/).

## ❓ About

**The Unicode Map Project** (Japanese: Unicode巨大地図) is an experimental project to illustrate [Unicode](http://unicode.org/standard/WhatIsUnicode.html) characters (and non-characters) in a large poster, and sell them at some [dōjinshi](https://en.wikipedia.org/wiki/D%C5%8Djinshi) fair event such as [Comiket](https://en.wikipedia.org/wiki/Comiket) in Japan. The version 1.0.0 was [sold at Comiket 91](https://webcatalog-free.circle.ms/Circle/13007447), held on Dec 29, 2016. Its composition of Unicode characters is very featured by its arrangement, which introduces a [Hilbert curve](https://en.wikipedia.org/wiki/Hilbert_curve) to visually span [the blocks of Unicode](https://en.wikipedia.org/wiki/Unicode_block).

The poster is developed with open source and the poster data [can be downloaded](#download) for free. And also any contribution is welcomed!

## ⏬ Download

### BMP-1 (U+0000 - U+3FFF) ver3.0.0

* [SVG (35.4 MB)](https://github.com/hakatashi/unicode-map/releases/download/201710261128/bmp-1-poster.svg)
* [PNG (16.6 MB)](https://github.com/hakatashi/unicode-map/releases/download/201710261128/bmp-1-poster.png)
* [PDF (13.4 MB)](https://github.com/hakatashi/unicode-map/releases/download/201710261128/bmp-1-poster.pdf)

### BMP-2 (U+4000 - U+7FFF) ver3.0.0

* [SVG (35.1 MB)](https://github.com/hakatashi/unicode-map/releases/download/201710261128/bmp-2-poster.svg)
* [PNG (23.1 MB)](https://github.com/hakatashi/unicode-map/releases/download/201710261128/bmp-2-poster.png)
* [PDF (14.9 MB)](https://github.com/hakatashi/unicode-map/releases/download/201710261128/bmp-2-poster.pdf)

### Development version

Development version of the builds are available in the [Release page](https://github.com/hakatashi/unicode-map/releases).

## 💪 Build

Install [Node.js 8+](https://nodejs.org/) and run:

    npm install
    npm run build

**WARN: This command will download almost 1GB of the font data from the internet, and cache them into `fonts` subdirectory.**

## 🔰 License

The overall repository is licensed under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.txt) by hakatashi.

The files not in the `data/glyphs` subdirectory are also licensed under [MIT License](https://opensource.org/licenses/MIT) by hakatashi.

## 🛣️ Roadmap

* Full support of BMP
* More permissive license

## 🙏 Materials

* ArmenianEternity.svg
	* link: https://commons.wikimedia.org/wiki/File:ArmenianEternity.svg
	* author: AnonMoos
	* license: Public Domain
	* for: u058d.svg
* SYRIAC-LETTER-MALAYALAM-NGA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-NGA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0860.svg
* SYRIAC-LETTER-MALAYALAM-JA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-JA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0861.svg
* SYRIAC-LETTER-MALAYALAM-NYA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-NYA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0862.svg
* SYRIAC-LETTER-MALAYALAM-TTA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-TTA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0863.svg
* SYRIAC-LETTER-MALAYALAM-NNA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-NNA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0864.svg
* SYRIAC-LETTER-MALAYALAM-NNNA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-NNNA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0865.svg
* SYRIAC-LETTER-MALAYALAM-BHA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-BHA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0866.svg
* SYRIAC-LETTER-MALAYALAM-RA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-RA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0867.svg
* SYRIAC-LETTER-MALAYALAM-LLA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-LLA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0868.svg
* SYRIAC-LETTER-MALAYALAM-LLLA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-LLLA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u0869.svg
* SYRIAC-LETTER-MALAYALAM-SSA.png
	* link: https://en.wikipedia.org/wiki/File:SYRIAC-LETTER-MALAYALAM-SSA.png
	* author: Raamesh
	* license: CC BY-SA 4.0
	* for: u086A.svg
* Астрологічні цифри сингальського письма. Sinhalese astrological numerals (Sinhala Lith Illakkam).png
	* link: https://commons.wikimedia.org/wiki/File:%D0%90%D1%81%D1%82%D1%80%D0%BE%D0%BB%D0%BE%D0%B3%D1%96%D1%87%D0%BD%D1%96_%D1%86%D0%B8%D1%84%D1%80%D0%B8_%D1%81%D0%B8%D0%BD%D0%B3%D0%B0%D0%BB%D1%8C%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B8%D1%81%D1%8C%D0%BC%D0%B0._Sinhalese_astrological_numerals_(Sinhala_Lith_Illakkam).png
	* author: 00 وديع
	* license: CC0 1.0
	* for: u0de6.svg .. u0def.svg
* Open Sans
	* link: http://www.opensans.com/
	* author: Steve Matteson and Google Corporation
	* license: Apache License v2
	* for: Control characters
* Linux Libertine
	* link: http://www.linuxlibertine.org/
	* author: Libertine Open Fonts Project and Philipp H. Poll
	* license: SIL OFL 1.1
	* for: Poster Design
* Cinzel
	* link: http://ndiscovered.com/cinzel/
	* author: Natanael Gama
	* license: SIL OFL 1.1
	* for: Poster Design


================================================
FILE: configs/bmp-1.ls
================================================
module.exports =
  name: 'bmp-1'
  layout: 'bmp-1'
  chart:
    x: 28.35
    y: 728.5
  codepoint: 0x0000


================================================
FILE: configs/bmp-2.ls
================================================
module.exports =
  name: 'bmp-2'
  layout: 'bmp-2'
  chart:
    x: 28.35
    y: 728.5
  codepoint: 0x4000


================================================
FILE: configs/bmp-3.ls
================================================
module.exports =
  name: 'bmp-3'
  layout: 'bmp-3'
  chart:
    x: 28.35
    y: 28.35
  codepoint: 0x8000


================================================
FILE: configs/index.ls
================================================
module.exports =
  * require './bmp-1'
  * require './bmp-2'
  * require './bmp-3'


================================================
FILE: data/codepoints/0000.yml
================================================
# Basic Latin
0000..001F:
  control:
    - NUL
    - SOH
    - STX
    - ETX
    - EOT
    - ENQ
    - ACK
    - BEL

    - BS
    - TAB
    - LF
    - VT
    - FF
    - CR
    - SO
    - SI

    - DLE
    - DC1
    - DC2
    - DC3
    - DC4
    - NAK
    - SYN
    - ETB

    - CAN
    - EM
    - SUB
    - ESC
    - FS
    - GS
    - RS
    - US

'0020':
  control: SP

0021..007E:
  font: doulos
  transform: scale(0.8)

007F:
  control: DEL

# Latin-1 Supplement
0080..00A0:
  control:
    - PAD # Only appears in early drafts of ISO 10646. Unicode charts shows XXX for this character.
    - HOP # Only appears in early drafts of ISO 10646. Unicode charts shows XXX for this character.
    - BPH
    - NBH
    - IND
    - NEL
    - SSA
    - ESA

    - HTS
    - HTJ
    - VTS
    - PLD
    - PLU
    - RI
    - SS2
    - SS3

    - DCS
    - PU1
    - PU2
    - STS
    - CCH
    - MW
    - SPA
    - EPA

    - SOS
    - SGC # Only appears in early drafts of ISO 10646. Unicode charts shows XXX for this character.
    - SCI
    - CSI
    - ST
    - OSC
    - PM
    - APC

    - NB\nSP

# C1 Controls and Latin-1 Supplement

00A1..00FF:
  font: doulos
  transform: scale(0.8)

  00AD:
    control: SHY\n-

# Latin Extended-A

0100..017F:
  font: doulos
  transform: scale(0.8)

  0149:
    svg: true
    transform: scale(0.8)

# Latin Extended-B

0180..024F:
  font: doulos
  transform: scale(0.8)

  022A..0231:
    font: doulos
    transform: translate(0, 0.05) scale(0.8)

# IPA Extensions

0250..02AF:
  font: doulos
  transform: scale(0.8)

# Spacing Modifier Letters

02B0..02FF:
  font: doulos
  transform: scale(0.8)

# Combining Diacritical Marks

0300..036F:
  font: doulos
  combining: true
  transform: translate(0, -0.06) scale(0.7) translate(0.25, 0)

  0321..0322:
    font: symbola
    combining: true
    transform: translate(0, -0.06) scale(0.7) translate(0.25, 0)

  0340..0345:
    font: symbola
    combining: true
    transform: translate(0, -0.06) scale(0.7) translate(0.25, 0)

  034F:
    control: CGJ

  035C:
    font: doulos
    combining: true
    transform: translate(0, -0.16) scale(0.7) translate(0.25, 0)

  035D..035E:
    font: doulos
    combining: true
    transform: translate(0, 0.04) scale(0.7) translate(0.25, 0)

  035F:
    font: doulos
    combining: true
    transform: translate(0, -0.16) scale(0.7) translate(0.25, 0)

  0360..0361:
    font: doulos
    combining: true
    transform: translate(0, 0.04) scale(0.7) translate(0.25, 0)

  '0362':
    font: doulos
    combining: true
    transform: translate(0, -0.2) scale(0.7) translate(0.25, 0)

# Greek and Coptic

0370..03FF:
  font: symbola
  transform: scale(0.8)

  0378..0379: notdef
  0380..0383: notdef
  038B: notdef
  038D: notdef
  03A2: notdef

# Cyrillic

0400..04FF:
  font: symbola
  transform: scale(0.8)

  0483..0487:
    font: symbola
    transform: scale(0.8) translate(0.25, 0)
    combining: true

  0488..0489:
    font: symbola
    transform: translate(0, -0.08) scale(0.8) translate(0.5, 0)
    combining: true

# Cyrillic Supplement

0500..052F:
  font: symbola
  transform: scale(0.8)

  052A:
    font: symbola
    transform: scale(0.75)

# Armenian

0530..058F:
  font: freeSerif
  transform: scale(0.8)

  '0530': notdef
  0557..0558: notdef
  '0560': notdef
  0588: notdef

  058B: # Early mapping
    early: true
    font: free-serif
    codepoint: 0x0561
    transform: translate(0, 0.15) scale(0.9) rotate(180)

  058C: # Early mapping
    early: true
    svg: true
    transform: scale(0.9)

  058D..058E:
    svg: true

# Hebrew

0590..05FF:
  font: freeSerif
  transform: scale(0.8)

  0591..05C7:
    font: notoHebrew
    transform: scale(0.7)
    combining: true

    05C6:
      font: freeSerif
      transform: scale(0.8)

    05BE:
      font: freeSerif
      transform: scale(0.8)

    05C0:
      font: freeSerif
      transform: scale(0.8)

    05C3:
      font: freeSerif
      transform: scale(0.8)

  0590: notdef
  05C8..05CF: notdef
  05EB..05EE: notdef

  05EF:
    early: true
    svg: true
    transform: scale(0.8)

  05F5..05FF: notdef

# Arabic

0600..06FF:
  font: freeSerif
  transform: scale(0.8)

  0600..0603:
    font: freeSerif
    transform: scale(0.8)
    box: true

  '0604':
    font: notoArabic
    transform: translate(0, 0.1) scale(0.4)
    box: true

  '0605':
    svg: true
    transform: scale(0.9)
    box: true

  0610..061A:
    font: freeSerif
    transform: scale(0.7) translate(-0.15, 0)
    combining: true

  061C:
    control: ALM

  061D: notdef

  064B..065F:
    font: freeSerif
    transform: scale(0.7) translate(-0.15, 0)
    combining: true

  0670:
    font: freeSerif
    transform: scale(0.7) translate(-0.15, 0)
    combining: true

  06D6..06ED:
    font: freeSerif
    transform: scale(0.7) translate(-0.15, 0)
    combining: true

    06DD:
      font: freeSerif
      transform: scale(0.7)
      box: true

    06DE:
      font: freeSerif
      transform: scale(0.8)

    06E5..06E6:
      font: freeSerif
      transform: scale(0.8)

    06E9:
      font: freeSerif
      transform: scale(0.8)

# Syriac

0700..074F:
  font: notoSyriac
  transform: scale(0.8)

  070E: notdef

  070F:
    control: SAM # Should be modified

  0730..074A:
    font: notoSyriac
    combining: true
    transform: scale(0.9) translate(0, -0.05)

  074B..074C: notdef

# Arabic Supplement

0750..077F:
  font: freeSerif
  transform: scale(0.8) translate(0, -0.05)

# Thaana

0780..07BF:
  font: freeSerif
  transform: scale(0.9)

  07A6..07B0:
    font: freeSerif
    combining: true
    transform: scale(0.8) translate(-0.35, -0.1)

  07B2..07BF: notdef

# NKo

07C0..07FF:
  font: notoNko
  transform: scale(0.8)

  07EB..07F1:
    font: notoNko
    combining: true
    transform: scale(0.7) translate(-0.25, 0.1)

  07F2:
    font: notoNko
    combining: true
    transform: scale(0.7) translate(-0.25, -0.08)

  07F3:
    font: notoNko
    combining: true
    transform: scale(0.7) translate(-0.25, 0.1)

  07FB..07FC: notdef

  07FD: # early mapping
    early: true
    svg: true
    combining: true
    transform: scale(0.7) translate(0, 0.1)

  07FE..07FF: # early mapping
    early: true
    svg: true
    transform: scale(0.8)


================================================
FILE: data/codepoints/0800.yml
================================================
# Samaritan

0800..083F:
  font: notoSamaritan
  transform: scale(0.8)

  0816..0819:
    font: notoSamaritan
    combining: true
    transform: scale(0.7) translate(-0.1, 0.15)

  081B..0823:
    font: notoSamaritan
    combining: true
    transform: scale(0.7) translate(-0.1, 0.15)

  0825..0827:
    font: notoSamaritan
    combining: true
    transform: scale(0.7) translate(-0.1, 0.15)

  0829..082D:
    font: notoSamaritan
    combining: true
    transform: scale(0.7) translate(-0.1, 0.15)

  082E..082F: notdef
  083F: notdef

# Mandaic

0840..085F:
  font: notoMandaic
  transform: scale(0.8)

  0859..085B:
    font: notoMandaic
    combining: true
    transform: scale(0.7) translate(0, -0.1)

  085C..085D: notdef
  085F: notdef

# Syriac Extensions

0860..087F:
  svg: true
  transform: scale(0.8)

  0863:
    svg: true

  0866:
    svg: true
    transform: scale(0.9)

  0867:
    svg: true

  086B..087F: notdef

# empty

0870..08FF: notdef

# Arabic Extended-A

08A0..08FF:
  font: scheherazade
  transform: translate(0, -0.2)

  08B5: notdef

  08B8:
    svg: true

  08BE..08D2: notdef

  # Arabic text used:
  # 08D4: الرب
  # 08D8: نِ
  # 08DA: الثالثة
  # 08DB: السجدة
  # 08DC: النصف
  # 08DD: سكتة
  # 08DE: قف
  # 08DF: وقفة

  08D3: # Early mapping
    early: true
    font: scheherazade
    codepoint: 0x06E5
    combining: true
    transform: translate(0, 0.05)

  08D4:
    svg: true
    combining: true

  08D5:
    font: scheherazade-Bold
    codepoint: 0x0635
    combining: true
    transform: scale(0.45) translate(0, -0.9)

  08D6:
    font: scheherazade-Bold
    codepoint: 0x0639
    combining: true
    transform: scale(0.45) translate(0, -1.0)

  08D7:
    font: scheherazade-Bold
    codepoint: 0x0642
    combining: true
    transform: scale(0.45) translate(0, -0.9)

  08D8..08DF:
    svg: true
    combining: true

  08E0:
    font: scheherazade-Bold
    codepoint: 0x0602
    combining: true
    transform: scale(0.6) translate(0, -0.7)

  08E1:
    font: scheherazade-Bold
    codepoint: 0x0603
    combining: true
    transform: scale(0.6) translate(0, -0.7)

  08E2:
    svg: true
    box: true
    transform: scale(0.8)

  08E3:
    font: scheherazade
    combining: true
    transform: translate(0, -0.4)

  08E4..08E5:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.05)

  08E6:
    font: scheherazade
    combining: true
    transform: translate(-0.1, -0.4)

  08E7..08E8:
    font: scheherazade
    combining: true
    transform: translate(-0.05, 0)

  08E9:
    font: scheherazade
    combining: true
    transform: translate(-0.1, -0.4)

  08EA..08EC:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.05)

  08ED..08EF:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.4)

  08F0..08F1:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.05)

  08F2:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.4)

  08F3..08F5:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.05)

  08F6:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.4)

  08F7..08F8:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.05)

  08F9..08FA:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.4)

  08FB..08FF:
    font: scheherazade
    combining: true
    transform: translate(-0.05, -0.05)

# Devanagari

0900..097F:
  font: annapurna
  transform: scale(0.8)

  0900..0901:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, 0.1)

  0902:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.1, 0.1)

  0903:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.35, 0)

  093A:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, 0.1)

  093B:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  093C:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  093E:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  093F:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(-0.3, 0.1)

  0940:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  0941..0944:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  0945..0948:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, 0.1)

  0949..094C:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  094D:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  094E:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(-0.3, 0.1)

  094F:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  0951:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.15, 0.1)

  0952:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.25, -0.1)

  0953..0955:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, 0.1)

  0956..0957:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  0962..0963:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

# Bengali

0980..09FF:
  font: notoBengali
  transform: scale(0.8)

  0981:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.1, 0.1)

  0982..0983:
    font: notoBengali
    combining: true
    transform: scale(0.7) translate(0.4, 0)

  0984: notdef
  098D..098E: notdef
  0991..0992: notdef
  09A9: notdef
  09B1: notdef
  09B3..09B5: notdef
  09BA..09BB: notdef

  09BC:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  09BE:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  09BF:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(-0.3, 0)

  09C0:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.4, 0)

  09C1..09C4:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.1, -0.1)

  09C5..09C6: notdef

  09C7..09C8:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(-0.3, 0)

  09C9..09CA: notdef

  09CB..09CC:
    font: notoBengali
    combining: true
    transform: scale(0.8)

  09CD:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.1, -0.1)

  09CF..09D6: notdef

  09D7:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  09D8..09DB: notdef
  09DE: notdef

  09E2..09E3:
    font: notoBengali
    combining: true
    transform: scale(0.8) translate(0.1, -0.1)

  09E4..09E5: notdef

  09FC..09FD:
    svg: true
    transform: scale(0.8)

  09FE:
    early: true
    combining: true
    font: noto-bengali
    codepoint: 0x09BD
    transform: translate(0, -0.3) scale(0.5)

  09FF: notdef


================================================
FILE: data/codepoints/0A00.yml
================================================
# Gurmukhi

0A00..0A7F:
  font: free-serif
  transform: scale(0.8)

  0A00: notdef

  0A01:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0, 0.1)

  0A02:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.05, 0.1)

  0A03:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, -0.1)

  0A04: notdef
  0A0B..0A0E: notdef
  0A11..0A12: notdef
  0A29: notdef
  0A31: notdef
  0A34: notdef
  0A37: notdef
  0A3A..0A3B: notdef

  0A3C:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0A3D: notdef

  0A3E:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.4, 0)

  0A3F:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(-0.3, 0)

  0A40:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.4, 0)

  0A41..0A42:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, -0.1)

  0A43..0A46: notdef

  0A47..0A48:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.1, 0.05)

  0A49..0A4A: notdef

  0A4B..0A4C:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.1, 0.05)

  0A4D:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  0A4E..0A50: notdef

  0A51:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  0A52..0A58: notdef
  0A5D: notdef
  0A5F..0A65: notdef

  0A70..0A71:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.15, 0.05)

  0A74:
    font: free-serif
    transform: scale(0.8) translate(-0.15, 0)

  0A75:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.15, -0.1)

  0A76: # early mapping
    early: true
    svg: true
    transform: scale(0.8)

  0A77..0A7F: notdef

# Gujarati

0A80..0AFF:
  font: noto-gujarati
  transform: scale(0.8)

  0A80: notdef

  0A81..0A82:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.1, 0.1)

  0A83:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0A84: notdef
  0A8E: notdef
  0A92: notdef
  0AA9: notdef
  0AB1: notdef
  0AB4: notdef
  0ABA..0ABB: notdef

  0ABC:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.25, -0.1)

  0ABE:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0ABF:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(-0.3, 0)

  0AC0:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0AC1:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.1, -0.1)

  0AC2..0AC4:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  0AC5:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.1, 0.1)

  0AC6: notdef

  0AC7..0AC8:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.1, 0.1)

  0AC9:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0ACA: notdef

  0ACB..0ACC:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0ACD:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  0ACE..0ACF: notdef
  0AD1..0ADF: notdef

  0AE2..0AE3:
    font: noto-gujarati
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  0AE4..0AE5: notdef
  0AF2..0AF8: notdef

  0AF9:
    svg: true

  0AFA..0AFF:
    svg: true
    combining: true

# Oriya

0B00..0B7F:
  font: free-serif
  transform: scale(0.8)

  0B00: notdef

  0B01:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.15, 0.05)

  0B02:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0B03:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, 0)

  0B04: notdef
  0B0D..0B0E: notdef
  0B11..0B12: notdef
  0B29: notdef
  0B31: notdef
  0B34: notdef
  0B3A..0B3B: notdef

  0B3C:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.2, -0.15)

  0B3E:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, 0)

  0B3F:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, 0.1)

  0B40:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, 0)

  0B41..0B44:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.15, -0.15)

  0B45..0B46: notdef

  0B47:
    font: free-serif
    combining: true
    transform: scale(0.65) translate(-0.5, 0)

  0B48:
    font: free-serif
    combining: true
    transform: scale(0.65) translate(-0.2, 0)

  0B49..0B4A: notdef

  0B4B..0B4C:
    font: free-serif
    combining: true
    transform: scale(0.65) translate(-0.1, 0)

  0B4D:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  0B4E..0B55: notdef

  0B56..0B57:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, 0)

  0B58..0B5B: notdef
  0B5E: notdef

  0B62..0B63:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  0B64..0B65: notdef

  0B71:
    font: free-serif
    transform: scale(0.8) translate(0, -0.1)

  0B78..0B7F: notdef

# Tamil

0B80..0BFF:
  font: noto-tamil
  transform: scale(0.6)

  0B80..0B81: notdef

  0B82:
    font: noto-tamil
    combining: true
    transform: scale(0.6)

  0B84: notdef
  0B8B..0B8D: notdef
  0B91: notdef

  0B94:
    font: noto-tamil
    transform: scale(0.45, 0.6)

  0B96..0B98: notdef
  0B9B: notdef
  0B9D: notdef
  0BA0..0BA2: notdef
  0BA5..0BA7: notdef
  0BAB..0BAD: notdef
  0BBA..0BBB: notdef

  0BBC: # early mapping
    early: true
    svg: true
    combining: true

  0BBD: notdef

  0BBE:
    font: noto-tamil
    combining: true
    transform: scale(0.5) translate(0.6, 0)

  0BBF:
    font: noto-tamil
    combining: true
    transform: scale(0.6) translate(0.4, 0)

  0BC0:
    font: noto-tamil
    combining: true
    transform: scale(0.6) translate(0.4, 0)

  # TODO: Should this (and next) mark have spacing form for chart?
  # Ref: Unicode 9.0.0 p.486
  0BC1:
    font: noto-tamil
    combining: true
    transform: scale(0.6) translate(0.6, 0)
  0BC2:
    font: noto-tamil
    combining: true
    transform: scale(0.4, 0.6) translate(0.8, 0)

  0BC3..0BC5: notdef

  0BC6:
    font: noto-tamil
    combining: true
    transform: scale(0.4, 0.6) translate(-0.75, 0)

  0BC7:
    font: noto-tamil
    combining: true
    transform: scale(0.5, 0.6) translate(-0.65, 0)

  0BC8:
    font: noto-tamil
    combining: true
    transform: scale(0.3, 0.6) translate(-1.1, -0.1)

  0BC9: notdef

  0BCA..0BCC:
    svg: true
    combining: true

  0BCD:
    font: noto-tamil
    combining: true
    transform: scale(0.6)

  0BCE..0BCF: notdef
  0BD1..0BD6: notdef

  0BD7:
    font: noto-tamil
    combining: true
    transform: scale(0.25, 0.6) translate(1.3, 0)

  0BD8..0BE5: notdef

  0BF5:
    font: noto-tamil
    transform: scale(0.45, 0.6)

  0BF8:
    font: noto-tamil
    transform: scale(0.5, 0.6)

  0BFB..0BFF: notdef


================================================
FILE: data/codepoints/0C00.yml
================================================
# Telugu

0C00..0C7F:
  font: noto-telugu
  transform: scale(0.8)

  0C00:
    svg: true
    combining: true

  0C01:
    font: noto-telugu
    combining: true
    transform: scale(0.7) translate(0.4, -0.15)

  0C02:
    font: noto-telugu
    combining: true
    transform: scale(0.7) translate(0.5, -0.15)

  0C03:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0C04:
    early: true
    svg: true
    combining: true

  0C0D: notdef
  0C11: notdef
  0C29: notdef

  0C34:
    svg: true
    transform: scale(0.8)

  0C3A..0C3C: notdef

  0C3E..0C40:
    font: noto-telugu
    combining: true
    transform: scale(0.7) translate(0.3, -0.15)

  0C41:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  0C42:
    font: noto-telugu
    combining: true
    transform: scale(0.5, 0.8) translate(0.7, -0.1)

  0C43..0C44:
    font: noto-telugu
    combining: true
    transform: scale(0.7, 0.8) translate(0.4, -0.1)

  0C45: notdef

  0C46..0C48:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  0C49: notdef

  0C4A..0C4D:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  0C4E..0C54: notdef

  0C55:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.1, -0.1)

  0C56:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0C57: notdef

  0C5A:
    svg: true
    transform: scale(0.8)

  0C5B..0C5F: notdef

  0C60:
    font: noto-telugu
    transform: scale(0.6, 0.8)

  0C62..0C63:
    font: noto-telugu
    combining: true
    transform: scale(0.8) translate(0.3, -0.2)

  0C64..0C65: notdef
  0C70..0C76: notdef

  0C77:
    early: true
    svg: true

# Kannada

0C80..0CFF:
  font: noto-kannada
  transform: scale(0.75)

  0C80:
    svg: true
    transform: scale(0.75)

  0C81:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.1, 0.1)

  0C82:
    font: noto-kannada
    combining: true
    transform: scale(0.65, 0.75) translate(0.5, -0.05)

  0C83:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.4, -0.05)

  0C84:
    early: true
    svg: true
    transform: scale(0.9)

  0C8D: notdef
  0C91: notdef
  0CA9: notdef
  0CB4: notdef
  0CBA..0CBB: notdef

  0CBC:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0, -0.1)

  0CBE:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.5, -0.1)

  0CBF:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.2, 0)

  0CC0..0CC1:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.4, 0)

  0CC2:
    font: noto-kannada
    combining: true
    transform: scale(0.6, 0.75) translate(0.5, 0)

  0CC3:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.3, -0.2)

  0CC4:
    font: noto-kannada
    combining: true
    transform: scale(0.6, 0.75) translate(0.5, -0.2)

  0CC5: notdef

  0CC6:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.2, -0.1)

  0CC7:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.4, -0.1)

  0CC8:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.3, -0.1)

  0CC9: notdef

  0CCA:
    font: noto-kannada
    combining: true
    transform: scale(0.5, 0.75) translate(0.7, -0.1)

  0CCB:
    font: noto-kannada
    combining: true
    transform: scale(0.3, 0.75) translate(1, -0.1)

  0CCC:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.4, -0.1)

  0CCD:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.4, -0.1)

  0CCE..0CD4: notdef

  0CD5:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.4, 0)

  0CD6:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.5, -0.4)

  0CD7..0CDD: notdef
  0CDF: notdef

  0CE0:
    font: noto-kannada
    transform: scale(0.65, 0.75)

  0CE2..0CE3:
    font: noto-kannada
    combining: true
    transform: scale(0.75) translate(0.15, -0.2)

  0CE4..0CE5: notdef
  0CF0: notdef

  0CF1..0CF2:
    font: noto-kannada
    transform: scale(0.75)
    box: true

  0CF3..0CFF: notdef

# Malayalam

0D00..0D7F:
  font: free-serif
  transform: scale(0.8) translate(0, -0.1)

  0D00:
    svg: true
    combining: true

  0D01:
    font: noto-malayalam
    combining: true
    transform: scale(0.8)

  0D02:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, -0.2)

  0D03:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0D04: notdef

  0D08:
    font: free-serif
    transform: scale(0.8) scale(0.9, 1) translate(0, -0.1)

  0D0D: notdef

  0D10:
    font: free-serif
    transform: scale(0.8) scale(0.85, 1) translate(-0.05, -0.1)

  0D11: notdef

  0D3B..0D3C:
    svg: true
    combining: true

  0D3E:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  0D3F..0D44:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0D45: notdef

  0D46..0D47:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(-0.45, -0.1)

  0D48:
    font: free-serif
    combining: true
    transform: scale(0.3, 0.8) translate(-1.1, -0.1)

  0D49: notdef

  0D4A..0D4C:
    svg: true
    combining: true

  0D4D:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.2, 0)

  0D4E:
    font: free-serif
    box: true
    transform: scale(0.8) translate(0, -0.2)

  0D50..0D53: notdef

  0D54: # TODO: find more neat serif font
    font: manjari
    transform: scale(0.7) scale(-1, 1)

  0D55..0D56:
    font: manjari
    transform: scale(0.7)

  0D57:
    font: free-serif
    combining: true
    transform: scale(0.5, 0.8) translate(0.6, -0.1)

  0D58..0D5C:
    font: manjari
    transform: scale(0.7)

  0D5D:
    font: manjari
    transform: scale(0.45, 0.7)

  0D5E..0D5F:
    font: manjari
    transform: scale(0.7)

  0D62..0D63:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0D64..0D65: notdef

  0D76:
    font: manjari
    transform: scale(0.7)

  0D77:
    font: manjari
    transform: scale(0.6, 0.7)

  0D78:
    font: manjari
    transform: scale(0.5, 0.7)

# Sinhala

0D80..0DFF:
  font: free-serif
  transform: scale(0.8) translate(0, -0.1)

  0D80..0D81: notdef

  0D82:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0D83:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.05)

  0D84: notdef

  0D90:
    font: free-serif
    transform: scale(0.7, 0.8) translate(0, -0.1)

  0D97..0D99: notdef
  0DB2: notdef
  0DBC: notdef
  0DBE..0DBF: notdef
  0DC7..0DC9: notdef

  0DCA:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0DCB..0DCE: notdef

  0DCF..0DD1:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, -0.05)

  0DD2..0DD3:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.05)

  0DD4:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0DD5: notdef

  0DD6:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0DD7: notdef

  0DD8:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.35, -0.1)

  0DD9:
    font: free-serif
    combining: true
    transform: scale(0.5, 0.8) translate(-0.65, -0.1)

  0DDA:
    svg: true
    combining: true

  0DDB:
    font: free-serif
    combining: true
    transform: scale(0.25, 0.8) translate(-1.25, -0.1)

  0DDC..0DDE:
    svg: true
    combining: true

  0DDF:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  0DE0..0DE5: notdef

  0DE6..0DEF:
    svg: true
    transform: scale(0.8)

  0DF0..0DF1: notdef

  0DF2:
    font: free-serif
    combining: true
    transform: scale(0.5, 0.8) translate(0.65, -0.1)

  0DF3:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  0DF5..0DFF: notdef


================================================
FILE: data/codepoints/0E00.yml
================================================
# Thai

0E00..0E7F:
  font: norasi
  transform: scale(0.8) translate(0, -0.05)

  0E00: notdef

  0E31:
    font: norasi
    combining: true
    transform: scale(0.8) translate(0.4, 0.1)

  0E34..0E37:
    font: norasi
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  0E38..0E3A:
    font: norasi
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0E3B..0E3E: notdef

  0E42..0E44:
    font: norasi
    transform: scale(0.8) translate(0, 0.15)

  0E47:
    font: norasi
    combining: true
    transform: scale(0.8) translate(0.3, 0.05)

  0E48..0E4C:
    font: norasi
    combining: true
    transform: scale(0.8) translate(0.3, 0.4)

  0E4D..0E4E:
    font: norasi
    combining: true
    transform: scale(0.8) translate(0.4, 0.1)

  0E5B:
    font: norasi
    transform: scale(0.7, 0.8) translate(-0.05, -0.05)

  0E5C..0E7F: notdef

# Lao

0E80..0EFF:
  font: noto-lao
  transform: scale(0.7)

  0E80: notdef
  0E83: notdef
  0E85: notdef

  0E86:
    early: true
    font: jglao
    codepoint: 0x0E83
    transform: scale(0.9) translate(0, -0.1)

  0E89:
    early: true
    font: jglao
    transform: scale(0.9) translate(0, -0.1)

  0E8B: notdef

  0E8C:
    early: true
    font: jglao
    codepoint: 0x0E8B
    transform: scale(0.9) translate(0, -0.1)

  0E8E:
    early: true
    font: jglao
    codepoint: 0x0E8C
    transform: scale(0.9) translate(0, -0.1)

  0E8F:
    early: true
    font: jglao
    codepoint: 0x0E8E
    transform: scale(0.9) translate(0, -0.1)

  0E90:
    early: true
    font: jglao
    codepoint: 0x0E8F
    transform: scale(0.9) translate(0, -0.1)

  0E91:
    early: true
    font: jglao
    codepoint: 0x0E90
    transform: scale(0.9) translate(0, -0.1)

  0E92:
    early: true
    font: jglao
    codepoint: 0x0E91
    transform: scale(0.9) translate(0, -0.1)

  0E93:
    early: true
    font: jglao
    transform: scale(0.9) translate(0, -0.1)

  0E98:
    early: true
    font: jglao
    codepoint: 0x0EE5
    transform: scale(0.9) translate(0, -0.1)

  0EA0:
    early: true
    font: jglao
    transform: scale(0.9) translate(0, -0.1)

  0EA4: notdef
  0EA6: notdef

  0EA8:
    early: true
    font: jglao
    codepoint: 0x0EA4
    transform: scale(0.9) translate(0, -0.1)

  0EA9:
    early: true
    font: jglao
    codepoint: 0x0EA6
    transform: scale(0.9) translate(0, -0.1)

  0EAC:
    early: true
    font: jglao
    transform: scale(0.9) translate(0, -0.1)

  0EB1:
    font: noto-lao
    combining: true
    transform: scale(0.7) translate(0.3, 0.1)

  0EB4..0EB7:
    font: noto-lao
    combining: true
    transform: scale(0.7) translate(0.3, 0.1)

  0EB8..0EB9:
    font: noto-lao
    combining: true
    transform: scale(0.7) translate(0.2, -0.1)

  0EBA:
    early: true
    combining: true
    font: jglao
    transform: scale(0.9) translate(0.2, -0.2)

  0EBB:
    font: noto-lao
    combining: true
    transform: scale(0.7) translate(0.3, 0.1)

  0EBC:
    font: noto-lao
    combining: true
    transform: scale(0.7) translate(0.3, -0.1)

  0EBE..0EBF: notdef
  0EC5: notdef
  0EC7: notdef

  0EC8..0ECD:
    font: noto-lao
    combining: true
    transform: scale(0.7) translate(0.25, 0.3)

  0ECE..0ECF: notdef
  0EDA..0EDB: notdef
  0EE0..0EFF: notdef

0F00..0FFF:
  font: jomolhari
  transform: scale(0.8) translate(0, 0.15)

  0F00..0F03:
    font: jomolhari
    transform: scale(0.8) translate(0, 0.25)

  0F08:
    font: jomolhari
    transform: scale(0.8) translate(0, -0.1)

  0F0B: # TODO: Draw glyph
    control: NB
    box: true

  0F12:
    font: jomolhari
    transform: scale(0.8) translate(0, -0.1)

  0F15..0F16:
    font: jomolhari
    transform: scale(0.8)

  0F18:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.3, -0.15)

  0F19:
    font: noto-tibetan
    combining: true
    transform: scale(0.8) translate(0.3, -0.05)

  0F35:
    font: noto-tibetan
    combining: true
    transform: scale(0.8) translate(0.25, -0.15)

  0F36:
    font: jomolhari
    transform: scale(0.8) translate(0, 0.05)

  0F37:
    font: noto-tibetan
    combining: true
    transform: scale(0.8) translate(0.15, -0.15)

  0F39:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.3, 0.2)

  0F3C..0F3D:
    font: jomolhari
    transform: scale(0.7) translate(0, 0.25)

  0F3E:
    font: noto-tibetan
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  0F3F:
    font: noto-tibetan
    combining: true
    transform: scale(0.8) translate(-0.3, -0.1)

  0F48: notdef

  0F6B..0F6C:
    font: noto-tibetan
    transform: scale(0.7) translate(0, -0.1)

  0F6D..0F70: notdef

  0F71:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.15, -0.1)

  0F72:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.2, 0.25)

  0F73:
    svg: true
    combining: true

  0F74..0F75:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.15, -0.1)

  0F76..0F79:
    svg: true
    combining: true

  0F7A..0F7E:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.2, 0.25)

  0F7F:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.3, 0.15)

  0F80:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.2, 0.25)

  0F81:
    svg: true
    combining: true

  0F82..0F83:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.2, 0.2)

  0F84:
    font: jomolhari
    combining: true
    transform: scale(0.8) translate(0.2, 0.15)

  0F86..0F87:
    font: noto-tibetan
    combining: true
    transform: scale(0.8) translate(0.1, 0.15)

  0F8C:
    font: noto-tibetan
    transform: scale(0.8) translate(0, 0.25)

  0F8D..0F8F:
    font: noto-tibetan
    combining: true
    transform: scale(0.7) translate(0.35, 0.15)

  0F90..0FBC:
    font: jomolhari
    combining: true
    transform: scale(0.8, 0.45) translate(0.2, 0.35)

    0F98: notdef

    0F99:
      font: jomolhari
      combining: true
      transform: scale(0.8, 0.45) translate(0, 0.35)

    0FAD:
      font: jomolhari
      combining: true
      transform: scale(0.8, 0.45) translate(0.2, 0.35)

    0FB5:
      font: jomolhari
      combining: true
      transform: scale(0.8, 0.45) translate(0.4, 0.35)

  0FBD: notdef

  0FC3:
    font: jomolhari
    transform: scale(0.8) translate(0, 0)

  0FC4:
    font: jomolhari
    transform: scale(0.8) translate(0, -0.15)

  0FC5:
    font: jomolhari
    transform: scale(0.8)

  0FC6:
    font: jomolhari
    combining: true
    transform: scale(0.7) translate(0, 0.1)

  0FC8:
    font: jomolhari
    transform: scale(0.8) translate(0, -0.15)

  0FC9..0FCC:
    font: jomolhari
    transform: scale(0.8) translate(0, 0.05)

  0FCD: notdef

  0FCE:
    font: noto-tibetan
    transform: scale(0.8) translate(0, -0.1)

  0FD0:
    font: jomolhari
    transform: scale(0.75) translate(0, 0.2)

  0FD1:
    font: jomolhari
    transform: scale(0.8) translate(0, -0.1)

  0FD2..0FDA:
    font: noto-tibetan
    transform: scale(0.8) translate(0, 0)

  0FDB..0FFF: notdef


================================================
FILE: data/codepoints/1000.yml
================================================
# Myanmar

1000..109F:
  font: padauk
  transform: scale(0.65) translate(0, -0.1)

  102A:
    font: padauk
    transform: scale(0.45, 0.65) translate(0, -0.1)

  102B:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  102C:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.5, -0.1)

  102D..102E:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.2, -0.1)

  102F..1030: # TODO: is this right composition?
    font: padauk
    combining: true
    transform: scale(0.65, 0.3) translate(0, 0.6)

  1031:
    font: padauk
    combining: true
    transform: scale(0.65) translate(-0.5, -0.1)

  1032..1035:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.2, -0.1)

  1036..1037:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.1, -0.1)

  1038:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  1039: # TODO: draw cross
    font: padauk
    transform: scale(0)
    combining: true
    box: true

  103A..103B:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  103C:
    font: padauk
    combining: true
    transform: scale(0.65) translate(-0.3, -0.1)

  103D:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.2, -0.1)

  103E:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0, -0.1)

  1056..1057:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.5, -0.1)

  1058..1059:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0, -0.1)

  105E..1060:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.1, -0.1)

  1062..1064:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  1067..106D:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  1071:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0, -0.1)

  1072:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.2, -0.1)

  1073:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0, -0.1)

  1074:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.3, -0.1)

  1082:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0, -0.1)

  1083:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  1084:
    font: padauk
    combining: true
    transform: scale(0.65) translate(-0.5, -0.1)

  1085..1086:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.2, -0.1)

  1087..108B:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  108C:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.5, -0.1)

  108D:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0, 0)

  108F:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  109A..109C:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.4, -0.1)

  109D:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.2, -0.1)

# Georgian

10A0..10FF:
  font: noto-georgian
  transform: scale(0.7)

  10C6: notdef

  10C7: # TODO: more consistent typeface
    font: quivira
    transform: scale(0.7)

  10C8..10CC: notdef

  10CD:
    font: quivira
    transform: scale(0.7)

  10CE..10CF: notdef

  10FD..10FF:
    font: quivira
    transform: scale(0.8)

# Hangul Jamo

1100..11FF:
  font: unbatang
  transform: translate(0.12, -0.05)

  115F:
    control: HC\nF

  1160:
    control: HJ\nF

  1161..11A7:
    font: unbatang
    transform: translate(0.5, -0.05)

  11A8..11FF:
    font: unbatang
    transform: translate(0.42, -0.05)

# Ethiopic

1200..137F:
  font: abyssinica
  transform: scale(0.8)

  1249: notdef
  124E..124F: notdef
  1257: notdef
  1259: notdef
  125E..125F: notdef
  1289: notdef
  128E..128F: notdef
  12B1: notdef
  12B6..12B7: notdef
  12BF: notdef
  12C1: notdef
  12C6..12C7: notdef
  12D7: notdef
  1311: notdef
  1316..1317: notdef
  135B..135C: notdef

  135D..135F:
    font: abyssinica
    combining: true
    transform: scale(0.8) translate(0.25, 0.1)

  137D..137F: notdef

# Ethiopic Supplement

1380..139F:
  font: abyssinica
  transform: scale(0.8)

  139A..139F: notdef

# Cherokee
# TODO: Even Unicode 9.0.0 introduced new sans-serif typeface to the chart, I think serif typeface is more preffered

13A0..13FF:
  font: noto-cherokee
  transform: scale(0.8)

  13F6..13F7: notdef
  13FE..13FF: notdef

# Unified Canadian Aboriginal Syllabics

1400..167F:
  font: noto-canadian-aboriginal
  transform: scale(0.8)

  1671..1672:
    font: noto-canadian-aboriginal
    transform: scale(0.7, 0.8)

  1675..1676:
    font: noto-canadian-aboriginal
    transform: scale(0.7, 0.8)

# Ogham

1680..169F:
  font: noto-ogham
  transform: scale(0.8)

  1680:
    font: noto-ogham
    box: true
    transform: scale(0.8)

  169D..169F: notdef

# Runic

16A0..16FF:
  font: noto-runic
  transform: scale(0.8)

  16F1..16F8:
    svg: true

    16F2:
      font: noto-runic
      codepoint: 0x16CB
      transform: scale(-0.8, 0.8)

    16F7:
      font: noto-runic
      codepoint: 0x16B4
      transform: scale(0.8, -0.8)

  16F9..16FF: notdef

# Tagalog

1700..171F:
  font: noto-tagalog
  transform: scale(0.8)

  170D: notdef

  1712:
    font: noto-tagalog
    combining: true
    transform: scale(0.8) translate(0.15, 0)

  1713..1714:
    font: noto-tagalog
    combining: true
    transform: scale(0.8) translate(0.25, 0)

  1715..171F: notdef

# Hanunoo

1720..173F:
  font: free-serif

  1732..1733:
    font: free-serif
    combining: true
    transform: transform(0.3, 0.05)

  1734:
    font: free-serif
    combining: true
    transform: scale(0.8) transform(0.3, 0)

  1737..173F: notdef

# Buhid

1740..175F:
  font: hancom
  transform: scale(0.8)

  1752:
    font: hancom
    combining: true
    transform: scale(0.8) translate(0, 0.1)

  1753:
    font: hancom
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  1754..175F: notdef

# Tagbanwa

1760..177F:
  font: noto-tagbanwa
  transform: scale(0.8)

  176D: notdef
  1771: notdef

  1772..1773:
    font: noto-tagbanwa
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  1774..177F: notdef

# Khmer

1780..17FF:
  font: noto-khmer
  transform: scale(0.75) translate(0, -0.05)

  17AA:
    font: noto-khmer
    transform: scale(0.75) translate(0, 0.05)

  17B3:
    font: noto-khmer
    transform: scale(0.75) translate(0, 0.05)

  17B4:
    control: KIV\nAQ

  17B5:
    control: KIV\nAA

  17B6:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.35, -0.05)

  17B7..17BA:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.35, 0.2)

  17BB..17BD:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.2, -0.1)

  17BE..17C0:
    svg: true
    combining: true

  17C1..17C3:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(-0.4, 0.15)

  17C4..17C5:
    svg: true
    combining: true

  17C6:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.35, 0.2)

  17C7..17C8:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.35, 0)

  17C9..17D1:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.35, 0.2)

  17D2:
    font: noto-khmer
    combining: true
    box: true
    transform: scale(0.75) translate(0.35, -0.2)

  17D3:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.35, 0.2)

  17D8:
    font: noto-khmer
    transform: scale(0.4, 0.75) translate(0, -0.05)

  17DA:
    font: noto-khmer
    transform: scale(0.55, 0.75) translate(0, -0.05)

  17DD:
    font: noto-khmer
    combining: true
    transform: scale(0.75) translate(0.45, 0.2)

  17DE..17DF: notdef
  17EA..17EF: notdef
  17FA..17FF: notdef


================================================
FILE: data/codepoints/1800.yml
================================================
# Mongolian

1800..18AF:
  font: mongolian-script
  transform: scale(0.7) translate(0, -0.05)

  180B..180E:
    control:
      - FV\nS1
      - FV\nS2
      - FV\nS3
      - MV\nS

  180F: notdef

  1810..1819:
    font: mongolian-script
    transform: rotate(90) scale(0.7) translate(0, -0.05)

  181A..181F: notdef

  1878:
    early: true
    svg: true

  1879..187F: notdef

  1885:
    font: mongolian-script
    combining: true
    transform: scale(0.7) translate(0, -0.5)

  1886:
    font: mongolian-script
    combining: true
    transform: scale(0.7, 0.4) translate(0, -0.8)

  189C:
    font: mongolian-script
    transform: scale(0.7) translate(0, 0)

  18A9:
    svg: true
    combining: true

  18AA:
    svg: true

  18AB..18AF: notdef

# Unified Canadian Aboriginal Syllabics Extended

18B0..18FF:
  font: noto-canadian-aboriginal
  transform: scale(0.8)

  18DE..18DF:
    font: noto-canadian-aboriginal
    transform: scale(0.8) translate(0, 0.2)

  18F6..18FF: notdef

# Limbu

1900..194F:
  font: namdhinggo

  191D..191E:
    svg: true

  191F: notdef

  1920..1921:
    font: namdhinggo
    combining: true
    transform: translate(0.3, 0)

  1922:
    font: namdhinggo
    combining: true
    transform: translate(0.2, -0.15)

  1923:
    font: namdhinggo
    combining: true
    transform: translate(0.3, -0.1)

  1924:
    font: namdhinggo
    combining: true
    transform: scale(0.7, 1) translate(0.45, -0.1)

  1925:
    font: namdhinggo
    combining: true
    transform: translate(0.35, -0.05)

  1926:
    font: namdhinggo
    combining: true
    transform: scale(0.7, 1) translate(0.45, -0.05)

  1927..1928:
    font: namdhinggo
    combining: true
    transform: translate(0.1, 0)

  1929..192B:
    font: namdhinggo
    combining: true
    transform: translate(0.3, -0.2)

  192C..192F: notdef

  1930:
    font: namdhinggo
    combining: true
    transform: scale(0.8, 1) translate(0.4, -0.1)

  1931:
    font: namdhinggo
    combining: true
    transform: translate(0.3, -0.2)

  1932..1933:
    font: namdhinggo
    combining: true
    transform: translate(0.3, -0.2)

  1934..1936:
    font: namdhinggo
    combining: true
    transform: translate(0.3, -0.1)

  1937:
    font: namdhinggo
    combining: true
    transform: translate(0.2, -0.1)

  1938:
    font: namdhinggo
    combining: true
    transform: translate(0.3, -0.2)

  1939:
    font: namdhinggo
    combining: true
    transform: translate(0.2, -0.1)

  193A:
    font: namdhinggo
    combining: true
    transform: translate(0.1, 0.1)

  193B:
    font: namdhinggo
    combining: true
    transform: translate(0.25, -0.2)

  193C..193F: notdef
  1941..1943: notdef

# Tai Le

1950..197F:
  font: free-serif
  transform: scale(0.8)

  196E..196F: notdef
  1975..197F: notdef

# New Tai Lue

1980..19DF:
  font: dai-banna
  transform: scale(0.85) translate(0, -0.1)

  19AC..19AF: notdef
  19CA..19CF: notdef
  19DB..19DF: notdef

# Khmer Symbols

19E0..19FF:
  font: noto-khmer
  transform: scale(0.55) translate(0, -0.05)


================================================
FILE: data/codepoints/1A00.yml
================================================
# Buginese

1A00..1A1F:
  font: free-serif
  transform: scale(0.8)

  1A17..1A18:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.2, 0)

  1A19:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(-0.2, 0)

  1A1A:
    font: free-serif
    combining: true
    transform: scale(0.6, 0.8) translate(0.6, 0)

  1A1B:
    font: free-serif
    combining: true
    transform: scale(0.8) translate(0.4, 0)

  1A1C..1A1D: notdef

# Tai Tham

1A20..1AAF:
  font: noto-tai-tham
  transform: scale(0.8)

  1A55:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(-0.4, 0)

  1A56..1A57:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  1A58:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.4, 0.2)

  1A59..1A5A:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  1A5B:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  1A5C..1A5E:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.25, -0.1)

  1A5F: notdef

  1A60:
    font: noto-tai-tham
    combining: true
    box: true
    transform: scale(0.8) translate(0.15, -0.15)

  1A61:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  1A62:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.2, 0)

  1A63..1A64:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.35, 0)

  1A65..1A68:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.25, 0.1)

  1A69..1A6A:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  1A6B:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.25, 0)

  1A6C:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  1A6D:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.3, -0.1)

  1A6E:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(-0.4, -0.1)

  1A6F:
    font: noto-tai-tham
    combining: true
    transform: scale(0.4, 0.8) translate(-0.8, -0.1)

  1A70..1A72:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(-0.4, -0.1)

  1A73..1A76:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.15, 0)

  1A77..1A7C:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.3, 0.05)

  1A7D..1A7E: notdef

  1A7F:
    font: noto-tai-tham
    combining: true
    transform: scale(0.8) translate(0.15, -0.1)

  1A8A..1A8F: notdef
  1A9A..1A9F: notdef
  1AAE..1AAF: notdef

# Combining Diacritical Marks Extended

1AB0..1AFF:
  font: nishiki

  1AB0..1AB4:
    font: nishiki
    combining: true
    transform: translate(0.3, 0.1)

  1AB5..1AB8:
    font: nishiki
    combining: true
    transform: translate(0.3, -0.1)

  1AB9..1ABA:
    font: nishiki
    combining: true
    transform: translate(0.4, -0.05)

  1ABB..1ABC:
    font: nishiki
    combining: true
    transform: translate(0.3, 0.1)

  1ABD:
    font: nishiki
    combining: true
    transform: translate(0.3, -0.15)

  1ABE:
    font: nishiki
    combining: true
    transform: translate(0.25, 0)

  1ABF..1AFF: notdef

# Balinese
# Consider using Aksara Bali instead of Noto
# http://www.alanwood.net/downloads/aksrbali.zip

1B00..1B7F:
  font: noto-balinese
  transform: scale(0.7) translate(0, -0.2)

  1B00..1B03:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.3, 0)

  1B04:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.4, -0.2)

  1B34:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.25, 0)

  1B35:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.5, 0)

  1B36..1B37:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.25, 0)

  1B38..1B3A:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.3, -0.2)

  1B3B..1B41:
    svg: true
    combining: true

  1B42:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.4, 0.1)

  1B43:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.5, 0.1)

  1B44:
    font: noto-balinese
    combining: true
    transform: scale(0.5) translate(0.5, 0)

  1B46:
    font: noto-balinese
    transform: scale(0.5, 0.7) translate(0, -0.2)

  1B4C..1B4F: notdef

  1B6B:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.2, 0)

  1B6C:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.2, -0.2)

  1B6D..1B73:
    font: noto-balinese
    combining: true
    transform: scale(0.7) translate(0.3, 0)

  1B7D..1B7F: notdef

# Sundanese

1B80..1BBF:
  font: noto-sundanese
  transform: scale(0.7)

  1B80..1B81:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.2, 0.1)

  1B82:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.45, -0.1)

  1BA1..1BA2:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.3, -0.1)

  1BA3:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.4, -0.1)

  1BA4:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.25, 0.1)

  1BA5:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.4, -0.1)

  1BA6:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(-0.3, 0)

  1BA7:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.4, 0)

  1BA8..1BA9:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.25, 0.1)

  1BAA:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.4, 0)

  1BAB:
    font: noto-sundanese
    box: true
    transform: scale(0.7) translate(0, 0.3)

  1BAC..1BAD:
    font: noto-sundanese
    combining: true
    transform: scale(0.7) translate(0.4, -0.1)

  1BAF:
    font: noto-sundanese
    transform: scale(0.6, 0.7)

# Batak

1BC0..1BFF:
  font: noto-batak
  transform: scale(0.8) translate(0, -0.1)

  1BE6:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.2, 0)

  1BE7:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  1BE8:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.2, 0)

  1BE9..1BEB:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.4, -0.15)

  1BEC:
    font: noto-batak
    combining: true
    transform: scale(0.7, 0.8) translate(0.5, -0.15)

  1BED:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  1BEE..1BEF:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  1BF0..1BF1:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  1BF2:
    font: noto-batak
    combining: true
    transform: scale(0.7, 0.8) translate(0.5, -0.15)

  1BF3:
    font: noto-batak
    combining: true
    transform: scale(0.8) translate(0.4, -0.1)

  1BF4..1BFB: notdef

  1BFC..1BFF:
    font: noto-batak
    transform: scale(0.8) translate(0, 0.05)


================================================
FILE: data/codepoints/1C00.yml
================================================
# Lepcha

1C00..1C4F:
  font: mingzat
  transform: scale(0.7) translate(0, -0.1)

  1C20:
    font: mingzat
    transform: scale(0.7) translate(-0.05, -0.1)

  1C24..1C26:
    font: mingzat
    combining: true
    transform: scale(0.7) translate(0.4, -0.1)

  1C27..1C29:
    font: mingzat
    combining: true
    transform: scale(0.6) translate(-0.5, -0.1)

  1C2A..1C2B:
    font: mingzat
    combining: true
    transform: scale(0.6) translate(0.5, -0.2)

  1C2C:
    font: mingzat
    combining: true
    transform: scale(0.7) translate(0.4, -0.35)

  1C2D..1C33:
    font: mingzat
    combining: true
    transform: scale(0.7) translate(0.4, 0.1)

  1C34..1C35:
    font: mingzat
    combining: true
    transform: scale(0.7) translate(-0.5, -0.1)

  1C36:
    font: mingzat
    combining: true
    transform: scale(0.7) translate(0.4, 0.1)

  1C37:
    font: mingzat
    combining: true
    transform: scale(0.7) translate(0.4, -0.35)

  1C38..1C3A: notdef
  1C4A..1C4C: notdef

# Ol Chiki

1C50..1C7F:
  font: noto-ol-chiki
  transform: scale(0.9)

# Cyrillic Extended-C

1C80..1C8F:
  font: ponomar
  transform: scale(0.8)

  1C89..1C8F: notdef

# Georgian Extended

1C90..1CBF:
  font: dejavu
  transform: scale(0.8)
  early: true

  1C90..1CB6:
    font: dejavu
    transform: scale(0.7)
    early: true
    codepoint:
      - 0xF400
      - 0xF401
      - 0xF402
      - 0xF403
      - 0xF404
      - 0xF405
      - 0xF406
      - 0xF407
      - 0xF408
      - 0xF409
      - 0xF40A
      - 0xF40B
      - 0xF40C
      - 0xF40D
      - 0xF40E
      - 0xF40F
      - 0xF410
      - 0xF411
      - 0xF412
      - 0xF413
      - 0xF414
      - 0xF415
      - 0xF416
      - 0xF417
      - 0xF418
      - 0xF419
      - 0xF41A
      - 0xF41B
      - 0xF41C
      - 0xF41D
      - 0xF41E
      - 0xF41F
      - 0xF420
      - 0xF421
      - 0xF422
      - 0xF423
      - 0xF424
      - 0xF425
      - 0xF426

  1CB7:
    transform: translate(0, -0.02) scale(0.7)
    early: true
    svg: true

  1CB8:
    font: dejavu
    transform: scale(0.7) scale(-1, 1)
    codepoint: 0xF417
    early: true

  1CB9:
    font: dejavu
    transform: translate(0, -0.05) scale(0.7) rotate(180)
    codepoint: 0xF402
    early: true

  1CBA:
    transform: scale(0.7)
    svg: true
    early: true

  1CBB..1CBC: notdef

  1CBD:
    transform: scale(0.7)
    early: true
    svg: true

  1CBE:
    font: dejavu
    transform: translate(0, -0.05) scale(0.7) rotate(180)
    codepoint: 0xF422
    early: true

  1CBF:
    transform: scale(0.7)
    svg: true
    early: true

# Sundanese Supplement

1CC0..1CCF:
  font: noto-sundanese
  transform: scale(0.7)

  1CC4:
    font: noto-sundanese
    transform: scale(0.55, 0.7) translate(-0.05, 0)

  1CC7:
    font: noto-sundanese
    transform: scale(0.55, 0.7) translate(-0.05, 0)

  1CC8..1CCF: notdef

# Vedic Extensions

1CD0..1CFF:
  font: noto-devanagari

  1CD0..1CD2:
    font: noto-devanagari
    combining: true
    transform: translate(0.15, 0.2)

  1CD4:
    font: noto-devanagari
    combining: true
    transform: translate(0.15, -0.05)

  1CD5..1CD7:
    font: noto-devanagari
    combining: true
    transform: translate(0.25, -0.2)

  1CD8..1CD9:
    font: noto-devanagari
    combining: true
    transform: translate(0.15, -0.2)

  1CDA..1CDB:
    font: noto-devanagari
    combining: true
    transform: translate(0.1, 0.15)

  1CDC..1CDE:
    font: noto-devanagari
    combining: true
    transform: translate(0.15, -0.2)

  1CDF:
    font: noto-devanagari
    combining: true
    transform: translate(0.25, -0.2)

  1CE0:
    font: noto-devanagari
    combining: true
    transform: translate(0.2, 0.1)

  1CE1:
    font: noto-devanagari
    combining: true
    transform: translate(0.2, 0) scale(0.9)

  1CE2:
    font: noto-devanagari
    combining: true
    transform: translate(0.1, 0)

  1CE3:
    font: noto-devanagari
    combining: true
    transform: translate(0.2, -0.05)

  1CE4..1CE5:
    font: noto-devanagari
    combining: true
    transform: translate(-0.2, -0.05)

  1CE6..1CE7:
    font: noto-devanagari
    combining: true
    transform: translate(0.2, -0.05)

  1CE8:
    font: noto-devanagari
    combining: true
    transform: translate(-0.2, -0.05)

  1CED:
    font: noto-devanagari
    combining: true
    transform: translate(0, -0.2)

  1CF2..1CF3:
    font: noto-devanagari
    combining: true
    transform: translate(0.3, -0.05) scale(0.8)

  1CF4:
    font: noto-devanagari
    combining: true
    transform: translate(0.15, 0.3)

  1CF7:
    svg: true
    combining: true

  1CF8..1CF9:
    svg: true
    combining: true

  1CFA:
    svg: true
    transform: scale(0.8)
    early: true

  1CFB..1CFF: notdef

# Phonetic Extensions

1D00..1D7F:
  font: doulos
  transform: scale(0.9) translate(0, -0.05)

# Phonetic Extensions Supplement

1D80..1DBF:
  font: doulos
  transform: scale(0.9) translate(0, -0.05)

# Combining Diacritical Marks Supplement

1DC0..1DFF:
  font: doulos
  combining: true

  1DC0..1DC1:
    font: noto-serif
    combining: true
    transform: translate(0, 0.1)

  1DC2:
    font: noto-serif
    combining: true
    transform: translate(0, -0.2)

  1DC3..1DC9:
    font: noto-serif
    combining: true
    transform: translate(0, 0.1)

  1DCA:
    font: noto-serif
    combining: true
    transform: translate(0, -0.2)

  1DCB..1DCE:
    font: free-serif
    combining: true
    transform: scale(0.9, 1) translate(0.3, 0)

  1DCF:
    font: free-serif
    combining: true
    transform: translate(0.2, -0.2)

  1DD0:
    font: junicode
    combining: true
    transform: translate(0.3, -0.2)

  1DD1..1DD2:
    font: junicode
    combining: true
    transform: translate(0.2, 0)

  1DD3..1DE6:
    font: free-serif
    combining: true
    transform: translate(0.2, 0)

  1DE7:
    font: free-serif
    combining: true
    codepoint: 0x03B1
    transform: scale(0.4) translate(0, -0.75)

  1DE8:
    font: free-serif
    combining: true
    codepoint: 0x62
    transform: scale(0.4) translate(0, -0.75)

  1DE9:
    font: free-serif
    combining: true
    codepoint: 0x03B2
    transform: scale(0.4) translate(0, -0.75)

  1DEA:
    font: free-serif
    combining: true
    codepoint: 0x0259
    transform: scale(0.4) translate(0, -0.75)

  1DEB:
    font: free-serif
    combining: true
    codepoint: 0x66
    transform: scale(0.4) translate(0, -0.75)

  1DEC:
    font: quivira
    combining: true
    codepoint: 0xAB38
    transform: scale(0.4) translate(0, -0.75)

  # TODO: Add slash
  1DED:
    font: free-serif
    combining: true
    codepoint: 0x6F
    transform: scale(0.4) translate(0, -0.75)

  1DEE:
    font: free-serif
    combining: true
    codepoint: 0x70
    transform: scale(0.4) translate(0, -0.85)

  1DEF:
    font: free-serif
    combining: true
    codepoint: 0x0283
    transform: scale(0.4) translate(0, -0.85)

  # TODO: Add slash
  1DF0:
    font: free-serif
    combining: true
    codepoint: 0x75
    transform: scale(0.4) translate(0, -0.75)

  1DF1:
    font: free-serif
    combining: true
    codepoint: 0x77
    transform: scale(0.4) translate(0, -0.75)

  1DF2:
    font: free-serif
    combining: true
    codepoint: 0xE4
    transform: scale(0.4) translate(0, -0.75)

  1DF3:
    font: free-serif
    combining: true
    codepoint: 0xF6
    transform: scale(0.4) translate(0, -0.75)

  1DF4:
    font: free-serif
    combining: true
    codepoint: 0xFC
    transform: scale(0.4) translate(0, -0.75)

  1DF5:
    font: free-serif
    combining: true
    codepoint: 0x02D4
    transform: translate(0, -0.5)

  1DF6..1DF9:
    svg: true
    combining: true

  1DFA..1DFA: notdef

  1DFB:
    font: nishiki
    combining: true
    transform: translate(0.3, 0.1)

  1DFC:
    font: free-serif
    combining: true
    transform: translate(0, -0.15)

  1DFD:
    font: free-serif
    combining: true
    transform: translate(0.25, -0.15)

  1DFE:
    font: free-serif
    combining: true
    transform: translate(0.2, 0)

  1DFF:
    font: free-serif
    combining: true
    transform: translate(0.3, -0.15)


================================================
FILE: data/codepoints/1E00.yml
================================================
# Latin Extended Additional

1E00..1EFF:
  font: free-serif
  transform: scale(0.8)

# Greek Extended

1F00..1FFF:
  font: free-serif
  transform: scale(0.8)

  1F16..1F17: notdef
  1F1E..1F1F: notdef
  1F46..1F47: notdef
  1F4E..1F4F: notdef
  1F58: notdef
  1F5A: notdef
  1F5C: notdef
  1F5E: notdef
  1F7E..1F7F: notdef
  1FB5: notdef
  1FC5: notdef
  1FD4..1FD5: notdef
  1FDC: notdef
  1FF0..1FF1: notdef
  1FF5: notdef
  1FFF: notdef


================================================
FILE: data/codepoints/2000.yml
================================================
# General Punctuation

2000..206F:
  font: symbola
  transform: translate(0, -0.05)

  2000..200F:
    control:
      - NQ\nSP
      - MQ\nSP
      - EN\nSP
      - EM\nSP
      - 3/M\nSP
      - 4/M\nSP
      - 6/M\nSP
      - F\nSP
      - P\nSP
      - TH\nSP
      - H\nSP
      - ZW\nSP
      - ZW\nNJ
      - ZW\nJ
      - LRM
      - RLM

  2011:
    control: NB\n-

  2028..202F:
    control:
      - L\nSEP
      - P\nSEP
      - LRE
      - RLE
      - PDF
      - LRO
      - RLO
      - NNB\nSP

  2030:
    font: free-serif

  2031:
    font: free-serif
    transform: scale(0.75, 1)

  205F:
    control: MM\nSP

  2060:
    control: WJ

  2061..2062:
    svg: true
    box: true

  2063:
    font: doulos
    codepoint: 0x2C
    transform: translate(0, -0.2)
    box: true

  2064:
    svg: true
    box: true

  2065: notdef

  2066..206F:
    control:
      - LRI
      - RLI
      - FSI
      - PDI
      - I\nSS
      - A\nSS
      - I\nAFS
      - A\nAFS
      - NA\nDS
      - NO\nDS

# Superscripts and Subscripts

2070..209F:
  font: doulos
  transform: scale(0.95) translate(0, -0.05)

  2072..2073: notdef
  208F: notdef
  209D..209F: notdef

# Currency Symbols

20A0..20CF:
  font: free-serif
  transform: scale(0.9)

  20AF:
    font: free-serif
    transform: scale(0.7)

  20BA..20BD:
    font: doulos

  20BE:
    font: symbola

  20BF:
    font: btc
    codepoint: 0x42
    transform: scale(0.8)

  20C0..20CF: notdef

# Combining Diacritical Marks for Symbols

20D0..20FF:
  font: symbola
  combining: true

  20D0..20DC:
    font: symbola
    combining: true
    transform: translate(0.25, 0.05)

    20D2..20D3:
      font: symbola
      combining: true
      transform: translate(0.25, -0.1)

    20D8..20DA:
      font: symbola
      combining: true
      transform: translate(0.25, -0.05)

  20DD..20E3:
    font: symbola
    combining: true
    transform: translate(0.5, -0.1)

    20E1:
      font: symbola
      combining: true
      transform: translate(0.25, 0.1)

  20E4:
    font: symbola
    combining: true
    transform: translate(0.5, -0.05)

  20E5..20E6:
    font: symbola
    combining: true
    transform: translate(0.25, -0.1)

  20E7:
    font: symbola
    combining: true
    transform: translate(0.25, 0)

  20E8:
    font: symbola
    combining: true
    transform: translate(0.25, -0.2)

  20E9:
    font: symbola
    combining: true
    transform: translate(0.25, 0)

  20EA..20EB:
    font: symbola
    combining: true
    transform: translate(0.25, -0.1)

  20EC..20EF:
    font: symbola
    combining: true
    transform: translate(0.25, -0.2)

  20F0:
    font: symbola
    combining: true
    transform: translate(0.25, 0)

  20F1..20FF: notdef

# Letterlike Symbols

2100..214F:
  font: symbola
  transform: scale(0.9)

  210B:
    font: symbola
    transform: scale(0.9) translate(-0.1, 0)

  2117:
    font: symbola
    transform: scale(0.9) translate(0, -0.1)

  2121:
    font: symbola
    transform: scale(0.7, 0.9)

  2122:
    font: symbola
    transform: scale(0.8, 0.9)

  212C:
    font: symbola
    transform: scale(0.9) translate(-0.05, 0)

  2130..2131:
    font: symbola
    transform: scale(0.9) translate(-0.1, 0)

  2133:
    font: symbola
    transform: scale(0.8, 0.9) translate(-0.05, 0)

  213B:
    font: symbola
    transform: scale(0.7, 0.9)

# Number Forms

2150..218F:
  font: symbola
  transform: scale(0.9)

  215F:
    font: symbola
    transform: scale(0.9) translate(-0.2, 0)

  2166:
    font: symbola
    transform: scale(0.75, 0.9)

  2167:
    font: symbola
    transform: scale(0.6, 0.9)

  216B:
    font: symbola
    transform: scale(0.8, 0.9)

  2177:
    font: symbola
    transform: scale(0.8, 0.9)

  218C..218F: notdef

# Arrows

2190..21FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)


================================================
FILE: data/codepoints/2200.yml
================================================
# Mathematical Operators

2200..22FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

  22A6..22AF:
    font: symbola
    transform: scale(0.9)

  22D8..22D9:
    font: symbola
    transform: scale(0.75, 0.9) translate(0, -0.05)

# Miscellaneous Technical

2300..23FF:
  font: symbola
  transform: scale(0.9)

  23B2..23B3:
    font: symbola
    transform: scale(0.8)

  23D4..23D6:
    font: symbola
    transform: scale(0.8)

  23FF:
    font: observer-symbol
    codepoint: 0x6F
    transform: scale(0.9)

# Control Pictures

2400..243F:
  font: quivira

  2427..243F: notdef

# Optical Character Recognition

2440..245F:
  font: symbola

  244B..245F: notdef

# Enclosed Alphanumerics

2460..24FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Box Drawing

2500..257F:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Block Elements

2580..259F:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Geometric Shapes

25A0..25FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Miscellaneous Symbols

2600..26FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Dingbats

2700..27BF:
  font: symbola
  transform: scale(0.9)

  275B..2793:
    font: symbola
    transform: scale(0.9) translate(0, -0.05)

# Miscellaneous Mathematical Symbols-A

27C0..27EF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Supplemental Arrows-A

27F0..27FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

  27F4..27FF:
    font: symbola
    transform: scale(0.65) translate(0, -0.05)

# Braille Patterns

2800..28FF:
  font: symbola
  transform: scale(0.95) translate(0.1, -0.1)

# Supplemental Arrows-B

2900..297F:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Miscellaneous Mathematical Symbols-B

2980..29FF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

# Supplemental Mathematical Operators

2A00..2AFF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

  2A0C:
    font: symbola
    transform: scale(0.7, 0.9) translate(0, -0.05)

  2A4A..2A4B:
    font: symbola
    transform: scale(0.8, 0.9) translate(0, -0.05)

  2AF7..2AF8:
    font: symbola
    transform: scale(0.8) translate(0, -0.05)

# Miscellaneous Symbols and Arrows

2B00..2BFF:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

  2B32..2B33:
    font: symbola
    transform: scale(0.7) translate(0, -0.05)

  2B74..2B75: notdef
  2B96..2B97: notdef

  2BBA:
    early: true
    font: symbola
    codepoint: 0x29C9
    transform: scale(0.9) translate(0, -0.05) scale(-1, 1)

  2BBB..2BBC:
    early: true
    svg: true

  2BC9:
    early: true
    font: nishiki
    transform: scale(0.85)

  2BD2:
    font: nishiki
    transform: scale(0.85)

  # TODO: The glyph shape of U+2BD6 PLUTO FORM FIVE is questionable
  2BD3..2BEB: # Early maping
    early: true
    font: nishiki
    transform: scale(0.85)

  2BF0..2BFE:
    early: true
    font: nishiki
    transform: scale(0.85)

  2BFF:
    early: true
    font: nishiki
    transform: scale(0.85)


================================================
FILE: data/codepoints/2C00.yml
================================================
# Glagolitic

2C00..2C5F:
  font: quivira
  transform: scale(0.8)

  2C27:
    font: quivira
    transform: scale(0.7, 0.8)

  2C29:
    font: quivira
    transform: scale(0.7, 0.8)

  2C2F: notdef

  2C30..2C5F:
    font: quivira
    transform: translate(0, -0.1)

    2C5F: notdef

# Latin Extended-C

2C60..2C7F:
  font: doulos
  transform: scale(0.8) translate(0, 0)

  2C7C:
    font: doulos
    transform: scale(0.8) translate(0, -0.1)

# Coptic

2C80..2CFF:
  font: analecta
  transform: scale(0.8)

  2CEF:
    font: analecta
    combining: true
    transform: scale(0.8) translate(0.4, 0.1)

  2CF0..2CF1:
    font: analecta
    combining: true
    transform: scale(0.8) translate(0.25, 0.1)

  2CF4..2CF8: notdef

# Georgian Supplement

2D00..2D2F:
  font: noto-georgian
  transform: scale(0.8)

  2D26: notdef

  2D27:
    font: quivira
    transform: scale(0.9) translate(0, -0.1)

  2D28..2D2C: notdef

  2D2D:
    font: quivira
    transform: scale(0.9) translate(0, -0.1)

  2D2E..2D2F: notdef

# Tifinagh

2D30..2D7F:
  font: noto-tifinagh
  transform: scale(0.8)

  2D68..2D6E: notdef
  2D71..2D7E: notdef

  2D7F:
    font: noto-tifinagh
    combining: true
    box: true
    transform: scale(0.8) translate(0, -0.1)

# Ethiopic Extended

2D80..2DDF:
  font: abyssinica
  transform: scale(0.8)

  2D97..2D9F: notdef
  2DA7: notdef
  2DAF: notdef
  2DB7: notdef
  2DBF: notdef
  2DC7: notdef
  2DCF: notdef
  2DD7: notdef
  2DDF: notdef

# Cyrillic Extended-A

2DE0..2DFF:
  font: free-serif
  combining: true
  transform: translate(0.1, -0.05)

  2DF2..2DF3:
    font: free-serif
    combining: true
    transform: translate(0.15, -0.05)

  2DF5:
    font: free-serif
    combining: true
    transform: translate(0.2, -0.05)

  2DFB..2DFF:
    font: free-serif
    combining: true
    transform: translate(0.15, -0.05)


================================================
FILE: data/codepoints/2E00.yml
================================================
# Supplemental Punctuation

2E00..2E7F:
  font: symbola
  transform: scale(0.9) translate(0, -0.05)

  # TODO: render hyphens

  2E3A:
    control: 2M

  2E3B:
    control: 3M

  2E45..2E49:
    font: nishiki
    transform: scale(0.8)

  2E4A..2E4F: # Early mapping
    early: true
    font: nishiki
    transform: scale(0.8)

  2E50..2E7F: notdef

# CJK Radicals Supplement

2E80..2EFF:
  font:
    - ipaexm
    - hanamin-a
  transform: scale(0.9) translate(0, 0.05)

  2E9A: notdef
  2EF4..2EFF: notdef

# Kangxi Radicals

2F00..2FDF:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

  2FD6..2FDF: notdef

# Empty

2FE0..2FEF: notdef

# Ideographic Description Characters

2FF0..2FFF:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

  2FFC..2FFF: notdef


================================================
FILE: data/codepoints/3000.yml
================================================
# CJK Symbols and Punctuation

3000..303F:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

  3000:
    control: ID\nSP

  301A..301B:
    font: noto-cjk-jp
    transform: scale(0.9) translate(0, 0.05)

  301E:
    font: ipaexm
    codepoint: 0x301D
    transform: scale(-0.9, 0.9)

  3021..3029:
    font: babel-stone
    transform: scale(0.9)

  302A:
    font: hancom
    combining: true
    transform: translate(0.4, -0.2)

  302B:
    font: hancom
    combining: true
    transform: translate(0.4, 0.15)

  302C:
    font: hancom
    combining: true
    transform: translate(0.2, 0.15)

  302D:
    font: hancom
    combining: true
    transform: translate(0.2, -0.2)

  302E..302F:
    font: hancom
    combining: true
    transform: translate(0.7, 0)

  3030..3032:
    font: hanamin-a
    transform: scale(0.9) translate(0, 0.05)

  3037:
    font: hancom
    transform: translate(0, 0.1)

  3038:
    font: ipaexm
    codepoint: 0x5341
    transform: scale(0.9) translate(0, 0.05)

  3039:
    font: ipaexm
    codepoint: 0x5efe
    transform: scale(0.9) translate(0, 0.05)

  303A:
    font: ipaexm
    codepoint: 0x5345
    transform: scale(0.9) translate(0, 0.05)

  3038:
    font: ipaexm
    codepoint: 0x5341
    transform: scale(0.9) translate(0, 0.05)

  3039:
    font: ipaexm
    codepoint: 0x5efe
    transform: scale(0.9) translate(0, 0.05)

  303A:
    font: ipaexm
    codepoint: 0x5345
    transform: scale(0.9) translate(0, 0.05)

  303E:
    font: hancom
    box: true
    transform: translate(0, 0.05)

  303F:
    font: hancom

# Hiragana

3040..309F:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

  3040: notdef
  3097..3098: notdef

  3099..309A:
    font: ipaexm
    combining: true
    transform: scale(0.9) translate(-0.1, 0.15)

# Katakana

30A0..30FF:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

# Bopomofo

3100..312F:
  font: babel-stone
  transform: scale(0.9) translate(0, 0.05)

  3100..3104: notdef

  312E:
    svg: true

  312F: # Early mapping
    early: true
    svg: true

# Hangul Compatibility Jamo

3130..318F:
  font: unbatang
  transform: translate(0, -0.05)

  3130: notdef

  3164:
    control: HF

  318F: notdef

# Kanbun

3190..319F:
  font: babel-stone
  transform: scale(0.9) translate(-0.25, 0)

# Bopomofo Extended

31A0..31BF:
  font: babel-stone
  transform: scale(0.9) translate(0, 0.05)

  31B4..31B7:
    font: babel-stone
    transform: scale(0.9) translate(-0.25, 0.05)

  31BB..31BF: notdef

# CJK Strokes

31C0..31EF:
  font: hanamin-a
  transform: translate(0, 0.05)

  31CF:
    font: ipaexm
    codepoint: 0x4e40
    transform: scale(0.9) translate(0, 0.05)

  31D0:
    font: ipaexm
    codepoint: 0x4e00
    transform: scale(0.9) translate(0, 0.05)

  31D1:
    font: ipaexm
    codepoint: 0x4e28
    transform: scale(0.9) translate(0, 0.05)

  31D3:
    font: ipaexm
    codepoint: 0x4e3f
    transform: scale(0.9) translate(0, 0.05)

  31D4:
    font: ipaexm
    codepoint: 0x4e36
    transform: scale(0.9) translate(0, 0.05)

  31D5:
    font: ipaexm
    codepoint: 0x4e3f
    transform: scale(0.9) translate(0, 0.05)

  #31D6:
  #  font: ipaexm
  #  codepoint: 0x4e5b
  #  transform: scale(0.9) translate(0, 0.05)

  #31D9:
  #  font: ipamjm
  #  codepoint: 0x2010c
  #  transform: scale(0.9) translate(0, 0.05)

  31DA:
    font: ipaexm
    codepoint: 0x4e85
    transform: scale(0.9) translate(0, 0.05)

  #31DC:
  #  font: ipamjm
  #  codepoint: 0x200cb
  #  transform: scale(0.9) translate(0, 0.05)

  31DD:
    font: ipaexm
    codepoint: 0x4e40
    transform: scale(0.9) translate(0, 0.05)

  #31DE:
  #  font: ipamjm
  #  codepoint: 0x200d1
  #  transform: scale(0.9) translate(0, 0.05)

  31DF:
    font: ipamjm
    codepoint: 0x4e5a
    transform: scale(0.9) translate(0, 0.05)

  31E0:
    font: ipaexm
    codepoint: 0x4e59
    transform: scale(0.9) translate(0, 0.05)

  #31E1:
  #  font: ipamjm
  #  codepoint: 0x2010e
  #  transform: scale(0.9) translate(0, 0.05)

  31E3:
    font: babel-stone
    transform: scale(0.9) translate(0, 0.05)

  31E4..31EF: notdef

# Katakana Phonetic Extensions

31F0..31FF:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)


================================================
FILE: data/codepoints/3200.yml
================================================
# Enclosed CJK Letters and Months

3200..32FF:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

  3200..321E:
    font: hancom
    transform: scale(0.9) translate(0, 0.05)

  321F: notdef

  3244..324F:
    font: hanamin-a
    transform: scale(0.9) translate(0, 0.05)

  3250:
    font: hancom
    transform: scale(0.9) translate(0, 0.05)

  3260..327F:
    font: hancom
    transform: scale(0.9) translate(0, 0.05)

  32C0..32CF:
    font: hancom
    transform: scale(0.9) translate(0, 0.05)

  32FF: notdef

# CJK Compatibility

3300..33FF:
  font: ipaexm
  transform: scale(0.9) translate(0, 0.05)

  332C:
    svg: true
    transform: scale(0.85)

  3358..337A:
    font: hancom
    transform: scale(0.9) translate(0, 0.05)

  3380..33FF:
    font:
      - ipaexm
      - hancom
    transform: scale(0.9) translate(0, 0.05)


================================================
FILE: data/codepoints/3400.yml
================================================
# CJK Unified Ideographs Extension A

3400..4DBF:
  font:
    - noto-serif-jp
    - ipamjm
    - ipaexm
    - hanamin-a
  transform: scale(0.9) translate(0, 0.05)

  4DB6..4DBF: notdef

# Yijing Hexagram Symbols

4DC0..4DFF:
  font: nishiki
  transform: scale(0.9)

# CJK Unified Ideographs

4E00..9FFF:
  font:
    - noto-serif-jp
    - ipamjm
    - ipaexm
    - hanamin-a
  transform: scale(0.9) translate(0, 0.05)

  9FD6..9FFF: notdef


================================================
FILE: data/codepoints/A000.yml
================================================
# Yi Syllables

A000..A48F:
  font: noto-yi
  transform: scale(0.95) translate(0, 0.05)

  A48D..A48F: notdef

# Yi Radicals

A490..A4CF:
  font: noto-yi
  transform: scale(0.95) translate(0, 0.05)

  A4C7..A4CF: notdef

# Lisu

A4D0..A4FF:
  font: lisu

================================================
FILE: data/codepoints/A500.yml
================================================
# Vai

A500..A63F:
  font: wakor
  transform: scale(0.95)

  A62C..A63F: notdef

# Cyrillic Extended-B

A640..A69F:
  font: quivira
  transform: scale(0.75)

  A66F:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0, -0.1)

  A670:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0.4, 0)

  A671:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0.25, 0)

  A672:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0.42, 0)

  A673:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0, -0.25)

  A674..A67D:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0, -0.05)

  A69E:
    font: free-serif-bold
    combining: true
    codepoint: 0x0444
    transform: translate(0, -0.35) scale(0.35)

  A69F:
    font: quivira
    combining: true
    transform: scale(0.75) translate(0, -0.1)

# Bamum

A6A0..A6FF:
  font: noto-bamum
  transform: scale(0.8)

  A6F0..A6F1:
    font: noto-bamum
    combining: true
    transform: scale(0.8) translate(-0.35, 0.2)

  A6F8..A6FF: notdef

# Modifier Tone Letters

A700..A71F:
  font: charis
  transform: scale(0.9)

  A700..A707:
    font: charis
    transform: scale(0.9) translate(0, -0.05)

  A71E..A71F:
    font: charis
    transform: scale(0.9) translate(0, -0.15)

# Latin Extended-D

A720..A7FF:
  font: doulos
  transform: scale(0.8)

  A78F:
    font: doulos
    codepoint: 0x00B7

  A79A..A79F:
    font: quivira
    transform: scale(0.8)

  # FIXME
  A7AE:
    font: doulos
    codepoint: 0x0054
    transform: scale(0.8)

  A7AF: notdef

  A7B3:
    font: free-serif
    codepoint: 0x03C7
    transform: scale(0.8)

  A7B4:
    font: free-serif
    codepoint: 0x0392
    transform: scale(0.8)

  A7B5:
    font: free-serif
    codepoint: 0x03B2
    transform: scale(0.8)

  A7B6:
    font: free-serif
    codepoint: 0x0460
    transform: scale(0.8)

  A7B7:
    font: free-serif
    codepoint: 0x03C9
    transform: scale(0.8)

  A7B8..A7F6: notdef


================================================
FILE: data/codepoints/A800.yml
================================================
# Syloti Nagri

A800..A82F:
  font: noto-syloti-nagri
  transform: scale(0.8)

  A802:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  A806:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.2, 0.1)

  A80B:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  A823..A824:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  A825:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.2, -0.15)

  A826:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.2, 0.15)

  A827:
    font: noto-syloti-nagri
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  A82C..A82F: notdef

# Common Indic Number Forms

A830..A83F:
  font: annapurna
  transform: scale(0.8)

  A839:
    font: annapurna
    transform: scale(0.8) translate(0, -0.1)

  A83A..A83F: notdef

# Phags-pa

A840..A87F:
  font: babel-phags-pa
  transform: scale(0.8)

  A878..A87F: notdef

# Saurashtra

A880..A8DF:
  font: pagul
  transform: scale(0.9)

  A880..A881:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.3, 0)

  A8B4:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.35, 0)

  A8B5:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.3, 0)

  A8B6:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.3, 0.1)

  A8B7:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.3, 0)

  A8B8..A8BC:
    font: pagul
    combining: true
    transform: scale(0.7, 0.9) translate(0.45, 0)

  A8BD:
    font: pagul
    combining: true
    transform: scale(0.35, 0.9) translate(0.9, 0)

  A8BE..A8C1:
    font: pagul
    combining: true
    transform: scale(0.7, 0.9) translate(0.45, 0)

  A8C2..A8C3:
    font: pagul
    combining: true
    transform: scale(0.5, 0.9) translate(0.6, 0)

  A8C4:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.3, -0.15)

  A8C5:
    font: pagul
    combining: true
    transform: scale(0.9) translate(0.3, 0.2)

  A8C6..A8CD: notdef
  A8DA..A8DF: notdef

# Devanagari Extended

A8E0..A8FF:
  font: annapurna
  transform: scale(0.8)

  A8E0..A8F1:
    font: annapurna
    combining: true
    transform: scale(0.8) translate(0.2, 0.4)

  # FIXME
  A8FC..A8FD: notdef

  A8FE..A8FF: notdef

# Kayah Li

A900..A92F:
  font: noto-kayah-li
  transform: scale(0.8)

  A926..A92A:
    font: noto-kayah-li
    combining: true
    transform: scale(0.8) translate(0.38, 0)

  A92B..A92D:
    font: noto-kayah-li
    combining: true
    transform: scale(0.8) translate(0.38, -0.1)

# Rejang

A930..A95F:
  font: noto-rejang
  transform: scale(0.8)

  A947..A949:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.3, 0)

  A94A:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.2, 0.2)

  A94B:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.35, 0)

  A94C:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.25, -0.15)

  A94D:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.2, -0.1)

  A94E:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(0, -0.1)

  A94F..A951:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.2, 0.2)

  A952:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  A953:
    font: noto-rejang
    combining: true
    transform: scale(0.8) translate(-0.2, 0.2)

  A954..A95E: notdef

# Hangul Jamo Extended-A

A960..A97F:
  font: unbatang
  transform: translate(0.14, -0.03)

  A97D..A97F: notdef

# Javanese

A980..A9DF:
  font: noto-javanese
  transform: scale(0.6) translate(0, -0.2)

  A980:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(-0.3, 0)

  A981:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(-0.1, -0.1)

  A982:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(-0.2, -0.1)

  A983:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(0.4, -0.2)

  A9B3:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(-0.2, -0.1)

  A9B4..A9B5:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(0.4, -0.1)

  A9B6..A9B7:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(-0.2, 0)

  A9B8..A9B9:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(0.6, -0.2)

  A9BA..A9BB:
    font: noto-javanese
    combining: true
    transform: scale(0.5, 0.6) translate(-0.6, -0.2)

  A9BC:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(-0.2, -0.1)

  A9BD..A9BF:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(0.4, -0.1)

  A9C0:
    font: noto-javanese
    combining: true
    transform: scale(0.6) translate(0.2, -0.1)

  A9C1..A9C2:
    font: noto-javanese
    transform: scale(0.5) translate(0, -0.4)

  A9C3..A9C5:
    font: noto-javanese
    transform: scale(0.4, 0.5) translate(0, -0.2)

  A9CD:
    font: noto-javanese
    transform: scale(0.6) translate(0, -0.4)

  A9CE: notdef
  A9DA..A9DD: notdef

# Myanmar Extended-B

A9E0..A9FF:
  font: padauk
  transform: scale(0.65) translate(0, -0.1)

  A9E5:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.15, -0.1)

  A9FF: notdef


================================================
FILE: data/codepoints/AA00.yml
================================================
# Cham

AA00..AA5F:
  font: noto-cham
  transform: scale(0.8)

  AA0F:
    font: noto-cham
    transform: scale(0.8) translate(0.1, 0)

  AA29..AA2C:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  AA2D:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.2, 0.1)

  AA2E:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  AA2F..AA30:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(-0.4, 0)

  AA31:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  AA32:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.1, 0.1)

  AA33:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.5, 0)

  AA34:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(-0.3, 0)

  AA35:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.1, -0.1)

  AA36:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.2, -0.1)

  AA43:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.3, 0.1)

  AA4C:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  AA4D:
    font: noto-cham
    combining: true
    transform: scale(0.8) translate(0.4, 0)

  AA37..AA3F: notdef
  AA4E..AA4F: notdef
  AA5A..AA5B: notdef

# Myanmar Extended-B

AA60..AA7F:
  font: padauk
  transform: scale(0.65) translate(0, -0.1)

  AA7B:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.3, -0.1)

  AA7C:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.25, -0.1)

  AA7D:
    font: padauk
    combining: true
    transform: scale(0.65) translate(0.5, -0.05)

# Tai Viet

AA80..AADF:
  font: tai-heritage
  transform: scale(0.5) translate(-0.1, 0)

  AA8B:
    font: tai-heritage
    transform: scale(0.5) translate(-0.1, -0.2)

  AAAF:
    font: tai-heritage
    transform: scale(0.5) translate(-0.1, -0.2)

  AAB0:
    font: tai-heritage
    combining: true
    transform: scale(0.5) translate(0.1, 0.1)

  AAB2..AAB3:
    font: tai-heritage
    combining: true
    transform: scale(0.5) translate(0.1, 0.1)

  AAB4:
    font: tai-heritage
    combining: true
    transform: scale(0.5) translate(0.3, 0)

  AAB7..AAB8:
    font: tai-heritage
    combining: true
    transform: scale(0.5) translate(0.1, 0.1)

  AABE..AABF:
    font: tai-heritage
    combining: true
    transform: scale(0.5) translate(0.1, 0.1)

  AAC1:
    font: tai-heritage
    combining: true
    transform: scale(0.5) translate(0.1, 0.3)

  AAC3..AADA: notdef

# Meetei Mayek Extensions

AAE0..AAFF:
  font: noto-meetei-mayek
  transform: scale(0.8)

  AAEB:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(-0.35, 0)

  AAEC:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.25, -0.15)

  AAED:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.35, 0.15)

  AAEE:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(-0.4, 0)

  AAEF:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.4, 0)

  AAF5:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, -0.2)

  AAF6:
    font: noto-meetei-mayek
    combining: true
    box: true
    transform: scale(0.8) translate(0.5, -0.2)

  AAF7..AAFF: notdef

# Ethiopic Extended-A

AB00..AB2F:
  font: abyssinica
  transform: scale(0.8)

  AB00: notdef
  AB07..AB08: notdef
  AB0F..AB10: notdef
  AB17..AB1F: notdef
  AB27: notdef
  AB2F: notdef

# Latin Extended-E

AB30..AB6F:
  font: quivira
  transform: scale(0.8)

  # FIXME
  AB60..AB63: notdef

  AB66..AB6F: notdef

# Cherokee Supplement

AB70..ABBF:
  font: noto-cherokee
  transform: scale(0.8)

# Meetei Mayek

ABC0..ABFF:
  font: noto-meetei-mayek
  transform: scale(0.8)

  ABE3..ABE4:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  ABE5:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, 0.2)

  ABE6:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.35, 0.2)

  ABE7:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  ABE8:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.25, -0.2)

  ABE9:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, 0.2)

  ABEA:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, 0.2)

  ABEC:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.8) translate(0.3, 0)

  ABED:
    font: noto-meetei-mayek
    combining: true
    transform: scale(0.7) translate(-0.05, -0.1)

  ABEE..ABEF: notdef
  ABFA..ABFF: notdef


================================================
FILE: data/codepoints/AC00.yml
================================================
# Hangul Syllables

AC00..D7AF:
  font: noto-serif-jp
  transform: scale(0.9)

  D7A4..D7AF: notdef

================================================
FILE: data/layouts/bmp-1.ai
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e63380405b19b32ec296c6eefe51734223ed96d9d8583f3396b0c8d371be23ea
size 4030616


================================================
FILE: data/layouts/bmp-2.ai
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:fc5b77deafa0bc6f6f8fcf51688adf24e171ae116be4951ef98e319288d46140
size 4092613


================================================
FILE: data/layouts/bmp-3.ai
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:7f6f71d4b733461041bf65faaf851b43a33d9ed55f44c97fb53fb861e7717d4a
size 3970740


================================================
FILE: index.ls
================================================
require! {
  'mz/fs'
  './lib/util': {log, now}
  './lib/download-fonts'
  './lib/load-codepoints'
  './lib/generate-svg'
  './lib/convert-to-png'
  './lib/convert-to-pdf'
  './lib/compose-poster'
  './configs'
  'bluebird': Promise
}

now ->
  log 'Downloading fonts...'
  download-fonts!

.then ->
  log 'Loading codepionts...'
  load-codepoints!

.then (codepoints) ->

  Promise.map-series configs, (config) ->
    chart-svg = "#{config.name}-chart.svg"
    poster-svg = "#{config.name}-poster.svg"
    poster-png = "#{config.name}-poster.png"
    poster-pdf = "#{config.name}-poster.pdf"

    now ->
      log "Generating #{config.name} SVG..."
      generate-svg codepoints, config

    .then (svg) ->
      Promise.all [
        * now ->
            log "Writing #chart-svg..."
            fs.write-file chart-svg, svg
        * now ->
            log "Composing #poster-svg..."
            compose-poster svg, config
      ]

    .then ([_, poster]) ->
      Promise.all [
        * now ->
            log "Writing #poster-svg..."
            fs.write-file poster-svg, poster
        * now ->
            log "Generating #poster-png..."
            convert-to-png poster
          .then (png) ->
            log "Writing #poster-png..."
            fs.write-file poster-png, png
      ]

    .then ->
      log "Generating #poster-pdf..."
      convert-to-pdf poster-svg, poster-pdf

.then ->
  log 'Done.'

.catch (error) ->
  console.error error
  process.exit 1


================================================
FILE: lib/codepoint-builder.ls
================================================
require! {
  './util': {merge-maps}
}

flatten = (object, {start, end}) ->
  # Define model
  model =
    | object is \notdef
      type: \notdef
    | object is \tofu
      type: \tofu
    | object.has-own-property \font =>
      type: \font
      font-name: if typeof! object.font is \Array then object.font else [object.font]
      codepoint: object.codepoint
    | object.has-own-property \control =>
      type: \control
      short-name: object.control
    | object.has-own-property \svg =>
      type: \svg
    | otherwise => throw new Error 'Type not specified'

  if model.type is \control and typeof! model.short-name is \String
    model.short-name .= split '\n' .filter (.length > 0)

  if model.type in <[font svg]>
    for transform in <[transform scale skew translate rotate combining box early]>
      if object[transform]?
        model[transform] = object[transform]

  map = new Map!

  # Calculate overrides first
  for key, value of object
    codepoints = key.split '..'

    continue unless codepoints.every (.match /[\da-f]{4,5}/i)

    codepoints .= map (parse-int _, 16)

    [submap-start, submap-end] =
      if codepoints.length is 1
        codepoints[0 0]
      else
        codepoints[0 1]

    submap = flatten value, do
      start: submap-start
      end: submap-end

    for codepoint from submap-start to submap-end
      map.set codepoint, submap.get codepoint

  # Interpolate by models
  for codepoint from start to end
    unless map.has codepoint
      clone = Object.assign {}, model

      if model.type is \font
        if typeof! model.codepoint is \Array
          clone.codepoint = clone.codepoint[codepoint - start]

      if model.type is \control
        if typeof! model.short-name is \Array
          clone.short-name = clone.short-name[codepoint - start]

      map.set codepoint, clone

  map

module.exports = (object) ->
  maps = for key, value of object
    codepoints = key.split '..' .map (parse-int _, 16)

    [start, end] =
      if codepoints.length is 1
        codepoints[0 0]
      else
        codepoints[0 1]

    flatten value, {start, end}

  merge-maps maps


================================================
FILE: lib/compose-poster.ls
================================================
require! {
  'mz/fs'
  './util': {log}
  jsdom
  progress: Progress
  xmlserializer
}

module.exports = (chart-svg, config) ->
  poster-svg <- fs.read-file "data/layouts/#{config.layout}.svg" .then

  resolve, reject <- new Promise _

  error, window <- jsdom.env '' [require.resolve 'snapsvg']
  return reject error if error

  {Snap, document} = window

  paper = Snap 7016 9933 # 594x841mm * 300dpi

  root-group = paper.group!
  root-group.transform "scale(#{300 / 72})"

  chart = paper.group!append-to root-group
  poster = paper.group!append-to root-group

  chart-element = Snap.parse chart-svg
  for child in Array::slice.call chart-element.node.children, 0
    chart.append child

  poster-element = Snap.parse poster-svg
  for child in Array::slice.call poster-element.node.children, 0
    poster.append child

  chart.transform "translate(#{config.chart.x}, #{config.chart.y}) scale(#{1627.09 / 3840})"

  svg = xmlserializer.serialize-to-string paper.node
  window.close!

  resolve svg


================================================
FILE: lib/convert-to-pdf.ls
================================================
require! {
  nightmare: Nightmare
  'file-url'
}

module.exports = (svg-path, pdf-path) ->
  nightmare = Nightmare!

  nightmare
  .goto file-url svg-path
  .evaluate ->
    svg = document.query-selector 'svg'
    svg.set-attribute 'viewBox', '0 0 7016 9933'
    svg.set-attribute 'width', '594mm'
    svg.set-attribute 'height', '841mm'
  .pdf pdf-path, do
    margins-type: 1
    page-size:
      width: 594000
      height: 841000
      print-background: false
      landscape: false
  .end!


================================================
FILE: lib/convert-to-png.ls
================================================
require! {
  svg2png
}

module.exports = (svg) ->
  svg-data = Buffer.from svg
  svg2png svg-data


================================================
FILE: lib/download-fonts.ls
================================================
require! {
  path
  download
  './util': {log, now}
  'mz/fs'
  'mkdirp-then': mkdirp
  bluebird: Promise
}

fonts =
  'Symbola': 'https://www.wfonts.com/download/data/2016/04/23/symbola/symbola.zip'
  'Noto': 'https://noto-website.storage.googleapis.com/pkgs/Noto-unhinted.zip'
  'IPAexm': 'https://moji.or.jp/wp-content/ipafont/IPAexfont/ipaexm00401.zip'
  'IPAmjm': 'https://dforest.watch.impress.co.jp/library/i/ipamjfont/10750/ipamjm00601.zip'
  'hanazono': 'http://jaist.dl.osdn.jp/hanazono-font/64385/hanazono-20160201.zip'
  'Doulos': 'https://software.sil.org/downloads/r/doulos/DoulosSIL-5.000.zip'
  'FreeFont': 'https://ftp.gnu.org/gnu/freefont/freefont-ttf-20120503.zip'
  'Hancom': 'http://cdn.hancom.com/pds/docs/HancomFont.zip'
  'Scheherazade': 'http://software.sil.org/downloads/r/scheherazade/Scheherazade-2.100.zip'
  'Annapurna': 'http://software.sil.org/downloads/r/annapurna/AnnapurnaSIL-1.202.zip'
  'Manjari': 'http://www.malayalamtype.com/fonts/Manjari-Regular.ttf'
  'tlwg': 'https://linux.thai.net/pub/thailinux/software/fonts-tlwg/fonts/ttf-tlwg-0.5.0.tar.gz'
  'Jomolhari': 'https://collab.its.virginia.edu/access/content/group/26a34146-33a6-48ce-001e-f16ce7908a6a/Tibetan%20fonts/Tibetan%20Unicode%20Fonts/Jomolhari-alpha003.zip'
  'Padauk': 'http://software.sil.org/downloads/r/padauk/padauk-3.002.zip'
  'Quivira': 'http://www.quivira-font.com/files/Quivira.otf'
  'UnFonts': 'http://ftp.jaist.ac.jp/pub/Linux/Momonga/development/source/SOURCES/2607-un-fonts-core-1.0.2-080608.tar.gz'
  'Abyssinica': 'http://software.sil.org/downloads/r/abyssinica/AbyssinicaSIL-1.500.zip'
  'NotoSansCherokee': 'https://github.com/googlefonts/noto-fonts-alpha/raw/main/from-glyphsapp/unhinted/ttf/sans/NotoSansCherokee-Regular.ttf'
  'MongolianScript': 'https://web.archive.org/web/20160707014328if_/http://font.bolorsoft.com/download/fonts.zip'
  'Namdhinggo': 'http://scripts.sil.org/cms/scripts/render_download.php?format=file&media_id=NamdhinggoSIL1.004&filename=NamdhinggoSIL1.004.zip'
  'DaiBanna': 'http://scripts.sil.org/cms/scripts/render_download.php?format=file&media_id=DaiBanna-2.200.zip&filename=DaiBanna-2.200.zip'
  'Nishiki': 'https://umihotaru.work/nishiki-teki.zip'
  'Mingzat': 'http://scripts.sil.org/cms/scripts/render_download.php?format=file&media_id=Mingzat-0.100&filename=Mingzat-0.100.zip'
  'PonomarUnicode': 'http://www.ponomar.net/files/PonomarUnicode.zip'
  'junicode': 'https://sourceforge.net/projects/junicode/files/junicode/junicode-0-7-8/junicode-0-7-8.zip'
  'BTC': 'https://github.com/RWOverdijk/BitKey/raw/master/client/src/fonts/BTC.ttf'
  'ObserverSymbol': 'http://hypertexthero.com/static/img/observer-symbol/observer-symbol-latest.zip'
  'Analecta': 'https://www.wfonts.com/download/data/2016/06/09/analecta/analecta.zip'
  'BabelStoneHan': 'http://www.babelstone.co.uk/Fonts/Download/BabelStoneHan.zip'
  'OpenSans': 'http://www.opensans.com/download/open-sans.zip'
  'DejaVu': 'https://sourceforge.net/projects/dejavu/files/dejavu/2.37/dejavu-fonts-ttf-2.37.zip'
  'JGLao': 'https://github.com/hakatashi/font-archive/raw/master/jglao.zip'
  'NotoSerifCJKjp': 'https://noto-website.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip'
  'LisuUnicode': 'https://github.com/phjamr/LisuUnicode/raw/master/LisuUnicode-Regular.ttf'
  'Wakor': 'http://www.evertype.com/fonts/vai/wakorfont.zip'
  'Charis': 'https://software.sil.org/downloads/r/charis/CharisSIL-5.000.zip'
  'BabelStonePhagsPa': 'http://www.babelstone.co.uk/Fonts/Download/BabelStonePhagspaBook_v2.ttf'
  'Pagul': 'https://sourceforge.net/projects/pagul/files/Pagul_v1.0.zip'
  'TaiHeritage': 'https://software.sil.org/downloads/r/taiheritage/TaiHeritagePro-2.600.zip'

module.exports = ->
  Promise.each do
    * Object.keys fonts
    * (directory) ->
        url = fonts[directory]
        path-name = path.join \fonts directory

        now ->
          fs.readdir path-name
        .then (files) ->
          return Promise.reject! if files.length is 0
          log "#directory is already downloaded."
        .catch ->
          log "#path-name not exists. Downloading..."

          mkdirp path-name
          .then ->
            headers =
              if directory is 'Hancom'
                {referer: 'http://www.hancom.com/'}
              else if directory in <[Namdhinggo DaiBanna Mingzat]>
                {accept: '*/*'}
              else
                {}

            extract =
              if directory in <[Quivira NotoSansCherokee BTC Manjari LisuUnicode BabelStonePhagsPa]>
                false
              else
                true

            download url, path-name, {extract, headers}


================================================
FILE: lib/generate-svg.ls
================================================
require! {
  'mz/fs'
  './util': {log, to-hex}
  jsdom
  path
  hilbert: {Hilbert2d}
  progress: Progress
  xmlserializer
  'opentype.js'
  'camel-case'
  util
}

font-counts = new Map!

font-data =
  doulos:
    name: 'Doulos SIL 5.000'
    URL: 'http://software.sil.org/doulos/'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Doulos/DoulosSIL-5.000/DoulosSIL-R.ttf'
  symbola:
    name: 'Symbola'
    URL: 'http://users.teilar.gr/~g1951d/'
    author: 'George Douros'
    license: 'Permissive License'
    licenseURL: 'http://users.teilar.gr/~g1951d/'
    path: 'Symbola/Symbola.ttf'
  ipamjm:
    name: 'IPA mj Mincho'
    URL: 'https://moji.or.jp/mojikiban/font/'
    author: 'Information-technology Promotion Agency, Japan (IPA)'
    license: 'IPA Font License v1.0'
    licenseURL: 'https://moji.or.jp/ipafont/license/'
    path: 'IPAmjm/ipamjm.ttf'
  ipaexm:
    name: 'IPA ex Mincho'
    URL: 'https://moji.or.jp/ipafont/ipaex00401/'
    author: 'Information-technology Promotion Agency, Japan (IPA)'
    license: 'IPA Font License v1.0'
    licenseURL: 'https://moji.or.jp/ipafont/ipaex00401'
    path: 'IPAexm/ipaexm00401/ipaexm.ttf'
  hanamin-a:
    name: 'Hanazono Mincho'
    URL: 'http://fonts.jp/hanazono/'
    author: 'GlyphWiki Project'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'hanazono/HanaMinA.ttf'
  free-serif:
    name: 'GNU FreeFont'
    URL: 'https://www.gnu.org/software/freefont/'
    author: 'GNU FreeFont Contributors'
    license: 'GPLv3+FE'
    licenseURL: 'https://www.gnu.org/software/freefont/license.html'
    path: 'FreeFont/freefont-20120503/FreeSerif.ttf'
  free-serif-bold:
    name: 'GNU FreeFont'
    URL: 'https://www.gnu.org/software/freefont/'
    author: 'GNU FreeFont Contributors'
    license: 'GPLv3+FE'
    licenseURL: 'https://www.gnu.org/software/freefont/license.html'
    path: 'FreeFont/freefont-20120503/FreeSerifBold.ttf'
  noto:
    name: 'Noto Fonts'
    URL: 'https://www.google.com/get/noto/'
    author: 'Google Inc.'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
  noto-hebrew:
    path: 'Noto/NotoSansHebrew-Regular.ttf'
  noto-arabic:
    path: 'Noto/NotoNaskhArabic-Regular.ttf'
  noto-syriac:
    path: 'Noto/NotoSansSyriacEastern-Regular.ttf'
  noto-nko:
    path: 'Noto/NotoSansNKo-Regular.ttf'
  noto-samaritan:
    path: 'Noto/NotoSansSamaritan-Regular.ttf'
  noto-mandaic:
    path: 'Noto/NotoSansMandaic-Regular.ttf'
  noto-bengali:
    path: 'Noto/NotoSerifBengali-Regular.ttf'
  noto-gujarati:
    path: 'Noto/NotoSerifGujarati-Regular.ttf'
  noto-tamil:
    path: 'Noto/NotoSerifTamil-Regular.ttf'
  noto-telugu:
    path: 'Noto/NotoSerifTelugu-Regular.ttf'
  noto-kannada:
    path: 'Noto/NotoSerifKannada-Regular.ttf'
  noto-malayalam:
    path: 'Noto/NotoSerifMalayalam-Regular.ttf'
  noto-lao:
    path: 'Noto/NotoSerifLao-Regular.ttf'
  noto-tibetan:
    path: 'Noto/NotoSansTibetan-Regular.ttf'
  noto-georgian:
    path: 'Noto/NotoSerifGeorgian-Regular.ttf'
  noto-cherokee:
    path: 'NotoSansCherokee/NotoSansCherokee-Regular.ttf'
  noto-canadian-aboriginal:
    path: 'Noto/NotoSansCanadianAboriginal-Regular.ttf'
  noto-ogham:
    path: 'Noto/NotoSansOgham-Regular.ttf'
  noto-runic:
    path: 'Noto/NotoSansRunic-Regular.ttf'
  noto-tagalog:
    path: 'Noto/NotoSansTagalog-Regular.ttf'
  noto-tagbanwa:
    path: 'Noto/NotoSansTagbanwa-Regular.ttf'
  noto-khmer:
    path: 'Noto/NotoSerifKhmer-Regular.ttf'
  noto-tai-tham:
    path: 'Noto/NotoSansTaiTham-Regular.ttf'
  noto-balinese:
    path: 'Noto/NotoSansBalinese-Regular.ttf'
  noto-sundanese:
    path: 'Noto/NotoSansSundanese-Regular.ttf'
  noto-batak:
    path: 'Noto/NotoSansBatak-Regular.ttf'
  noto-ol-chiki:
    path: 'Noto/NotoSansOlChiki-Regular.ttf'
  noto-devanagari:
    path: 'Noto/NotoSerifDevanagari-Regular.ttf'
  noto-serif:
    path: 'Noto/NotoSerif-Regular.ttf'
  noto-tifinagh:
    path: 'Noto/NotoSansTifinagh-Regular.ttf'
  noto-yi:
    path: 'Noto/NotoSansYi-Regular.ttf'
  noto-bamum:
    path: 'Noto/NotoSansBamum-Regular.ttf'
  noto-syloti-nagri:
    path: 'Noto/NotoSansSylotiNagri-Regular.ttf'
  noto-kayah-li:
    path: 'Noto/NotoSansKayahLi-Regular.ttf'
  noto-rejang:
    path: 'Noto/NotoSansRejang-Regular.ttf'
  noto-javanese:
    path: 'Noto/NotoSansJavanese-Regular.ttf'
  noto-cham:
    path: 'Noto/NotoSansCham-Regular.ttf'
  noto-meetei-mayek:
    path: 'Noto/NotoSansMeeteiMayek-Regular.ttf'
  noto-cjk-jp:
    path: 'Noto/NotoSansCJKjp-Light.otf'
  noto-serif-jp:
    path: 'NotoSerifCJKjp/NotoSerifCJKjp-Regular.otf'
  scheherazade:
    name: 'Scheherazade 2.100'
    URL: 'http://software.sil.org/scheherazade/'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Scheherazade/Scheherazade-2.100/Scheherazade-Regular.ttf'
  scheherazade-bold:
    path: 'Scheherazade/Scheherazade-2.100/Scheherazade-Bold.ttf'
  annapurna:
    name: 'Annapurna SIL 1.202'
    URL: 'http://software.sil.org/annapurna/'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Annapurna/AnnapurnaSIL-1.202/AnnapurnaSIL-Regular.ttf'
  manjari:
    name: 'Manjari'
    URL: 'https://github.com/santhoshtr/Manjari'
    author: 'Santhosh Thottingal, Kavya Manohar'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Manjari/Manjari-Regular.ttf'
  norasi:
    name: 'Norasi'
    URL: 'https://linux.thai.net/projects/fonts-tlwg'
    author: 'The National Font Project (v.beta), Yannis Haralambous, Virach Sornlertlamvanich, and Anutara Tantraporn, with modification by Thai Linux Working Group (TLWG)'
    license: 'GPLv2+FE'
    licenseURL: 'https://github.com/tlwg/fonts-tlwg/blob/master/COPYING'
    path: 'tlwg/ttf-tlwg-0.5.0/Norasi.ttf'
  jomolhari:
    name: 'Jomolhari 000.003c'
    URL: 'https://collab.itc.virginia.edu/wiki/tibetan-script/Jomolhari.html'
    author: 'THL Staff'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Jomolhari/Jomolhari-alpha3c-0605331.ttf'
  padauk:
    name: 'Padauk 3.002'
    URL: 'http://software.sil.org/padauk/'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Padauk/padauk-3.002/PadaukBook-Regular.ttf'
  quivira:
    name: 'Quivira 4.1'
    URL: 'http://www.quivira-font.com/'
    author: 'Alexander Lange'
    license: 'Permissive License'
    licenseURL: 'http://www.quivira-font.com/notes.php'
    path: 'Quivira/Quivira.otf'
  unbatang:
    name: 'UnBatang'
    URL: 'https://kldp.net/unfonts/'
    author: 'Koanughi Un, Won-kyu Park, and Jungshik Shin'
    license: 'GPLv2'
    licenseURL: 'http://www.gnu.org/licenses/gpl.txt'
    path: 'UnFonts/un-fonts/UnBatang.ttf'
  abyssinica:
    name: 'Abyssinica SIL 1.500'
    URL: 'http://software.sil.org/abyssinica/'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Abyssinica/AbyssinicaSIL-1.500/AbyssinicaSIL-R.ttf'
  hancom:
    name: 'HCRBatang'
    URL: 'http://www.hancom.com/cs_center/csDownload.do'
    author: 'Hancom INC(HNC)'
    license: 'Permissive License'
    licenseURL: 'http://www.hancom.com/cs_center/csDownload.do'
    path: 'Hancom/HANBatang.ttf'
  mongolian-script:
    name: 'MongolianScript'
    URL: 'http://mongol.openmn.org/'
    author: 'Myataviin Erdenechimeg and Bolorsoft LLC'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'MongolianScript/fonts/MongolianScript.ttf'
  namdhinggo:
    name: 'Namdhinggo SIL 1.004'
    URL: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=NamdhinggoSIL'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Namdhinggo/NamdhinggoSIL/NamdhinggoSIL-R.ttf'
  dai-banna:
    name: 'Dai Banna SIL 2.200'
    URL: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=daibannasil'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'DaiBanna/dai-banna-2.200/DBSILBR.ttf'
  nishiki:
    name: 'Nishiki-teki Font'
    URL: 'https://umihotaru.work/'
    author: 'Umihotaru'
    license: 'Permissive License'
    licenseURL: 'https://umihotaru.work/faq.txt'
    path: 'Nishiki/nishiki-teki.ttf'
  mingzat:
    name: 'Mingzat 0.100'
    URL: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=Mingzat'
    author: 'SIL International'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Mingzat/Mingzat/Mingzat-R.ttf'
  ponomar:
    name: 'Ponomar Unicode'
    URL: 'http://www.ponomar.net/cu_support/fonts.html'
    author: 'Vlad Dorosh, Aleksandr Andreev, Yuri Shardt, and Nikita Simmons'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'PonomarUnicode/PonomarUnicode.otf'
  junicode:
    name: 'Junicode'
    URL: 'http://junicode.sourceforge.net/'
    author: 'Peter S. Baker'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'junicode/junicode/fonts/Junicode.ttf'
  btc:
    name: 'BTC.ttf'
    URL: 'https://en.bitcoin.it/wiki/Template:BTC'
    author: 'theymos'
    license: 'Public domain'
    licenseURL: ''
    path: 'BTC/BTC.ttf'
  observer-symbol:
    name: 'ObserverSymbol'
    URL: 'https://www.simongriffee.com/notebook/international-symbol-observer/'
    author: 'Simon Griffee'
    license: 'CC0 1.0 Universal'
    licenseURL: 'https://creativecommons.org/publicdomain/zero/1.0/'
    path: 'ObserverSymbol/ObserverSymbol.ttf'
  analecta:
    name: 'Analecta'
    URL: 'http://users.teilar.gr/~g1951d/'
    author: 'George Douros'
    license: 'Permissive License'
    licenseURL: 'http://users.teilar.gr/~g1951d/'
    path: 'Analecta/Analecta.otf'
  babel-stone:
    name: 'BabelStone Han'
    URL: 'http://www.babelstone.co.uk/Fonts/Han.html'
    author: 'Arphic Technology Co., Ltd.'
    license: 'Arphic Public License'
    licenseURL: 'http://ftp.gnu.org/non-gnu/chinese-fonts-truetype/LICENSE'
    path: 'BabelStoneHan/BabelStoneHan.ttf'
  open-sans:
    name: 'Open Sans'
    URL: 'http://www.opensans.com/'
    author: 'Steve Matteson and Google Corporation'
    license: 'Apache License v2'
    licenseURL: 'http://www.apache.org/licenses/LICENSE-2.0'
    path: 'OpenSans/OpenSans-Bold.ttf'
  dejavu:
    name: 'DejaVu Serif'
    URL: 'https://dejavu-fonts.github.io/'
    author: 'Bitstream'
    license: 'Free License'
    licenseURL: 'https://dejavu-fonts.github.io/License.html'
    path: 'DejaVu/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif.ttf'
  jglao:
    name: 'JG Lao Times'
    URL: 'https://web.archive.org/web/20090729181203/http://geocities.com/jglavy/asian.html'
    author: 'GlavyFonts'
    license: 'Permissive License'
    licenseURL: 'https://web.archive.org/web/20090729181203/http://geocities.com/jglavy/asian.html'
    path: 'JGLao/JG LaoTimesOT.ttf'
  lisu:
    name: 'LisuUnicode'
    URL: 'http://phjamr.github.io/lisu.html'
    author: 'phjamr'
    license: 'SIL OFL 1.1'
    licenseURL: 'https://github.com/phjamr/LisuUnicode/blob/master/LICENSE.md'
    path: 'LisuUnicode/LisuUnicode-Regular.ttf'
  wakor:
    name: 'Wakor'
    URL: 'http://www.evertype.com/fonts/vai/'
    author: 'Jason Glavy'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://www.evertype.com/fonts/vai/wakor-licence.html'
    path: 'Wakor/Wakor-4.0.7/Wakor.ttf'
  charis:
    name: 'Charis'
    URL: 'https://software.sil.org/charis/'
    author: 'SIL'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'Charis/CharisSIL-5.000/CharisSIL-R.ttf'
  babel-phags-pa:
    name: 'BabelStone Phags-pa Book'
    URL: 'http://www.babelstone.co.uk/Fonts/Phags-pa.html'
    author: 'Arphic Technology Co., Ltd.'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'BabelStonePhagsPa/BabelStonePhagspaBook_v2.ttf'
  pagul:
    name: 'PagulFont'
    URL: 'https://sourceforge.net/projects/pagul/'
    author: 'mooreprabu'
    license: 'GPLv3+FE'
    licenseURL: 'https://www.gnu.org/software/freefont/license.html'
    path: 'Pagul/Pagul.ttf'
  tai-heritage:
    name: 'Tai Heritage Pro'
    URL: 'https://software.sil.org/taiheritage/'
    author: 'SIL'
    license: 'SIL OFL 1.1'
    licenseURL: 'http://scripts.sil.org/ofl'
    path: 'TaiHeritage/TaiHeritagePro-2.600/TaiHeritagePro-Regular.ttf'

load-fonts = ->
  Promise.all do
    for let name, {path: short-path} of font-data
      if short-path is undefined
        Promise.resolve {}
      else
        new Promise (resolve, reject) ->
          full-path = path.join __dirname, \../fonts, short-path
          opentype.load full-path, (error, font) ->
            if error then reject error else resolve "#name": font
  .then (fonts) ->
    new Promise (resolve, reject) ->
      log 'All fonts loaded.'
      resolve Object.assign {}, ...fonts

load-glyphs = ->
  fs.readdir path.join __dirname, \../data/glyphs
  .then (files) ->
    Promise.all do
      for let file in files when path.extname(file) is '.svg'
        fs.read-file path.join __dirname, \../data/glyphs, file .then (glyph) ->
          "#{camel-case path.basename file, '.svg'}": glyph
  .then (glyphs) ->
    log 'All glyphs loaded.'
    Object.assign {}, ...glyphs

module.exports = (codepoint-infos, config) ->
  [fonts, custom-glyphs] <- Promise.all [
    load-fonts!
    load-glyphs!
  ] .then

  resolve, reject <- new Promise _

  error, window <- jsdom.env '' [require.resolve 'snapsvg']
  return reject error if error

  {Snap, document} = window

  hilbert = new Hilbert2d 256

  block-size = 30

  paper = Snap 128 * block-size, 128 * block-size

  path-string = ''

  progress = new Progress 'Generating... [:bar] :current glyphs :elapseds' do
    incomplete: ' '
    width: 40
    total: 128 * 128

  anchors = paper.group!
  glyphs = paper.group!

  defined-characters = 0
  early-mapped-characters = 0

  start-xy = hilbert.xy config.codepoint

  for code-point from config.codepoint til config.codepoint + 128 * 128
    {x, y} = hilbert.xy code-point

    x -= start-xy.x
    y -= start-xy.y

    codepoint-info = codepoint-infos.get code-point

    continue unless codepoint-info?

    glyph-infos =
      for let name, font of fonts
        {name, font, glyph: font.char-to-glyph String.from-code-point(codepoint-info?.codepoint or code-point)}

    unless codepoint-info.type is \notdef
      defined-characters++

    if codepoint-info.early is true
      early-mapped-characters++

    if codepoint-info?.type is \notdef
      notdef-group = paper.group!

      # Draw box
      notdef = Snap.parse custom-glyphs.notdef
      for child in Array::slice.call notdef.node.children, 0
        notdef-group.append child

      notdef-group.attr transform: "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 2048})"

      glyphs.append notdef-group
    else if codepoint-info?.type is \tofu
      tofu-group = paper.group!

      # Draw box
      tofu = Snap.parse custom-glyphs.tofu
      for child in Array::slice.call tofu.node.children, 0
        tofu-group.append child

      tofu-group.attr transform: "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 2048})"

      glyphs.append tofu-group
    else if codepoint-info?.type is \control
      control-box-group = paper.group!

      # Draw box
      control-box = Snap.parse custom-glyphs.control-box
      for child in Array::slice.call control-box.node.children, 0
        control-box-group.append child

      # Draw text
      text-font = fonts.open-sans
      text-size = 768
      lines = codepoint-info.short-name.split '\\n'

      for line, line-index in lines
        text-path = text-font.get-path line, 1024, 1024, text-size .to-path-data!
        text = paper.path text-path
        text-width = text-font.string-to-glyphs line .reduce do
          * (a, b) -> a + b.advance-width / text-font.units-per-em * text-size
          * 0
        text.attr transform: "translate(#{- text-width / 2} #{(line-index - lines.length / 2 + 0.85) * text-size})"
        control-box-group.append text

      control-box-group.attr transform: "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 2048})"

      glyphs.append control-box-group
    else if codepoint-info?.type is \svg
      svg-font-group = paper.group!

      svg-group = paper.group!

      glyph-svg = Snap.parse custom-glyphs["u#{to-hex code-point}"]
      for child in Array::slice.call glyph-svg.node.children, 0
        svg-group.append child

      # Transform
      transform = Snap.matrix 1, 0, 0, 1, 0, 0
      transform.translate x * block-size, y * block-size
      if codepoint-info?.transform
        transform.scale block-size
        transform.translate 0.5, 0.5
        transform.add Snap._.transform2matrix Snap._.svg-transform2string codepoint-info?.transform
        transform.translate -0.5, -0.5
        transform.scale 1 / block-size
      transform.scale block-size / 1024
      svg-group.transform transform

      svg-font-group.append svg-group

      if codepoint-info?.box
        box-group = paper.group!

        box = Snap.parse custom-glyphs.control-box
        for child in Array::slice.call box.node.children, 0
          box-group.append child

        box-group.transform "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 2048})"

        svg-font-group.append box-group

      if codepoint-info?.combining
        combining-circle-group = paper.group!

        combining-circle = Snap.parse custom-glyphs.combining-circle
        for child in Array::slice.call combining-circle.node.children, 0
          combining-circle-group.append child

        combining-circle-group.transform "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 1024})"

        svg-font-group.append combining-circle-group

      glyphs.append svg-font-group
    else
      glyph-info =
        if codepoint-info?.type is \font
          if codepoint-info.font-name.length is 1
            glyph-infos.find (.name is camel-case codepoint-info.font-name)
          else
            font-names = codepoint-info.font-name.map camel-case
            font-name = font-names.find ((name) -> glyph-infos.some (-> it.name is name and it.glyph.unicode isnt undefined))
            glyph-infos.find (-> it.name is font-name)
        else if process.env.DEBUG is \true
          glyph-infos.find (.glyph.unicode isnt undefined)
        else
          undefined

      if glyph-info isnt undefined
        font-group = paper.group!

        width = glyph-info.glyph.advance-width / glyph-info.font.units-per-em * block-size
        glyph-path = glyph-info.glyph.get-path (block-size - width) / 2, 25, block-size .to-path-data!
        path = paper.path glyph-path

        font-count-name =
          if glyph-info.name.starts-with 'noto'
            'noto'
          else if glyph-info.name.starts-with 'scheherazade'
            'scheherazade'
          else
            glyph-info.name

        unless font-counts.has font-count-name
          font-counts.set font-count-name, 0

        font-counts.set font-count-name, 1 + font-counts.get font-count-name

        # Transform
        transform = Snap.matrix 1, 0, 0, 1, 0, 0
        # SVG Transform operation occurs by last-in-first-out order
        # http://stackoverflow.com/q/27635272
        transform.translate x * block-size, y * block-size
        if codepoint-info?.transform
          transform.scale block-size
          transform.translate 0.5, 0.5
          transform.add Snap._.transform2matrix Snap._.svg-transform2string codepoint-info?.transform
          transform.translate -0.5, -0.5
          transform.scale 1 / block-size
        path.transform transform

        font-group.append path

        if codepoint-info?.combining
          combining-circle-group = paper.group!

          combining-circle = Snap.parse custom-glyphs.combining-circle
          for child in Array::slice.call combining-circle.node.children, 0
            combining-circle-group.append child

          combining-circle-group.transform "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 1024})"

          font-group.append combining-circle-group

        if codepoint-info?.box
          box-group = paper.group!

          box = Snap.parse custom-glyphs.control-box
          for child in Array::slice.call box.node.children, 0
            box-group.append child

          box-group.transform "translate(#{x * block-size} #{y * block-size}) scale(#{block-size / 2048})"

          font-group.append box-group

        glyphs.append font-group

    if codepoint-info?.type isnt undefined
      temp-anchors = []
      anchor-group = paper.group!

      anchor-size = 2

      if x isnt 0x7F
        right-anchor1 = paper.line block-size, 0, block-size, anchor-size
        anchor-group.append right-anchor1

        right-anchor2 = paper.line block-size, block-size - anchor-size, block-size, block-size
        anchor-group.append right-anchor2

      if y isnt 0x7F
        bottom-anchor1 = paper.line 0, block-size, anchor-size, block-size
        anchor-group.append bottom-anchor1

        bottom-anchor2 = paper.line block-size - anchor-size, block-size, block-size, block-size
        anchor-group.append bottom-anchor2

      if x % 16 is 0 and x isnt 0 and y % 16 is 0 and y isnt 0
        big-anchor = paper.rect -anchor-size, -anchor-size, anchor-size * 2, anchor-size * 2
        big-anchor.transform 'rotate(45deg)'
        anchor-group.append big-anchor

      anchor-group.transform "translate(#{x * block-size} #{y * block-size})"
      anchors.append anchor-group

    if path-string.length is 0
      path-string += "M #{(x + 0.5) * block-size} #{(y + 0.5) * block-size} "
    else
      path-string += "L #{(x + 0.5) * block-size} #{(y + 0.5) * block-size} "

    progress.tick 128 if (code-point + 1) % 128 is 0

  anchors.attr do
    stroke-width: '0.5px'
    stroke: 'black'

  path = paper.path path-string
  path.attr do
    fill: 'none'
    stroke: 'black'
    stroke-opacity: 0.3
    stroke-width: 0.5
  path.prepend-to paper

  paper.node.set-attribute 'viewBox', '0 0 3840 3840'
  paper.node.set-attribute 'width', 7680
  paper.node.set-attribute 'height', 7680

  font-counts-list = Array.from font-counts
  font-counts-list.sort (a, b) -> b.1 - a.1
  font-license-text = font-counts-list.map ([font-name, font-count]) ->
    font = font-data[font-name]
    "#{font.name} by #{font.author} licensed under #{font.license}"
  .join '\n'
  font-count-text = font-counts-list.map ([font-name, font-count]) ->
    font = font-data[font-name]
    "#{font.name}: #{font-count}"
  .join '\n'

  console.log """

    ====== License notation ======

    #{font-license-text}
  """

  console.log """

    ====== Glyph count ======

    #{font-count-text}
  """

  console.log """

    ====== Statistics ======

  """

  console.log "Defined Characters: #{defined-characters}"
  console.log "Early Mapped Characters: #{early-mapped-characters}"

  log 'Rendering SVG...'

  svg = xmlserializer.serialize-to-string paper.node

  window.close!

  resolve svg


================================================
FILE: lib/load-codepoints.ls
================================================
require! {
  path
  'mz/fs'
  'yaml-js'
  './util': {log, now, merge-maps}
  './codepoint-builder'
}

module.exports = ->
  now ->
    fs.readdir 'data/codepoints'
  .then (files) ->
    yaml-files = files.filter -> it.slice -4 is '.yml'

    Promise.all yaml-files.map (yaml-file) ->
      fs.read-file path.resolve 'data/codepoints' yaml-file
      .then (yaml) ->
        object = yaml-js.load yaml

        codepoint-builder object

  .then (codepoint-maps) ->
    merge-maps codepoint-maps


================================================
FILE: lib/util.ls
================================================
export log = (text) ->
  date = new Date!
  date-string = date.to-ISO-string!
  memory = process.memory-usage!rss / (1024 * 1024) |> Math.floor
  console.log "[#date-string (Memory: #{memory}MiB)] #text"

export merge-maps = (maps) ->
  flattened-maps = maps.map (-> Array.from it) .reduce ((a, b) -> a ++ b), []
  new Map flattened-maps

# Just executes specified function and returns result.
# Used to beautify indentation in promise chains
export now = -> it!

export to-hex = (codepoint) ->
  if codepoint < 0x10000
    ('0000' + codepoint.to-string 16).slice -4
  else
    codepoint.to-string 16


================================================
FILE: package.json
================================================
{
  "name": "unicode-map",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "build": "node --max-old-space-size=4096 node_modules/livescript/bin/lsc index.ls",
    "watch": "concurrently \"npm run chokidar\" \"npm run livereload\"",
    "chokidar": "chokidar \"data/**/*.yml\" \"lib/*.ls\" -c \"lsc index.ls\"",
    "livereload": "livereload \"test.svg\" -d",
    "test": "mocha --compilers ls:livescript test/index.ls"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/hakatashi/unicode-map.git"
  },
  "keywords": [],
  "author": "Koki Takahashi <hakatasiloving@gmail.com> (http://hakatashi.com/)",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/hakatashi/unicode-map/issues"
  },
  "homepage": "https://github.com/hakatashi/unicode-map#readme",
  "dependencies": {
    "anymatch": "^1.3.2",
    "bluebird": "^3.5.1",
    "camel-case": "^3.0.0",
    "chai": "^3.5.0",
    "chokidar": "^1.7.0",
    "chokidar-cli": "^1.2.0",
    "concurrently": "^3.5.0",
    "download": "^5.0.3",
    "file-url": "^2.0.2",
    "hilbert": "^2.0.0",
    "jsdom": "^9.12.0",
    "livereload": "^0.6.3",
    "livescript": "^1.5.0",
    "mkdirp-then": "^1.2.0",
    "mocha": "^3.5.3",
    "mz": "^2.7.0",
    "nightmare": "^2.10.0",
    "no-case": "^2.3.2",
    "opentype.js": "^0.7.3",
    "optionator": "^0.8.2",
    "progress": "^1.1.8",
    "snapsvg": "^0.5.1",
    "svg2png": "^4.1.1",
    "xmlserializer": "^0.6.0",
    "yaml-js": "^0.1.5"
  }
}


================================================
FILE: test/codepoint-builder.ls
================================================
require! {
  './expect'
  '../lib/codepoint-builder'
}

{describe: Describe, it: It} = global

assets =
  * * 'extracts hex key and convert it to number'
    * F1B1: font: \testfont
    * 0xF1B1:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined

  * * 'recognizes codepoints over U+FFFF'
    * D109A: font: \testfont
    * 0xD109A:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined

  * * 'extracts code point range to the series of keys'
    * '0150..0153': font: \testfont
    * 0x0150:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined
      0x0151:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined
      0x0152:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined
      0x0153:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined

  * * 'accepts additional parameters'
    * '535A':
        font: \testfont
        codepoint: undefined
        scale: 0.5
    * 0x535A:
        type: \font
        font-name: <[testfont]>
        codepoint: undefined
        scale: 0.5

  * * 'supports nested notation'
    * '535A..535F':
        font: \font1
        '535B':
          font: \font2
        '535D..535E':
          font: \font3
    * 0x535A:
        type: \font
        font-name: <[font1]>
        codepoint: undefined
      0x535B:
        type: \font
        font-name: <[font2]>
        codepoint: undefined
      0x535C:
        type: \font
        font-name: <[font1]>
        codepoint: undefined
      0x535D:
        type: \font
        font-name: <[font3]>
        codepoint: undefined
      0x535E:
        type: \font
        font-name: <[font3]>
        codepoint: undefined
      0x535F:
        type: \font
        font-name: <[font1]>
        codepoint: undefined

  * * 'recognizes glyphs of type control'
    * '0102': control: \NUL
    * 0x0102:
        type: \control
        short-name: \NUL

  * * 'splats array of short-names into each characters'
    * '535A..535C': control: <[NUL SP CR]>
    * 0x535A:
        type: \control
        short-name: \NUL
      0x535B:
        type: \control
        short-name: \SP
      0x535C:
        type: \control
        short-name: \CR

  * * 'splats lines of short-names into each characters'
    * '535A..535C': control: '''
        NUL
        SP

        CR

      '''
    * 0x535A:
        type: \control
        short-name: \NUL
      0x535B:
        type: \control
        short-name: \SP
      0x535C:
        type: \control
        short-name: \CR

  * * 'recognizes glyphs of type svg'
    * '0102': svg: true
    * 0x0102:
        type: \svg

  * * 'recognizes glyphs of type notdef'
    * '0102': 'notdef'
    * 0x0102:
        type: \notdef

<- Describe 'Code Point Builder'

for let asset in assets
  It asset.0, ->
    expect codepoint-builder asset.1 .to.be.map asset.2


================================================
FILE: test/expect.ls
================================================
require! {
  chai
}

map-to-obj = (map) ->
  obj = Object.create null

  for [key, value] in Array.from map.entries!
    obj[key] = value

  obj

chai.use ({Assertion}, util) ->
  Assertion.add-method 'map' (expected) ->
    new Assertion @_obj .to.be.instanceof Map

    actual-obj = map-to-obj @_obj

    expected-obj =
      if expected instanceof Map
        map-to-obj expected
      else
        expected

    new Assertion actual-obj .to.deep.equal expected-obj

module.exports = chai.expect


================================================
FILE: test/index.ls
================================================
require! {
  './codepoint-builder'
}
Download .txt
gitextract_77ap7ofj/

├── .gitattributes
├── .gitignore
├── .travis.yml
├── README.md
├── configs/
│   ├── bmp-1.ls
│   ├── bmp-2.ls
│   ├── bmp-3.ls
│   └── index.ls
├── data/
│   ├── codepoints/
│   │   ├── 0000.yml
│   │   ├── 0800.yml
│   │   ├── 0A00.yml
│   │   ├── 0C00.yml
│   │   ├── 0E00.yml
│   │   ├── 1000.yml
│   │   ├── 1800.yml
│   │   ├── 1A00.yml
│   │   ├── 1C00.yml
│   │   ├── 1E00.yml
│   │   ├── 2000.yml
│   │   ├── 2200.yml
│   │   ├── 2C00.yml
│   │   ├── 2E00.yml
│   │   ├── 3000.yml
│   │   ├── 3200.yml
│   │   ├── 3400.yml
│   │   ├── A000.yml
│   │   ├── A500.yml
│   │   ├── A800.yml
│   │   ├── AA00.yml
│   │   └── AC00.yml
│   └── layouts/
│       ├── bmp-1.ai
│       ├── bmp-2.ai
│       └── bmp-3.ai
├── index.ls
├── lib/
│   ├── codepoint-builder.ls
│   ├── compose-poster.ls
│   ├── convert-to-pdf.ls
│   ├── convert-to-png.ls
│   ├── download-fonts.ls
│   ├── generate-svg.ls
│   ├── load-codepoints.ls
│   └── util.ls
├── package.json
└── test/
    ├── codepoint-builder.ls
    ├── expect.ls
    └── index.ls
Condensed preview — 46 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (151K chars).
[
  {
    "path": ".gitattributes",
    "chars": 514,
    "preview": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n\n# St"
  },
  {
    "path": ".gitignore",
    "chars": 1278,
    "preview": "# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nl"
  },
  {
    "path": ".travis.yml",
    "chars": 1813,
    "preview": "language: node_js\n\n# Sudo-enabled machines have much more memory\nsudo: required\n\nnode_js:\n  - node\n\nbefore_install:\n  # "
  },
  {
    "path": "README.md",
    "chars": 6188,
    "preview": "# The Unicode Map Project [![Build Status][travis-image]][travis-url] [![Greenkeeper badge][greenkeeper-image]][greenkee"
  },
  {
    "path": "configs/bmp-1.ls",
    "chars": 106,
    "preview": "module.exports =\n  name: 'bmp-1'\n  layout: 'bmp-1'\n  chart:\n    x: 28.35\n    y: 728.5\n  codepoint: 0x0000\n"
  },
  {
    "path": "configs/bmp-2.ls",
    "chars": 106,
    "preview": "module.exports =\n  name: 'bmp-2'\n  layout: 'bmp-2'\n  chart:\n    x: 28.35\n    y: 728.5\n  codepoint: 0x4000\n"
  },
  {
    "path": "configs/bmp-3.ls",
    "chars": 106,
    "preview": "module.exports =\n  name: 'bmp-3'\n  layout: 'bmp-3'\n  chart:\n    x: 28.35\n    y: 28.35\n  codepoint: 0x8000\n"
  },
  {
    "path": "configs/index.ls",
    "chars": 83,
    "preview": "module.exports =\n  * require './bmp-1'\n  * require './bmp-2'\n  * require './bmp-3'\n"
  },
  {
    "path": "data/codepoints/0000.yml",
    "chars": 6218,
    "preview": "# Basic Latin\n0000..001F:\n  control:\n    - NUL\n    - SOH\n    - STX\n    - ETX\n    - EOT\n    - ENQ\n    - ACK\n    - BEL\n\n  "
  },
  {
    "path": "data/codepoints/0800.yml",
    "chars": 7198,
    "preview": "# Samaritan\n\n0800..083F:\n  font: notoSamaritan\n  transform: scale(0.8)\n\n  0816..0819:\n    font: notoSamaritan\n    combin"
  },
  {
    "path": "data/codepoints/0A00.yml",
    "chars": 7354,
    "preview": "# Gurmukhi\n\n0A00..0A7F:\n  font: free-serif\n  transform: scale(0.8)\n\n  0A00: notdef\n\n  0A01:\n    font: free-serif\n    com"
  },
  {
    "path": "data/codepoints/0C00.yml",
    "chars": 8347,
    "preview": "# Telugu\n\n0C00..0C7F:\n  font: noto-telugu\n  transform: scale(0.8)\n\n  0C00:\n    svg: true\n    combining: true\n\n  0C01:\n  "
  },
  {
    "path": "data/codepoints/0E00.yml",
    "chars": 7121,
    "preview": "# Thai\n\n0E00..0E7F:\n  font: norasi\n  transform: scale(0.8) translate(0, -0.05)\n\n  0E00: notdef\n\n  0E31:\n    font: norasi"
  },
  {
    "path": "data/codepoints/1000.yml",
    "chars": 8127,
    "preview": "# Myanmar\n\n1000..109F:\n  font: padauk\n  transform: scale(0.65) translate(0, -0.1)\n\n  102A:\n    font: padauk\n    transfor"
  },
  {
    "path": "data/codepoints/1800.yml",
    "chars": 3030,
    "preview": "# Mongolian\n\n1800..18AF:\n  font: mongolian-script\n  transform: scale(0.7) translate(0, -0.05)\n\n  180B..180E:\n    control"
  },
  {
    "path": "data/codepoints/1A00.yml",
    "chars": 7524,
    "preview": "# Buginese\n\n1A00..1A1F:\n  font: free-serif\n  transform: scale(0.8)\n\n  1A17..1A18:\n    font: free-serif\n    combining: tr"
  },
  {
    "path": "data/codepoints/1C00.yml",
    "chars": 8055,
    "preview": "# Lepcha\n\n1C00..1C4F:\n  font: mingzat\n  transform: scale(0.7) translate(0, -0.1)\n\n  1C20:\n    font: mingzat\n    transfor"
  },
  {
    "path": "data/codepoints/1E00.yml",
    "chars": 441,
    "preview": "# Latin Extended Additional\n\n1E00..1EFF:\n  font: free-serif\n  transform: scale(0.8)\n\n# Greek Extended\n\n1F00..1FFF:\n  fon"
  },
  {
    "path": "data/codepoints/2000.yml",
    "chars": 3810,
    "preview": "# General Punctuation\n\n2000..206F:\n  font: symbola\n  transform: translate(0, -0.05)\n\n  2000..200F:\n    control:\n      - "
  },
  {
    "path": "data/codepoints/2200.yml",
    "chars": 3068,
    "preview": "# Mathematical Operators\n\n2200..22FF:\n  font: symbola\n  transform: scale(0.9) translate(0, -0.05)\n\n  22A6..22AF:\n    fon"
  },
  {
    "path": "data/codepoints/2C00.yml",
    "chars": 1837,
    "preview": "# Glagolitic\n\n2C00..2C5F:\n  font: quivira\n  transform: scale(0.8)\n\n  2C27:\n    font: quivira\n    transform: scale(0.7, 0"
  },
  {
    "path": "data/codepoints/2E00.yml",
    "chars": 777,
    "preview": "# Supplemental Punctuation\n\n2E00..2E7F:\n  font: symbola\n  transform: scale(0.9) translate(0, -0.05)\n\n  # TODO: render hy"
  },
  {
    "path": "data/codepoints/3000.yml",
    "chars": 4195,
    "preview": "# CJK Symbols and Punctuation\n\n3000..303F:\n  font: ipaexm\n  transform: scale(0.9) translate(0, 0.05)\n\n  3000:\n    contro"
  },
  {
    "path": "data/codepoints/3200.yml",
    "chars": 838,
    "preview": "# Enclosed CJK Letters and Months\n\n3200..32FF:\n  font: ipaexm\n  transform: scale(0.9) translate(0, 0.05)\n\n  3200..321E:\n"
  },
  {
    "path": "data/codepoints/3400.yml",
    "chars": 439,
    "preview": "# CJK Unified Ideographs Extension A\n\n3400..4DBF:\n  font:\n    - noto-serif-jp\n    - ipamjm\n    - ipaexm\n    - hanamin-a\n"
  },
  {
    "path": "data/codepoints/A000.yml",
    "chars": 253,
    "preview": "# Yi Syllables\n\nA000..A48F:\n  font: noto-yi\n  transform: scale(0.95) translate(0, 0.05)\n\n  A48D..A48F: notdef\n\n# Yi Radi"
  },
  {
    "path": "data/codepoints/A500.yml",
    "chars": 2054,
    "preview": "# Vai\n\nA500..A63F:\n  font: wakor\n  transform: scale(0.95)\n\n  A62C..A63F: notdef\n\n# Cyrillic Extended-B\n\nA640..A69F:\n  fo"
  },
  {
    "path": "data/codepoints/A800.yml",
    "chars": 5674,
    "preview": "# Syloti Nagri\n\nA800..A82F:\n  font: noto-syloti-nagri\n  transform: scale(0.8)\n\n  A802:\n    font: noto-syloti-nagri\n    c"
  },
  {
    "path": "data/codepoints/AA00.yml",
    "chars": 4996,
    "preview": "# Cham\n\nAA00..AA5F:\n  font: noto-cham\n  transform: scale(0.8)\n\n  AA0F:\n    font: noto-cham\n    transform: scale(0.8) tra"
  },
  {
    "path": "data/codepoints/AC00.yml",
    "chars": 99,
    "preview": "# Hangul Syllables\n\nAC00..D7AF:\n  font: noto-serif-jp\n  transform: scale(0.9)\n\n  D7A4..D7AF: notdef"
  },
  {
    "path": "data/layouts/bmp-1.ai",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e63380405b19b32ec296c6eefe51734223ed96d9d8583f3396b0c8d371be23ea\ns"
  },
  {
    "path": "data/layouts/bmp-2.ai",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:fc5b77deafa0bc6f6f8fcf51688adf24e171ae116be4951ef98e319288d46140\ns"
  },
  {
    "path": "data/layouts/bmp-3.ai",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:7f6f71d4b733461041bf65faaf851b43a33d9ed55f44c97fb53fb861e7717d4a\ns"
  },
  {
    "path": "index.ls",
    "chars": 1473,
    "preview": "require! {\n  'mz/fs'\n  './lib/util': {log, now}\n  './lib/download-fonts'\n  './lib/load-codepoints'\n  './lib/generate-svg"
  },
  {
    "path": "lib/codepoint-builder.ls",
    "chars": 2130,
    "preview": "require! {\n  './util': {merge-maps}\n}\n\nflatten = (object, {start, end}) ->\n  # Define model\n  model =\n    | object is \\n"
  },
  {
    "path": "lib/compose-poster.ls",
    "chars": 1000,
    "preview": "require! {\n  'mz/fs'\n  './util': {log}\n  jsdom\n  progress: Progress\n  xmlserializer\n}\n\nmodule.exports = (chart-svg, conf"
  },
  {
    "path": "lib/convert-to-pdf.ls",
    "chars": 495,
    "preview": "require! {\n  nightmare: Nightmare\n  'file-url'\n}\n\nmodule.exports = (svg-path, pdf-path) ->\n  nightmare = Nightmare!\n\n  n"
  },
  {
    "path": "lib/convert-to-png.ls",
    "chars": 98,
    "preview": "require! {\n  svg2png\n}\n\nmodule.exports = (svg) ->\n  svg-data = Buffer.from svg\n  svg2png svg-data\n"
  },
  {
    "path": "lib/download-fonts.ls",
    "chars": 4643,
    "preview": "require! {\n  path\n  download\n  './util': {log, now}\n  'mz/fs'\n  'mkdirp-then': mkdirp\n  bluebird: Promise\n}\n\nfonts =\n  '"
  },
  {
    "path": "lib/generate-svg.ls",
    "chars": 23322,
    "preview": "require! {\n  'mz/fs'\n  './util': {log, to-hex}\n  jsdom\n  path\n  hilbert: {Hilbert2d}\n  progress: Progress\n  xmlserialize"
  },
  {
    "path": "lib/load-codepoints.ls",
    "chars": 495,
    "preview": "require! {\n  path\n  'mz/fs'\n  'yaml-js'\n  './util': {log, now, merge-maps}\n  './codepoint-builder'\n}\n\nmodule.exports = -"
  },
  {
    "path": "lib/util.ls",
    "chars": 601,
    "preview": "export log = (text) ->\n  date = new Date!\n  date-string = date.to-ISO-string!\n  memory = process.memory-usage!rss / (102"
  },
  {
    "path": "package.json",
    "chars": 1507,
    "preview": "{\n  \"name\": \"unicode-map\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"no"
  },
  {
    "path": "test/codepoint-builder.ls",
    "chars": 2936,
    "preview": "require! {\n  './expect'\n  '../lib/codepoint-builder'\n}\n\n{describe: Describe, it: It} = global\n\nassets =\n  * * 'extracts "
  },
  {
    "path": "test/expect.ls",
    "chars": 499,
    "preview": "require! {\n  chai\n}\n\nmap-to-obj = (map) ->\n  obj = Object.create null\n\n  for [key, value] in Array.from map.entries!\n   "
  },
  {
    "path": "test/index.ls",
    "chars": 37,
    "preview": "require! {\n  './codepoint-builder'\n}\n"
  }
]

About this extraction

This page contains the full source code of the hakatashi/unicode-map GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 46 files (138.0 KB), approximately 54.1k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!