Module:Sortkey: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Johnuniq Module:Arguments defaults to removing blank arguments but gives an error with string.find; for example List of rampage killers (Asia) uses {{hs|}} |
m 12 revisions imported |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 15: | Line 15: | ||
local args = getArgs(frame); | local args = getArgs(frame); | ||
return p._encode(args[1] or "") | return p._encode(args[1] or "") | ||
end | |||
local function valid_number(num) | |||
-- Return true if num is a valid number. | |||
-- In Scribunto (different from some standard Lua), when expressed as a string, | |||
-- overflow or other problems are indicated with text like "inf" or "nan" | |||
-- which are regarded as invalid here (each contains "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 | end | ||
return p | return p |
Latest revision as of 00:52, 3 September 2020
Documentation for this module may be created at Module:Sortkey/doc
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p._encode(sortkey)
-- Protect against sortkey nesting.
-- Example: {{sort|{{dts|2013|07|07}}|{{dts|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)
-- Return true if num is a valid number.
-- In Scribunto (different from some standard Lua), when expressed as a string,
-- overflow or other problems are indicated with text like "inf" or "nan"
-- which are regarded as invalid here (each contains "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