summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-05-03 03:02:51 +0000
committerNorbert Preining <norbert@preining.info>2020-05-03 03:02:51 +0000
commitd78de17ddf0443233483fd98f40802cae5aa87c5 (patch)
tree1b7128cc505808a09c18e158288d6c3cdcf5c2fb /macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
parent8626a9c3cb5dc8d02d779d5b5b1e3933d5626f43 (diff)
CTAN sync 202005030302
Diffstat (limited to 'macros/luatex/generic/luaotfload/luaotfload-multiscript.lua')
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-multiscript.lua153
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