diff options
Diffstat (limited to 'tex/context/base/char-ini.lua')
| -rw-r--r-- | tex/context/base/char-ini.lua | 75 | 
1 files changed, 55 insertions, 20 deletions
| diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua index 28a11a1e9..a16178bf2 100644 --- a/tex/context/base/char-ini.lua +++ b/tex/context/base/char-ini.lua @@ -10,8 +10,8 @@ local tex = tex  local utf = unicode.utf8  local utfchar, utfbyte, utfvalues = utf.char, utf.byte, string.utfvalues -local concat = table.concat -local next, tonumber = next, tonumber +local concat, unpack = table.concat, table.unpack +local next, tonumber, type = next, tonumber, type  local texsprint, texprint = tex.sprint, tex.print  local format, lower, gsub, match, gmatch = string.format, string.lower, string.gsub, string.match, string.match, string.gmatch  local texsetlccode, texsetuccode, texsetsfcode, texsetcatcode  = tex.setlccode, tex.setuccode, tex.setsfcode, tex.setcatcode @@ -771,29 +771,64 @@ characters.activeoffset = 0x10000 -- there will be remapped in that byte range  -- some day we will make a table -characters.lccodes     = allocate()  local lccodes     = characters.lccodes     -- lazy table -characters.uccodes     = allocate()  local uccodes     = characters.uccodes     -- lazy table -characters.shcodes     = allocate()  local shcodes     = characters.shcodes     -- lazy table +local function utfstring(s) +    if type(s) == "table" then +        return concat { utfchar( unpack(s) ) } +    else +        return utfchar(s) +    end +end + +utf.string = utf.string or utfstring + +characters.lccodes = allocate()  local lccodes = characters.lccodes -- lazy table +characters.uccodes = allocate()  local uccodes = characters.uccodes -- lazy table +characters.shcodes = allocate()  local shcodes = characters.shcodes -- lazy table + +setmetatable(lccodes, { __index = function(t,u) if u then local c = data[u] c = c and c.lccode or u t[u] = c return c end end } ) +setmetatable(uccodes, { __index = function(t,u) if u then local c = data[u] c = c and c.uccode or u t[u] = c return c end end } ) +setmetatable(shcodes, { __index = function(t,u) if u then local c = data[u] c = c and c.shcode or u t[u] = c return c end end } ) -characters.lcchars     = allocate()  local lcchars     = characters.lcchars     -- lazy table -characters.ucchars     = allocate()  local ucchars     = characters.ucchars     -- lazy table -characters.shchars     = allocate()  local shchars     = characters.shchars     -- lazy table +characters.lcchars = allocate()  local lcchars = characters.lcchars -- lazy table +characters.ucchars = allocate()  local ucchars = characters.ucchars -- lazy table +characters.shchars = allocate()  local shchars = characters.shchars -- lazy table -characters.lccharcodes = allocate()  local lccharcodes = characters.lccharcodes -- lazy table -characters.uccharcodes = allocate()  local uccharcodes = characters.uccharcodes -- lazy table -characters.shcharcodes = allocate()  local shcharcodes = characters.shcharcodes -- lazy table +setmetatable(lcchars, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.lccode c = c and utfchar  (c) or u t[u] = c return c end end } ) +setmetatable(ucchars, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.uccode c = c and utfchar  (c) or u t[u] = c return c end end } ) +setmetatable(shchars, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.shcode c = c and utfstring(c) or u t[u] = c return c end end } ) -setmetatable(lccodes,     { __index = function(t,u) if u then local c = data[u]          c = c and c.lccode                      or u t[u] = c return c end end } ) -setmetatable(uccodes,     { __index = function(t,u) if u then local c = data[u]          c = c and c.uccode                      or u t[u] = c return c end end } ) -setmetatable(shcodes,     { __index = function(t,u) if u then local c = data[u]          c = c and c.shcode                      or u t[u] = c return c end end } ) +--~ characters.lccharcodes = allocate()  local lccharcodes = characters.lccharcodes -- lazy table +--~ characters.uccharcodes = allocate()  local uccharcodes = characters.uccharcodes -- lazy table +--~ characters.shcharcodes = allocate()  local shcharcodes = characters.shcharcodes -- lazy table -setmetatable(lcchars,     { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.lccode c = c and utfchar(c) or u t[u] = c return c end end } ) -setmetatable(ucchars,     { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.uccode c = c and utfchar(c) or u t[u] = c return c end end } ) -setmetatable(shchars,     { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.shcode c = c and utfchar(c) or u t[u] = c return c end end } ) +--~ setmetatable(lccharcodes, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.lccode or u t[u] = c return c end end } ) +--~ setmetatable(uccharcodes, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.uccode or u t[u] = c return c end end } ) +--~ setmetatable(shcharcodes, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.shcode or u t[u] = c return c end end } ) + +characters.specialchars = allocate()  local specialchars = characters.specialchars -- lazy table + +setmetatable(specialchars, { __index = function(t,u) +    if u then +        local c = data[utfbyte(u)] +        local s = c and c.specials +        if s then +            local t = { } +            for i=2,#s do +                local c = data[s[i]] +                if is_letter[c.category] then +                    t[#t+1] = c +                end +            end +            c = concat(t) +            t[u] = c +            return c +        else +            t[u] = u +            return u +        end +    end +end } ) -setmetatable(lccharcodes, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.lccode                      or u t[u] = c return c end end } ) -setmetatable(uccharcodes, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.uccode                      or u t[u] = c return c end end } ) -setmetatable(shcharcodes, { __index = function(t,u) if u then local c = data[utfbyte(u)] c = c and c.shcode                      or u t[u] = c return c end end } )  function characters.lower(str)      local new = { } | 
