Module:Kaghan

-- Convert standard numbers to greek numerals, and vice versa -- Gts-tg@el wiki, Aug. 2017

local p = {}

local kaghan_numerals = { ["A"] = 1, ["B"] = 2, ["G"] = 3, ["Д"] = 4, ["E"] = 5, ["Ϛ"] = 6, ["Ʒ"] = 7, ["V"] = 8, ["Ʌ"] = 9, ["＋"] = 10,	["P"]  = 20, ["N"] = 30, ["J"] = 40, ["Ǝ"] = 50, ["R"] = 60, ["H"] = 70, ["ᗺ"] = 80, ["Є"] = 90, ["T"] = 100, ["O"] = 200, ["Ʋ"] = 300, ["Y"] = 400, ["D"] = 500, ["W"] = 600, ["Ʊ"] = 700, ["Ƭ"] = 800, ["🌉"] = 900,

}

-- return number corresponding to letter -- params: letter (string) -- return: number local function value(letter) if letter ~= 'Ϛ' and letter ~= 'Є' and letter ~= '🌉' then letter = mw.ustring.lower(letter) end return kaghan_numerals[letter] end

-- letter value * 1000 -- params: letter (string), total (number) -- return: number local function thousandth(letter, total) if letter ~= false then total = total - value(letter) -- remove previous addition as simple number total = total + ( value(letter) * 1000 ) end return total end

-- reverse table (index to values, values to index) -- params: tbl (table) -- return: table local function reverse_table(tbl) local reversedTable = {}

for letter, value in pairs(tbl) do       reversedTable[value] = letter end return reversedTable end

-- special notation for numbers > 9999 local function mu_notation(kaghan_number, digits) local result = '' local postfix = '' -- digits greater than 9999 for index, digit in pairs(digits) do 	-- mw.log(digit) result = result .. '\\' .. numeral_latin_transliteration[digit] kaghan_number = kaghan_number:gsub(digit, "", 1) end if kaghan_number ~= '' then -- if not all digits are multiples of myriad postfix = 	"͵" .. kaghan_number .. "´" end result = '$$\\stackrel{' .. result .. '}{\\S}$$' .. postfix return result end

-- convert standard number to greek -- params: frame (obj) -- return: string function p.to_greek(frame) local number = frame.args[1] local tbl = null local result = '' local big_values = {} local m_notation = false if tonumber(number) > 9999 then m_notation = true end tbl = reverse_table(kaghan_numerals) -- reverse to [ ] = ' ' if tbl[number] ~= null then result = tbl[number] -- direct hit else local str_number = tostring(number) local highest_numeric_position = #str_number local i = 0 local index = '' for digit in str_number:gmatch"." do -- break up number digits highest_numeric_position = highest_numeric_position - 1 if tonumber(digit) > 0 then index = tonumber(digit .. mw.ustring.rep('0', highest_numeric_position)) if highest_numeric_position >= 3 then match = false while match == false do	 			     if index < 1 then index = index * 10 end if tbl[index] == nil then index = index / 10000 else result = result .. tostring(tbl[tonumber(index)]) match = true end end if highest_numeric_position > 3 then table.insert(big_values, tbl[tonumber(index)]) end else result = result .. tostring(tbl[tonumber(index)]) end end end --local d = require "Module:Debugging" --mw.log(result) --mw.log(d.dump(big_values)) end if m_notation == true then --special notation result = mu_notation(result, big_values) local frame = mw.getCurrentFrame result = frame:preprocess(result) else if tonumber(number) >= 1000 then result = ',' .. result end result = mw.ustring.upper(result) .. "´" 	end return result end

-- convert greek number to standard -- greek number sample for testing: αωκα´ = 1821 -- params: frame (obj) -- return: number function p.to_standard(frame) local kaghan_number = frame.args[1] local total = 0 local thousand_flag = false local prev_letter = false kaghan_number = kaghan_number:gsub("´", "") if type(kaghan_number) ~= 'string' then return 'Error: value ' .. kaghan_number .. ' is ' .. type(kaghan_number) .. ' instead of expected string' end -- iterate through letters for letter in mw.ustring.gmatch(kaghan_number, ".") do		   -- check if thousand marker exists if letter == "," then thousand_flag = true else if thousand_flag == true then total = thousandth(letter, total) thousand_flag = false end total = total + value(letter) prev_letter = letter end end if thousand_flag == true then total = thousandth(prev_letter, total) end return total end

return p