Skip to content

Instantly share code, notes, and snippets.

@hatkidchan
Created January 27, 2023 08:13
Show Gist options
  • Save hatkidchan/28ff90e9fdebdced8cd6d0ddc9cd584b to your computer and use it in GitHub Desktop.
Save hatkidchan/28ff90e9fdebdced8cd6d0ddc9cd584b to your computer and use it in GitHub Desktop.
#!/bin/bash
# usage: split-font-pages.sh "source-font.ttf" "output.css" "output-prefix"
for page in \
"U+0000-007F" "U+0080-00FF" "U+0100-017F" "U+0180-024F" \
"U+0250-02AF" "U+02B0-02FF" "U+0300-036F" "U+0370-03FF" \
"U+0400-04FF" "U+0500-052F" "U+0530-058F" "U+0590-05FF" \
"U+0600-06FF" "U+0700-074F" "U+0750-077F" "U+0780-07BF" \
"U+07C0-07FF" "U+0800-083F" "U+0840-085F" "U+0860-086F" \
"U+0870-089F" "U+08A0-08FF" "U+0900-097F" "U+0980-09FF" \
"U+0A00-0A7F" "U+0A80-0AFF" "U+0B00-0B7F" "U+0B80-0BFF" \
"U+0C00-0C7F" "U+0C80-0CFF" "U+0D00-0D7F" "U+0D80-0DFF" \
"U+0E00-0E7F" "U+0E80-0EFF" "U+0F00-0FFF" "U+1000-109F" \
"U+10A0-10FF" "U+1100-11FF" "U+1200-137F" "U+1380-139F" \
"U+13A0-13FF" "U+1400-167F" "U+1680-169F" "U+16A0-16FF" \
"U+1700-171F" "U+1720-173F" "U+1740-175F" "U+1760-177F" \
"U+1780-17FF" "U+1800-18AF" "U+18B0-18FF" "U+1900-194F" \
"U+1950-197F" "U+1980-19DF" "U+19E0-19FF" "U+1A00-1A1F" \
"U+1A20-1AAF" "U+1AB0-1AFF" "U+1B00-1B7F" "U+1B80-1BBF" \
"U+1BC0-1BFF" "U+1C00-1C4F" "U+1C50-1C7F" "U+1C80-1C8F" \
"U+1C90-1CBF" "U+1CC0-1CCF" "U+1CD0-1CFF" "U+1D00-1D7F" \
"U+1D80-1DBF" "U+1DC0-1DFF" "U+1E00-1EFF" "U+1F00-1FFF" \
"U+2000-206F" "U+2070-209F" "U+20A0-20CF" "U+20D0-20FF" \
"U+2100-214F" "U+2150-218F" "U+2190-21FF" "U+2200-22FF" \
"U+2300-23FF" "U+2400-243F" "U+2440-245F" "U+2460-24FF" \
"U+2500-257F" "U+2580-259F" "U+25A0-25FF" "U+2600-26FF" \
"U+2700-27BF" "U+27C0-27EF" "U+27F0-27FF" "U+2800-28FF" \
"U+2900-297F" "U+2980-29FF" "U+2A00-2AFF" "U+2B00-2BFF" \
"U+2C00-2C5F" "U+2C60-2C7F" "U+2C80-2CFF" "U+2D00-2D2F" \
"U+2D30-2D7F" "U+2D80-2DDF" "U+2DE0-2DFF" "U+2E00-2E7F" \
"U+2E80-2EFF" "U+2F00-2FDF" "U+2FF0-2FFF" "U+3000-303F" \
"U+3040-309F" "U+30A0-30FF" "U+3100-312F" "U+3130-318F" \
"U+3190-319F" "U+31A0-31BF" "U+31C0-31EF" "U+31F0-31FF" \
"U+3200-32FF" "U+3300-33FF" "U+3400-4DBF" "U+4DC0-4DFF" \
"U+4E00-9FFF" "U+A000-A48F" "U+A490-A4CF" "U+A4D0-A4FF" \
"U+A500-A63F" "U+A640-A69F" "U+A6A0-A6FF" "U+A700-A71F" \
"U+A720-A7FF" "U+A800-A82F" "U+A830-A83F" "U+A840-A87F" \
"U+A880-A8DF" "U+A8E0-A8FF" "U+A900-A92F" "U+A930-A95F" \
"U+A960-A97F" "U+A980-A9DF" "U+A9E0-A9FF" "U+AA00-AA5F" \
"U+AA60-AA7F" "U+AA80-AADF" "U+AAE0-AAFF" "U+AB00-AB2F" \
"U+AB30-AB6F" "U+AB70-ABBF" "U+ABC0-ABFF" "U+AC00-D7AF" \
"U+D7B0-D7FF" "U+D800-DB7F" "U+DB80-DBFF" "U+DC00-DFFF" \
"U+E000-F8FF" "U+F900-FAFF" "U+FB00-FB4F" "U+FB50-FDFF" \
"U+FE00-FE0F" "U+FE10-FE1F" "U+FE20-FE2F" "U+FE30-FE4F" \
"U+FE50-FE6F" "U+FE70-FEFF" "U+FF00-FFEF" "U+FFF0-FFFF" \
"U+10000-1007F" "U+10080-100FF" "U+10100-1013F" "U+10140-1018F" \
"U+10190-101CF" "U+101D0-101FF" "U+10280-1029F" "U+102A0-102DF" \
"U+102E0-102FF" "U+10300-1032F" "U+10330-1034F" "U+10350-1037F" \
"U+10380-1039F" "U+103A0-103DF" "U+10400-1044F" "U+10450-1047F" \
"U+10480-104AF" "U+104B0-104FF" "U+10500-1052F" "U+10530-1056F" \
"U+10570-105BF" "U+10600-1077F" "U+10780-107BF" "U+10800-1083F" \
"U+10840-1085F" "U+10860-1087F" "U+10880-108AF" "U+108E0-108FF" \
"U+10900-1091F" "U+10920-1093F" "U+10980-1099F" "U+109A0-109FF" \
"U+10A00-10A5F" "U+10A60-10A7F" "U+10A80-10A9F" "U+10AC0-10AFF" \
"U+10B00-10B3F" "U+10B40-10B5F" "U+10B60-10B7F" "U+10B80-10BAF" \
"U+10C00-10C4F" "U+10C80-10CFF" "U+10D00-10D3F" "U+10E60-10E7F" \
"U+10E80-10EBF" "U+10F00-10F2F" "U+10F30-10F6F" "U+10F70-10FAF" \
"U+10FB0-10FDF" "U+10FE0-10FFF" "U+11000-1107F" "U+11080-110CF" \
"U+110D0-110FF" "U+11100-1114F" "U+11150-1117F" "U+11180-111DF" \
"U+111E0-111FF" "U+11200-1124F" "U+11280-112AF" "U+112B0-112FF" \
"U+11300-1137F" "U+11400-1147F" "U+11480-114DF" "U+11580-115FF" \
"U+11600-1165F" "U+11660-1167F" "U+11680-116CF" "U+11700-1174F" \
"U+11800-1184F" "U+118A0-118FF" "U+11900-1195F" "U+119A0-119FF" \
"U+11A00-11A4F" "U+11A50-11AAF" "U+11AB0-11ABF" "U+11AC0-11AFF" \
"U+11C00-11C6F" "U+11C70-11CBF" "U+11D00-11D5F" "U+11D60-11DAF" \
"U+11EE0-11EFF" "U+11FB0-11FBF" "U+11FC0-11FFF" "U+12000-123FF" \
"U+12400-1247F" "U+12480-1254F" "U+12F90-12FFF" "U+13000-1342F" \
"U+13430-1343F" "U+14400-1467F" "U+16800-16A3F" "U+16A40-16A6F" \
"U+16A70-16ACF" "U+16AD0-16AFF" "U+16B00-16B8F" "U+16E40-16E9F" \
"U+16F00-16F9F" "U+16FE0-16FFF" "U+17000-187FF" "U+18800-18AFF" \
"U+18B00-18CFF" "U+18D00-18D7F" "U+1AFF0-1AFFF" "U+1B000-1B0FF" \
"U+1B100-1B12F" "U+1B130-1B16F" "U+1B170-1B2FF" "U+1BC00-1BC9F" \
"U+1BCA0-1BCAF" "U+1CF00-1CFCF" "U+1D000-1D0FF" "U+1D100-1D1FF" \
"U+1D200-1D24F" "U+1D2E0-1D2FF" "U+1D300-1D35F" "U+1D360-1D37F" \
"U+1D400-1D7FF" "U+1D800-1DAAF" "U+1DF00-1DFFF" "U+1E000-1E02F" \
"U+1E100-1E14F" "U+1E290-1E2BF" "U+1E2C0-1E2FF" "U+1E7E0-1E7FF" \
"U+1E800-1E8DF" "U+1E900-1E95F" "U+1EC70-1ECBF" "U+1ED00-1ED4F" \
"U+1EE00-1EEFF" "U+1F000-1F02F" "U+1F030-1F09F" "U+1F0A0-1F0FF" \
"U+1F100-1F1FF" "U+1F200-1F2FF" "U+1F300-1F5FF" "U+1F600-1F64F" \
"U+1F650-1F67F" "U+1F680-1F6FF" "U+1F700-1F77F" "U+1F780-1F7FF" \
"U+1F800-1F8FF" "U+1F900-1F9FF" "U+1FA00-1FA6F" "U+1FA70-1FAFF" \
"U+1FB00-1FBFF" "U+20000-2A6DF" "U+2A700-2B73F" "U+2B740-2B81F" \
"U+2B820-2CEAF" "U+2CEB0-2EBEF" "U+2F800-2FA1F" "U+30000-3134F" \
"U+E0000-E007F" "U+E0100-E01EF" "U+F0000-FFFFF";
do
# $1 - input file
# $2 - output css
# $3 - output basename
fontfile="${3}-${page/U+/}.woff";
(
printf '@font-face {'
printf 'font-family: "%s"; ' "$3";
printf 'src: url("%s") format("woff"); ' "${fontfile}";
printf 'unicode-range: %s; }\n' "${page}";
) >> "$2";
echo "pyftsubset \"$1\" --unicodes=\"$page\" --layout-features=\"\" \
--flavor=\"woff\" --output-file=\"${fontfile}\"";
done | xargs -P4 -I {} sh -c {};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment