summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua')
-rw-r--r--Master/texmf-dist/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua325
1 files changed, 325 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua b/Master/texmf-dist/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
new file mode 100644
index 00000000000..f33395c73d0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
@@ -0,0 +1,325 @@
+#!/usr/bin/env texlua
+--------------------------------------------------------------------------------
+-- FILE: cyrillicnumbers.lua
+-- USAGE: called by t-cyrillicnumbers.mkvi
+-- DESCRIPTION: part of the Cyrillic Numbers module for ConTeXt
+-- REQUIREMENTS: recent ConTeXt MkIV and LuaTeX
+-- AUTHOR: Philipp Gesang (phg), <phg42 dot 2a at gmail dot com>
+-- VERSION: hg tip
+-- CHANGED: 2013-03-28 00:10:47+0100
+--------------------------------------------------------------------------------
+--
+
+--[[ldx--
+<p>read this first:</p>
+
+<p>Жолобов, О. Ф.: <key>Числительные</key>. In: <key>Историческая
+ грамматика древнерусского языка</key>, vol. 4, Moskva
+ 2006, pp. 58--63</p>
+
+<p>Trunte, Nikolaos H.: <key>Altkirchenslavisch</key>. In:
+ <key>Словѣньскъи ѩꙁъікъ. Ein praktisches Lehrbuch
+ des Kirchenslavischen in 30 Lektionen. Zugleich eine
+ Einführung in die slavische Philologie</key>, vol.
+ 1, München ⁵2005, pp. 161ff.</p>
+
+<p>or have a glance at these:</p>
+
+<typing>
+http://www.pravpiter.ru/zads/n018/ta013.htm
+http://www.uni-giessen.de/partosch/eurotex99/berdnikov2.pdf
+http://ru.wikipedia.org/wiki/Кириллическая_система_счисления
+</typing>
+--ldx]]--
+
+local iowrite = io.write
+local mathceil = math.ceil
+local mathfloor = math.floor
+local stringformat = string.format
+local tableconcat = table.concat
+local tableinsert = table.insert
+local tostring = tostring
+local type = type
+local utf8char = unicode.utf8.char
+local utf8len = unicode.utf8.len
+
+
+local cyrnum = {
+ placetitlo = "font",
+ prefer100k = false,
+ titlolocation = "final", -- above final digit
+ titlospan = 3, -- only with mp
+ drawdots = true,
+ debug = false,
+}
+
+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 = {
+ { "а", "в", "г", "д", "е", "ѕ", "з", "и", "ѳ", },
+ { "і", "к", "л", "м", "н", "ѯ", "о", "п", "ч", },
+ { "р", "с", "т", "у", "ф", "х", "ѱ", "ѡ", "ц", },
+}
+local cyrillic_1k = "҂"
+local cyrillic_100k = utf8char(0x488) -- combining hundred thousands sign
+local cyrillic_1m = utf8char(0x489) -- combining million sign
+local cyrillic_titlo = utf8char(0x483) -- combining titlo
+
+--[[ldx--
+<p>Some string synonyms for user convenience.</p>
+--ldx]]--
+cyrnum.yes_synonyms = {
+ yes = true,
+ yeah = true,
+ ["true"] = true,
+}
+
+cyrnum.no_synonyms = {
+ no = true,
+ nope = true,
+ ["false"] = true,
+}
+
+--[[ldx--
+<p><type>m</type> for rounded down middle position, <type>l</type> for final
+position. Will default to initial position otherwise.</p>
+--ldx]]--
+cyrnum.position_synonyms = {
+ final = "l",
+ last = "l",
+ right = "l",
+ rightmost = "l",
+ ["false"] = "l",
+ middle = "m",
+ center = "m",
+ ["true"] = "m",
+}
+
+--[[ldx--
+<p>Digits above the thirds require special markers, some of which need to be
+placed before, others after the determined character.</p>
+--ldx]]--
+local handle_plus1k = function (digit)
+ local before, after
+ if digit == 7 then
+ after = cyrillic_1m
+ elseif cyrnum.prefer100k and digit == 6 then
+ after = cyrillic_100k
+ elseif digit > 3 then -- insert thousand sign
+ before = cyrillic_1k
+ end
+ return before, after
+end
+
+-- digit list = {
+-- [1] = character to be printed
+-- [2] = real digit of character
+-- [3] = print this before character (e.g. thousand signs)
+-- [4] = print this after character (e.g. million signs)
+-- }
+
+--[[ldx--
+<p>The base list of digits denotes empty (zero) digits with "false" values
+instead of characters. The function <type>digits_only</type> will extract only
+the nonempty digit values, returning a list.</p>
+--ldx]]--
+local digits_only = function (list)
+ local result = { }
+ for i=1, #list do
+ local elm = list[i]
+ if type(elm) == "string" then
+ local before, after
+ if i > 3 then
+ before, after = handle_plus1k(i)
+ end
+ result[#result+1] = { elm, i, before, after } -- i contains the real digit
+ end
+ end
+ return result
+end
+
+--[[ldx--
+<p>The different ways for drawing the <italic>titlo</italic> are stored inside
+a table. Basically, the options are to use the titlos symbol that is provided
+by the font or to draw the titlo in <l n="metapost"/>.</p>
+--ldx]]--
+local lreverse = function(list)local r={}for i=#list,1,-1 do r[#r+1]=list[i]end return r end
+
+local start_titlo, stop_titlo = [[\cyrnumdrawtitlo{]], "}"
+
+local titlofuncs = {
+ font = function (list)
+ local result, titlopos = { }, #list
+ if cyrnum.titlolocation == "l" then
+ titlopos = 1
+ elseif cyrnum.titlolocation == "m" then
+ titlopos = mathceil(#list/2)
+ end
+ for i=#list, 1, -1 do
+ local char, digit, before, after = list[i][1], list[i][2], list[i][3], list[i][4]
+ if before then
+ result[#result+1] = before
+ end
+ result[#result+1] = char
+ if after then
+ result[#result+1] = after
+ end
+ if i == titlopos then
+ result[#result+1] = cyrillic_titlo
+ end
+ end
+ return result
+ end,
+ mp = function (list)
+ local result = { }
+ local titlospan = cyrnum.titlospan
+ local titlotype = cyrnum.titlotype
+ local titlostart = #list -- default to “all”
+ if titlotype == true then -- number
+ titlostart = (#list >= titlospan) and titlospan or #list
+ end
+ for i=#list, 1, -1 do
+ local char, digit, before, after = list[i][1], list[i][2], list[i][3], list[i][4]
+ --local char, digit, before, after = unpack(list[i])
+ if i == titlostart then
+ result[#result+1] = start_titlo
+ end
+ if before then
+ result[#result+1] = before
+ end
+ result[#result+1] = char
+ if after then
+ result[#result+1] = after
+ end
+ end
+ result[#result+1] = stop_titlo
+ return result
+ end,
+ no = function (list)
+ local result = { }
+ for i=#list, 1, -1 do
+ local char, digit, before, after = list[i][1], list[i][2], list[i][3], list[i][4]
+ if before then
+ result[#result+1] = before
+ end
+ result[#result+1] = char
+ if after then
+ result[#result+1] = after
+ end
+ end
+ return result
+ end,
+}
+
+--[[ldx--
+<p>Concatenation of the digit list has to take into account different conditions: whether the user requests the dot markers to be added, whether a titlo is requested etc.</p>
+--ldx]]--
+local concat_cyrillic_nums = function (list)
+ local result = ""
+ local digits = digits_only(list) -- strip placeholders
+ local nlist, ndigits = #list, #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
+
+local do_tocyrillic do_tocyrillic = function (n, result)
+ if n < 1000 then
+ local mod100 = n % 100
+ if #result == 0 and mod100 > 10 and mod100 < 20 then
+ result[#result+1] = "і"
+ result[#result+1] = cyrillic_numerals[1][mod100%10] or false
+ else
+ result[#result+1] = cyrillic_numerals[1][mathfloor(n%10)] or false
+ result[#result+1] = cyrillic_numerals[2][mathfloor((n%100)/10)] or false
+ end
+ result[#result+1] = cyrillic_numerals[3][mathfloor((n%1000)/100)] or false
+ else
+ result = do_tocyrillic(n%1000, result)
+ result = do_tocyrillic(mathfloor(n/1000), result)
+ end
+ return result
+end
+
+local tocyrillic = function (n)
+ local chars = do_tocyrillic(n, { })
+ return concat_cyrillic_nums(chars)
+end
+
+local Tocyrillic = function (n)
+ local chars = do_tocyrillic(n, { })
+ return concat_cyrillic_nums(chars, true)
+end
+
+converters.tocyrillic = tocyrillic
+converters.cyrillicnumerals = tocyrillic
+converters.Cyrillicnumerals = Tocyrillic
+
+function commands.cyrillicnumerals (n) context(tocyrillic(n)) end
+function commands.Cyrillicnumerals (n) context(Tocyrillic(n)) end
+
+--- Fun ---------------------------------------------------------
+
+local f_peano = [[suc(%s)]]
+local do_topeano = function (n)
+ n = tonumber(n) or 0
+ if n == 0 then return "0" end
+ local result = stringformat(f_peano, 0)
+ if n == 1 then return result end
+ for i=2, n do
+ result = stringformat(f_peano, result)
+ end
+ return result
+end
+
+local s_churchp = [[λf.λx.\;]]
+local s_church0 = [[x]]
+local s_church1 = [[f\,x]]
+local f_church = [[f(%s)]]
+local do_tochurch = function (n)
+ if n == 0 then return s_churchp .. s_church0
+ elseif n == 1 then return s_churchp .. s_church1 end
+ local result = stringformat(f_church, s_church1)
+ for i=2, n do
+ result = stringformat(f_church, result)
+ end
+ return s_churchp .. result
+end
+
+converters.topeano = do_topeano
+converters.tochurch = do_tochurch
+
+commands.peanonumerals = function (n) context(do_topeano(n)) end
+commands.churchnumerals = function (n) context.mathematics(do_tochurch(n)) end
+
+-- vim:ft=lua:ts=2:sw=2:expandtab:fo=croql