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
|