Modul:Sort: Unterschied zwischen den Versionen
w>PerfektesChaos (Setup) |
w>PerfektesChaos (update) |
||
Zeile 1: | Zeile 1: | ||
--[=[ 2013-10- | --[=[ 2013-10-21 | ||
Sort | Sort | ||
]=] | ]=] | ||
Zeile 57: | Zeile 57: | ||
elseif c == min1 or c == min2 then -- grouping | elseif c == min1 or c == min2 then -- grouping | ||
else | else | ||
i = j | |||
break -- for j | break -- for j | ||
end | end | ||
i = n | |||
end -- for j | end -- for j | ||
last = true | last = true | ||
elseif lead then | elseif lead then | ||
Zeile 79: | Zeile 79: | ||
if i < n then | if i < n then | ||
suffix = mw.ustring.sub( source, i ) | 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 ) | |||
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 ) | |||
end | |||
sub = "." .. sub | |||
end | |||
end | |||
end | end | ||
break -- for i | break -- for i | ||
Zeile 123: | Zeile 146: | ||
local p = { } | local p = { } | ||
p. | p.Tlatin = function ( frame ) | ||
-- Template:: | -- Template::latin | ||
-- {{{1}}} | -- {{{1}}} | ||
return "not yet ready" | return "not yet ready" | ||
end -- p. | end -- p.Tlatin | ||
Zeile 147: | Zeile 170: | ||
-- z -- number of leading zeros / maximum length; defaults to 15 | -- z -- number of leading zeros / maximum length; defaults to 15 | ||
-- m -- negative figures by digits; default: by value | -- m -- negative figures by digits; default: by value | ||
local lucky, r = pcall( Sort.num, | local lucky, r = pcall( Sort.num, | ||
frame:getParent().args[ 1 ] or "", | frame:getParent().args[ 1 ] or "", | ||
Zeile 156: | Zeile 175: | ||
frame.args.t, | frame.args.t, | ||
tonumber( frame.args.z ), | tonumber( frame.args.z ), | ||
m == "1" ) | frame.args.m == "1" ) | ||
-- DEBUG: | -- DEBUG: | ||
if not lucky then | if not lucky then | ||
r = "<span class= | r = "<span class=\"error\">" .. r .. "</span>" | ||
end | end | ||
return r; | return r; |
Version vom 24. Oktober 2013, 22:49 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Sort/doc erstellt werden
--[=[ 2013-10-21 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 ) 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 ) 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