Skip to content

Instantly share code, notes, and snippets.

@gagern
Created February 11, 2016 23:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gagern/89db1179766a702c564d to your computer and use it in GitHub Desktop.
Save gagern/89db1179766a702c564d to your computer and use it in GitHub Desktop.
unicode letters
letters=(function(d,s){var i,j=0,c=[],p=[],n=s.length;for(i=0;i<n;++i)c[i]=j=d[s.charCodeAt(i)-32]+j;for(i=0;i<n;i+=2)for(j=c[i];j<=c[i+1];++j)p.push(j);return p;})([2,0,108,3,4,1,6,5,7,11,17,8,12,21,9,22,30,10,15,24,25,16,13,42,14,18,46,19,37,27,28,29,35,36,26,32,40,43,47,53,20,48,50,56,33,34,39,49,51,52,55,63,64,65,68,85,23,31,38,45,107,59,66,69,72,88,102,114,117,157,41,44,54,60,67,70,71,73,74,75,76,80,81,82,83,84,86,87,89,93,94,98,99,105,106,111,116,122,130,132,134,138,153,165,185,191,195,196,221,231,268,277,287,310,332,339,362,365,390,391,449,457,470,513,541,568,582,619,785,881,921,1070,1164,1288,1340,2684,2749,3071,4050,4148,4149,4421,5761,5991,6581,8453,8634,10591,11171,16481,20949,42710],"U4(4I!)!'!&/ 0 \x99')2$+! !\x82$ %## !(! ! ; s \x85.\x87 <#!+ZmB& :7A% { !5%+%) #!*! ?0a,!4C1%'!&-'!1!$!33`HqG$!;!+.52'(#%#- & !$#$!*!8% 2%H''%#- & % % %C# !H *+ - & % $$!;!5%3!,(#%#- & % $$!Y% 5!9! '$ #$% ! %$%$ $)X!G( / 2$!= &%A( / . $$!L! %5%;( D#!*!* 4'&*$X + !#&]F %6&]% !#% !#!(# & ! !#% # %1!#$ !/#L!T( @>$\x807-!*''#$!$%+ ',6!9< !&!#7 \x92 ##& ! ##D ##C ##& ! ##8 K ##^Z2*W#'$\x9f#5 4&n((+, #2*2*2, 5PA!'!Vw.D !&_)0J?#$,E'4R/1Qt!z:9&K?8%)E=@7 )@\"# #$%1\x89U\x8f#'#<#'#( ! ! ! 0#Q & !$ &$##'',& &d!8!*,b!'!#. !$$(! ! ! # 1##&$'!G%\xa7: : \x83(#$%6< !&!#R+!*/1& & & & & & & &r!\x9a%E$&%'W( x #&D$y9Bh2\x9b\xb0o\xb6E\xa4V[#\x8e$2)%-:*0#_J+#b#M#(T1 # /0P2OS'$! !6=)/B>+:?!*$ .)$ D3 (-/$!$O !$%#$#! !4 #1+ 6'#'#'1& & 7 .)c0\xb46/'I\xb1\x95#}N&6$&! . , $ ! % % \\M\x94;S#Gf)d$ \x84<4(4,a$'#'#'# A) 4 9 % 8#6@\x81\x96>$IIY*5 ((<)?#@'(Oe|N.Pe\x911-)(\x86'#! E %$!#/)/10^9 %)-)4lR(%U!5# B[>$>A( =>G)-)98*\x7f`KJ8J\xa0QpgL3=@7M$!6F2#/! !A* 3W& ! # 8 .+:N(#%#- & % $$!;!6$\x90F-% !\x88:7#<F-!i7v4\x97SC!\x98K\xa5\xa2\x8d\x8a\xa8\xa3\xaa\x9e\xb2\x9d+0c?;F*#CH&9\xa1V,!j,\xb5%\xa9~&,$++.\xafu k %#!#%## ) ! & T ##( & = # $ !$& \x93#3 3 0 3 0 3 0 3 0 3 (\xac\x8b\xa6# B % !#! . # ! !(!'! ! ! % !#! ! ! ! ! % !## & # # ! . 5& $ 5\xad\xb77\xab,\x8c#\xae\xb3\x9c");
// Compress list of all Unicode letters to less than 2kB
"use strict";
var cps = require("unicode-8.0.0/categories/L/code-points");
var dict, str;
var dictSrc, strSrc;
function compress() {
var cps1 = cps.slice();
var i = 0;
var deltas = [];
while (cps1.length) {
var j = cps1.shift();
deltas.push(j - i);
i = j;
while (cps1[0] === j + 1)
j = cps1.shift();
deltas.push(j - i);
i = j;
}
//console.log(JSON.stringify(deltas));
var hist = {};
for (i of deltas)
hist[i] = (hist[i] || 0) + 1;
dict = Object.keys(hist).map(Number);
dict.sort((a, b) => hist[a] !== hist[b] ? hist[b] - hist[a] : a - b);
dict.splice(0x02, 0, dict[0x5e]); // "
dict.splice(0x3c, 0, dict[0x5e]); // \
dict.splice(0x5f, 2);
dictSrc = JSON.stringify(dict);
//dictSrc = dictSrc.replace(/.{70,78},/g, '$&\n');
//console.log(dictSrc);
var bytes = deltas.map(d => dict.indexOf(d) + 0x20);
strSrc = bytes.map(
b => b === 0x22 ? '\\"' : b === 0x5c ? '\\\\' : b < 0x7f ?
String.fromCharCode(b) : "\\x" + b.toString(16)
).join("");
//strSrc = strSrc.replace(/.{70,73}[^\\]{3}/g, '$&"+\n"');
strSrc = '"' + strSrc + '"';
//console.log(strSrc);
str = new Function('return ' + strSrc)();
}
var decompress = function(d, s) {
var i, j = 0, c = [], p = [], n = s.length;
for (i = 0; i < n; ++i)
c[i] = j = d[s.charCodeAt(i) - 32] + j;
for (i = 0; i < n; i += 2)
for (j = c[i]; j <= c[i + 1]; ++j)
p.push(j);
return p;
}
compress();
var cps2 = decompress(dict, str);
if (cps.join() !== cps2.join())
throw error("Mismatch!");
var res = 'letters=(' +
decompress.toString().replace(/(\W)\s+|\s+(?=\W)/g, '$1') +
')(' + dictSrc + ',' + strSrc + ');';
console.log(res);
letters=(function(d,s){var i,j=0,c=[],p=[],n=s.length;for(i=0;i<n;++i)c[i]=j=
d[s.charCodeAt(i)-32]+j;for(i=0;i<n;i+=2)for(j=c[i];j<=c[i+1];++j)p.push(j);
return p;})([2,0,108,3,4,1,6,5,7,11,17,8,12,21,9,22,30,10,15,24,25,16,13,42,14,
18,46,19,37,27,28,29,35,36,26,32,40,43,47,53,20,48,50,56,33,34,39,49,51,52,55,
63,64,65,68,85,23,31,38,45,107,59,66,69,72,88,102,114,117,157,41,44,54,60,67,70
,71,73,74,75,76,80,81,82,83,84,86,87,89,93,94,98,99,105,106,111,116,122,130,132
,134,138,153,165,185,191,195,196,221,231,268,277,287,310,332,339,362,365,390,
391,449,457,470,513,541,568,582,619,785,881,921,1070,1164,1288,1340,2684,2749,
3071,4050,4148,4149,4421,5761,5991,6581,8453,8634,10591,11171,16481,20949,42710
],"U4(4I!)!'!&/ 0 \x99')2$+! !\x82$ %## !(! ! ; s \x85.\x87 <#!+ZmB& :7A% {"+
" !5%+%) #!*! ?0a,!4C1%'!&-'!1!$!33`HqG$!;!+.52'(#%#- & !$#$!*!8% 2%H''%#- &"+
" % % %C# !H *+ - & % $$!;!5%3!,(#%#- & % $$!Y% 5!9! '$ #$% ! %$%$ $)X!G("+
" / 2$!= &%A( / . $$!L! %5%;( D#!*!* 4'&*$X + !#&]F %6&]% !#% !#!(# & "+
" ! !#% # %1!#$ !/#L!T( @>$\x807-!*''#$!$%+ ',6!9< !&!#7 \x92 ##& ! ##D ##C #"+
"#& ! ##8 K ##^Z2*W#'$\x9f#5 4&n((+, #2*2*2, 5PA!'!Vw.D !&_)0J?#$,E'4R/1Qt!z"+
":9&K?8%)E=@7 )@\"# #$%1\x89U\x8f#'#<#'#( ! ! ! 0#Q & !$ &$##'',& &d!8!*,b!"+
"'!#. !$$(! ! ! # 1##&$'!G%\xa7: : \x83(#$%6< !&!#R+!*/1& & & & & & & &r!\x9a"+
"%E$&%'W( x #&D$y9Bh2\x9b\xb0o\xb6E\xa4V[#\x8e$2)%-:*0#_J+#b#M#(T1 # /0P2O"+
"S'$! !6=)/B>+:?!*$ .)$ D3 (-/$!$O !$%#$#! !4 #1+ 6'#'#'1& & 7 .)c0\xb46/'I"+
"\xb1\x95#}N&6$&! . , $ ! % % \\M\x94;S#Gf)d$ \x84<4(4,a$'#'#'# A) 4 9 % 8#6@"+
"\x81\x96>$IIY*5 ((<)?#@'(Oe|N.Pe\x911-)(\x86'#! E %$!#/)/10^9 %)-)4lR(%U!5# "+
" B[>$>A( =>G)-)98*\x7f`KJ8J\xa0QpgL3=@7M$!6F2#/! !A* 3W& ! # 8 .+:N(#%#- & "+
"% $$!;!6$\x90F-% !\x88:7#<F-!i7v4\x97SC!\x98K\xa5\xa2\x8d\x8a\xa8\xa3\xaa"+
"\x9e\xb2\x9d+0c?;F*#CH&9\xa1V,!j,\xb5%\xa9~&,$++.\xafu k %#!#%## ) ! & T ##("+
" & = # $ !$& \x93#3 3 0 3 0 3 0 3 0 3 (\xac\x8b\xa6# B % !#! . # ! !(!'! ! !"+
" % !#! ! ! ! ! % !## & # # ! . 5& $ 5\xad\xb77\xab,\x8c#\xae\xb3\x9c");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment