Zum Inhalt springen
Wikipedia Die freie Enzyklopädie

Modul:Vorlage:LuaModuleDoc

aus Wikipedia, der freien Enzyklopädie

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus

Dies ist die (produktive) Mutterversion eines global benutzten Lua-Moduls.
Wenn die serial-Information nicht übereinstimmt, müsste eine Kopie hiervon in das lokale Wiki geschrieben werden.
Versionsbezeichnung auf WikiData: 2024年03月01日

 local LuaModuleDoc = { suite = "LuaModuleDoc",
 serial = "2024年03月01日",
 item = 12981914,
 frame = false,
 ns = -9999,
 -- current namespace number
 nsDocs = -99999,
 -- central documentation namespace number
 title = false,
 -- current page Title object
 transl = false }
 --[=[
 Support {{LuaModuleDoc}}
 * nav()
 * failsafe()
 ]=]

 local Failsafe = LuaModuleDoc



 local function fetch( arg, assign )
 -- Retrieve template argument
 -- Precondition:
 -- arg -- string or number; argument identifier
 -- assign -- any, optional; default value
 -- Uses:
 -- > LuaModuleDoc.frame
 local r = LuaModuleDoc.frame.args[ arg ]
 if type( r ) ~= "string" then
 if assign == nil then
 r = "{{{<" .. arg .. ">}}}"
 else
 r = assign
 end
 end
 return r
 end -- fetch()



 local function catIfDefined( slot )
 -- Categorize if category defined
 -- slot -- string; Config entry
 -- Return:
 -- string or false: categorization, if any
 -- Uses:
 -- mw.title.makeTitle()
 local s = fetch( slot, "" )
 local r
 if #s > 0 then
 local t = mw.title.makeTitle( "Category", s )
 if t.exists then
 r = string.format( "[[%s]]", t.prefixedText )
 end
 end
 return r
 end -- catIfDefined()



 local function createPage( swift, sub, start, ns, script )
 -- Create button for page creation
 -- swift -- string;
 -- "NoPageCentral", "NoTalkCentral", "NoTalkRedir"
 -- sub -- string; page name to be created
 -- start -- string; defined pageDocRoot argument
 -- ns -- number; namespace
 -- script -- string; module name (main)
 -- Return:
 -- string
 -- Uses:
 -- > LuaModuleDoc.frame
 -- fetch()
 -- MediaWiki:Move-leave-redirect Weiterleitung erstellen
 -- MediaWiki:autosumm-new Seite wurde neu angelegt: „1ドル"
 local setup = "preload" .. swift:sub( 7 )
 local r
 setup = fetch( setup )
 if setup then
 local create = { action = "edit",
 preload = setup,
 redlink = "1" }
 local button, path, show, story, summary
 if swift == "NoTalkRedir" then
 show = "move-leave-redirect"
 story = string.format( "%s/%s", start, script )
 story = mw.title.makeTitle( ns, story ).prefixedText
 story = string.format( "[[%s]]", story )
 summary = "#redirect " .. story
 else
 local s = fetch( "langsRequest", false )
 show = "recreate"
 if s then
 s = mw.text.trim( s )
 if s ~= "" then
 s = "|" .. s
 end
 end
 story = ( s or "" )
 summary = "{{LuaModuleDoc}}"
 end
 -- summary = mw.message.new( "autosumm-new" ):params( summary )
 create.summary = summary
 create.preloadtitle = summary
 if story then
 create[ "preloadparams[]" ] = story
 end
 path = { sub, mw.uri.buildQueryString( create ) }
 r = LuaModuleDoc.frame:callParserFunction( "canonicalurl",
 path )
 show = mw.message.new( show ):plain()
 button = mw.title.makeTitle( mw.site.namespaces.Template.id,
 "MediaWiki-Button" )
 if button.exists then
 button = { template = button.text,
 Typ = "progressive",
 ["Groß"] = "1",
 Link = r,
 Text = show }
 r = LuaModuleDoc.frame:expandTemplate{
 title = button.template,
 args = button }
 else
 r = string.format( "<br>[%s '''%s''']", r, show )
 end
 end
 return r or ""
 end -- createPage()



 local function globalRepos( script )
 -- Check for global dissemination
 -- script -- string; module name (main)
 -- Uses:
 -- > LuaModuleDoc.title
 -- > LuaModuleDoc.frame
 -- fetch()
 -- mw.wikibase.getEntity()
 -- mw.title.makeTitle()
 -- Return:
 -- string
 local entity = mw.wikibase.getEntity()
 local r
 if type( entity ) == "table" then
 local mode = 0
 local repo = entity:formatPropertyValues( "P1324" )
 local params, s
 if type( repo ) == "table" and
 type( repo.value ) == "string" and
 repo.value:find( "//" ) then
 local t = mw.text.split( repo.value, ",%s+" )
 if #t > 1 then
 for i = 1, #t do
 if t[ i ]:find( mw.site.server, 1, true ) then
 s = t[ i ]
 break -- for i
 end
 end -- for i
 if not s then
 s = t[ 1 ]
 end
 else
 s = repo.value
 end
 repo = mw.uri.new( s )
 if type( repo.path ) == "string" and
 repo.path:match( "^/wiki/" ) then
 local space
 space, s = repo.path:sub( 7 ):match( "^([^:]+):(.+)$" )
 if space and
 mw.site.namespaces[ space ] then
 if s:find( "%%%x%x" ) then
 s = mw.uri.decode( s )
 end
 t = mw.title.makeTitle( space, s )
 s = "//" .. repo.host
 if t and
 mw.title.equals( LuaModuleDoc.title, t ) and
 mw.site.server:find( s, 1, true ) then
 mode = 2
 else
 mode = 1
 end
 end
 end
 s = fetch( "templateGlobal", "" )
 if #s > 0 then
 local l, bib = pcall( require,
 LuaModuleDoc.title.prefixedText )
 local vsn = entity:formatPropertyValues( "P348" )
 params = { }
 if mode < 2 then
 params[ 1 ] = string.format( "[%s %s]",
 tostring( repo ),
 repo.host )
 end
 if type( vsn ) == "table" and
 type( vsn.value) == "string" and
 vsn.value ~= "" then
 params.version = vsn.value
 end
 if type( bib ) == "table" then
 local serial
 if bib.failsafe then
 if type( bib.failsafe ) == "function" then
 serial = bib.failsafe( { args = { } } )
 else
 serial = bib.failsafe
 end
 elseif bib[ "#serial"] then
 serial = bib[ "#serial"]
 end
 if type( serial ) == "number" then
 serial = string.format( "%d", serial )
 end
 if type( serial ) == "string" then
 params.here = serial
 end
 end
 if fetch( "forkedGlobal", "0" ) ~= "1" and
 params.version and params.here and
 params.version ~= params.here then
 params.update = "1"
 end
 r = LuaModuleDoc.frame:expandTemplate{ title=s,
 args=params }
 end
 end
 s = fetch( "categoryWikiData", "" )
 if #s > 0 then
 local slot
 if mode > 0 then
 if mode == 2 then
 slot = catIfDefined( "categoryWikiDataParent" )
 else
 slot = catIfDefined( "categoryWikiDataChild" )
 end
 end
 if not slot then
 slot = catIfDefined( s )
 end
 if slot then
 if r then
 r = r .. slot
 else
 r = slot
 end
 if params and params.update then
 slot = catIfDefined( "categoryWikiDataReplication" )
 if slot then
 r = r .. slot
 end
 end
 end
 end
 end
 return r or ""
 end -- globalRepos()



 local function navDevelop( start, script )
 -- Most interesting test and development page
 -- Precondition:
 -- start -- string; central documentation root
 -- script -- string; basic module name
 -- Return:
 -- string or false: full page name, if any
 -- Uses:
 -- > LuaModuleDoc.nsDocs
 -- mw.title.makeTitle()
 local n = LuaModuleDoc.nsDocs
 local r = false
 local sub = "/" .. fetch( "subTest", "Test" )
 local s = string.format( "%s/%s%s", start, script, sub )
 local t = mw.title.makeTitle( n, s )
 if not t.exists then
 local low = false
 local subLow = mw.ustring.lower( sub )
 if subLow ~= sub then
 s = string.format( "%s/%s%s", start, script, subLow )
 t = mw.title.makeTitle( n, s )
 low = t.exists
 end
 if not low then
 n = mw.site.namespaces.Module.id
 s = string.format( "%s/%s", script, sub )
 t = mw.title.makeTitle( n, s )
 if not t.exists and subLow ~= sub then
 s = script .. subLow
 t = mw.title.makeTitle( n, s )
 t = t.exists
 end
 end
 end
 if t then
 r = string.format( "%s:%s",
 mw.site.namespaces[ n ].name, s )
 end
 return r
 end -- navDevelop()



 local function navError( say, specific )
 -- Return error message, evaluate page .pageErr
 -- Precondition:
 -- say -- string; message key
 -- specific -- string, optional; additional information
 -- Uses:
 -- > LuaModuleDoc.frame
 -- fetch()
 local show = fetch( "pageErr" )
 local r
 if type( show ) == "string" then
 local pars = { say }
 if type( specific ) == "string" then
 table.insert( pars, specific )
 end
 r = LuaModuleDoc.frame:expandTemplate{ title = show,
 args = pars }
 else
 local e = mw.html.create( "span" )
 :attr( "class", "error" )
 :wikitext( error( "arg 'pageErr' missing", 3 ) )
 r = tostring( e )
 end
 return r
 end -- navError()



 local function navLang( suite, collect, lazy )
 -- Append languages from string to collection
 -- Precondition:
 -- suite -- string; space separated source
 -- collect -- table; to be extended
 -- every element: { langCode, lazy }
 -- lazy -- true if only existing page is to be linked
 if type( suite ) == "string" then
 local raw = mw.text.split( suite, "%s+" )
 local e, i, j, s
 for i = 1, #raw do
 s = raw[ i ]
 if #s > 1 then
 for j = 1, #collect do
 if s then
 e = collect[ j ]
 if e[ 1 ] == s then
 s = false
 if not lazy then
 e[ 2 ] = false
 end
 end
 end
 end -- for j
 if s then
 table.insert( collect, { s, lazy } )
 end
 end
 end -- for i
 end
 end -- navLang()



 local function navLangs( start, script )
 -- Analyze languages
 -- Precondition:
 -- current page is supposed to transclude LuaModuleDoc
 -- start -- string; central documentation root
 -- script -- string; basic module name
 -- Postcondition:
 -- LuaModuleDoc.transl is set up as table:
 -- args for navigation template
 -- [1] basic module name
 -- [2] number of language codes + 1
 -- [3] first language code
 -- [4] second language code
 -- ... list of further language codes
 -- Uses:
 -- > LuaModuleDoc.nsDocs
 -- < LuaModuleDoc.transl
 -- fetch()
 -- navLang()
 -- mw.title.makeTitle()
 local e, i, s, t
 local specified = fetch( "langsRequest", false )
 local super = start .. "/" .. script .. "/"
 LuaModuleDoc.transl = { }
 if type( specified ) == "string" then
 if specified:match( "^%s*$" ) then
 specified = false
 end
 end
 navLang( fetch( "langsDefault" ), LuaModuleDoc.transl, specified )
 navLang( fetch( "langsMore" ), LuaModuleDoc.transl, true )
 navLang( specified, LuaModuleDoc.transl, false )
 if #LuaModuleDoc.transl < 1 then
 LuaModuleDoc.transl = { { "en", false } }
 end
 for i = #LuaModuleDoc.transl, 1, -1 do
 e = LuaModuleDoc.transl[ i ]
 s = e[ 1 ]
 if e[ 2 ] then
 t = mw.title.makeTitle( LuaModuleDoc.nsDocs, super .. s )
 if not t.exists then
 s = false
 end
 end
 if s then
 LuaModuleDoc.transl[ i ] = s
 else
 table.remove( LuaModuleDoc.transl, i )
 end
 end -- for i -1
 table.insert( LuaModuleDoc.transl,
 1,
 script )
 table.insert( LuaModuleDoc.transl,
 2,
 tostring( #LuaModuleDoc.transl ) )
 end -- navLangs()



 local function navMerge( start, swift, script, sub, lead )
 -- Include various external content into page
 -- Precondition:
 -- start -- string; defined pageDocRoot argument
 -- swift -- string; defined pageNav argument
 -- script -- string; module name (main)
 -- sub -- string or false; possible sub-module name
 -- lead -- true: Module: namespace; false: text namespace
 -- Uses:
 -- > LuaModuleDoc.transl
 -- > LuaModuleDoc.ns
 -- > LuaModuleDoc.nsDocs
 -- > LuaModuleDoc.title
 -- > LuaModuleDoc.frame
 -- navError()
 -- mw.title.makeTitle()
 -- createPage()
 -- fetch()
 local server = mw.site.server
 local super = false
 local t = navDevelop( start, script )
 local collect, low, r, s
 collect = LuaModuleDoc.transl
 if t then
 collect.Test = t
 end
 if LuaModuleDoc.ns == LuaModuleDoc.nsDocs then
 s = string.format( "%s/%s", start, script )
 if LuaModuleDoc.title.text == s then
 super = LuaModuleDoc.title.text .. "/"
 elseif sub then
 collect.subDoc = sub
 collect.subModule = sub
 s = string.format( "%s/%s/%s", start, script, sub )
 if LuaModuleDoc.title.text == s then
 s = string.format( "%s/%s", s, collect[ 3 ] )
 t = mw.title.makeTitle( LuaModuleDoc.nsDocs, s )
 if t.exists then
 super = LuaModuleDoc.title.text .. "/"
 end
 end
 end
 elseif lead and sub then
 s = string.format( "%s/%s/%s", start, script, sub )
 t = mw.title.makeTitle( LuaModuleDoc.nsDocs, s )
 if t.exists then
 collect.subDoc = sub
 end
 end
 if server:match( "%.beta%.wmflabs%.org$" ) then
 local slang, series = server:match( "//(%l+)%.(%l+)%." )
 low = true
 if series == "wikipedia" then
 if slang == "de" then
 collect.BETA = "w:de:" --Talk
 end
 end
 end
 r = LuaModuleDoc.frame:expandTemplate{ title = swift,
 args = collect }
 if not low then
 t = LuaModuleDoc.title.talkPageTitle
 if LuaModuleDoc.ns == mw.site.namespaces.Module.id then
 local doc
 s = string.format( "%s/%s", start, script )
 doc = mw.title.makeTitle( LuaModuleDoc.nsDocs, s )
 if not doc.exists then
 r = r .. createPage( "NoPageCentral",
 doc.prefixedText,
 start,
 LuaModuleDoc.nsDocs,
 script )
 t = false
 end
 end
 if t and not t.exists then
 if super then
 s = "NoTalkCentral"
 elseif LuaModuleDoc.ns == LuaModuleDoc.nsDocs + 1 then
 s = false
 else
 s = "NoTalkRedir"
 end
 if s then
 r = string.format( "%s%s%s",
 r,
 navError( s ),
 createPage( s,
 t.prefixedText,
 start,
 LuaModuleDoc.nsDocs + 1,
 script ) )
 end
 end
 end
 if super then
 local d = "{{%s*[lL]uaModuleDoc[^}]*}}%s*"
 local p1 = "^%s*" .. d .. "<onlyinclude>"
 local p2 = "%s*<noinclude>" .. d .. "</noinclude>"
 local space, sub, support
 for i = 3, #collect do
 t = mw.title.makeTitle( LuaModuleDoc.nsDocs,
 super .. collect[ i ] )
 s = t:getContent()
 if s then
 s = s:gsub( p1, "" ):gsub( p2, "" )
 if s:match( d ) then
 r = string.format( "%s<br />%s<br />",
 r,
 navError( "BadInclude",
 t.prefixedText ) )
 else
 r = r ..
 LuaModuleDoc.frame:expandTemplate{
 title = t.prefixedText }
 break -- for i
 end
 end
 end -- for i
 s = fetch( "pageTemplateInsert", "" )
 space, support = s:match( "^([^:]+):(.+)$" )
 if space and mw.title.makeTitle( space, support ).exists then
 local suppress = fetch( "noHint", "" )
 if #suppress == 0 then
 local swift = collect[ 1 ]
 if sub then
 swift = string.format( "%s/%s", swift, sub )
 end
 r = r ..
 LuaModuleDoc.frame:expandTemplate{ title = s,
 args = { swift } }
 end
 end
 s = fetch( "categoryDocs", "" )
 if #s > 0 then
 t = mw.title.makeTitle( "Category", s )
 if t.exists then
 r = string.format( "%s[[%s|%s]]",
 r, t.prefixedText, collect[ 1 ] )
 end
 end
 r = r .. "__NOEDITSECTION__"
 end
 if lead then
 r = r .. globalRepos( script )
 end
 return r
 end -- navMerge()



 local function navPage( lead )
 -- Return navigation text; analyze page location
 -- Precondition:
 -- current namespace will support LuaModuleDoc
 -- lead -- true: Module: namespace; false: text namespace
 -- Uses:
 -- > LuaModuleDoc.title
 -- > LuaModuleDoc.transl
 -- fetch()
 -- navLangs()
 -- navMerge()
 -- navError()
 local r
 local start = fetch( "pageDocRoot" )
 if type( start ) == "string" then
 local s = "^"
 local script
 if not lead then
 s = "^" .. start .. "/"
 end
 s = s .. "([^/]+)/(.*/?)$"
 script, s = string.match( LuaModuleDoc.title.text .. "/", s )
 if type( script ) == "string" then
 local sub = false
 local swift = fetch( "pageNav" )
 navLangs( start, script )
 if type( s ) == "string" then
 if #s > 1 then
 local q
 s = s:match( "^([^/]+)/.*/?$" )
 q = mw.title.makeTitle( "Module",
 script .. "/" .. s )
 if q.exists and q.contentModel == "Scribunto" then
 sub = s
 for i = 1, #LuaModuleDoc.transl do
 if LuaModuleDoc.transl[ i ] == s then
 sub = false
 break -- for i
 end
 end -- for i
 end
 end
 end
 if type( swift ) == "string" then
 r = navMerge( start,
 swift,
 script,
 sub,
 lead )
 else
 r = navError( "configMissing", "pageNav" )
 end
 else
 r = navError( "BadPage" ) .. LuaModuleDoc.title.text
 end
 else
 r = navError( "configMissing", "pageDocRoot" )
 end
 return r
 end -- navPage()



 local function navigation()
 -- Start execution; return navigation text; analyze namespace
 -- Uses:
 -- < LuaModuleDoc.title
 -- < LuaModuleDoc.ns
 -- < LuaModuleDoc.nsDocs
 -- fetch()
 -- mw.title.getCurrentTitle()
 -- navPage()
 -- navError()
 local r
 local nsDocs = fetch( "nsDocs" )
 if nsDocs then
 local lead
 LuaModuleDoc.title = mw.title.getCurrentTitle()
 LuaModuleDoc.ns = LuaModuleDoc.title.namespace
 lead = ( LuaModuleDoc.ns ==
 mw.site.namespaces.Module.id )
 LuaModuleDoc.nsDocs = tonumber( nsDocs )
 if lead or
 LuaModuleDoc.ns == LuaModuleDoc.nsDocs or
 LuaModuleDoc.ns == LuaModuleDoc.nsDocs + 1 then
 r = navPage( lead )
 else
 r = navError( "BadNamespace" )
 end
 else
 r = navError( "configMissing", "nsDocs" )
 end
 return r
 end -- navigation()



 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()



 -- Provide template access
 local p = {}

 function p.nav( frame )
 -- Uses:
 -- < LuaModuleDoc.frame
 -- navigation()
 local lucky, r
 LuaModuleDoc.frame = frame
 lucky, r = pcall( navigation )
 if not lucky then
 local e = mw.html.create( "span" )
 :attr( "class", "error" )
 :wikitext( r )
 r = tostring( e )
 end
 return r or ""
 end



 p.failsafe = function ( frame )
 -- Check or retrieve version information
 -- Precondition:
 -- frame -- object; #invoke environment
 -- Postcondition:
 -- Return string with error message or ""
 -- Uses:
 -- LuaModuleDoc.failsafe()
 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

AltStyle によって変換されたページ (->オリジナル) /