Module:Isopsephy

local p = {} local getArgs = require('Module:Arguments').getArgs

local UTF8_char = "[%z\1-\127\194-\244][\128-\191]*"

local frame local sum = 0 local wordSum = 0

local rightToLeft = { ["ar"] = true, ["he"] = true }

local greekTable = { ["α"] = {value=1, name="Alpha"}, ["β"] = {value=2, name="Beta"}, ["γ"] = {value=3, name="Gamma"}, ["δ"] = {value=4, name="Delta"}, ["ε"] = {value=5, name="Epsilon"}, ["ϝ"] = {value=6, name="Digamma"}, ["ϛ"] = {value=6, name="Stigma"}, ["ζ"] = {value=7, name="Zeta"}, ["η"] = {value=8, name="Eta"}, ["θ"] = {value=9, name="Theta"}, ["ι"] = {value=10, name="Iota"}, ["κ"] = {value=20, name="Kappa"}, ["λ"] = {value=30, name="Lambda"}, ["μ"] = {value=40, name="Mu"}, ["ν"] = {value=50, name="Nu"}, ["ξ"] = {value=60, name="Xi"}, ["ο"] = {value=70, name="Omicron"}, ["π"] = {value=80, name="Pi"}, ["ϙ"] = {value=90, name="Koppa"}, ["ρ"] = {value=100, name="Rho"}, ["σ"] = {value=200, name="Sigma"}, ["τ"] = {value=300, name="Tau"}, ["υ"] = {value=400, name="Upsilon"}, ["φ"] = {value=500, name="Phi"}, ["χ"] = {value=600, name="Chi"}, ["ψ"] = {value=700, name="Psi"}, ["ω"] = {value=800, name="Omega"}, ["ϡ"] = {value=900, name="Sampi"}, }

local arabicTable = { --Aleph ["ا"] = {value=1, name="ʾalif"}, ["ب"] = {value=2, name="bāʾ"}, ["ج"] = {value=3, name="ǧīm"}, ["د"] = {value=4, name="dāl"}, ["ه"] = {value=5, name="hāʾ"}, ["و"] = {value=6, name="wāw"}, ["ز"] = {value=7, name="zāy"}, ["ح"] = {value=8, name="ḥāʾ"}, ["ط"] = {value=9, name="ṭāʾ"}, ["ي"] = {value=10, name="yāʾ"}, ["ك"] = {value=20, name="kāf"}, ["ل"] = {value=30, name="lām"}, ["م"] = {value=40, name="mīm"}, ["ن"] = {value=50, name="nūn"}, ["س"] = {value=60, name="sīn"}, ["ع"] = {value=70, name="ʿayn"}, ["ف"] = {value=80, name="fāʾ"}, ["ص"] = {value=90, name="ṣād"}, ["ق"] = {value=100, name="qāf"}, ["ر"] = {value=200, name="rāʾ"}, ["ش"] = {value=300, name="shīn"}, ["ت"] = {value=400, name="tāʾ"}, ["ث"] = {value=500, name="thāʾ"}, ["خـ"] = {value=600, name="khāʾ"}, ["ذ"] = {value=700, name="dhāl"}, ["ض"] = {value=800, name="ḍād"}, ["ظ"] = {value=900, name="ẓāʾ"}, ["غ"] = {value=1000, name="ghayn"}, }

local hebrewTable = { ["א"] = {value=1, name="Aleph"}, ["ב"] = {value=2, name="Bet"}, ["ג"] = {value=3, name="Gimel"}, ["ד"] = {value=4, name="Dalet"}, ["ה"] = {value=5, name="He"}, ["ו"] = {value=6, name="Vav"}, ["ז"] = {value=7, name="Zayin"}, ["ח"] = {value=8, name="Het"}, ["ט"] = {value=9, name="Tet"}, ["י"] = {value=10, name="Yod"}, ["כ"] = {value=20, name="Kaf"}, ["ל"] = {value=30, name="Lamed"}, ["מ"] = {value=40, name="Mem"}, ["נ"] = {value=50, name="Nun"}, ["ס"] = {value=60, name="Samekh"}, ["ע"] = {value=70, name="Ayin"}, ["פ"] = {value=80, name="Pe"}, ["צ"] = {value=90, name="Tsadi"}, ["ק"] = {value=100, name="Qoph"}, ["ר"] = {value=200, name="Resh"}, ["ש"] = {value=300, name="Shin"}, ["ת"] = {value=400, name="Tav"}, ["ך"] = {value=500, name="Kaf (final)"}, ["ם"] = {value=600, name="Mem (final)"}, ["ן"] = {value=700, name="Nun (final)"}, ["ף"] = {value=800, name="Pe (final)"}, ["ץ"] = {value=900, name="Tsadi (final)"}, }

local langTable = { ["grc"] = {lookupTable=greekTable, scriptTemplate='Script/Greek', transliterate='grc-transl'}, ["ar"] = {lookupTable=arabicTable, scriptTemplate='Script/Arabic'}, ["he"] = {lookupTable=hebrewTable, scriptTemplate='Script/Hebrew'}, }

local function processLetter(lang, chr) local function formatLetter(c) return frame:expandTemplate{ title = langTable[lang].scriptTemplate, args = {c} }	end local function formatTransliteration(c) if langTable[lang].transliterate then return frame:expandTemplate{ title = langTable[lang].transliterate, args = {c} }		end end

local function formatNumber(c) indexC = string.ulower(c) if langTable[lang].lookupTable[indexC] then local value = langTable[lang].lookupTable[indexC].value wordSum = wordSum + value return value end return ' ' end

local div = mw.html.create("div") :addClass("letter") local p1 = div:tag("p"):wikitext(formatLetter(chr)) local p2 = div:tag("p"):wikitext(formatTransliteration(chr)) local p3 = div:tag("p"):wikitext(formatNumber(chr)) return div end

local function processWord(lang, word) local html = "" wordSum = 0 for i, c in ipairs(word) do		if (i ~= 1) then html = html .. ' + '		end if langTable[lang] then html = html .. tostring(processLetter(lang, c)) else html = html .. c	   end end sum = sum + wordSum html = ' ' .. ' ( '				.. html				.. ' ) ' .. ' '			.. ' ' .. wordSum .. ' '	return mw.html.create("div") :addClass("word") :wikitext(html) end

function parseStrToTable(str) local wordsTable = {} for word in str:gmatch("[^%s]+") do		local wordTable = {} for letter in word:gmatch(UTF8_char) do			table.insert(wordTable, letter) end table.insert(wordsTable, wordTable) end return wordsTable end

function ReverseTable(myTable) if myTable and #myTable > 1 then local temp = nil for n = 1,math.floor(#myTable/2) do			temp = myTable[n] myTable[n] = myTable[#myTable-(n-1)] myTable[#myTable-(n-1)] = temp end end end

function p.isopsephy(frameArg) frame = frameArg local args = getArgs(frame, {wrappers = 'Template:Isopsephy'}) str = args[1]

local html = "" sum = 0 if args.lang and str then local words = parseStrToTable(str) if rightToLeft[args.lang] then ReverseTable(words) for i, word in ipairs(words) do				ReverseTable(word) end end for i, word in ipairs(words) do			if (i ~= 1) then html = html .. ' + '			end html = html .. tostring(processWord(args.lang, word)) end html = html .. ' = '					.. ' ' .. sum .. ' '	end return tostring(			mw.html.create("div")				:addClass("isopsephy")				:wikitext(html)			) end

return p