Modul:Text: Unterschied zwischen den Versionen
2017-03-25
w>NordNordWest K (Änderte den Schutz von „Modul:Text“: per Anfrage: https://de.wikipedia.org/w/index.php?title=Wikipedia%3AAdministratoren%2FAnfragen&type=revision&diff=156076713&oldid=156073630 ([Bearbeiten=Nur Sichter] (unbeschränkt) [Verschieben=Nur Adminis…) |
w>PerfektesChaos (2017-03-25) |
||
| Zeile 1: | Zeile 1: | ||
local Text = { suite = "Text", | local Text = { suite = "Text", | ||
serial = " | serial = "2017-03-25" } | ||
--[=[ | --[=[ | ||
Text utilities | Text utilities | ||
| Zeile 128: | Zeile 128: | ||
return r | return r | ||
end -- fiatQuote() | end -- fiatQuote() | ||
Text.char = function ( apply, again, accept ) | |||
-- Create string from codepoints | |||
-- Parameter: | |||
-- apply -- table (sequence) with numerical codepoints, or nil | |||
-- again -- number of repetitions, or nil | |||
-- accept -- true, if no error messages to be appended | |||
-- Returns: string | |||
local r | |||
if type( apply ) == "table" then | |||
local bad = { } | |||
local codes = { } | |||
local s | |||
for k, v in pairs( apply ) do | |||
s = type( v ) | |||
if s == "number" then | |||
if v < 32 and v ~= 9 and v ~= 10 then | |||
v = tostring( v ) | |||
else | |||
v = math.floor( v ) | |||
s = false | |||
end | |||
elseif s ~= "string" then | |||
v = tostring( v ) | |||
end | |||
if s then | |||
table.insert( bad, v ) | |||
else | |||
table.insert( codes, v ) | |||
end | |||
end -- for k, v | |||
if #bad == 0 then | |||
if #codes > 0 then | |||
r = mw.ustring.char( unpack( codes ) ) | |||
if again then | |||
if type( again ) == "number" then | |||
local n = math.floor( again ) | |||
if n > 1 then | |||
r = r:rep( n ) | |||
elseif n < 1 then | |||
r = "" | |||
end | |||
else | |||
s = "bad repetitions: " .. tostring( again ) | |||
end | |||
end | |||
end | |||
else | |||
s = "bad codepoints: " .. table.concat( bad, " " ) | |||
end | |||
if s and not accept then | |||
r = tostring( mw.html.create( "span" ) | |||
:addClass( "error" ) | |||
:wikitext( s ) ) | |||
end | |||
end | |||
return r or "" | |||
end -- Text.char() | |||
| Zeile 149: | Zeile 209: | ||
end | end | ||
end | end | ||
end | end -- for k, v | ||
return table.concat( collect, apply or "|" ) | return table.concat( collect, apply or "|" ) | ||
end -- Text.concatParams() | end -- Text.concatParams() | ||
| Zeile 290: | Zeile 350: | ||
end | end | ||
end | end | ||
end | end -- for k, v | ||
return mw.text.listToText( collect ) | return mw.text.listToText( collect ) | ||
end -- Text.listToText() | end -- Text.listToText() | ||
| Zeile 310: | Zeile 370: | ||
local mode, slang | local mode, slang | ||
if type( alien ) == "string" then | if type( alien ) == "string" then | ||
slang = alien:lower() | slang = mw.text.trim( alien ):lower() | ||
else | else | ||
slang = mw.language.getContentLanguage():getCode() | slang = mw.language.getContentLanguage():getCode() | ||
| Zeile 452: | Zeile 512: | ||
end -- for i | end -- for i | ||
end -- flat() | end -- flat() | ||
local focus = function ( a ) | |||
-- char is not ambivalent | |||
local r = ( a > 64 ) | |||
if r then | |||
r = ( a < 8192 or a > 8212 ) | |||
else | |||
r = ( a == 38 or a == 60 ) -- '&' '<' | |||
end | |||
return r | |||
end -- focus() | |||
local form = function ( a ) | local form = function ( a ) | ||
return string.format( span, | return string.format( span, | ||
| Zeile 461: | Zeile 531: | ||
for i = 1, n do | for i = 1, n do | ||
c = mw.ustring.codepoint( adjust, i, i ) | c = mw.ustring.codepoint( adjust, i, i ) | ||
if c | if focus( c ) then | ||
if flat( c ) then | if flat( c ) then | ||
if j then | if j then | ||
| Zeile 527: | Zeile 597: | ||
-- Export | -- Export | ||
local p = { } | local p = { } | ||
function p.char( frame ) | |||
local params = frame:getParent().args | |||
local story = params[ 1 ] | |||
local codes, lenient, multiple | |||
if story then | |||
local items = mw.text.split( story, "%s+" ) | |||
if #items > 0 then | |||
local j | |||
lenient = ( params.errors == "0" ) | |||
codes = { } | |||
multiple = tonumber( params[ "*" ] ) | |||
for k, v in pairs( items ) do | |||
if v:sub( 1, 1 ) == "x" then | |||
j = tonumber( "0" .. v ) | |||
elseif v == "" then | |||
v = false | |||
else | |||
j = tonumber( v ) | |||
end | |||
if v then | |||
table.insert( codes, j or v ) | |||
end | |||
end -- for k, v | |||
end | |||
end | |||
return Text.char( codes, multiple, lenient ) | |||
end | |||
function p.concatParams( frame ) | function p.concatParams( frame ) | ||
| Zeile 560: | Zeile 658: | ||
return Text.isQuote( frame.args[ 1 ] or "" ) and "1" or "" | return Text.isQuote( frame.args[ 1 ] or "" ) and "1" or "" | ||
end | end | ||
function p.listToFormat(frame) | |||
local lists = {} | |||
local pformat = frame.args["format"] | |||
local sep = frame.args["sep"] or ";" | |||
-- Parameter parsen: Listen | |||
for k, v in pairs(frame.args) do | |||
local knum = tonumber(k) | |||
if knum then lists[knum] = v end | |||
end | |||
-- Listen splitten | |||
local maxListLen = 0 | |||
for i = 1, #lists do | |||
lists[i] = mw.text.split(lists[i], sep) | |||
if #lists[i] > maxListLen then maxListLen = #lists[i] end | |||
end | |||
-- Ergebnisstring generieren | |||
local result = "" | |||
local result_line = "" | |||
for i = 1, maxListLen do | |||
result_line = pformat | |||
for j = 1, #lists do | |||
result_line = mw.ustring.gsub(result_line, "%%s", lists[j][i], 1) | |||
end | |||
result = result .. result_line | |||
end | |||
return result | |||
end | |||
function p.listToText( frame ) | function p.listToText( frame ) | ||
| Zeile 575: | Zeile 709: | ||
return Text.listToText( args, frame.args.format ) | return Text.listToText( args, frame.args.format ) | ||
end | end | ||
function p.quoteUnquoted( frame ) | function p.quoteUnquoted( frame ) | ||
| Zeile 601: | Zeile 737: | ||
return Text.uprightNonlatin( frame.args[ 1 ] or "" ) | return Text.uprightNonlatin( frame.args[ 1 ] or "" ) | ||
end | end | ||
function p.zip(frame) | function p.zip(frame) | ||
local lists = {} | |||
local seps = {} | |||
local defaultsep = frame.args["sep"] or "" | |||
local innersep = frame.args["isep"] or "" | |||
local outersep = frame.args["osep"] or "" | |||
-- Parameter parsen | |||
for k, v in pairs(frame.args) do | |||
local knum = tonumber(k) | |||
if knum then lists[knum] = v else | |||
if string.sub(k, 1, 3) == "sep" then | |||
local sepnum = tonumber(string.sub(k, 4)) | |||
if sepnum then seps[sepnum] = v end | |||
end | |||
end | |||
end | |||
-- sofern keine expliziten Separatoren angegeben sind, den Standardseparator verwenden | |||
for i = 1, math.max(#seps, #lists) do | |||
if not seps[i] then seps[i] = defaultsep end | |||
end | |||
-- Listen splitten | |||
local maxListLen = 0 | |||
for i = 1, #lists do | |||
lists[i] = mw.text.split(lists[i], seps[i]) | |||
if #lists[i] > maxListLen then maxListLen = #lists[i] end | |||
end | |||
local result = "" | |||
for i = 1, maxListLen do | |||
if i ~= 1 then result = result .. outersep end | |||
for j = 1, #lists do | |||
if j ~= 1 then result = result .. innersep end | |||
result = result .. (lists[j][i] or "") | |||
end | |||
end | |||
return result | |||
end | end | ||
function p. | |||
function p.failsafe() | |||
return Text.serial | |||
end | end | ||
p.Text = function () | p.Text = function () | ||