summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/uninormalize/unicode-normalize-names.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/uninormalize/unicode-normalize-names.lua')
-rw-r--r--macros/luatex/latex/uninormalize/unicode-normalize-names.lua57
1 files changed, 57 insertions, 0 deletions
diff --git a/macros/luatex/latex/uninormalize/unicode-normalize-names.lua b/macros/luatex/latex/uninormalize/unicode-normalize-names.lua
new file mode 100644
index 0000000000..a15d6b0978
--- /dev/null
+++ b/macros/luatex/latex/uninormalize/unicode-normalize-names.lua
@@ -0,0 +1,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