summaryrefslogtreecommitdiff
path: root/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
blob: d47c74491552e08ac7a5c0e0c11efaddf34a1c94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/env texlua
--------------------------------------------------------------------------------
--         FILE:  cyrillicnumbers.lua
--        USAGE:  called by t-cyrillicnumbers.mkiv
--  DESCRIPTION:  part of the Cyrillic Numbers module for ConTeXt
-- REQUIREMENTS:  recent ConTeXt MkIV and LuaTeX
--       AUTHOR:  Philipp Gesang (phg), <gesang at stud dot uni-heidelberg dot de>
--      VERSION:  hg tip
--      CREATED:  2011-11-29 10:06:00+0100
--------------------------------------------------------------------------------
--

--- read this first:
---
--- Жолобов, О. Ф.: *Числительные*. In: *Историческая грамматика древнерусского
---                 языка*, vol. 4, Moskva 2006, pp. 58--63
---
--- Trunte, Nikolaos H.: *Altkirchenslavisch*. In: *Словѣньскъи ѩꙁъікъ.
---                      Ein praktisches Lehrbuch des Kirchenslavischen in 30
---                      Lektionen. Zugleich eine Einführung in die slavische
---                      Philologie*, vol. 1, München ⁵2005, pp. 161ff.

--- or have a glance at these:
--- http://www.pravpiter.ru/zads/n018/ta013.htm
--- http://www.uni-giessen.de/partosch/eurotex99/berdnikov2.pdf
--- <http://ru.wikipedia.org/wiki/Кириллическая_система_счисления>

local mathfloor   = math.floor
local tableconcat = table.concat
local utf8char    = unicode.utf8.char
local utfupper    = unicode.utf8.upper

thirddata = thirddata or { }

local cyrillic_placetitlo = true

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

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
    end
  end
  if cyrillic_placetitlo then -- not all fonts do this well
    result = result .. cyrillic_titlo
  end
  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