diff options
Diffstat (limited to 'macros/luatex/generic/luaotfload/luaotfload-multiscript.lua')
-rw-r--r-- | macros/luatex/generic/luaotfload/luaotfload-multiscript.lua | 153 |
1 files changed, 103 insertions, 50 deletions
diff --git a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua index f6a272ecab..5638d281c7 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua @@ -5,8 +5,8 @@ local ProvidesLuaModule = { name = "luaotfload-multiscript", - version = "3.12", --TAGVERSION - date = "2020-02-02", --TAGDATE + version = "3.13", --TAGVERSION + date = "2020-05-01", --TAGDATE description = "luaotfload submodule / multiscript", license = "GPL v2.0", author = "Marcel Krüger" @@ -23,14 +23,30 @@ local getwhd = node.direct.getwhd local insert_after = node.direct.insert_after local traverse_char = node.direct.traverse_char local protect_glyph = node.direct.protect_glyph +local flush_node = node.direct.flush_node +local remove = node.direct.remove local otffeatures = fonts.constructors.newfeatures "otf" -- local normalize = fonts.handlers.otf.features.normalize local definers = fonts.definers -local define_font = luaotfload.define_font +local define_font -- = luaotfload.define_font % This is set when the first font is loaded. local scripts_lib = require'luaotfload-scripts'.script local script_to_iso = scripts_lib.to_iso local script_to_ot = scripts_lib.to_ot +local delayedremove, finishremove do + local removed + function finishremove() + if removed then + flush_node(removed) + end + removed = nil + end + function delayedremove(head, current) + finishremove() + removed = current + return remove(head, current) + end +end local harf = luaotfload.harfbuzz local GSUBtag, GPOStag if harf then @@ -63,55 +79,56 @@ local script_extensions do end end end +local script_list = {} local script_mapping do -- We could extract these from PropertyValueAliases.txt... local script_aliases = { - Adlam = "Adlm", Caucasian_Albanian = "Aghb", Ahom = "Ahom", Arabic = "Arab", - Imperial_Aramaic = "Armi", Armenian = "Armn", Avestan = "Avst", - Balinese = "Bali", Bamum = "Bamu", Bassa_Vah = "Bass", Batak = "Batk", - Bengali = "Beng", Bhaiksuki = "Bhks", Bopomofo = "Bopo", Brahmi = "Brah", - Braille = "Brai", Buginese = "Bugi", Buhid = "Buhd", Chakma = "Cakm", - Canadian_Aboriginal = "Cans", Carian = "Cari", Cham = "Cham", - Cherokee = "Cher", Coptic = "Copt", Cypriot = "Cprt", Cyrillic = "Cyrl", - Devanagari = "Deva", Dogra = "Dogr", Deseret = "Dsrt", Duployan = "Dupl", - Egyptian_Hieroglyphs = "Egyp", Elbasan = "Elba", Elymaic = "Elym", - Ethiopic = "Ethi", Georgian = "Geor", Glagolitic = "Glag", - Gunjala_Gondi = "Gong", Masaram_Gondi = "Gonm", Gothic = "Goth", - Grantha = "Gran", Greek = "Grek", Gujarati = "Gujr", Gurmukhi = "Guru", - Hangul = "Hang", Han = "Hani", Hanunoo = "Hano", Hatran = "Hatr", - Hebrew = "Hebr", Hiragana = "Hira", Anatolian_Hieroglyphs = "Hluw", - Pahawh_Hmong = "Hmng", Nyiakeng_Puachue_Hmong = "Hmnp", - Katakana_Or_Hiragana = "Hrkt", Old_Hungarian = "Hung", Old_Italic = "Ital", - Javanese = "Java", Kayah_Li = "Kali", Katakana = "Kana", - Kharoshthi = "Khar", Khmer = "Khmr", Khojki = "Khoj", Kannada = "Knda", - Kaithi = "Kthi", Tai_Tham = "Lana", Lao = "Laoo", Latin = "Latn", - Lepcha = "Lepc", Limbu = "Limb", Linear_A = "Lina", Linear_B = "Linb", - Lisu = "Lisu", Lycian = "Lyci", Lydian = "Lydi", Mahajani = "Mahj", - Makasar = "Maka", Mandaic = "Mand", Manichaean = "Mani", Marchen = "Marc", - Medefaidrin = "Medf", Mende_Kikakui = "Mend", Meroitic_Cursive = "Merc", - Meroitic_Hieroglyphs = "Mero", Malayalam = "Mlym", Modi = "Modi", - Mongolian = "Mong", Mro = "Mroo", Meetei_Mayek = "Mtei", Multani = "Mult", - Myanmar = "Mymr", Nandinagari = "Nand", Old_North_Arabian = "Narb", - Nabataean = "Nbat", Newa = "Newa", Nko = "Nkoo", Nushu = "Nshu", - Ogham = "Ogam", Ol_Chiki = "Olck", Old_Turkic = "Orkh", Oriya = "Orya", - Osage = "Osge", Osmanya = "Osma", Palmyrene = "Palm", Pau_Cin_Hau = "Pauc", - Old_Permic = "Perm", Phags_Pa = "Phag", Inscriptional_Pahlavi = "Phli", - Psalter_Pahlavi = "Phlp", Phoenician = "Phnx", Miao = "Plrd", - Inscriptional_Parthian = "Prti", Rejang = "Rjng", Hanifi_Rohingya = "Rohg", - Runic = "Runr", Samaritan = "Samr", Old_South_Arabian = "Sarb", - Saurashtra = "Saur", SignWriting = "Sgnw", Shavian = "Shaw", - Sharada = "Shrd", Siddham = "Sidd", Khudawadi = "Sind", Sinhala = "Sinh", - Sogdian = "Sogd", Old_Sogdian = "Sogo", Sora_Sompeng = "Sora", - Soyombo = "Soyo", Sundanese = "Sund", Syloti_Nagri = "Sylo", - Syriac = "Syrc", Tagbanwa = "Tagb", Takri = "Takr", Tai_Le = "Tale", - New_Tai_Lue = "Talu", Tamil = "Taml", Tangut = "Tang", Tai_Viet = "Tavt", - Telugu = "Telu", Tifinagh = "Tfng", Tagalog = "Tglg", Thaana = "Thaa", - Thai = "Thai", Tibetan = "Tibt", Tirhuta = "Tirh", Ugaritic = "Ugar", - Vai = "Vaii", Warang_Citi = "Wara", Wancho = "Wcho", Old_Persian = "Xpeo", - Cuneiform = "Xsux", Yi = "Yiii", Zanabazar_Square = "Zanb", - Inherited = "Zinh", Common = "Zyyy", Unknown = "Zzzz", + Adlam = "adlm", Caucasian_Albanian = "aghb", Ahom = "ahom", Arabic = "arab", + Imperial_Aramaic = "armi", Armenian = "armn", Avestan = "avst", + Balinese = "bali", Bamum = "bamu", Bassa_Vah = "bass", Batak = "batk", + Bengali = "beng", Bhaiksuki = "bhks", Bopomofo = "bopo", Brahmi = "brah", + Braille = "brai", Buginese = "bugi", Buhid = "buhd", Chakma = "cakm", + Canadian_Aboriginal = "cans", Carian = "cari", Cham = "cham", + Cherokee = "cher", Coptic = "copt", Cypriot = "cprt", Cyrillic = "cyrl", + Devanagari = "deva", Dogra = "dogr", Deseret = "dsrt", Duployan = "dupl", + Egyptian_Hieroglyphs = "egyp", Elbasan = "elba", Elymaic = "elym", + Ethiopic = "ethi", Georgian = "geor", Glagolitic = "glag", + Gunjala_Gondi = "gong", Masaram_Gondi = "gonm", Gothic = "goth", + Grantha = "gran", Greek = "grek", Gujarati = "gujr", Gurmukhi = "guru", + Hangul = "hang", Han = "hani", Hanunoo = "hano", Hatran = "hatr", + Hebrew = "hebr", Hiragana = "hira", Anatolian_Hieroglyphs = "hluw", + Pahawh_Hmong = "hmng", Nyiakeng_Puachue_Hmong = "hmnp", + Katakana_Or_Hiragana = "hrkt", Old_Hungarian = "hung", Old_Italic = "ital", + Javanese = "java", Kayah_Li = "kali", Katakana = "kana", + Kharoshthi = "khar", Khmer = "khmr", Khojki = "khoj", Kannada = "knda", + Kaithi = "kthi", Tai_Tham = "lana", Lao = "laoo", Latin = "latn", + Lepcha = "lepc", Limbu = "limb", Linear_A = "lina", Linear_B = "linb", + Lisu = "lisu", Lycian = "lyci", Lydian = "lydi", Mahajani = "mahj", + Makasar = "maka", Mandaic = "mand", Manichaean = "mani", Marchen = "marc", + Medefaidrin = "medf", Mende_Kikakui = "mend", Meroitic_Cursive = "merc", + Meroitic_Hieroglyphs = "mero", Malayalam = "mlym", Modi = "modi", + Mongolian = "mong", Mro = "mroo", Meetei_Mayek = "mtei", Multani = "mult", + Myanmar = "mymr", Nandinagari = "nand", Old_North_Arabian = "narb", + Nabataean = "nbat", Newa = "newa", Nko = "nkoo", Nushu = "nshu", + Ogham = "ogam", Ol_Chiki = "olck", Old_Turkic = "orkh", Oriya = "orya", + Osage = "osge", Osmanya = "osma", Palmyrene = "palm", Pau_Cin_Hau = "pauc", + Old_Permic = "perm", Phags_Pa = "phag", Inscriptional_Pahlavi = "phli", + Psalter_Pahlavi = "phlp", Phoenician = "phnx", Miao = "plrd", + Inscriptional_Parthian = "prti", Rejang = "rjng", Hanifi_Rohingya = "rohg", + Runic = "runr", Samaritan = "samr", Old_South_Arabian = "sarb", + Saurashtra = "saur", SignWriting = "sgnw", Shavian = "shaw", + Sharada = "shrd", Siddham = "sidd", Khudawadi = "sind", Sinhala = "sinh", + Sogdian = "sogd", Old_Sogdian = "sogo", Sora_Sompeng = "sora", + Soyombo = "soyo", Sundanese = "sund", Syloti_Nagri = "sylo", + Syriac = "syrc", Tagbanwa = "tagb", Takri = "takr", Tai_Le = "tale", + New_Tai_Lue = "talu", Tamil = "taml", Tangut = "tang", Tai_Viet = "tavt", + Telugu = "telu", Tifinagh = "tfng", Tagalog = "tglg", Thaana = "thaa", + Thai = "thai", Tibetan = "tibt", Tirhuta = "tirh", Ugaritic = "ugar", + Vai = "vaii", Warang_Citi = "wara", Wancho = "wcho", Old_Persian = "xpeo", + Cuneiform = "xsux", Yi = "yiii", Zanabazar_Square = "zanb", + Inherited = "zinh", Common = "zyyy", Unknown = "zzzz", } - local entry = lpeg.Cg(codepoint_range * sep * ((lpeg.R'AZ' + lpeg.R'az' + '_')^1/script_aliases/string.lower))^-1 * (1-lpeg.P'\n')^0 * '\n' + local entry = lpeg.Cg(codepoint_range * sep * ((lpeg.R'AZ' + lpeg.R'az' + '_')^1/script_aliases))^-1 * (1-lpeg.P'\n')^0 * '\n' -- local entry = lpeg.Cg(codepoint_range * sep * lpeg.Cc(true))^-1 * (1-lpeg.P'\n')^0 * '\n' local file = lpeg.Cf( lpeg.Ct'' @@ -121,6 +138,23 @@ local script_mapping do local f = io.open(kpse.find_file"Scripts.txt") script_mapping = file:match(f:read'*a') f:close() + + for _, scr in next, script_aliases do + script_list[#script_list + 1] = scr + end +end + +table.sort(script_list) +local script_mark_offset = 0x200000 +local script_marks = {} +do + for i=1,#script_list do + local codepoint = script_mark_offset - 1 + i + local scr = script_list[i] + -- script_mapping[codepoint] = scr + script_marks[scr] = codepoint + script_marks[codepoint] = scr + end end local function load_on_demand(specifications, size) @@ -184,6 +218,7 @@ local function is_dominant_script(scripts, script, first, ...) end local function makecombifont(tfmdata, _, additional_scripts) + define_font = define_font or luaotfload.define_font -- Lazy loading because this file get's loaded before define_font is defined local has_auto additional_scripts = tostring(additional_scripts) if additional_scripts:sub(1, 5) == "auto+" then @@ -287,12 +322,12 @@ end local glyph_id = node.id'glyph' -- TODO: unset last_script, matching parentheses etc -function domultiscript(head, _, _, _, direction) +local function domultiscript(head, _, _, _, direction) head = node.direct.todirect(head) local last_fid, last_fonts, last_script for cur, cid, fid in traverse_char(head) do if fid ~= last_fid then - last_fid, last_fonts, last_script = fid, additional_scripts_fonts[fid] + last_fid, last_fonts = fid, additional_scripts_fonts[fid] end if last_fonts then local mapped_scr = script_mapping[cid] @@ -321,8 +356,18 @@ function domultiscript(head, _, _, _, direction) if mapped_font then setfont(cur, mapped_font) end + elseif fid == 0 then + local script_mark = script_marks[cid] + if script_mark then + head = delayedremove(head, current) -- Instead of removing them we could also keep them and suppress the missing glyph warning, but this seems cleaner + last_script = script_mark + end + else + last_script = nil end end + finishremove() -- Cleanup + return head end function luaotfload.add_multiscript(name, fonts) @@ -336,6 +381,10 @@ function luaotfload.add_multiscript(name, fonts) return name end +function luaotfload.get_script_mark(scr) + return script_marks[scr] +end + otffeatures.register { name = "multiscript", description = "Combine fonts for multiple scripts", @@ -349,4 +398,8 @@ otffeatures.register { -- } } +return { + -- I would omit the table if that wouldn't cause the function to be used as initializer + process = domultiscript, +} --- vim:sw=2:ts=2:expandtab:tw=71 |