summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/luaotfload/luaotfload-scripts.lua')
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-scripts.lua91
1 files changed, 91 insertions, 0 deletions
diff --git a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
new file mode 100644
index 0000000000..48ececf890
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
@@ -0,0 +1,91 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-script.lua
+-- DESCRIPTION: part of luaotfload / script
+-----------------------------------------------------------------------
+
+local ProvidesLuaModule = {
+ name = "luaotfload-script",
+ version = "3.11", --TAGVERSION
+ date = "2019-11-10", --TAGDATE
+ description = "luaotfload submodule / Script helpers",
+ license = "CC0 1.0 Universal",
+ author = "Marcel Krüger"
+}
+
+if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+end
+
+local canonical_name = {
+ dflt = "DFLT",
+ hira = "kana",
+ laoo = "lao",
+ yiii = "yi",
+ nkoo = "nko",
+ yaii = "vai",
+ ["lao "] = "lao",
+ ["yi "] = "yi",
+ ["nko "] = "nko",
+ ["vai "] = "vai",
+}
+local versioned_script = {
+ mym = "mymr", mymr = "mym",
+ bng = "beng", beng = "bng",
+ dev = "deva", deva = "dev",
+ gjr = "gujr", gujr = "gjr",
+ gur = "guru", guru = "gur",
+ knd = "knda", knda = "knd",
+ mlm = "mlym", mlym = "mlm",
+ ory = "orya", orya = "ory",
+ tml = "taml", taml = "tml",
+ tel = "telu", telu = "tel",
+}
+local function get_versioned(original)
+ local base = original:gsub("%d$", "") -- Strip any existing version
+ local versioned = versioned_script[base]
+ if not versioned then
+ return original
+ end
+ if #base == 3 then
+ local t = base
+ base = versioned
+ versioned = t
+ end
+ if base == "mymr" then
+ return "mym2", "mymr"
+ end
+ return versioned .. '3', versioned .. '2', base
+end
+
+-- We never return trailing spaces because I consider them implementation details.
+local function script_to_ot(iso)
+ iso = iso:lower()
+ return get_versioned(canonical_name[iso] or iso)
+end
+
+local function script_to_iso(tag)
+ tag = tag:lower()
+ tag = canonical_name[tag] or tag
+ local stripped, did_strip = tag:gsub("%d$", "")
+ tag = did_strip == 1 and versioned_script[stripped] or tag
+ local tag_length = #tag
+ if tag_length == 4 then return tag end -- Optimization for common case
+ -- I promise you, I am not making this one up
+ return tag .. string.rep(tag:sub(tag_length, tag_length), 4-tag_length)
+end
+
+local function to_harfbuzz(script, language)
+ local otscript = script_to_iso(script)
+ -- if script_to_ot(otscript) == script then
+ -- return otscript, language
+ -- end
+ return otscript, "x-hbot" .. language .. "-hbsc" .. script
+end
+
+return {
+ to_harfbuzz = to_harfbuzz,
+ script = {
+ to_ot = script_to_ot,
+ to_iso = script_to_iso,
+ },
+}