Die Dokumentation für dieses Modul kann unter Modul:Vorlage:Seitenbewertung/Doku erstellt werden
local BadgesQuery = { suite = "BadgesQuery", serial = "2022-10-19", item = 114773646 } --[==[ Query badges registered at Wikidata ]==] local Failsafe = BadgesQuery local function find( access, another ) -- Find badges of item -- Precondition: -- access -- string, with Q-item -- another -- string, with site, or not -- Postcondition: -- Returns -- 1 -- string, with page name, if sitelink, or not -- 2 -- sequence table, non-empty, with badges, or not local e = mw.wikibase.getEntity( access ) local r1, r2 if e then local t = e.sitelinks if t then local site if type( another ) == "string" then site = mw.text.trim( another ) if site == "" then site = false end end site = site or mw.wikibase.getGlobalSiteId() t = t[ site ] if t then r1 = t.title r2 = t.badges if type( r2 ) == "table" and #r2 == 0 then r2 = false end end end end return r1, r2 end -- find() BadgesQuery.features = function ( arglist, frame ) -- Present (linked) page, may be decorated with badges -- Precondition: -- arglist -- table, with options -- frame -- object, or not -- Postcondition: -- Returns string local r, self if type( arglist ) == "table" and type( arglist.sTransclude ) == "string" then local sq self = mw.wikibase.getEntityIdForCurrentPage() if type( arglist.nsTransclude ) ~= "number" then arglist.nsTransclude = 10 end if arglist.subject then sq = mw.wikibase.getEntityIdForTitle( arglist.subject ) if sq and sq ~= self then self = false end else sq = self end if sq then local s, badges = find( sq, arglist.site ) if badges then local t if not arglist.subject then arglist.subject = s end for i = 1, #badges do s = badges[ i ]:lower() arglist[ s ] = "1" end -- for i t = mw.title.makeTitle( arglist.nsTransclude, arglist.sTransclude ) if t and t.exists then frame = frame or mw.getCurrentFrame() if arglist.link and not self then arglist.linked = "1" end r = frame:expandTemplate{ title = t, args = arglist } end end end end if not r then if not arglist.subject then self = true arglist.subject = mw.title.getCurrentTitle().prefixedText end if arglist.link and not self then r = string.format( "[[%s]]", arglist.subject ) else r = arglist.subject end end return r end -- BadgesQuery.features() BadgesQuery.fulfils = function ( ask, array, another ) -- Test badge requirement -- Precondition: -- ask -- string, with local page name, or not -- array -- sequence table, with badge item numbers -- another -- string, with site, or not -- Postcondition: -- Returns boolean local r if type( array ) == "table" then local sq if ask then sq = mw.wikibase.getEntityIdForTitle( ask ) else sq = mw.wikibase.getEntityIdForCurrentPage() end if sq then local x, badges = find( sq, another ) if badges then local k, query for j = 1, #array do k = array[ j ] if type( k ) == "number" and k > 0 then query = query or { } table.insert( query, "Q" .. k ) end end -- for j if query then for i = 1, #badges do for j = 1, #query do if badges[ i ] == query[ j ] then r = true break -- for j end end -- for j if r then break -- for i end end -- for i end end end end return r or false end -- BadgesQuery.fulfils() Failsafe.failsafe = function ( atleast ) -- Retrieve versioning and check for compliance -- Precondition: -- atleast -- string, with required version -- or wikidata|item|~|@ 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 = { } p.features = function ( frame ) local submit = frame.args.sTransclude local r if submit and submit ~= "" then local subject = frame.args[ 1 ] local ns = tonumber( frame.args.nsTransclude ) local link = frame.args.link local long = frame.args.long local px = frame.args.px local site = frame.args.site local space = frame.args.space local params = { site = site, nsTransclude = ns, sTransclude = submit } if link == "1" then params.link = true end if long == "1" then params.long = true end if px then local k = tonumber( px ) if k and k > 5 then params.px = math.floor( k ) end end if space then if space == "0" or space:match( "^[1-9]%.?%d*%l%l+" ) then params.space = space end end if subject then subject = mw.text.trim( subject ) if subject ~= "" then params.subject = subject end end r = BadgesQuery.features( params, frame ) end return r or "" end -- p.features p.fulfils = function ( frame ) local subject = frame.args[ 1 ] local s = frame.args.match local site = frame.args.site local r if s then local want = mw.text.split( s, "%s+" ) local m for i = 1, #want do m = tonumber( want[ i ] ) if m and m > 0 then r = r or { } table.insert( r, m ) end end -- for i end if r then if subject then subject = mw.text.trim( subject ) if subject == "" then subject = false end end r = BadgesQuery.fulfils( subject, r, site ) end return r and "1" or "" end -- p.fulfils 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 setmetatable( p, { __call = function ( func, ... ) setmetatable( p, nil ) return Failsafe end } ) return p -- BadgesQuery