UNPKG

19.8 kBtext/coffeescriptView Raw
1
2CND = require 'cnd'
3log = CND.log.bind CND
4echo = CND.echo.bind CND
5rainbow = CND.rainbow.bind CND
6CHR = require '../../coffeenode-chr'
7
8# log '&jzr#x123;helo'.match @xncr_kernel_matcher
9# log '&jzr#x123;helo'.match @ncr_kernel_matcher
10# log 'ģhelo'.match @xncr_kernel_matcher
11# log 'ģhelo'.match @ncr_kernel_matcher
12# log 'ģhelo'.match @first_chr_matcher_ncr
13# log 'ģhelo'.match @first_chr_matcher_xncr
14# log 'ģhelo'.match @first_chr_matcher_plain
15# log '𤕣古文龜'.match @first_chr_matcher_plain
16
17assert = require 'assert'
18# assert = require 'better-assert'
19
20assert.deepEqual ( ( '&jzr#x123;helo'.match CHR._first_chr_matcher_xncr )[ 1 .. 3 ] ),[ 'jzr', '123', undefined ]
21assert.deepEqual ( ( '&jzr#123;helo'.match CHR._first_chr_matcher_xncr )[ 1 .. 3 ] ),[ 'jzr', undefined, '123' ]
22assert.deepEqual ( ( 'ģhelo'.match CHR._first_chr_matcher_xncr )[ 1 .. 3 ] ),[ '', '123', undefined ]
23assert.deepEqual ( ( 'ģhelo'.match CHR._first_chr_matcher_ncr )[ 1 .. 3 ] ), [ '', '123', undefined ]
24assert.deepEqual ( ( '{helo'.match CHR._first_chr_matcher_ncr )[ 1 .. 3 ] ), [ '', undefined, '123' ]
25assert.deepEqual ( CHR._chr_csg_cid_from_chr 'abc', 'plain' ), [ 'a', 'u', 97 ]
26assert.deepEqual ( CHR._chr_csg_cid_from_chr 'abc', 'ncr' ), [ 'a', 'u', 97 ]
27assert.deepEqual ( CHR._chr_csg_cid_from_chr 'abc', 'xncr' ), [ 'a', 'u', 97 ]
28assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc', 'plain' ), [ '&', 'u', 38 ]
29assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc', 'ncr' ), [ 'a', 'u', 97 ]
30assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc', 'xncr' ), [ 'a', 'u', 97 ]
31assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc' ), [ '&', 'u', 38 ]
32assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc', 'plain' ), [ '&', 'u', 38 ]
33assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc', 'ncr' ), [ 'a', 'u', 97 ]
34assert.deepEqual ( CHR._chr_csg_cid_from_chr 'aabc', 'xncr' ), [ 'a', 'u', 97 ]
35assert.deepEqual ( CHR.csg_cid_from_chr '𤕣' ), [ 'u', 38 ]
36assert.deepEqual ( CHR.csg_cid_from_chr '𤕣', input: 'plain' ), [ 'u', 38 ]
37assert.deepEqual ( CHR.csg_cid_from_chr '𤕣', input: 'ncr' ), [ 'u', 148835 ]
38assert.deepEqual ( CHR.csg_cid_from_chr '𤕣', input: 'xncr' ), [ 'u', 148835 ]
39assert.deepEqual ( CHR.csg_cid_from_chr '𤕣' ), [ 'u', 148835 ]
40assert.deepEqual ( CHR.csg_cid_from_chr '𤕣', input: 'plain' ), [ 'u', 148835 ]
41assert.deepEqual ( CHR.csg_cid_from_chr '𤕣', input: 'ncr' ), [ 'u', 148835 ]
42assert.deepEqual ( CHR.csg_cid_from_chr '𤕣', input: 'xncr' ), [ 'u', 148835 ]
43assert.deepEqual ( ( '𤕣'[ 0 ] + 'x' ).match CHR._first_chr_matcher_plain ), null
44assert.throws ( -> CHR._chr_csg_cid_from_chr '𤕣'[ 0 ] ), /^Error: illegal character sequence/
45assert.throws ( -> CHR._chr_csg_cid_from_chr '𤕣'[ 0 ] + 'x' ), /^Error: illegal character sequence/
46assert.throws ( -> CHR.chrs_from_text 'x', input: 'xxx' ), /^Error: unknown input mode: /
47
48#===========================================================================================================
49# SPLITTING TEXTS
50#-----------------------------------------------------------------------------------------------------------
51assert.deepEqual ( CHR.chrs_from_text '' ), []
52assert.deepEqual ( CHR.chrs_from_text 'abc' ), [ 'a', 'b', 'c' ]
53assert.deepEqual ( CHR.chrs_from_text '𤕣abc' ), [ '𤕣', 'a', 'b', 'c' ]
54assert.deepEqual ( CHR.chrs_from_text '𤕣ab𤕣c' ), [ '𤕣', 'a', 'b', '𤕣', 'c' ]
55assert.deepEqual ( CHR.chrs_from_text '𤕣a{b𤕣c' ), [ '𤕣', 'a', '&', '#', '1', '2', '3', ';', 'b', '𤕣', 'c' ]
56assert.deepEqual ( CHR.chrs_from_text '𤕣a&jzr#123;b𤕣c' ), [ '𤕣', 'a', '&', 'j', 'z', 'r', '#', '1', '2', '3', ';', 'b', '𤕣', 'c' ]
57assert.deepEqual ( CHR.chrs_from_text '𤕣a𒎫b𤕣c' ), [ '𤕣', 'a', '&', '#', 'x', '1', '2', '3', 'a', 'b', ';', 'b', '𤕣', 'c' ]
58assert.deepEqual ( CHR.chrs_from_text '𤕣a&jzr#x123ab;b𤕣c' ), [ '𤕣', 'a', '&', 'j', 'z', 'r', '#', 'x', '1', '2', '3', 'a', 'b', ';', 'b', '𤕣', 'c' ]
59assert.deepEqual ( CHR.chrs_from_text '', input: 'ncr' ), []
60assert.deepEqual ( CHR.chrs_from_text 'abc', input: 'ncr' ), [ 'a', 'b', 'c' ]
61assert.deepEqual ( CHR.chrs_from_text '𤕣abc', input: 'ncr' ), [ '𤕣', 'a', 'b', 'c' ]
62assert.deepEqual ( CHR.chrs_from_text '𤕣ab𤕣c', input: 'ncr' ), [ '𤕣', 'a', 'b', '𤕣', 'c' ]
63assert.deepEqual ( CHR.chrs_from_text '𤕣a{b𤕣c', input: 'ncr' ), [ '𤕣', 'a', '{', 'b', '𤕣', 'c' ]
64assert.deepEqual ( CHR.chrs_from_text '𤕣a𒎫b𤕣c', input: 'ncr' ), [ '𤕣', 'a', '𒎫', 'b', '𤕣', 'c' ]
65assert.deepEqual ( CHR.chrs_from_text '𤕣a&jzr#x123ab;b𤕣c', input: 'ncr' ), [ '𤕣', 'a', '&', 'j', 'z', 'r', '#', 'x', '1', '2', '3', 'a', 'b', ';', 'b', '𤕣', 'c' ]
66assert.deepEqual ( CHR.chrs_from_text '', input: 'xncr' ), []
67assert.deepEqual ( CHR.chrs_from_text 'abc', input: 'xncr' ), [ 'a', 'b', 'c' ]
68assert.deepEqual ( CHR.chrs_from_text '𤕣abc', input: 'xncr' ), [ '𤕣', 'a', 'b', 'c' ]
69assert.deepEqual ( CHR.chrs_from_text '𤕣ab𤕣c', input: 'xncr' ), [ '𤕣', 'a', 'b', '𤕣', 'c' ]
70assert.deepEqual ( CHR.chrs_from_text '𤕣a{b𤕣c', input: 'xncr' ), [ '𤕣', 'a', '{', 'b', '𤕣', 'c' ]
71assert.deepEqual ( CHR.chrs_from_text '𤕣a𒎫b𤕣c', input: 'xncr' ), [ '𤕣', 'a', '𒎫', 'b', '𤕣', 'c' ]
72assert.deepEqual ( CHR.chrs_from_text '𤕣a&jzr#x123ab;b𤕣c', input: 'xncr' ), [ '𤕣', 'a', '&jzr#x123ab;', 'b', '𤕣', 'c' ]
73
74
75#===========================================================================================================
76# OBTAINING CIDS
77#-----------------------------------------------------------------------------------------------------------
78assert.throws ( -> CHR.cid_from_chr '' ), /^Error: unable to obtain CID from empty string$/
79assert.throws ( -> CHR.cid_from_chr '', 'ncr' ), /^Error: unable to obtain CID from empty string$/
80assert.throws ( -> CHR.cid_from_chr '', 'xncr' ), /^Error: unable to obtain CID from empty string$/
81assert.strictEqual ( CHR.cid_from_chr 'a' ), 97
82assert.strictEqual ( CHR.cid_from_chr 'x' ), 120
83assert.strictEqual ( CHR.cid_from_chr 'ʦ' ), 38
84assert.strictEqual ( CHR.cid_from_chr 'ٸ' ), 38
85assert.strictEqual ( CHR.cid_from_chr '&jzr#678;' ), 38
86assert.strictEqual ( CHR.cid_from_chr '&jzr#x678;' ), 38
87assert.strictEqual ( CHR.cid_from_chr 'a', input: 'ncr', ), 97
88assert.strictEqual ( CHR.cid_from_chr 'x', input: 'ncr', ), 120
89assert.strictEqual ( CHR.cid_from_chr 'ʦ', input: 'ncr', ), 678
90assert.strictEqual ( CHR.cid_from_chr 'ٸ', input: 'ncr', ), 0x678
91assert.strictEqual ( CHR.cid_from_chr '&jzr#678;', input: 'ncr', ), 38
92assert.strictEqual ( CHR.cid_from_chr '&jzr#x678;', input: 'ncr', ), 38
93assert.strictEqual ( CHR.cid_from_chr 'a', input: 'xncr', ), 97
94assert.strictEqual ( CHR.cid_from_chr 'x', input: 'xncr', ), 120
95assert.strictEqual ( CHR.cid_from_chr 'ʦ', input: 'xncr', ), 678
96assert.strictEqual ( CHR.cid_from_chr 'ٸ', input: 'xncr', ), 0x678
97assert.strictEqual ( CHR.cid_from_chr '&jzr#678;', input: 'xncr', ), 678
98assert.strictEqual ( CHR.cid_from_chr '&jzr#x678;', input: 'xncr', ), 0x678
99
100assert.strictEqual ( CHR.html_from_text 'helo wörld' ), """<span class="u-latn">helo w</span><span class="u-latn-1">ö</span><span class="u-latn">rld</span>"""
101assert.strictEqual ( CHR.html_from_text 'helo &#x24563; wörld' ), """<span class="u-latn">helo &amp;#x24563; w</span><span class="u-latn-1">ö</span><span class="u-latn">rld</span>"""
102assert.strictEqual ( CHR.html_from_text 'helo &#x24563; wörld', input: 'xncr'), """<span class="u-latn">helo </span><span class="u-cjk-xb">𤕣</span><span class="u-latn"> w</span><span class="u-latn-1">ö</span><span class="u-latn">rld</span>"""
103assert.strictEqual ( CHR.html_from_text '&jzr#xe101; & you', input: 'xncr' ), """<span class="jzr-fig">&#xe101;</span><span class="u-latn"> &amp; you</span>"""
104
105
106# log '-------------------------------'
107# log '𤕣a&#123;b𤕣c'.match /// ( #{@ncr_matcher.source} ) ///
108# log '𤕣a&#123;b𤕣c'.split /// ( #{@ncr_matcher.source} ) ///
109# log 'helo &#xabc1; world'.match /// ( #{@ncr_matcher.source} ) ///
110# log 'helo &#xabc1; world'.split /// ( #{@ncr_matcher.source} ) ///
111
112# f = ->
113# Table = require 'cli-table'
114# options =
115# head: [ 'name', 'text', 'match', ]
116# # colWidths: [ 50, 50, 50, ]
117# # chars:
118# # 'mid': ''
119# # 'left-mid': ''
120# # 'mid-mid': ''
121# # 'right-mid': ''
122# table = new Table options
123# texts = [
124# '&#xabc1;'
125# '&#1234;'
126# '&jzr#xabc1;'
127# '&jzr#1234;'
128# 'helo &#xabc1; world'
129# 'helo &#1234; world'
130# 'helo &jzr#xabc1; world'
131# 'helo &jzr#1234; world'
132# ]
133# matcher_names = [
134# 'ncr_matcher'
135# 'xncr_matcher'
136# 'ncr_csg_cid_matcher'
137# 'xncr_csg_cid_matcher' ]
138# for name in matcher_names
139# for text in texts
140# match = text.match @[ name ]
141# match = match[ ... ] if match?
142# match = rpr match
143# table.push [ name, text, match, ]
144# log table.toString()
145
146# log @ncr_splitter.source
147
148
149
150assert.strictEqual ( CHR._as_xncr 'u', 0x12abc ), '&#x12abc;'
151assert.strictEqual ( CHR._as_xncr 'u', 0x12abc ), '&#x12abc;'
152assert.strictEqual ( CHR._as_xncr 'jzr', 0x12abc ), '&jzr#x12abc;'
153assert.strictEqual ( CHR._as_sfncr 'u', 0x12abc ), 'u-12abc'
154assert.strictEqual ( CHR._as_sfncr 'jzr', 0x12abc ), 'jzr-12abc'
155
156assert.strictEqual ( CHR.as_ncr 0x12abc ), '&#x12abc;'
157assert.strictEqual ( CHR.as_sfncr 'a' ), 'u-61'
158assert.strictEqual ( CHR.as_rsg 'a' ), 'u-latn'
159assert.strictEqual ( CHR.as_rsg '𤕣' ), 'u-cjk-xb'
160assert.strictEqual ( CHR.as_range_name 'a' ), 'Basic Latin'
161assert.strictEqual ( CHR.as_range_name '𤕣' ), 'CJK Unified Ideographs Extension B'
162
163assert.strictEqual ( CHR.as_range_name '&#xe100;', input: 'plain' ), 'Basic Latin'
164assert.strictEqual ( CHR.as_range_name '&jzr#xe100;', input: 'plain' ), 'Basic Latin'
165assert.strictEqual ( CHR.as_rsg '&#xe100;', input: 'plain' ), 'u-latn'
166assert.strictEqual ( CHR.as_rsg '&jzr#xe100;', input: 'plain' ), 'u-latn'
167
168assert.strictEqual ( CHR.as_range_name '&#xe100;', input: 'ncr' ), 'Private Use Area'
169assert.strictEqual ( CHR.as_range_name '&jzr#xe100;', input: 'ncr' ), 'Basic Latin'
170assert.strictEqual ( CHR.as_rsg '&#xe100;', input: 'ncr' ), 'u-pua'
171assert.strictEqual ( CHR.as_rsg '&jzr#xe100;', input: 'ncr' ), 'u-latn'
172
173assert.strictEqual ( CHR.as_range_name '&#xe100;', input: 'xncr' ), 'Private Use Area'
174assert.strictEqual ( CHR.as_range_name '&jzr#xe100;', input: 'xncr' ), 'Jizura Character Components'
175assert.strictEqual ( CHR.as_rsg '&#xe100;', input: 'xncr' ), 'u-pua'
176assert.strictEqual ( CHR.as_rsg '&jzr#xe100;', input: 'xncr' ), 'jzr-fig'
177
178assert.throws ( -> CHR.as_rsg '&unknown#xe100;', input: 'xncr' ), /Error: unknown CSG: 'unknown'/
179assert.strictEqual ( CHR.as_rsg '&jzr#xe100;', input: 'xncr', csg: 'u' ), 'u-pua'
180assert.strictEqual ( CHR.as_rsg '&#xe100;', input: 'xncr', csg: 'u' ), 'u-pua'
181assert.strictEqual ( CHR.as_rsg '&#xe100;', input: 'xncr', csg: 'jzr' ), 'jzr-fig'
182assert.strictEqual ( CHR.as_rsg '&#x1;', input: 'xncr', csg: 'jzr' ), null
183assert.strictEqual ( CHR.as_fncr '&#x1;', input: 'xncr', csg: 'jzr' ), 'jzr-1'
184assert.strictEqual ( CHR.as_fncr '&#xe123;', input: 'xncr', csg: 'jzr' ), 'jzr-fig-e123'
185assert.strictEqual ( CHR.as_fncr '𤕣', input: 'xncr' ), 'u-cjk-xb-24563'
186
187assert.strictEqual ( CHR.as_cid '&jzr#xe100;', input: 'xncr' ), 0xe100
188assert.strictEqual ( CHR.as_cid '&jzr#xe100;', input: 'xncr', csg: 'u' ), 0xe100
189assert.strictEqual ( CHR.as_cid '𤕣', input: 'xncr' ), 0x24563
190
191assert.strictEqual ( CHR.as_csg '&jzr#xe100;', input: 'xncr' ), 'jzr'
192assert.strictEqual ( CHR.as_csg '&jzr#xe100;', input: 'xncr', csg: 'u' ), 'u'
193assert.strictEqual ( CHR.as_csg '𤕣', input: 'xncr' ), 'u'
194
195assert.deepEqual ( CHR.analyze 'helo world' ), {'~isa': 'CHR/chr-description',"chr":"h","csg":"u","cid":104,"fncr":"u-latn-68","sfncr":"u-68","ncr":"&#x68;","xncr":"&#x68;","rsg":"u-latn"}
196assert.deepEqual ( CHR.analyze '&#x24563;' ), {'~isa': 'CHR/chr-description',"chr":"&","csg":"u","cid":38,"fncr":"u-latn-26","sfncr":"u-26","ncr":"&#x26;","xncr":"&#x26;","rsg":"u-latn"}
197assert.deepEqual ( CHR.analyze '&#x24563;', input: 'ncr' ), {'~isa': 'CHR/chr-description',"chr":"𤕣","csg":"u","cid":148835,"fncr":"u-cjk-xb-24563","sfncr":"u-24563","ncr":"&#x24563;","xncr":"&#x24563;","rsg":"u-cjk-xb"}
198assert.deepEqual ( CHR.analyze '&#x24563;', input: 'xncr' ), {'~isa': 'CHR/chr-description',"chr":"𤕣","csg":"u","cid":148835,"fncr":"u-cjk-xb-24563","sfncr":"u-24563","ncr":"&#x24563;","xncr":"&#x24563;","rsg":"u-cjk-xb"}
199assert.deepEqual ( CHR.analyze '&jzr#x24563;' ), {'~isa': 'CHR/chr-description',"chr":"&","csg":"u","cid":38,"fncr":"u-latn-26","sfncr":"u-26","ncr":"&#x26;","xncr":"&#x26;","rsg":"u-latn"}
200assert.deepEqual ( CHR.analyze '&jzr#x24563;', input: 'ncr' ), {'~isa': 'CHR/chr-description',"chr":"&","csg":"u","cid":38,"fncr":"u-latn-26","sfncr":"u-26","ncr":"&#x26;","xncr":"&#x26;","rsg":"u-latn"}
201assert.deepEqual ( CHR.analyze '&jzr#x24563;', input: 'xncr' ), {'~isa': 'CHR/chr-description',"chr":"&jzr#x24563;","csg":"jzr","cid":148835,"fncr":"jzr-24563","sfncr":"jzr-24563","ncr":"&#x24563;","xncr":"&jzr#x24563;","rsg":null}
202
203
204assert.throws ( -> CHR.chunks_from_text 'ab&jzr#xe063;d', input: 'xncr', output: 'xxx' ), /Error: unknown output mode: 'xxx'/
205assert.deepEqual ( CHR.chunks_from_text 'helo wörld' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"helo w"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn-1","text":"ö"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"rld"}]
206assert.deepEqual ( CHR.chunks_from_text '種果〇𤕣カタカナ' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-cjk","text":"種果"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-cjk-sym","text":"〇"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-cjk-xb","text":"𤕣"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-cjk-kata","text":"カタカナ"}]
207assert.deepEqual ( CHR.chunks_from_text 'ab&#x63;d' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"ab&#x63;d"}]
208assert.deepEqual ( CHR.chunks_from_text 'ab&#x63;d', input: 'ncr' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"abcd"}]
209assert.deepEqual ( CHR.chunks_from_text 'ab&#x63;d', input: 'xncr' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"abcd"}]
210assert.deepEqual ( CHR.chunks_from_text 'ab&jzr#xe063;d' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"ab&jzr#xe063;d"}]
211assert.deepEqual ( CHR.chunks_from_text 'ab&jzr#xe063;d', input: 'ncr' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"ab&jzr#xe063;d"}]
212assert.deepEqual ( CHR.chunks_from_text 'ab&jzr#xe063;d', input: 'xncr' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"ab"},{"~isa":"CHR/chunk","csg":"jzr","rsg":"jzr-fig","text":"&#xe063;"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"d"}]
213assert.deepEqual ( CHR.chunks_from_text 'helo wörld', output: 'html' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"helo w"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn-1","text":"ö"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"rld"}]
214assert.deepEqual ( CHR.chunks_from_text '1 < 2', output: 'html' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"1 &lt; 2"}]
215assert.deepEqual ( CHR.chunks_from_text '2 > 1', output: 'html' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"2 &gt; 1"}]
216assert.deepEqual ( CHR.chunks_from_text 'me & you', output: 'html' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"me &amp; you"}]
217assert.deepEqual ( CHR.chunks_from_text 'me &amp; you', output: 'html' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"me &amp;amp; you"}]
218assert.deepEqual ( CHR.chunks_from_text 'ab&jzr#xe063;d', input: 'xncr', output: 'html' ), [{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"ab"},{"~isa":"CHR/chunk","csg":"jzr","rsg":"jzr-fig","text":"&#xe063;"},{"~isa":"CHR/chunk","csg":"u","rsg":"u-latn","text":"d"}]
219
220# log CHR.analyze '&jzr#xe100;', input: 'ncr'
221# log CHR.analyze '&jzr#xe100;', input: 'xncr'
222
223
224
225# @time_it_2 = ->
226# binary_interval_search = require './binary-interval-search'
227# names_and_ranges = [
228# [ 'Basic Latin', 0x0000, 0x007f ]
229# [ 'Latin-1 Supplement', 0x0080, 0x00ff ]
230# [ 'Latin Extended-A', 0x0100, 0x017f ]
231# [ 'Latin Extended-B', 0x0180, 0x024f ]
232# [ 'New Tai Lue', 0x1980, 0x19df ]
233# [ 'Khmer Symbols', 0x19e0, 0x19ff ]
234# [ 'Buginese', 0x1a00, 0x1a1f ]
235# [ 'Tai Tham', 0x1a20, 0x1aaf ]
236# [ null, 0x104af, 0x10800 ] # undefined CIDs
237# [ 'Miscellaneous Symbols And Pictographs', 0x1f300, 0x1f5ff ]
238# [ 'Emoticons', 0x1f600, 0x1f64f ]
239# [ 'Transport And Map Symbols', 0x1f680, 0x1f6ff ]
240# [ 'Alchemical Symbols', 0x1f700, 0x1f77f ]
241# [ 'Supplementary Private Use Area-A', 0xf0000, 0xfffff ]
242# [ 'Supplementary Private Use Area-B', 0x100000, 0x10ffff ]
243# [ null, 0x10ffff, 0x110000 ] # undefined CIDs
244# ]
245# for name_and_range in names_and_ranges
246# [ name
247# first_cid
248# last_cid ] = name_and_range
249# cid = first_cid + parseInt ( last_cid - first_cid ) / 2 + 0.5
250# log()
251# # log '##############', first_cid, cid, last_cid
252# log rainbow name, ( '0x' + cid.toString 16 ), binary_interval_search @_names_and_ranges, 1, 2, 0, cid
253# # log binary_interval_search 0x2a000
254# # log binary_interval_search 0x61
255# # log binary_interval_search 0x8f