Przejdź do zawartości

Moduł:Brudnopis/Paweł Ziemian/Liczba

Z Wikipedii, wolnej encyklopedii

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Brudnopis/Paweł Ziemian/Liczba/opis

local resources = mw.loadData("Moduł:Brudnopis/Paweł Ziemian/Liczba/res")

function inWords(s, n, f)
	local zero = 48
	local result = {}
	local scale = 0
	local lang = mw.language.getContentLanguage()
	local count = #n
	while count > 0 do
		local c1 = string.byte(n, count)
		local c10 = count <= 1 and zero or string.byte(n, count - 1)
		local c100 = count <= 2 and zero or string.byte(n, count - 2)
		local d1 = c1 - zero
		local d10 = 10 * (c10 - zero)
		local d100 = 100 * (c100 - zero)
		local d11 = d10 + d1
		local d111 = d100 + d11
		
		if d111 > 0 then
			if scale > 0 then
				if not resources.scales[scale] then
					return resources.zylion
				end

				table.insert(result, 1, lang:convertPlural(d111, resources.scales[scale]))
			end
			
			if ((d111 > 1) or (scale == 0)) and (resources.names[d1] or resources.names[d11]) then table.insert(result, 1, resources.names[d11] or resources.names[d1]) end
			if resources.names[d10] and not resources.names[d11] then table.insert(result, 1, resources.names[d10]) end
			if resources.names[d100] then table.insert(result, 1, resources.names[d100]) end
		end

		count = count - 3
		scale = scale + 1
	end
	
	if #result <= 0 then
		table.insert(result, resources.zero)
	end
	
	if f and (#f > 0) then
		table.insert(result, resources.comma)
	
		for i = 1, #f do
			local c = string.byte(f, i)
			local v = c - zero
			table.insert(result, v == 0 and resources.zero or resources.names[v])
		end
	end
	
	if resources.sign[s] then
		table.insert(result, 1, resources.sign[s])
	end
		
	return table.concat(result, " ")
end

function detect(s)
	if not s then
		return
	end
	
	local text, c = mw.ustring.gsub(s, "[ \194\160]", "")
	text = mw.text.trim(text)
	mw.logObject(text, "text")
	local s1, n1, f1, es1, en1 = mw.ustring.match(text, "^([%+%-]?)([0-9]+)[,%.]([0-9]+)[eE]([%+%-]?)([0-9]+)$")
	if n1 then
		return { s = s1, n = n1, f = f1, es = es1, en = en1, }
	end
		
	local s2, n2, es2, en2 = mw.ustring.match(text, "^([%+%-]?)([0-9]+)[eE]([%+%-]?)([0-9]+)$")
	if n2 then
		return { s = s2, n = n2, f = false, es = es2, en = en2 }
	end
		
	local s3, n3, f3 = mw.ustring.match(text, "^([%+%-]?)([0-9]+)[,%.]([0-9]+)$")
	if n3 then
		return { s = s3, n = n3, f = f3, es = false, en = false }
	end
		
	local s4, n4 = mw.ustring.match(text, "^([%+%-]?)([0-9]+)$")
	if n4 then
		return { s = s4, n = n4, f = false, es = false, en = false }
	end
end

return {
	
Value = function(frame)
	local dn = detect(frame.args[1])
	if not dn then
		mw.logObject(value, "Value: to chyba nie jest liczba")
		return
	end
	
	local result = {}
	table.insert(result, dn.s or "")
	table.insert(result, dn.n)
	if dn.f then
		table.insert(result, ".")
		table.insert(result, dn.f)
	end
	if dn.en then
		table.insert(result, "e")
		table.insert(result, dn.es or "")
		table.insert(result, dn.en)
	end
		
	local value = table.concat(result, "")
	mw.logObject(value, "value")
	return value
end,

InWords = function(frame)
	local dn = detect(frame.args[1])
	if not dn then
		mw.logObject(value, "InWords: to chyba nie jest liczba")
		return
	end
	
	local result = {}
	table.insert(result, inWords(dn.s, dn.n, dn.f))
	if dn.en then
		table.insert(result, resources.exp)
		table.insert(result, inWords(dn.es, dn.en))
	end

	local value = table.concat(result, " ")
	mw.logObject(value, "value")
	return value
end,

}