Modul:Sort
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