Модуль:Ключ сартаваньня
Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:Ключ сартаваньня/Дакумэнтацыя
local getArgs = require('Модуль:Аргумэнты').getArgs
local p = {}
function p._encode(sortkey)
-- Абарона ад укладзенасьці ключоў сартаваньня.
-- Прыклад: {{Сартаваньне|{{Сартаваньне даты|2013|07|07}}|{{Сартаваньне даты|1990|12|01}}}}
if string.find(sortkey, "sortkey") or string.find(sortkey, "data-sort-value") then
return "";
end
return mw.text.encode(sortkey)
end
function p.encode(frame)
local args = getArgs(frame);
return p._encode(args[1] or "")
end
local function valid_number(num)
-- Вяртае «ісьціна», калі num — лік.
-- У Scribunto (у адрозьненьне ад некаторых стандартаў Lua), пры выражэньні ў выглядзе радку,
-- перапаўненьне ці іншыя памылкі адзначаюцца тэкстам накшталт «inf» або «nan»
-- што тут лічыцца памылкай (паколькі ў абодвух радках ёсьць «n»).
if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then
return true
end
end
function p._sortKeyForNumber(value)
if not valid_number(value) then
if value < 0 then
sortkey = '1000000000000000000'
else
sortkey = '9000000000000000000'
end
elseif value == 0 then
sortkey = '5000000000000000000'
else
local mag = math.floor(math.log10(math.abs(value)) + 1e-14)
local prefix
if value > 0 then
prefix = 7000 + mag
else
prefix = 2999 - mag
value = value + 10^(mag+1)
end
sortkey = string.format('%d', prefix) .. string.format('%015.0f', math.floor(value * 10^(math.min(28,14-mag))))
end
return sortkey;
end
function p.sortKeyForNumber(frame)
local args = getArgs(frame);
return p._sortKeyForNumber(args[1] or "")
end
return p