Modul:Vorlage:PersonZelle
Vorlagenprogrammierung | Diskussionen | Lua | Unterseiten | ||
Modul | Deutsch
|
Modul: | Dokumentation |
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
Weiterleitung der Diskussionsseite fehlt
local Sort = { suite = "Sort",
sub = "cellPerson",
serial = "2021-03-20",
cat = "Wikipedia:Vorlagenfehler/Vorlage:PersonZelle",
item = 62090703,
globals = { Cell = 90144855,
Sorter = 24205172,
TemplUtl = 52364930 } }
--[=[
Vorlage:PersonZelle
]=]
local Failsafe = Sort
local GlobalMod = Sort
local foreignModule = function ( access, advanced, append, alt, alert )
-- Fetch global module
-- Precondition:
-- access -- string, with name of base module
-- advanced -- true, for require(); else mw.loadData()
-- append -- string, with subpage part, if any; or false
-- alt -- number, of wikidata item of root; or false
-- alert -- true, for throwing error on data problem
-- Postcondition:
-- Returns whatever, probably table
-- 2020-01-01
local storage = access
local finer = function ()
if append then
storage = string.format( "%s/%s",
storage,
append )
end
end
local fun, lucky, r, suited
if advanced then
fun = require
else
fun = mw.loadData
end
GlobalMod.globalModules = GlobalMod.globalModules or { }
suited = GlobalMod.globalModules[ access ]
if not suited then
finer()
lucky, r = pcall( fun, "Module:" .. storage )
end
if not lucky then
if not suited and
type( alt ) == "number" and
alt > 0 then
suited = string.format( "Q%d", alt )
suited = mw.wikibase.getSitelink( suited )
GlobalMod.globalModules[ access ] = suited or true
end
if type( suited ) == "string" then
storage = suited
finer()
lucky, r = pcall( fun, storage )
end
if not lucky and alert then
error( "Missing or invalid page: " .. storage )
end
end
return r
end -- foreignModule()
local fetch = function ( access, append, alert )
-- Fetch global library
-- Precondition:
-- access -- string|false, with name of base module
-- append -- string, with subpage part, if any; or false
-- alert -- true, for throwing error on data problem
local store, sub, suite
if access then
suite = access
store = access
else
suite = Sort.suite
if append then
sub = append:lower()
store = append
else
store = "Sorter"
end
end
if type( Sort[ store ] ) == "nil" then
local bib = foreignModule( suite,
true,
sub,
Sort.globals[ store ],
alert )
if bib and type( bib[ suite ] ) == "function" then
Sort[ store ] = bib[ suite ]()
else
error( tostring( bib ) )
end
end
return Sort[ store ]
end -- fetch()
local function fault( alert, frame )
-- Format error message
-- Parameter:
-- alert -- string, with complaint
-- frame -- object, or nil
-- Returns string
local TemplUtl = fetch( "TemplUtl" )
local staff = "editoronly"
local r
if TemplUtl then
local live
if mw.title.getCurrentTitle().namespace ~= 0 then
live = true
staff = false
end
r = TemplUtl.failure( alert, live, staff, frame )
else
local e = mw.html.create( "span" )
:addClass( "error" )
:wikitext( alert )
r = tostring( e )
end
r = string.format( " %s [[Category:%s]]", r, Sort.cat )
return r
end -- fault()
Sort.f = function ( arglist, frame )
-- Do it.
-- Parameter:
-- arglist -- table, with parameters
-- frame -- object, or nil
-- Returns:
-- string
local params = { [ 1 ] = false,
[ 2 ] = false,
[ 3 ] = false,
fett = false,
k = false,
kursiv = false,
nl = false,
pre = false,
postfix = false,
revers = false,
zeige1 = true,
zeige2 = true,
rowspan = false,
colspan = false,
class = false,
style = false,
id = false,
lang = false,
dir = false
}
local r, unknown
fetch( false, "Cell", true )
for k, v in pairs( arglist ) do
if type( params[ k ] ) == "boolean" then
v = mw.text.trim( v )
if v ~= "" then
params[ k ] = v
end
else
if unknown then
unknown = string.format( "%s, %s", unknown, k )
else
unknown = k
end
end
end -- for k, v in arglist
params.vor = params[ 1 ]
params.fam = params[ 2 ]
if params.fam then
local got, present
present = Sort.Cell.first( params, true )
params.artikel = params[ 3 ]
if params.nl == "0" then
params.nl = false
end
if params.fett == "0" then
params.fett = false
end
if params.kursiv == "0" then
params.kursiv = false
end
if params.revers == "0" then
params.revers = false
end
if params.zeige1 == "0" then
params.zeige1 = false
end
if params.zeige2 == "0" and
params.zeige1 and
params.vor then
params.zeige2 = false
end
got = Sort.fiat( params )
if got.sort then
Sort.Cell.faced( present, got.sort )
end
r = Sort.Cell.finalize( present, got.show )
if got.strange then
r = r .. fault( got.strange, frame )
end
else
local s = "Pflichtparameter (Familienname) fehlt"
r = "|"
if params.vor then
r = r .. params.vor
s = string.format( "%s – %s", s, params.vor )
end
r = r .. fault( s, frame )
end
if unknown then
r = r .. fault( "Unbekannter Parametername(n) " .. unknown,
frame )
end
return r
end -- Sort.f()
Sort.fiat = function ( arglist )
-- Create sortkey and presented name
-- Parameter:
-- arglist -- table, with parameters
-- Postcondition:
-- Returns table, or nil
-- .show -- string, with HTML cell contents
-- .sort -- string, with sort-value, if required
-- .strange -- string, with error message, if any
local params = { fam = false,
vor = false,
artikel = false,
fett = false,
k = false,
kursiv = false,
nl = false,
pre = false,
postfix = false,
revers = false,
zeige1 = true,
zeige2 = true,
}
local r, s
for k, v in pairs( arglist ) do
if type( params[ k ] ) == "boolean" then
s = type( v )
if s == "string" then
v = mw.text.trim( v )
if v ~= "" then
params[ k ] = v
end
elseif s == "boolean" then
params[ k ] = v
end
end
end -- for k, v in arglist
if params.fam then
local slot = params.artikel
local sort
r = { show = params.fam }
sort = r.show
s = r.show
if params.vor and params.zeige1 then
s = params.vor
if params.zeige2 then
if not Sort.swing then
Sort.swing = mw.ustring.char( 91, 39,
0x2019,
37, 45,
93 )
end
if mw.ustring.find( mw.ustring.sub( s, -1 ),
Sort.swing ) then
r.show = string.format( "%s%s", s, r.show )
else
r.show = string.format( "%s %s", s, r.show )
end
else
r.show = s
end
if params.revers then
sort = string.format( "%s, %s", s, sort )
else
sort = string.format( "%s, %s", sort, s )
end
end
if params.k then
if params.nl then
r.strange = "Widerspruch k=... und nl=1"
elseif slot then
r.strange = "Widerspruch k=... und 3=..."
else
slot = string.format( "%s (%s)", r.show, params.k )
end
sort = string.format( "%s @%s", sort, params.k )
end
if params.postfix then
sort = string.format( "%s %s", sort, params.postfix )
end
if not params.nl then
if slot then
r.show = string.format( "%s|%s", slot, r.show )
end
r.show = string.format( "[[%s]]", r.show )
end
if params.fett or params.kursiv then
local e = mw.html.create( "span" )
if params.fett then
e:css( "font-weight", "bold" )
end
if params.kursiv then
e:css( "font-style", "italic" )
end
r.show = tostring( e:wikitext( r.show ) )
end
if params.pre then
r.show = string.format( "%s %s", params.pre, r.show )
end
if sort:find( "[^ %w,#]" ) then
local Sorter = fetch( "Sort", false, true )
sort = Sorter.lex( sort, "latin" )
end
if sort:find( "[^, %w]" ) then
local quotes = mw.ustring.char( 91, 34,
39,
171,
187,
8216,
8217,
8218,
8220,
8221,
8222,
8249,
8250,
0x300C,
0x300D,
0x300E,
0x300F, 93 )
sort = mw.ustring.gsub( sort, quotes, "" )
end
if params.pre or params.vor or sort ~= params.fam then
r.sort = sort
end
end
return r
end -- Sort.fiat()
Failsafe.failsafe = function ( atleast )
-- Retrieve versioning and check for compliance
-- Precondition:
-- atleast -- string, with required version
-- or "wikidata" or "~" or "@" or false
-- Postcondition:
-- Returns string -- with queried version/item, also if problem
-- false -- if appropriate
-- 2020-08-17
local since = atleast
local last = ( since == "~" )
local linked = ( since == "@" )
local link = ( since == "item" )
local r
if last or link or linked or since == "wikidata" then
local item = Failsafe.item
since = false
if type( item ) == "number" and item > 0 then
local suited = string.format( "Q%d", item )
if link then
r = suited
else
local entity = mw.wikibase.getEntity( suited )
if type( entity ) == "table" then
local seek = Failsafe.serialProperty or "P348"
local vsn = entity:formatPropertyValues( seek )
if type( vsn ) == "table" and
type( vsn.value ) == "string" and
vsn.value ~= "" then
if last and vsn.value == Failsafe.serial then
r = false
elseif linked then
if mw.title.getCurrentTitle().prefixedText
== mw.wikibase.getSitelink( suited ) then
r = false
else
r = suited
end
else
r = vsn.value
end
end
end
end
end
end
if type( r ) == "nil" then
if not since or since <= Failsafe.serial then
r = Failsafe.serial
else
r = false
end
end
return r
end -- Failsafe.failsafe()
-- Export
local p = { }
function p.test( arglist )
return Sort.f( arglist )
end
p.f = function ( frame )
local lucky, r = pcall( Sort.f, frame:getParent().args, frame )
if not lucky then
r = fault( r )
end
return r
end
p.failsafe = function ( frame )
-- Versioning interface
local s = type( frame )
local since
if s == "table" then
since = frame.args[ 1 ]
elseif s == "string" then
since = frame
end
if since then
since = mw.text.trim( since )
if since == "" then
since = false
end
end
return Failsafe.failsafe( since ) or ""
end -- p.failsafe
function p.Sort()
-- Module interface
return Sort
end -- p.Sort()
return p