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
(fix) |
(RELEASE num+latin) |
||
Zeile 1: | Zeile 1: | ||
− | --[=[ 2013-10- | + | --[=[ 2013-10-25 |
Sort | Sort | ||
]=] | ]=] | ||
Zeile 6: | Zeile 6: | ||
local Sort = { } | local Sort = { } | ||
+ | |||
+ | |||
+ | |||
+ | Sort.lex = function ( adjust, apply, adapt ) | ||
+ | -- Build ASCII sortkey for text value | ||
+ | -- Precondition: | ||
+ | -- adjust -- string to be aligned | ||
+ | -- apply -- string with base | ||
+ | -- "latin" | ||
+ | -- adapt -- variation, or false | ||
+ | -- "DIN5007m2" -- DIN 5007 mode "2" | ||
+ | local r = adjust | ||
+ | if not r:match( "^[ -~]*$" ) then | ||
+ | local lucky | ||
+ | local collate | ||
+ | if apply then | ||
+ | collate = apply | ||
+ | else | ||
+ | collate = "uni" | ||
+ | end | ||
+ | if adapt then | ||
+ | collate = collate .. adapt | ||
+ | end | ||
+ | collate = "Module:Sort/" .. collate | ||
+ | lucky, collate = pcall( mw.loadData, collate ) | ||
+ | if type( collate ) == "table" then | ||
+ | local k, n, s, start | ||
+ | local n = mw.ustring.len( r ) | ||
+ | for i = n, 1, -1 do | ||
+ | k = mw.ustring.codepoint( r, i, i ) | ||
+ | if k < 127 then -- ASCII | ||
+ | s = ( k < 32 ) -- htab newline whitespace | ||
+ | if s then | ||
+ | s = " " | ||
+ | end | ||
+ | else | ||
+ | s = collate[ k ] | ||
+ | end | ||
+ | if s then | ||
+ | if i > 1 then | ||
+ | s = mw.ustring.sub( r, 1, i - 1 ) .. s | ||
+ | end | ||
+ | r = s .. mw.ustring.sub( r, i + 1 ) | ||
+ | end | ||
+ | end -- for i-- | ||
+ | else | ||
+ | r = "**ERROR** Sort.lex ** Submodule unavailable " .. collate | ||
+ | end | ||
+ | end | ||
+ | r = r:gsub( " +", " " ) | ||
+ | return r | ||
+ | end -- Sort.lex() | ||
Zeile 35: | Zeile 87: | ||
local c | local c | ||
if ad then | if ad then | ||
− | mid = mw.ustring.codepoint( ad, 1 ) | + | mid = mw.ustring.codepoint( ad, 1, 1 ) |
end | end | ||
if at then | if at then | ||
Zeile 44: | Zeile 96: | ||
end | end | ||
for i = 1, n do | for i = 1, n do | ||
− | c = mw.ustring.codepoint( source, i ) | + | c = mw.ustring.codepoint( source, i, i ) |
if c > 32 then -- not whitespace | if c > 32 then -- not whitespace | ||
if c >= 48 and c <= 57 then -- digits | if c >= 48 and c <= 57 then -- digits | ||
Zeile 52: | Zeile 104: | ||
elseif c == mid then -- decimal separator | elseif c == mid then -- decimal separator | ||
for j = i + 1, n do | for j = i + 1, n do | ||
− | c = mw.ustring.codepoint( source, j ) | + | c = mw.ustring.codepoint( source, j, j ) |
if c >= 48 and c <= 57 then -- digits | if c >= 48 and c <= 57 then -- digits | ||
sub = string.format( "%s%c", sub, c ) | sub = string.format( "%s%c", sub, c ) | ||
Zeile 151: | Zeile 203: | ||
-- Template::latin | -- Template::latin | ||
-- {{{1}}} | -- {{{1}}} | ||
− | + | -- #invoke | |
+ | -- v -- variant, omitted or "DIN5007m2" | ||
+ | local lucky, r = pcall( Sort.lex, | ||
+ | frame:getParent().args[ 1 ] or "", | ||
+ | "latin", | ||
+ | frame.args.v ) | ||
+ | return r; | ||
end -- p.Tlatin | end -- p.Tlatin | ||
Zeile 178: | Zeile 236: | ||
tonumber( frame.args.z ), | tonumber( frame.args.z ), | ||
frame.args.m == "1" ) | frame.args.m == "1" ) | ||
− | |||
− | |||
− | |||
− | |||
return r; | return r; | ||
end -- p.Tn | end -- p.Tn |
Version vom 26. Oktober 2013, 14:07 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Sort/Doku erstellt werden
--[=[ 2013-10-25
Sort
]=]
local Sort = { }
Sort.lex = function ( adjust, apply, adapt )
-- Build ASCII sortkey for text value
-- Precondition:
-- adjust -- string to be aligned
-- apply -- string with base
-- "latin"
-- adapt -- variation, or false
-- "DIN5007m2" -- DIN 5007 mode "2"
local r = adjust
if not r:match( "^[ -~]*$" ) then
local lucky
local collate
if apply then
collate = apply
else
collate = "uni"
end
if adapt then
collate = collate .. adapt
end
collate = "Module:Sort/" .. collate
lucky, collate = pcall( mw.loadData, collate )
if type( collate ) == "table" then
local k, n, s, start
local n = mw.ustring.len( r )
for i = n, 1, -1 do
k = mw.ustring.codepoint( r, i, i )
if k < 127 then -- ASCII
s = ( k < 32 ) -- htab newline whitespace
if s then
s = " "
end
else
s = collate[ k ]
end
if s then
if i > 1 then
s = mw.ustring.sub( r, 1, i - 1 ) .. s
end
r = s .. mw.ustring.sub( r, i + 1 )
end
end -- for i--
else
r = "**ERROR** Sort.lex ** Submodule unavailable " .. collate
end
end
r = r:gsub( " +", " " )
return r
end -- Sort.lex()
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, 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, 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, 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}}}
-- #invoke
-- v -- variant, omitted or "DIN5007m2"
local lucky, r = pcall( Sort.lex,
frame:getParent().args[ 1 ] or "",
"latin",
frame.args.v )
return r;
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" )
return r;
end -- p.Tn
p.Sort = function ()
return Sort
end -- p.Sort
return p