summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Gesang <pgesang@ix.urz.uni-heidelberg.de>2011-12-19 11:54:31 +0100
committerPhilipp Gesang <pgesang@ix.urz.uni-heidelberg.de>2011-12-19 11:54:31 +0100
commit0e9875dc02be12d84c42ff6458172cfac8cf7e07 (patch)
treeaf1048a6ce7f246737db28491ea6d2378e93a15e
parent68136a0b476cd6d5bb8fb512b1dae4b1c697425b (diff)
downloadcyrillicnumbers-0e9875dc02be12d84c42ff6458172cfac8cf7e07.tar.gz
new titlo code; not yet generalized
-rw-r--r--tex/context/third/cyrillicnumbers/cyrillicnumbers.lua50
-rw-r--r--tex/context/third/cyrillicnumbers/t-cyrillicnumbers.mkiv142
2 files changed, 161 insertions, 31 deletions
diff --git a/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua b/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
index 1c252ae..72ed5e4 100644
--- a/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
+++ b/tex/context/third/cyrillicnumbers/cyrillicnumbers.lua
@@ -37,6 +37,7 @@ local utfupper = unicode.utf8.upper
local cyrnum = {
placetitlo = "font",
+ prefer100k = false,
titlolocation = "final", -- above final digit
titlospan = 3, -- only with mp
drawdots = true,
@@ -90,12 +91,41 @@ cyrnum.yes_synonyms = {
["true"] = true,
}
+cyrnum.no_synonyms = {
+ no = true,
+ nope = true,
+ ["false"] = true,
+}
+
+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)
+-- }
+
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
+ 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
@@ -120,12 +150,24 @@ local titlofuncs = {
mp = function (list)
local result = { }
local titlospan = cyrnum.titlospan
- local titlostart = titlospan and #list > titlospan and #list-titlospan or 1
+ 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=tablemaxn(list), 1, -1 do
+ --local char, digit, before, after = list[i][1], list[i][2], list[i][
+ local char, digit, before, after = unpack(list[i])
if i == titlostart then
result[#result+1] = start_titlo
end
- result[#result+1] = list[i]
+ 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
@@ -138,7 +180,7 @@ local concat_cyrillic_nums = function (list, upper)
local digits = digits_only(list) -- strip placeholders
local nlist, ndigits = tablemaxn(list), tablemaxn(digits)
dbg(list)
- dbg(digits)
+ --dbg(digits)
local titlo = titlofuncs[cyrnum.placetitlo]
if titlo then
result = tableconcat(titlo(digits))
diff --git a/tex/context/third/cyrillicnumbers/t-cyrillicnumbers.mkiv b/tex/context/third/cyrillicnumbers/t-cyrillicnumbers.mkiv
index 79a47e6..600bee4 100644
--- a/tex/context/third/cyrillicnumbers/t-cyrillicnumbers.mkiv
+++ b/tex/context/third/cyrillicnumbers/t-cyrillicnumbers.mkiv
@@ -16,14 +16,29 @@
\unprotect
+\startinterface all
+ \setinterfacevariable {cyrillicnumerals} {cyrillicnumerals}
+ \setinterfacevariable {Cyrillicnumerals} {Cyrillicnumerals}
+ \setinterfacevariable {cyrnum} {cyrnum}
+ \setinterfacevariable {dots} {dots}
+ \setinterfacevariable {dotsymbol} {dotsymbol}
+ \setinterfacevariable {penwidth} {penwidth}
+ \setinterfacevariable {preferhundredk} {preferhundredk}
+ \setinterfacevariable {titlolocation} {titlolocation}
+ \setinterfacevariable {titlomode} {titlomode}
+ \setinterfacevariable {titlospan} {titlospan}
+ \setinterfacevariable {titlo} {titlo}
+\stopinterface
+
\definenamespace [cyrnum] [
- name=cyrnum,
- type=module,
- setup=list,
- parent=cyrnum,
- style=no,
- version=hg-tip,
- comment=cyrillic numbers,
+ command=\v!yes,
+ comment=cyrillic numbers,
+ \s!name=\v!cyrnum,
+ \s!parent=\v!cyrnum,
+ setup=\v!list,
+ style=\v!no,
+ type=module,
+ version=hg-tip,
]
\registerctxluafile{cyrillicnumbers}
@@ -31,25 +46,25 @@
\def\cyrnumsetvariables{%
\startluacode
local tc = thirddata.cyrnum
- tc.placetitlo = "\cyrnumparameter{titlo}"
- tc.titlospan = tonumber("\cyrnumparameter{titlospan}") or false
- tc.titlolocation = tc.last_synonyms["\cyrnumparameter{titlolocation}"] and "l" or "m"
- tc.drawdots = tc. yes_synonyms["\cyrnumparameter{dots}"] or false
- tc.dotsymbol = "\cyrnumparameter{dotsymbol}"
+ tc.placetitlo = "\cyrnumparameter{\v!titlo}"
+ tc.titlolocation = tc.last_synonyms["\cyrnumparameter{\v!titlolocation}"] and "l" or "m"
+ tc.prefer100k = tc. yes_synonyms["\cyrnumparameter{\v!preferhundredk}"] or false
+ tc.drawdots = tc. yes_synonyms["\cyrnumparameter{\v!dots}"] or false
+ tc.dotsymbol = "\cyrnumparameter{\v!dotsymbol}"
+
+ local span = "\cyrnumparameter{\v!titlospan}"
+ local num = tonumber(span)
+ if num then
+ tc.titlotype = true
+ tc.titlospan = num
+ elseif span == "all" then
+ tc.titlotype = false
+ end
\stopluacode%
}
-\appendtoks \cyrnumsetvariables \to \everysetupcyrnum
-
-\setupcyrnum[
- titlo=mp, % font|mp|no
- titlospan=3, % n|all
- titlolocation=middle, % final|middle -- only effective if using the font’s titlo
- dots=\v!yes, % yes|no
- dotsymbol=·,
- penwidth=3,
- titlomode=5,
-]
+\appendtoks \setuevalue{\currentcyrnum}{\do_cyrnum[\currentcyrnum]} \to \everydefinecyrnum
+\appendtoks \cyrnumsetvariables \to \everysetupcyrnum
\startmoduletestsection
\ctxlua{thirddata.cyrnum.debug = true}
@@ -269,17 +284,90 @@
\let\cyrnumdrawtitlo\cyrnum_titloframe %% for protected context
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% Interfacing with the Lua functions.
+%D \subject{Interfacing with the Lua functions}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\cyrillicnumerals#1{\ctxcommand{cyrillicnumerals(\number#1)}}
-\def\Cyrillicnumerals#1{\ctxcommand{Cyrillicnumerals(\number#1)}}
+%D \macros
+%D {definecyrnum}
+%D
+%D User interface to the main conversion routines. The definition
+%D macro autogenerates the primary user-level macro, which in turn
+%D relies \type{\setupcyrnum} for argument processing (see above on
+%D \at{Page}[setupdef]).
+%D
+%D Example usage:
+%D
+%D \starttyping
+%D \definecyrnum[titlofree]
+%D \setupcyrnum [titlofree][titlo=no]
+%D \starttext
+%D \titlofree{42}
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\do_cyrnum[#1]{%
+ \edef\currentcyrnum{#1}%
+ \dosingleempty\dodo_cyrnum%
+}
+
+\def\dodo_cyrnum[#1]{%
+ \iffirstargument
+ \doifassignmentelse{#1}{\setupcyrnum[\currentcyrnum][#1]}\relax
+ \else
+ \setupcyrnum
+ \fi
+ \dododo_cyrnum%
+}
+
+\def\dododo_cyrnum#1{%
+ \ctxcommand{cyrillicnumerals(\number#1)}%
+}
+
+%D \macros
+%D {setupcyrnum}
+%D
+%D The \type{\setupcyrnum} and \type{\definecyrnum} macros are
+%D autogenerated via the namespace.
+
+\setupcyrnum[
+ \v!dots=\v!yes, % yes|no
+ \v!dotsymbol=·,
+ \v!penwidth=.66pt,
+ \v!preferhundredk=no,
+ \v!titlolocation=\v!middle, % final|middle -- only effective if using the font’s titlo
+ \v!titlomode=5,
+ \v!titlospan=3, % n|all
+ \v!titlo=\v!mp, % font|mp|no
+]
+
+%D \macros
+%D {cyrillicnumerals,Cyrillicnumerals}
+%D
+%D Conforming to the standard \CONTEXT\ naming scheme as employed
+%D with number conversion macros, we define two macros for use with
+%D conversions. As there is no definition for uppercase conversion,
+%D the macro \type{\Cyrillicnumerals} exists only for compatibility
+%D reasons.
+%D
+%D Also, we setup two corresponding conversions \type{cyr} and
+%D \type{Cyr} for use with e.g. enumerations, headings, counters
+%D {\italic\letterampersand}c.
+
+\definecyrnum[\v!cyrillicnumerals]
+\definecyrnum[\v!Cyrillicnumerals]
\defineconversion[cyrillicnumerals][\cyrillicnumerals]
\defineconversion[Cyrillicnumerals][\Cyrillicnumerals]
\defineconversion[cyr] [\cyrillicnumerals]
\defineconversion[Cyr] [\Cyrillicnumerals]
+%D \macros
+%D {cyrnum}
+%D
+%D The default user macro is defined as \type{\cyrnum}.
+
+\definecyrnum[\v!cyrnum]
+
\unprotect \endinput
-% vi:ft=context:fo=co:ts=4:expandtab:sw=4
+% vi:ft=context:fo=co:ts=2:expandtab:sw=2