[latex3-commits] [git/LaTeX3-latex3-luaotfload] dev: First case-mapping code (968cf35)
Marcel Fabian Krüger
tex at 2krueger.de
Wed Oct 21 17:01:23 CEST 2020
Repository : https://github.com/latex3/luaotfload
On branch : dev
Link : https://github.com/latex3/luaotfload/commit/968cf3593e3357145ad4b89bd6c5d9ed96e18574
>---------------------------------------------------------------
commit 968cf3593e3357145ad4b89bd6c5d9ed96e18574
Author: Marcel Fabian Krüger <tex at 2krueger.de>
Date: Wed Oct 21 17:01:23 2020 +0200
First case-mapping code
Only the one-to-one cases, not loaded yet
>---------------------------------------------------------------
968cf3593e3357145ad4b89bd6c5d9ed96e18574
src/luaotfload-case.lua | 66 ++++++++++++++++++++++++++++++++++++++++++++++
src/luaotfload-unicode.lua | 50 +++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
diff --git a/src/luaotfload-case.lua b/src/luaotfload-case.lua
new file mode 100644
index 0000000..f3cb799
--- /dev/null
+++ b/src/luaotfload-case.lua
@@ -0,0 +1,66 @@
+local mapping_tables = require'luaotfload-unicode'.casemapping
+
+local uppercase = mapping_tables.uppercase
+local lowercase = mapping_tables.lowercase
+
+local otfregister = fonts.constructors.features.otf.register
+
+local direct = node.direct
+local is_char = direct.is_char
+local has_glyph = direct.has_glyph
+local uses_font = direct.uses_font
+local getnext = direct.getnext
+local setchar = direct.setchar
+local setdisc = direct.setdisc
+local getdisc = direct.getdisc
+
+local disc = node.id'disc'
+local glyph = node.id'disc'
+local function process(table)
+ local function processor(head, font)
+ local n = head
+ while n do
+ n = has_glyph(n)
+ if not n then break end
+ local char, id = is_char(n, font)
+ if char then
+ local mapping = table[char]
+ if mapping then
+ setchar(n, mapping)
+ end
+ elseif id == disc and uses_font(n, font) then
+ local pre, post, rep = getdisc(n)
+ setdisc(n, processor(pre, font), processor(post, font), processor(rep, font))
+ end
+ n = getnext(n)
+ end
+ return head
+ end
+ return processor
+end
+
+local upper_process = process(uppercase)
+otfregister {
+ name = 'upper',
+ description = 'Map to uppercase',
+ default = false,
+ processors = {
+ position = 1,
+ plug = upper_process,
+ node = upper_process,
+ base = upper_process,
+ },
+}
+
+local lower_process = process(lowercase)
+otfregister {
+ name = 'lower',
+ description = 'Map to lowercase',
+ default = false,
+ processors = {
+ position = 1,
+ plug = lower_process,
+ node = lower_process,
+ base = lower_process,
+ },
+}
diff --git a/src/luaotfload-unicode.lua b/src/luaotfload-unicode.lua
index c0761f5..aa5bee2 100644
--- a/src/luaotfload-unicode.lua
+++ b/src/luaotfload-unicode.lua
@@ -99,7 +99,57 @@ local alphnum_only do
end
end
+local uppercase, lowercase, titlecase = {}, {}, nil do
+ titlecase = nil -- Not implemented yet(?)
+ local ignored_field = (1-lpeg.P';')^0 * ';'
+ local simple_entry =
+ codepoint/0 * ';'
+ * ignored_field -- Name
+ * ignored_field -- General_Category
+ * ignored_field -- ccc
+ * ignored_field -- Bidi
+ * ignored_field -- Decomp
+ * ignored_field -- Numeric
+ * ignored_field -- Numeric
+ * ignored_field -- Numeric
+ * ignored_field -- Mirrored
+ * ignored_field -- Obsolete
+ * ignored_field -- Obsolete
+ * ';;\n'
+ local entry = simple_entry
+ + codepoint * ';'
+ * ignored_field -- Name
+ * ignored_field -- General_Category
+ * ignored_field -- ccc
+ * ignored_field -- Bidi
+ * ignored_field -- Decomp
+ * ignored_field -- Numeric
+ * ignored_field -- Numeric
+ * ignored_field -- Numeric
+ * ignored_field -- Mirrored
+ * ignored_field -- Obsolete
+ * ignored_field -- Obsolete
+ * (codepoint + lpeg.Cc(false)) * ';' -- uppercase
+ * (codepoint + lpeg.Cc(false)) * ';' -- lowercase
+ * (codepoint + lpeg.Cc(false)) * '\n' -- titlecase
+ / function(codepoint, upper, lower, title)
+ if upper then uppercase[codepoint] = upper end
+ if lower then lowercase[codepoint] = lower end
+ -- if title then titlecase[codepoint] = title end -- Not implemented yet(?)
+ end
+ local file = entry^0 * -1
+
+ local f = io.open(kpse.find_file"UnicodeData.txt")
+ assert(file:match(f:read'*a'))
+ f:close()
+end
+
return {
casefold = casefold,
alphnum_only = alphnum_only,
+ casemapping = {
+ uppercase = uppercase,
+ lowercase = lowercase,
+ -- titlecase = titlecase,
+ },
}
More information about the latex3-commits
mailing list.