Modul:PageTitleSimilar
aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen
Zur Suche springen
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
local PageTitleSimilar = { suite = "PageTitleSimilar", serial = "2025年02月11日", item = 0 } --[==[ Check whether similar page name is existing ]==] local Failsafe = PageTitleSimilar local THIS = { } local fault = function ( alert ) -- Format error message -- Precondition: -- alert -- string, with message -- Postcondition: -- Returns string local e = mw.html.create( "span" ) :addClass( "error" ) :wikitext( string.format( "%s * %s", PageTitleSimilar.suite, alert ) ) return tostring( e ) end -- fault() local find = function ( ask ) -- Check whether page title exists in this namespace -- Precondition: -- ask -- string, with page title -- Postcondition: -- Returns true, if existing -- THIS.title is the title of an existing page local t = mw.title.new( ask, THIS.ns ) local r if t then r = t.exists if r then THIS.title = t end end return r end -- find() local found = function ( apply ) -- Communicate match by transclusion -- Precondition: -- apply -- string, with message type -- -- Typogr -- -- URL -- THIS.title has been defined -- Postcondition: -- Returns string local source = "source" .. apply local shift = THIS.JSON[ source ] local r if type( shift ) == "string" then local t = mw.title.new( shift ) if t and t.exists then local params = { ["1"] = THIS.title.prefixedText } r = THIS.frame:expandTemplate{ title = t, args = params } end end if not r then r = fault( "missing transclusion for " .. source ) end return r end -- found() local fraction = function () -- Try URL completion when common special chars were truncated -- Postcondition: -- Returns string, or not local s = THIS.self local r if s:find( "(", 1, true ) then find( s .. ")" ) end if not THIS.title then local shift = s .. "." if not find( shift ) then shift = s .. "?" find( shift ) end end if THIS.title then r = found( "URL" ) end return r end -- fraction() local further = function () -- Try improvements by typographical chars -- Postcondition: -- Returns string, or not local rep = THIS.JSON.replace local r if type( rep ) == "table" then local s = THIS.self local shift for k, v in pairs( rep ) do if type( v[ 1 ] ) == "string" and type( v[ 2 ] ) == "string" then shift = mw.ustring.gsub( s, v[ 1 ], v[ 2 ] ) if shift ~= s then if find( shift ) then r = found( "Typogr" ) break -- for k, v else s = shift end end else r = fault( string.format( "replace[%s]", k ) ) break -- for k, v end end -- for k, v end return r end -- further() 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 -- 2024年03月01日 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 elseif link then r = false 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.f = function ( frame ) local source = frame.args[ 1 ] local r, scream if source then local lucky lucky, THIS.JSON = pcall( mw.loadJsonData, source ) if lucky then local t = mw.title.getCurrentTitle() THIS.frame = frame THIS.ns = t.ns THIS.self = t.prefixedText if frame.args.URL == "1" then r = fraction() end if not r then r = further() end else scream = "no valid JSON found: " .. mw.text.nowiki( source ) end else scream = "invoked without JSON" end if scream then r = fault( scream ) end return r or "" end -- p.f 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 return p