[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.