1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
-- Unicode names
if not characters then
require "char-def"
end
unicode = unicode or { }
unicode.conformance = unicode.conformance or { }
unidata = characters.data
if not math.div then -- from l-math.lua
function math.div(n, m)
return math.floor(n/m)
end
end
local function is_hangul(char)
return char >= 0xAC00 and char <= 0xD7A3
end
local function is_han_character(char) -- from font-otf.lua (check)
return
(char>=0x04E00 and char<=0x09FFF) or
(char>=0x03400 and char<=0x04DFF) or
(char>=0x20000 and char<=0x2A6DF) or
(char>=0x0F900 and char<=0x0FAFF) or
(char>=0x2F800 and char<=0x2FA1F)
end
local SBase, LBase, VBase, TBase = 0xAC00, 0x1100, 0x1161, 0x11A7
local LCount, VCount, TCount = 19, 21, 28
local NCount = VCount * TCount
local SCount = LCount * NCount
local JAMO_L_TABLE = { [0] = "G", "GG", "N", "D", "DD", "R", "M", "B", "BB",
"S", "SS", "", "J", "JJ", "C", "K", "T", "P", "H" }
local JAMO_V_TABLE = { [0] = "A", "AE", "YA", "YAE", "EO", "E", "YEO", "YE",
"O", "WA", "WAE", "OE", "YO", "U", "WEO", "WE", "WI", "YU", "EU", "YI", "I" }
local JAMO_T_TABLE = { [0] = "", "G", "GG", "GS", "N", "NJ", "NH", "D", "L",
"LG", "LM", "LB", "LS", "LT", "LP", "LH", "M", "B", "BS", "S", "SS", "NG",
"J", "C", "K", "T", "P", "H" }
function unicode.conformance.name(char)
if is_hangul(char) then
local SIndex = char - SBase
local LIndex = math.div(SIndex, NCount)
local VIndex = math.div(SIndex % NCount, TCount)
local TIndex = SIndex % TCount
return string.format("HANGUL SYLLABLE %s%s%s", JAMO_L_TABLE[LIndex],
JAMO_V_TABLE[VIndex], JAMO_T_TABLE[TIndex])
elseif is_han_character(char)
then return string.format("CJK UNIFIED IDEOGRAPH-%04X", char)
elseif unidata[char] -- if unidata[char] exists, the name exists
then return unidata[char].description
end
end
|