<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FSquc%2FRoman</id>
	<title>Module:Sandbox/Squc/Roman - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FSquc%2FRoman"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Squc/Roman&amp;action=history"/>
	<updated>2026-05-17T10:50:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Squc/Roman&amp;diff=146215&amp;oldid=prev</id>
		<title>imported&gt;Squc at 04:32, 5 October 2013</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Squc/Roman&amp;diff=146215&amp;oldid=prev"/>
		<updated>2013-10-05T04:32:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module to convert Roman numerals and reject invalid numerals&lt;br /&gt;
&lt;br /&gt;
local p={}&lt;br /&gt;
&lt;br /&gt;
local tags = {&lt;br /&gt;
    overline = &amp;#039;&amp;lt;span style=&amp;quot;text-decoration:overline;&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
    doubleov = &amp;#039;&amp;lt;span style=&amp;quot;border-top:double 3px&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    rn =     &amp;#039;&amp;lt;span style=&amp;quot;font-family:serif; font-size:118%;&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
    rnsize = &amp;#039;&amp;lt;span style=&amp;quot;font-family:serif; font-size:122%;&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
    nrnsize = &amp;#039;&amp;lt;span style=&amp;quot;font-size:114%;&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    errs = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
    sspan = &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    pipe = &amp;#039;&amp;amp;#124;&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function atc(cn, rp)&lt;br /&gt;
    local s = &amp;quot; - &amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
    if rp ~= nil then s = s..&amp;quot;roman numeral &amp;quot;..tostring(rp)..&amp;quot;, &amp;quot; end&lt;br /&gt;
    s = s..&amp;quot;char &amp;quot;..tostring(cn)..&amp;quot;&amp;#039;&amp;#039;; &amp;quot;&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function unesc( s )&lt;br /&gt;
    s = s:gsub(&amp;quot;\\p&amp;quot;, tags.pipe)&lt;br /&gt;
    s = s:gsub(&amp;quot;\\\\&amp;quot;, &amp;quot;\\&amp;quot;)&lt;br /&gt;
    s = s:gsub(&amp;quot;\\=&amp;quot;, &amp;quot;\=&amp;quot;)&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function disperr(err)&lt;br /&gt;
    return tags.errs..err..tags.sspan&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local rn_ref = {I=1, V=2, X=3, L=4, C=5, D=6, M=7}&lt;br /&gt;
local ref_rn = {[1]=&amp;quot;I&amp;quot;, [2]=&amp;quot;V&amp;quot;, [3]=&amp;quot;X&amp;quot;, [4]=&amp;quot;L&amp;quot;, [5]=&amp;quot;C&amp;quot;, [6]=&amp;quot;D&amp;quot;, [7]=&amp;quot;M&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
local function todec1 (rns, ovl, vbr, tcc)&lt;br /&gt;
&lt;br /&gt;
    local err = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local cex, cfr, crn, run, num = 0,0,0,0,0,0     -- prn, crn: previous, current roman numeral value&lt;br /&gt;
    local pex, pfr, prn = 0,0,0&lt;br /&gt;
        -- (current) cex: exponent (10^1, 10^2 etc.), cfr: fractional part, run: amount of character so far&lt;br /&gt;
    local rnc = &amp;quot;&amp;quot; -- roman numeral character&lt;br /&gt;
&lt;br /&gt;
    for i = 1, #rns do             -- cex = 2, cfr =   0 or 0.5,&lt;br /&gt;
        cex, cfr = math.modf((rns[i]-1)/2)  -- crn = 100 or 500 etc.&lt;br /&gt;
        if cfr == 0 then crn = 10^cex else crn = 5*10^cex end&lt;br /&gt;
        &lt;br /&gt;
        tc = tcc[i]&lt;br /&gt;
        &lt;br /&gt;
        local function rncg(j, ia)&lt;br /&gt;
            if j == nil then j = 0 end&lt;br /&gt;
            rn, ov, vb = rns[i+j], ovl[i+j], vbr[i+j]&lt;br /&gt;
            rncr = rn - ov*6 - vb*4&lt;br /&gt;
            if ia == 1 then&lt;br /&gt;
                if rn == 13 and rncr == 7 then&lt;br /&gt;
                    rncr, ov, vb = 4, 1, 1&lt;br /&gt;
                elseif rncr == 7 then&lt;br /&gt;
                    rncr = 1&lt;br /&gt;
                    ov = ov + 1&lt;br /&gt;
                else rncr = rncr + 1&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            rnc = ref_rn[rncr]&lt;br /&gt;
            local rnc_vb = &amp;quot;&amp;quot;&lt;br /&gt;
            if vb == 1 then rnc_vb = &amp;quot;&amp;amp;#124;&amp;quot; end&lt;br /&gt;
            rnc = rnc_vb .. rnc .. string.rep(&amp;quot;̅&amp;quot;, ov) .. rnc_vb&lt;br /&gt;
            return rnc&lt;br /&gt;
        end&lt;br /&gt;
        rnc = rncg()&lt;br /&gt;
        &lt;br /&gt;
        if crn &amp;lt; prn or prn == 0 then&lt;br /&gt;
&lt;br /&gt;
            num = num + prn*run&lt;br /&gt;
            run = 1&lt;br /&gt;
&lt;br /&gt;
        elseif crn == prn then&lt;br /&gt;
 &lt;br /&gt;
            if cfr == 0 then&lt;br /&gt;
                if run &amp;gt; 3 then                         -- e.g. &amp;quot;XXXXX&amp;quot; for 50, &amp;quot;L&amp;quot; suggested&lt;br /&gt;
                    err = err..&amp;quot;More than four &amp;quot;..rnc..&amp;quot; in a row, suggestion: &amp;quot;..rncg(0,1)..&amp;quot;?&amp;quot;..atc(tc, i)&lt;br /&gt;
                    run = run + 1&lt;br /&gt;
                elseif run == 0 then                    -- e.g. occurs after crn &amp;gt; prn (below) e.g. &amp;quot;XCC&amp;quot;&lt;br /&gt;
                    err = err..&amp;quot;Repeat after subtraction - &amp;quot; .. rncg(-2) .. rncg(-1) .. rnc .. atc(tc, i)&lt;br /&gt;
                    run = 1 -- In &amp;quot;XCC&amp;quot;, assume &amp;quot;XC&amp;quot; is a unit, so the current &amp;quot;C&amp;quot; is counted separately.&lt;br /&gt;
                else&lt;br /&gt;
                    run = run + 1&lt;br /&gt;
                end&lt;br /&gt;
            elseif cfr == 0.5 then                      -- e.g. &amp;quot;VV&amp;quot; for 10, &amp;quot;X&amp;quot; suggested&lt;br /&gt;
                err = err..rncg(-1)..&amp;quot; cannot be with another &amp;quot;..rnc..&amp;quot;, suggestion: &amp;quot;..rncg(0,1)..&amp;quot;?&amp;quot;..atc(tc,i)&lt;br /&gt;
            else return -1, (&amp;quot;Unknown error 1&amp;quot;) end&lt;br /&gt;
 &lt;br /&gt;
        elseif crn &amp;gt; prn then&lt;br /&gt;
 &lt;br /&gt;
            if crn &amp;gt; prn * 10 then                      -- e.g. &amp;quot;XM&amp;quot; or &amp;quot;IL&amp;quot;&lt;br /&gt;
                err = err..rnc..&amp;quot; cannot follow &amp;quot;..rncg(-1)..&amp;quot; (Subtraction can only be within the same digit)&amp;quot;..atc(tc,i)&lt;br /&gt;
            elseif pfr == 0.5 then                      -- e.g. &amp;quot;LC&amp;quot; for 50&lt;br /&gt;
                err = err..rnc..&amp;quot; cannot follow &amp;quot;..rncg(-1)..&amp;quot; (Cannot subtract from &amp;quot; .. tostring(prn) .. &amp;quot;)&amp;quot; ..atc(tc,i)&lt;br /&gt;
            elseif run &amp;gt; 2 then                         -- e.g. &amp;quot;XXXL&amp;quot; for 20&lt;br /&gt;
                err = err .. &amp;quot;Number of &amp;quot; .. rncg(-1) .. &amp;quot; before &amp;quot; .. rnc .. &amp;quot; must be at most two&amp;quot; .. atc(tc, i)&lt;br /&gt;
            end&lt;br /&gt;
            num = num - prn*run + crn&lt;br /&gt;
            run = 0&lt;br /&gt;
 &lt;br /&gt;
        else return -1, (&amp;quot;Unknown error 2&amp;quot;) end&lt;br /&gt;
 &lt;br /&gt;
        prn = crn&lt;br /&gt;
        pex = cex&lt;br /&gt;
        pfr = cfr&lt;br /&gt;
    end&lt;br /&gt;
    num = num + prn*run&lt;br /&gt;
    &lt;br /&gt;
    if err ~= &amp;quot;&amp;quot; then err = err:sub(1, -3) end&lt;br /&gt;
    return num, err&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function todec( args )  -- pn: number of pipes (vertical bar) found so far,         p: in a vertical bar(X100)?&lt;br /&gt;
    local err, tag = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;   -- err: error message, rnseq: sequence of roman numerals,   tag: current html tag&lt;br /&gt;
    local rnseq, t = {},{}    -- tc: total character count so far, argn: argument number, cc: current character&lt;br /&gt;
    local ovl, vbr, tcc = {},{},{}         -- ovl,vbr,tcc: tc, status of overline and     t: table of html tags,&lt;br /&gt;
    local argn, tc, pn, ovc = 1, 0, 0, -1  -- vertical bar for each number in rnseq,      n: current character number&lt;br /&gt;
    local ov, dv, rn = 0,0,0  -- ov, dv, rn: number of overline, double overline, rn tags nested&lt;br /&gt;
    local p = false           -- gt, sc: position of greater than, semicolon character&lt;br /&gt;
    local ierr = &amp;quot;&amp;quot;           -- ierr: errors already in input (in error style span tag)&lt;br /&gt;
    local carg = args[argn]   -- atc(): produces &amp;quot; - Char 123; &amp;quot; for error messages  | defined at&lt;br /&gt;
    while carg ~= nil do      -- tags: table of html tags                            | the start&lt;br /&gt;
        if carg == &amp;quot;&amp;quot; then    -- ovc: position of overline character (U+0305) modified roman numeral&lt;br /&gt;
            pn = pn + 1       --      (or another overline character)&lt;br /&gt;
            if p then p = false else p = true end&lt;br /&gt;
        else&lt;br /&gt;
            local n = 0&lt;br /&gt;
            local cc = &amp;quot;&amp;quot;&lt;br /&gt;
            local cplen = mw.ustring.len    -- codepoint length&lt;br /&gt;
            while n &amp;lt; cplen(carg) do&lt;br /&gt;
                n = n + 1&lt;br /&gt;
                cc = mw.ustring.sub(carg, n, n)&lt;br /&gt;
                if cc == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
                    local gt = mw.ustring.find(carg, &amp;quot;&amp;gt;&amp;quot;, n, true)&lt;br /&gt;
                    if gt == nil then&lt;br /&gt;
                        tc = tc + 1&lt;br /&gt;
                        err=err..&amp;quot;Unbalanced &amp;#039;&amp;lt;&amp;#039; found&amp;quot;..atc(tc)&lt;br /&gt;
                    else tag = mw.ustring.sub(carg, n, gt)&lt;br /&gt;
                        local taglen = cplen(tag)&lt;br /&gt;
                        n = n + taglen - 1&lt;br /&gt;
                        if tag == tags.sspan then&lt;br /&gt;
                            ct = t[#t]      -- current t&lt;br /&gt;
                            if     ct == &amp;quot;ov&amp;quot; then ov = ov - 1&lt;br /&gt;
                            elseif ct == &amp;quot;rn&amp;quot; then rn = rn - 1&lt;br /&gt;
                            elseif ct == &amp;quot;dv&amp;quot; then dv = dv - 1&lt;br /&gt;
                            end&lt;br /&gt;
                            if #t == 0 then err=err..&amp;quot;Unbalanced \&amp;quot;&amp;quot;..tags.sspan..&amp;quot;\&amp;quot; tag found&amp;quot;..atc(tc)&lt;br /&gt;
                            else t[#t] = nil end&lt;br /&gt;
                        elseif tag == tags.overline then&lt;br /&gt;
                            ov = ov + 1&lt;br /&gt;
                            t[#t + 1] = &amp;quot;ov&amp;quot;&lt;br /&gt;
                            if ov &amp;gt; 1 then err=err..ov..&amp;quot; nested overline tags found&amp;quot;..atc(tc) end&lt;br /&gt;
                        elseif tag == tags.doubleov then&lt;br /&gt;
                            dv = dv + 1&lt;br /&gt;
                            t[#t + 1] = &amp;quot;dv&amp;quot;&lt;br /&gt;
                            if dv &amp;gt; 1 then err=err..dv..&amp;quot; nested double overline tags found&amp;quot;..atc(tc) end&lt;br /&gt;
                        elseif tag == tags.rn or tag == tags.rnsize then&lt;br /&gt;
                            rn = rn + 1&lt;br /&gt;
                            t[#t + 1] = &amp;quot;rn&amp;quot;&lt;br /&gt;
                            if rn &amp;gt; 1 then err=err..rn..&amp;quot; nested rn tags found&amp;quot;..atc(tc) end&lt;br /&gt;
                        elseif tag == tags.nrnsize then -- Large font size span tag&lt;br /&gt;
                            t[#t + 1] = &amp;quot;sz&amp;quot;      -- for overlines to show properly&lt;br /&gt;
                        elseif tag == tags.errs then    -- close span tag start, end point&lt;br /&gt;
                            local csp, cep = mw.ustring.find(carg, tags.sspan, n, true)&lt;br /&gt;
                            ierr = ierr .. &amp;quot;, &amp;quot; .. mw.ustring.sub(carg, n+1, csp-1)&lt;br /&gt;
                            n = cep&lt;br /&gt;
                        else&lt;br /&gt;
                            err=err..&amp;quot;Unknown tag \&amp;quot;&amp;quot;..tag..&amp;quot;\&amp;quot; found&amp;quot;..atc(tc)&lt;br /&gt;
                            t[#t + 1] = &amp;quot;uk&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                elseif cc == &amp;quot; &amp;quot; then tc = tc + 1       -- spaces&lt;br /&gt;
                elseif cc == &amp;quot;&amp;amp;&amp;quot; then&lt;br /&gt;
                    local sc = mw.ustring.find(carg, &amp;quot;;&amp;quot;, n, true)&lt;br /&gt;
                    if sc == nil then&lt;br /&gt;
                        tc = tc + 1&lt;br /&gt;
                        err=err..&amp;quot;Extra character &amp;#039;&amp;amp;&amp;#039; found&amp;quot;..atc(tc)&lt;br /&gt;
                    else&lt;br /&gt;
                        tag = mw.ustring.sub(carg, n, sc)&lt;br /&gt;
                        tc = tc + cplen(tag)&lt;br /&gt;
                        n = n + cplen(tag) - 1&lt;br /&gt;
                        if tag == &amp;quot;&amp;amp;#124;&amp;quot; or tag == &amp;quot;&amp;amp;#x73;&amp;quot; then&lt;br /&gt;
                            pn = pn + 1&lt;br /&gt;
                            if p then p = false else p = true end&lt;br /&gt;
                        elseif tag == &amp;quot;&amp;amp;#773;&amp;quot; or tag == &amp;quot;&amp;amp;#x305;&amp;quot; then&lt;br /&gt;
                            if ovc+1 &amp;lt; tc then &lt;br /&gt;
                                err=err..&amp;quot;Overline character is not over a roman numeral&amp;quot;..atc(tc)&lt;br /&gt;
                            end&lt;br /&gt;
                            rnseq[#rnseq] = rnseq[#rnseq] + 6&lt;br /&gt;
                            ovl[#rnseq] = ovl[#rnseq] + 1&lt;br /&gt;
                            ovc = tc&lt;br /&gt;
                        else err=err..&amp;quot;Unknown tag \&amp;quot;&amp;quot;..tag..&amp;quot;\&amp;quot; found&amp;quot;..atc(tc)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                elseif cc == &amp;quot;̅&amp;quot; then&lt;br /&gt;
                    tc = tc + 1&lt;br /&gt;
                    if ovc+1 &amp;lt; tc then&lt;br /&gt;
                        err=err..&amp;quot;Overline character is not over a roman numeral&amp;quot;..atc(tc)&lt;br /&gt;
                    end&lt;br /&gt;
                    rnseq[#rnseq] = rnseq[#rnseq] + 6&lt;br /&gt;
                    ovl[#rnseq] = ovl[#rnseq] + 1&lt;br /&gt;
                    ovc = tc&lt;br /&gt;
                elseif cc == &amp;quot;|&amp;quot; then       -- Possible by calling from another module&lt;br /&gt;
                    pn = pn + 1&lt;br /&gt;
                    if p then p = false else p = true end&lt;br /&gt;
                else tc = tc + 1&lt;br /&gt;
                    ccu = cc:upper()&lt;br /&gt;
                    if rn_ref[ccu] == nil then&lt;br /&gt;
                        err=err..&amp;quot;Unknown character \&amp;quot;&amp;quot;..cc..&amp;quot;\&amp;quot; found&amp;quot;..atc(tc)&lt;br /&gt;
                    else   -- vb: vertical bar modifier&lt;br /&gt;
                        local vb = 0&lt;br /&gt;
                        if p then vb = 1 end&lt;br /&gt;
                        rnseq[#rnseq + 1] = rn_ref[ccu] + ov*6 + dv*12 + vb*4&lt;br /&gt;
                        tcc[#rnseq], ovl[#rnseq], vbr[#rnseq] = tc, ov + dv*2, vb&lt;br /&gt;
                        ovc = tc    -- for error message purposes ^&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        argn = argn + 1&lt;br /&gt;
        carg = args[argn]&lt;br /&gt;
    end&lt;br /&gt;
    if argn == 0 then return -1, &amp;quot;Input is empty&amp;quot;&lt;br /&gt;
    elseif #rnseq == 0 then return -1, &amp;quot;No roman numerals found&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        num, err1 = todec1(rnseq, ovl, vbr, tcc)&lt;br /&gt;
        if err  ~=&amp;quot;&amp;quot; then err = &amp;quot;Syntax errors: &amp;quot;..mw.ustring.sub(err, 1, -3)..&amp;quot;  &amp;quot; end&lt;br /&gt;
        if err1 ~=&amp;quot;&amp;quot; then err=err..&amp;quot;Roman numeral usage errors: &amp;quot;..err1..&amp;quot;  &amp;quot; end&lt;br /&gt;
        if ierr ~=&amp;quot;&amp;quot; then err=err..&amp;quot;Errors already in the input: &amp;quot;..mw.ustring.sub(ierr, 3)..&amp;quot;  &amp;quot; end&lt;br /&gt;
        if err ~= &amp;quot;&amp;quot; then err = mw.ustring.sub(err, 1, -3) end&lt;br /&gt;
        return num, err&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.todecimal( frame )&lt;br /&gt;
    local fargs = frame.args&lt;br /&gt;
    if fargs.d == &amp;quot;0&amp;quot; then&lt;br /&gt;
        pframe = frame:getParent()&lt;br /&gt;
        args = pframe.args&lt;br /&gt;
    else&lt;br /&gt;
        args = fargs&lt;br /&gt;
    end&lt;br /&gt;
    mode = fargs.mode or &amp;quot;0&amp;quot;&lt;br /&gt;
    disp = fargs.disp or &amp;quot;0&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local num, err = todec(args)&lt;br /&gt;
    &lt;br /&gt;
    if mode == &amp;quot;0&amp;quot; then       -- Normal mode&lt;br /&gt;
        if num == nil then return disperr(&amp;quot;Unknown error 4&amp;quot;) end&lt;br /&gt;
        if err == &amp;quot;&amp;quot; then&lt;br /&gt;
            if num ~= -1 then return num&lt;br /&gt;
            else return disperr(&amp;quot;Unknown error 3&amp;quot;) end&lt;br /&gt;
        else&lt;br /&gt;
            if num == -1 then return disperr(err)&lt;br /&gt;
            else return num..&amp;quot; &amp;quot;..disperr(err) end&lt;br /&gt;
        end&lt;br /&gt;
    elseif mode == &amp;quot;1&amp;quot; then   -- Supress errors&lt;br /&gt;
        if num == nil then num = -2 end&lt;br /&gt;
        return num&lt;br /&gt;
    elseif mode == &amp;quot;2&amp;quot; then   -- Display all&lt;br /&gt;
        if disp == &amp;quot;0&amp;quot; or disp == &amp;quot;&amp;quot; then&lt;br /&gt;
            disp = &amp;quot;&amp;amp;#91;num&amp;amp;#93;\\n &amp;amp;#91;err&amp;amp;#93;\\e &amp;amp;#91;time&amp;amp;#93;\\t&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        tim = os.clock()&lt;br /&gt;
        disp = unesc(disp)&lt;br /&gt;
        disp = disp:gsub(&amp;quot;\\n&amp;quot;, num)&lt;br /&gt;
        disp = disp:gsub(&amp;quot;\\e&amp;quot;, err)&lt;br /&gt;
        disp = disp:gsub(&amp;quot;\\t&amp;quot;, tim)&lt;br /&gt;
        return disp&lt;br /&gt;
    else return disperr(&amp;quot;Unknown mode&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.todecimald( roman )&lt;br /&gt;
    num, err = todec{ roman }&lt;br /&gt;
    return num, err, os.clock()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--  Decimal to roman numeral  --&lt;br /&gt;
&lt;br /&gt;
local function torom1 (dec1) -- For &amp;lt;5000 subunit&lt;br /&gt;
    local function torom2 (dec2, a, b, c)&lt;br /&gt;
        local rom3 = &amp;quot;&amp;quot;&lt;br /&gt;
        if     dec2==&amp;quot;1&amp;quot; then rom3 = a&lt;br /&gt;
        elseif dec2==&amp;quot;2&amp;quot; then rom3 = a..a&lt;br /&gt;
        elseif dec2==&amp;quot;3&amp;quot; then rom3 = a..a..a&lt;br /&gt;
        elseif dec2==&amp;quot;4&amp;quot; then rom3 = a..b&lt;br /&gt;
        elseif dec2==&amp;quot;5&amp;quot; then rom3 = b&lt;br /&gt;
        elseif dec2==&amp;quot;6&amp;quot; then rom3 = b..a&lt;br /&gt;
        elseif dec2==&amp;quot;7&amp;quot; then rom3 = b..a..a&lt;br /&gt;
        elseif dec2==&amp;quot;8&amp;quot; then rom3 = b..a..a..a&lt;br /&gt;
        elseif dec2==&amp;quot;9&amp;quot; then rom3 = a..c&lt;br /&gt;
        end&lt;br /&gt;
        return rom3&lt;br /&gt;
    end&lt;br /&gt;
    dec1 = tostring(dec1)&lt;br /&gt;
    local dec2 = string.rep(&amp;quot;0&amp;quot;,4-#dec1)..dec1&lt;br /&gt;
    local a = {[2]=&amp;quot;C&amp;quot;, [3]=&amp;quot;X&amp;quot;, [4]=&amp;quot;I&amp;quot;}&lt;br /&gt;
    local b = {[2]=&amp;quot;D&amp;quot;, [3]=&amp;quot;L&amp;quot;, [4]=&amp;quot;V&amp;quot;}&lt;br /&gt;
    local c = {[2]=&amp;quot;M&amp;quot;, [3]=&amp;quot;C&amp;quot;, [4]=&amp;quot;X&amp;quot;}&lt;br /&gt;
    local rom2 = { &amp;quot;&amp;quot;..string.rep(&amp;quot;M&amp;quot;, tonumber(dec2:sub(1,1)) ) }&lt;br /&gt;
    for i=2, 4 do&lt;br /&gt;
        rom2[i] = torom2(dec2:sub(i,i), a[i], b[i], c[i])&lt;br /&gt;
    end&lt;br /&gt;
    local rom1 = table.concat(rom2)&lt;br /&gt;
    return rom1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function torom (dec, rndisp)&lt;br /&gt;
    &lt;br /&gt;
    local err, ierr = &amp;quot;&amp;quot;, &amp;quot;&amp;quot; -- ierr: errors already in the input&lt;br /&gt;
    local rn, rc = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
    if rndisp then&lt;br /&gt;
        rn = tags.rn&lt;br /&gt;
        rc = tags.sspan -- &amp;lt;/span&amp;gt;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local floor = math.floor&lt;br /&gt;
    &lt;br /&gt;
    if type(dec) == &amp;quot;string&amp;quot; then   -- sp, ep: start point, end point&lt;br /&gt;
        errsp, errep = mw.ustring.find(dec, tags.errs, 1, true) -- error position (if present)&lt;br /&gt;
        while errsp do&lt;br /&gt;
            endsp, endep = mw.ustring.find(dec, tags.sspan, errep, true)&lt;br /&gt;
            if endsp then&lt;br /&gt;
                ierr = ierr .. &amp;quot;, &amp;quot; .. mw.ustring.sub(dec, errep+1, endsp-1)&lt;br /&gt;
                dec = mw.ustring.sub(dec, 1, errsp-1)..mw.ustring.sub(dec, endep+1)&lt;br /&gt;
            end&lt;br /&gt;
            errsp, errep = mw.ustring.find(dec, tags.errs, 1, true)&lt;br /&gt;
        end&lt;br /&gt;
        local ton = tonumber(dec)&lt;br /&gt;
        if ton == nil then&lt;br /&gt;
            err = err .. &amp;quot;Not a number; &amp;quot;&lt;br /&gt;
            dect = dec:gsub(&amp;quot;[^%d]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
            if dect==&amp;quot;&amp;quot; then return -1, &amp;quot;No digits&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                err=err..&amp;quot;Extra characters &amp;#039;&amp;quot;..dec:gsub(&amp;quot;%d&amp;quot;,&amp;quot;&amp;quot;)..&amp;quot;&amp;#039; found; &amp;quot;&lt;br /&gt;
                dec = dec:gsub(&amp;quot;[^%d.]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                dec = tonumber(dec)&lt;br /&gt;
            end&lt;br /&gt;
        else dec = ton&lt;br /&gt;
        end&lt;br /&gt;
    elseif type(dec) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
        local ton = tonumber(dec)&lt;br /&gt;
        if ton == nil then return -1, &amp;quot;Not a number or string&amp;quot; end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if dec &amp;lt; 1 then return -1, &amp;quot;Input (&amp;quot;..dec..&amp;quot;) is less than 1&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        local dec, frp = math.modf(dec)     -- frp: fractional part&lt;br /&gt;
        if frp ~= 0 then &lt;br /&gt;
            err=err..&amp;quot;Input has fractional part &amp;quot;..frp..&amp;quot;, ignoring...; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        local romt = {}&lt;br /&gt;
        local rdec = dec                    -- rdec: remaining dec&lt;br /&gt;
        local od = tags.doubleov&lt;br /&gt;
        local ov = tags.overline&lt;br /&gt;
        local cl = tags.sspan -- close&lt;br /&gt;
        local vb = tags.pipe  -- vertical bar&lt;br /&gt;
        if dec &amp;gt;= 5e9 then&lt;br /&gt;
            err = err .. &amp;quot;Input is 5,000,000,000 (5e9) or greater; &amp;quot;&lt;br /&gt;
            local ov = floor( math.log10(dec/5)/3 )&lt;br /&gt;
            local cdec = 0                  -- ov: number of overlines&lt;br /&gt;
            for i = ov, 3, -1 do&lt;br /&gt;
                cdec = floor(rdec/10^(i*3))&lt;br /&gt;
                rdec = rdec - cdec*10^(i*3)&lt;br /&gt;
                local romt2 = torom1(cdec)&lt;br /&gt;
                local romt1 = {}&lt;br /&gt;
                for j=1, #romt2 do romt1[j] = romt2:sub(j, j) end&lt;br /&gt;
                romt1[#romt1+1] = &amp;quot;&amp;quot;&lt;br /&gt;
                if rndisp then size = tags.rnsize else size = tags.nrnsize end&lt;br /&gt;
                romt[#romt+1] = size..table.concat(romt1, string.rep(&amp;quot;̅&amp;quot;,i))..cl&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if dec &amp;gt;= 5e8 then&lt;br /&gt;
            cdec = floor( rdec /1e6)&lt;br /&gt;
            rdec = rdec - cdec*1e6&lt;br /&gt;
            romt[#romt+1] = od..rn..torom1(cdec)..rc..cl&lt;br /&gt;
        end&lt;br /&gt;
        if dec &amp;gt;= 5e6 then&lt;br /&gt;
            cdec = floor( rdec /1e5)&lt;br /&gt;
            rdec = rdec - cdec*1e5&lt;br /&gt;
            romt[#romt+1] = vb..ov..rn..torom1(cdec)..rc..cl..vb&lt;br /&gt;
        end&lt;br /&gt;
        if dec &amp;gt;= 5e3 then&lt;br /&gt;
            cdec = floor( rdec /1e3)&lt;br /&gt;
            rdec = rdec - cdec*1e3&lt;br /&gt;
            romt[#romt+1] = ov..rn..torom1(cdec)..rc..cl&lt;br /&gt;
        end&lt;br /&gt;
        cdec = rdec&lt;br /&gt;
        romt[#romt+1] = rn..torom1(cdec)..rc&lt;br /&gt;
        rom = table.concat(romt, &amp;quot; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if err ~= &amp;quot;&amp;quot; then err = mw.ustring.sub(err, 1, -3)..&amp;quot;  &amp;quot; end&lt;br /&gt;
    if ierr ~=&amp;quot;&amp;quot; then err = err..&amp;quot;Errors already in the input: &amp;quot;..mw.ustring.sub(ierr, 3)..&amp;quot;  &amp;quot; end&lt;br /&gt;
    if err ~= &amp;quot;&amp;quot; then err = mw.ustring.sub(err, 1, -3) end&lt;br /&gt;
    return rom, err&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.fromdecimal( frame )&lt;br /&gt;
    fargs = frame.args&lt;br /&gt;
    if fargs.d == &amp;quot;0&amp;quot; then&lt;br /&gt;
        pframe = frame:getParent()&lt;br /&gt;
        args = pframe.args&lt;br /&gt;
    else&lt;br /&gt;
        args = fargs&lt;br /&gt;
    end&lt;br /&gt;
    mode = fargs.mode or &amp;quot;0&amp;quot;&lt;br /&gt;
    disp = fargs.disp or &amp;quot;0&amp;quot;&lt;br /&gt;
    local rn&lt;br /&gt;
    if fargs.rn == &amp;quot;1&amp;quot; then rn = true else rn = false end&lt;br /&gt;
    &lt;br /&gt;
    local rom, err = torom(args[1], rn)&lt;br /&gt;
    &lt;br /&gt;
    if mode == &amp;quot;0&amp;quot; then       -- Normal mode&lt;br /&gt;
        if rom == nil then return disperr(&amp;quot;Unknown error 6&amp;quot;) end&lt;br /&gt;
        if err == &amp;quot;&amp;quot; then&lt;br /&gt;
            if rom ~= -1 then return rom&lt;br /&gt;
            else return disperr(&amp;quot;Unknown error 5&amp;quot;) end&lt;br /&gt;
        else&lt;br /&gt;
            if rom == -1 then return disperr(err)&lt;br /&gt;
            else return rom..&amp;quot; &amp;quot;..disperr(err) end&lt;br /&gt;
        end&lt;br /&gt;
    elseif mode == &amp;quot;1&amp;quot; then   -- No error mode&lt;br /&gt;
        if rom == nil then rom = -2 end&lt;br /&gt;
        return rom&lt;br /&gt;
    elseif mode == &amp;quot;2&amp;quot; then   -- Display all&lt;br /&gt;
        if disp == &amp;quot;0&amp;quot; or disp == &amp;quot;&amp;quot; then&lt;br /&gt;
            disp = &amp;quot;&amp;amp;#91;rom&amp;amp;#93;\\r &amp;amp;#91;err&amp;amp;#93;\\e &amp;amp;#91;time&amp;amp;#93;\\t&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        tim = os.clock()&lt;br /&gt;
        disp:unesc()&lt;br /&gt;
        disp:gsub(&amp;quot;\\r&amp;quot;, rom)&lt;br /&gt;
        disp:gsub(&amp;quot;\\e&amp;quot;, err)&lt;br /&gt;
        disp:gsub(&amp;quot;\\t&amp;quot;, tim)&lt;br /&gt;
        return disp&lt;br /&gt;
    else return disperr(&amp;quot;Unknown mode&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.fromdecimald( dec, rn )&lt;br /&gt;
    if rn == &amp;quot;1&amp;quot; then rndisp = true else rndisp = false end&lt;br /&gt;
    rom, err = torom(dec, rndisp)&lt;br /&gt;
    return rom, err, os.clock()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Squc</name></author>
	</entry>
</feed>