Nicht angemeldeter Benutzer - Bearbeiten von Seiten ist nur als angemeldeter Benutzer möglich.
Modul:Sort: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(update) |
(fix) |
||
Zeile 1: | Zeile 1: | ||
− | --[=[ 2013-10- | + | --[=[ 2013-10-24 |
Sort | Sort | ||
]=] | ]=] | ||
Zeile 91: | Zeile 91: | ||
r = r .. sub:sub( 1, j ) | r = r .. sub:sub( 1, j ) | ||
sub = sub:sub( j + 1 ) | sub = sub:sub( j + 1 ) | ||
+ | max = max - j | ||
elseif j < 0 then | elseif j < 0 then | ||
j = - j | j = - j | ||
Zeile 98: | Zeile 99: | ||
sub = r:sub( - j ) .. sub | sub = r:sub( - j ) .. sub | ||
r = r:sub( 1, #r - j ) | r = r:sub( 1, #r - j ) | ||
+ | max = max + j | ||
end | end | ||
sub = "." .. sub | sub = "." .. sub |
Version vom 25. Oktober 2013, 00:11 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Sort/Doku erstellt werden
--[=[ 2013-10-24
Sort
]=]
local Sort = { }
Sort.num = function ( adjust, ad, at, align, absolute )
-- Build sortkey for heading numerical value
-- Precondition:
-- adjust -- string to be aligned; leading digits / minus
-- ad -- decimal separator; "." or ","; defaults to "."
-- at -- thousands group separator; defaults to none
-- "," "." "'"
-- align -- number of leading zeros / maximum length
-- defaults to 15
-- absolute -- negative figures by digits; default: by value
-- Postcondition:
-- Returns string with sortkey
local max = 15
local mid = 46 -- "."
local min1 = -1 -- none
local min2 = -2 -- none
local low = false
local last = false
local lead = true
local source = tostring( adjust )
local sub = "."
local suffix = false
local n = mw.ustring.len( source )
local r = ""
local c
if ad then
mid = mw.ustring.codepoint( ad, 1 )
end
if at then
min1, min2 = mw.ustring.codepoint( at, 1, 2 )
end
if align then
max = align
end
for i = 1, n do
c = mw.ustring.codepoint( source, i )
if c > 32 then -- not whitespace
if c >= 48 and c <= 57 then -- digits
r = string.format( "%s%c", r, c )
max = max - 1
elseif c == min1 or c == min2 then -- group separator
elseif c == mid then -- decimal separator
for j = i + 1, n do
c = mw.ustring.codepoint( source, j )
if c >= 48 and c <= 57 then -- digits
sub = string.format( "%s%c", sub, c )
elseif c == min1 or c == min2 then -- grouping
else
i = j
break -- for j
end
i = n
end -- for j
last = true
elseif lead then
if c == 45 or c == 8722 then -- minus
low = true
elseif c ~= 43 then -- plus
last = true
end
else
last = true
end
lead = false
elseif not lead then -- whitespace not leading
last = true
end
if last then
if i < n then
suffix = mw.ustring.sub( source, i )
if c == 69 or c == 101 then -- E e
local s = suffix:match( "^[Ee](-?%d+)" )
if s then
j = tonumber( s )
sub = sub:sub( 2 )
suffix = suffix:sub( #s + 2 )
if j > 0 then
if j > #sub then
sub = sub .. string.rep( "0", j - #sub )
end
r = r .. sub:sub( 1, j )
sub = sub:sub( j + 1 )
max = max - j
elseif j < 0 then
j = - j
if j > #r then
r = string.rep( "0", j - #r ) .. r
end
sub = r:sub( - j ) .. sub
r = r:sub( 1, #r - j )
max = max + j
end
sub = "." .. sub
end
end
end
break -- for i
end
end -- for i
if low then
if not absolute then -- complementary value
local s = "."
local cmpl = function ( str, k )
return 57 - str:byte( k )
end
for i = 2, #sub do
s = string.format( "%s%d", s, cmpl( sub, i ) )
end -- for i
for i = #r, 1, -1 do
s = string.format( "%d%s", cmpl( r, i ), s )
end -- for i--
r = s
if max > 0 then
r = string.rep( "9", max ) .. r
end
sub = false
max = 0
end
end
if sub then
r = r .. sub
end
if max > 0 then
r = string.rep( "0", max ) .. r
end
if low then
r = "-" .. r
end
if suffix then
r = string.format( "%s %s", r, suffix )
end
return r
end -- Sort.num()
-- Export
local p = { }
p.Tlatin = function ( frame )
-- Template::latin
-- {{{1}}}
return "not yet ready"
end -- p.Tlatin
p.Td = function ( frame )
-- Template::date
-- {{{1}}}
return "not yet ready"
end -- p.Td
p.Tn = function ( frame )
-- Template::numerical
-- {{{1}}}
-- #invoke
-- d -- decimal separator; defaults to "."
-- t -- thousands group separator; defaults to none
-- z -- number of leading zeros / maximum length; defaults to 15
-- m -- negative figures by digits; default: by value
local lucky, r = pcall( Sort.num,
frame:getParent().args[ 1 ] or "",
frame.args.d,
frame.args.t,
tonumber( frame.args.z ),
frame.args.m == "1" )
-- DEBUG:
if not lucky then
r = "<span class=\"error\">" .. r .. "</span>"
end
return r;
end -- p.Tn
p.Sort = function ()
return Sort
end -- p.Sort
return p