summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/uninormalize/unicode-normalize-names.lua
blob: a15d6b0978550f268fa050fbbb34540cd2b3445e (plain)
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