summaryrefslogtreecommitdiff
path: root/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/third/cyrillicnumbers/cyrillicnumbers.lua')
-rw-r--r--tex/context/third/cyrillicnumbers/cyrillicnumbers.lua123
1 files changed, 108 insertions, 15 deletions
diff --git a/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua b/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
index d47c744..ab238ad 100644
--- a/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
+++ b/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
@@ -25,14 +25,46 @@
--- http://www.uni-giessen.de/partosch/eurotex99/berdnikov2.pdf
--- <http://ru.wikipedia.org/wiki/Кириллическая_система_счисления>
+local iowrite = io.write
+local mathceil = math.ceil
local mathfloor = math.floor
local tableconcat = table.concat
+local tablemaxn = table.maxn
+local tableinsert = table.insert
local utf8char = unicode.utf8.char
+local utf8len = unicode.utf8.len
local utfupper = unicode.utf8.upper
-thirddata = thirddata or { }
+local cyrnum = {
+ placetitlo = "font",
+ titlolocation = "final", -- above final digit
+ titlospan = 3, -- only with mp
+ drawdots = true,
+ debug = false,
+}
-local cyrillic_placetitlo = true
+thirddata = thirddata or { }
+thirddata.cyrnum = cyrnum
+
+local dbgpfx = "[cyrnum]"
+local dbg = function (...)
+ if cyrnum.debug then
+ local args = {...}
+ if type(args[1]) == "table" then args = args[1] end
+ iowrite(dbgpfx)
+ for i=1, #args do
+ local this = args[i]
+ local tthis = type(this)
+ iowrite" "
+ if tthis == "number" or tthis == "string" then
+ iowrite(this)
+ else
+ iowrite(tostring(this))
+ end
+ end
+ iowrite"\n"
+ end
+end
local cyrillic_numerals = {
{ "а", "в", "г", "д", "е", "ѕ", "з", "и", "ѳ", },
@@ -44,22 +76,83 @@ local cyrillic_100k = utf8char(0x488) -- combining hundred thousands sign
local cyrillic_1m = utf8char(0x489) -- combining million sign
local cyrillic_titlo = utf8char(0x483) -- combining titlo
-local concat_cyrillic_nums = function (chars, upper)
- local result = ""
- for i=#chars, 1, -1 do
- local this = chars[i]
- if this then
- if upper then this = utfupper(this) end
- if i > 3 then
- result = result .. cyrillic_1k .. this
- else
- result = result .. this
- end
+
+--local concat_cyrillic_nums = function (chars, upper)
+-- dbg(chars)
+-- local nchars, result = tablemaxn(chars), ""
+-- --if cyrnum.placetitlo and cyrnum.titlomode == "fm" then -- above central char
+-- -- dbg("char cnt", nchars)
+-- -- dbg("insert pos", mathceil(nchars/2))
+-- -- tableinsert(chars, mathceil(nchars/2), cyrillic_titlo)
+-- --end
+-- for i=#chars, 1, -1 do
+-- local this = chars[i]
+-- if this then
+-- if upper then this = utfupper(this) end
+-- if i > 3 then
+-- result = result .. cyrillic_1k .. this
+-- else
+-- result = result .. this
+-- end
+-- end
+-- end
+-- if cyrnum.placetitlo and cyrnum.titlomode == "fl" then -- take titlo from font, place it after / above last char
+-- result = result .. cyrillic_titlo
+-- end
+-- return result
+--end
+
+local digits_only = function (list)
+ local result = { }
+ for i=1, tablemaxn(list) do
+ local elm = list[i]
+ if type(elm) == "string" then
+ result[#result+1] = elm
end
end
- if cyrillic_placetitlo then -- not all fonts do this well
- result = result .. cyrillic_titlo
+ return result
+end
+
+local lreverse = function(list)local r={}for i=tablemaxn(list),1,-1 do r[#r+1]=list[i]end return r end
+
+local start_titlo, stop_titlo = [[\cyrnumdrawtitlo{]], "}"
+
+local titlofuncs = {
+ font = function (list)
+ if cyrnum.titlolocation == "final" then
+ list[#list+1] = cyrillic_titlo
+ else -- “middle” or whatever
+ local pos = mathceil(tablemaxn(list)/2)
+ tableinsert(list, mathceil(tablemaxn(list)/2), cyrillic_titlo)
+ end
+ return lreverse(list)
+ end,
+ mp = function (list)
+ local result = { start_titlo }
+ for i=tablemaxn(list), 1, -1 do
+ result[#result+1] = list[i]
+ end
+ result[#result+1] = stop_titlo
+ return result
+ end,
+ no = function (x) return x end,
+}
+
+local concat_cyrillic_nums = function (list, upper)
+ local result = ""
+ local digits = digits_only(list) -- strip placeholders
+ local nlist, ndigits = tablemaxn(list), tablemaxn(digits)
+ dbg(list)
+ dbg(digits)
+ local titlo = titlofuncs[cyrnum.placetitlo]
+ if titlo then
+ result = tableconcat(titlo(digits))
+ if cyrnum.drawdots then
+ local sym = cyrnum.dotsymbol
+ result = sym .. result .. sym
+ end
end
+ dbg(result)
return result
end