„Modul:Vorlage:LuaModuleDoc“ – Versionsunterschied
Erscheinungsbild
[gesichtete Version] | [gesichtete Version] |
Inhalt gelöscht Inhalt hinzugefügt
2018-02-18 |
2018-08-01 |
||
Zeile 1: | Zeile 1: | ||
local LuaModuleDoc = { suite = "LuaModuleDoc", |
local LuaModuleDoc = { suite = "LuaModuleDoc", |
||
serial = "2018- |
serial = "2018-08-01", |
||
item = 12981914 |
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}} |
Support {{LuaModuleDoc}} |
||
Zeile 7: | Zeile 15: | ||
* failsafe() |
* failsafe() |
||
]=] |
]=] |
||
-- Module globals |
|||
local CurrentTitle |
|||
local Frame |
|||
Zeile 21: | Zeile 23: | ||
-- arg -- string or number; argument identifier |
-- arg -- string or number; argument identifier |
||
-- assign -- any, optional; default value |
-- assign -- any, optional; default value |
||
-- Uses: |
|||
local r = Frame.args[ arg ] |
|||
-- > LuaModuleDoc.frame |
|||
local r = LuaModuleDoc.frame.args[ arg ] |
|||
if type( r ) ~= "string" then |
if type( r ) ~= "string" then |
||
if assign == nil then |
if assign == nil then |
||
Zeile 65: | Zeile 69: | ||
-- string |
-- string |
||
-- Uses: |
-- Uses: |
||
-- > LuaModuleDoc.frame |
|||
-- fetch() |
-- fetch() |
||
-- MediaWiki:Move-leave-redirect Weiterleitung erstellen |
-- MediaWiki:Move-leave-redirect Weiterleitung erstellen |
||
Zeile 101: | Zeile 106: | ||
end |
end |
||
path = { sub, mw.uri.buildQueryString( create ) } |
path = { sub, mw.uri.buildQueryString( create ) } |
||
r = |
r = LuaModuleDoc.frame:callParserFunction( "fullurl", path ) |
||
show = mw.message.new( show ):plain() |
show = mw.message.new( show ):plain() |
||
button = mw.title.makeTitle( mw.site.namespaces.Template.id, |
button = mw.title.makeTitle( mw.site.namespaces.Template.id, |
||
Zeile 111: | Zeile 116: | ||
Link = r, |
Link = r, |
||
Text = show } |
Text = show } |
||
r = |
r = LuaModuleDoc.frame:expandTemplate{ |
||
title = button.template, |
|||
args = button } |
|||
else |
else |
||
r = string.format( "<br>[%s '''%s''']", r, show ) |
r = string.format( "<br>[%s '''%s''']", r, show ) |
||
Zeile 126: | Zeile 132: | ||
-- script -- string; module name (main) |
-- script -- string; module name (main) |
||
-- Uses: |
-- Uses: |
||
-- > LuaModuleDoc.title |
|||
-- > LuaModuleDoc.frame |
|||
-- fetch() |
-- fetch() |
||
-- |
-- mw.wikibase.getEntity() |
||
-- mw.title.makeTitle() |
|||
-- Return: |
-- Return: |
||
-- string |
-- string |
||
-- Uses: |
|||
-- mw.wikibase.getEntity() |
|||
-- mw.title.makeTitle() |
|||
local entity = mw.wikibase.getEntity() |
local entity = mw.wikibase.getEntity() |
||
local r |
local r |
||
Zeile 150: | Zeile 156: | ||
t = mw.title.makeTitle( space, s ) |
t = mw.title.makeTitle( space, s ) |
||
s = "//" .. repo.host |
s = "//" .. repo.host |
||
if mw.title.equals( |
if mw.title.equals( LuaModuleDoc.title, t ) and |
||
mw.site.server:find( s, 1, true ) then |
mw.site.server:find( s, 1, true ) then |
||
mode = 2 |
mode = 2 |
||
Zeile 160: | Zeile 166: | ||
s = fetch( "templateGlobal", "" ) |
s = fetch( "templateGlobal", "" ) |
||
if #s > 0 then |
if #s > 0 then |
||
local |
local l, bib = pcall( require, |
||
LuaModuleDoc.title.prefixedText ) |
|||
local vsn = entity:formatPropertyValues( "P348" ) |
local vsn = entity:formatPropertyValues( "P348" ) |
||
params = { } |
params = { } |
||
Zeile 195: | Zeile 201: | ||
params.update = "1" |
params.update = "1" |
||
end |
end |
||
r = |
r = LuaModuleDoc.frame:expandTemplate{ title=s, |
||
args=params } |
args=params } |
||
end |
end |
||
end |
end |
||
Zeile 232: | Zeile 238: | ||
local function navDevelop( |
local function navDevelop( start, script ) |
||
-- Most interesting test and development page |
-- Most interesting test and development page |
||
-- Precondition: |
-- Precondition: |
||
-- nsDocs -- number; central documentation namespace number |
|||
-- start -- string; central documentation root |
-- start -- string; central documentation root |
||
-- script -- string; basic module name |
-- script -- string; basic module name |
||
Zeile 241: | Zeile 246: | ||
-- string or false: full page name, if any |
-- string or false: full page name, if any |
||
-- Uses: |
-- Uses: |
||
-- > LuaModuleDoc.nsDocs |
|||
-- mw.title.makeTitle() |
-- mw.title.makeTitle() |
||
local n = nsDocs |
local n = LuaModuleDoc.nsDocs |
||
local r = false |
local r = false |
||
local sub = "/" .. fetch( "subTest", "Test" ) |
local sub = "/" .. fetch( "subTest", "Test" ) |
||
Zeile 280: | Zeile 286: | ||
-- specific -- string, optional; additional information |
-- specific -- string, optional; additional information |
||
-- Uses: |
-- Uses: |
||
-- > LuaModuleDoc.frame |
|||
-- fetch() |
-- fetch() |
||
local show = fetch( "pageErr" ) |
local show = fetch( "pageErr" ) |
||
Zeile 288: | Zeile 295: | ||
table.insert( pars, specific ) |
table.insert( pars, specific ) |
||
end |
end |
||
r = |
r = LuaModuleDoc.frame:expandTemplate{ title = show, |
||
args = pars } |
|||
else |
else |
||
local e = mw.html.create( "span" ) |
local e = mw.html.create( "span" ) |
||
Zeile 334: | Zeile 342: | ||
local function navLangs( |
local function navLangs( start, script ) |
||
-- Analyze languages |
-- Analyze languages |
||
-- Precondition: |
-- Precondition: |
||
-- current page is supposed to transclude LuaModuleDoc |
-- current page is supposed to transclude LuaModuleDoc |
||
-- nsDocs -- number; central documentation namespace number |
|||
-- start -- string; central documentation root |
-- start -- string; central documentation root |
||
-- script -- string; basic module name |
-- 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: |
-- Uses: |
||
-- > LuaModuleDoc.nsDocs |
|||
-- < LuaModuleDoc.transl |
|||
-- fetch() |
-- fetch() |
||
-- navLang() |
-- navLang() |
||
-- mw.title.makeTitle() |
-- mw.title.makeTitle() |
||
local e, i, s, t |
local e, i, s, t |
||
local r = { } |
|||
local specified = fetch( "langsRequest", false ) |
local specified = fetch( "langsRequest", false ) |
||
local super = start .. "/" .. script .. "/" |
local super = start .. "/" .. script .. "/" |
||
LuaModuleDoc.transl = { } |
|||
if type( specified ) == "string" then |
if type( specified ) == "string" then |
||
if specified:match( "^%s*$" ) then |
if specified:match( "^%s*$" ) then |
||
Zeile 361: | Zeile 371: | ||
end |
end |
||
end |
end |
||
navLang( fetch( "langsDefault" ), |
navLang( fetch( "langsDefault" ), LuaModuleDoc.transl, specified ) |
||
navLang( fetch( "langsMore" ), |
navLang( fetch( "langsMore" ), LuaModuleDoc.transl, true ) |
||
navLang( specified, |
navLang( specified, LuaModuleDoc.transl, false ) |
||
if # |
if #LuaModuleDoc.transl < 1 then |
||
LuaModuleDoc.transl = { { "en", false } } |
|||
end |
end |
||
for i = # |
for i = #LuaModuleDoc.transl, 1, -1 do |
||
e = |
e = LuaModuleDoc.transl[ i ] |
||
s = e[ 1 ] |
s = e[ 1 ] |
||
if e[ 2 ] then |
if e[ 2 ] then |
||
t = mw.title.makeTitle( nsDocs, super .. s ) |
t = mw.title.makeTitle( LuaModuleDoc.nsDocs, super .. s ) |
||
if not t.exists then |
if not t.exists then |
||
s = false |
s = false |
||
Zeile 377: | Zeile 387: | ||
end |
end |
||
if s then |
if s then |
||
LuaModuleDoc.transl[ i ] = s |
|||
else |
else |
||
table.remove( |
table.remove( LuaModuleDoc.transl, i ) |
||
end |
end |
||
end -- for i -1 |
end -- for i -1 |
||
table.insert( |
table.insert( LuaModuleDoc.transl, |
||
1, |
|||
script ) |
|||
return r |
|||
table.insert( LuaModuleDoc.transl, |
|||
2, |
|||
tostring( #LuaModuleDoc.transl ) ) |
|||
end -- navLangs() |
end -- navLangs() |
||
local function navMerge( start, swift |
local function navMerge( start, swift, script, sub, lead ) |
||
-- Include various external content into page |
-- Include various external content into page |
||
-- Precondition: |
-- Precondition: |
||
-- start -- string; defined pageDocRoot argument |
-- start -- string; defined pageDocRoot argument |
||
-- swift -- string; defined pageNav argument |
-- swift -- string; defined pageNav argument |
||
-- ns -- number; current namespace number |
|||
-- nsDocs -- number; central documentation namespace number |
|||
-- script -- string; module name (main) |
-- script -- string; module name (main) |
||
-- sub -- string or false; possible sub-module name |
-- sub -- string or false; possible sub-module name |
||
-- lead -- true: Module: namespace; false: text namespace |
-- lead -- true: Module: namespace; false: text namespace |
||
-- Uses: |
-- Uses: |
||
-- > |
-- > LuaModuleDoc.transl |
||
-- |
-- > LuaModuleDoc.ns |
||
-- > LuaModuleDoc.nsDocs |
|||
-- > LuaModuleDoc.title |
|||
-- > LuaModuleDoc.frame |
|||
-- navError() |
-- navError() |
||
-- mw.title.makeTitle() |
-- mw.title.makeTitle() |
||
-- createPage() |
-- createPage() |
||
-- fetch() |
-- fetch() |
||
local server |
local server = mw.site.server |
||
local super |
local super = false |
||
local |
local t = navDevelop( start, script ) |
||
local |
local collect, low, r, s |
||
collect = LuaModuleDoc.transl |
|||
local low, r, s |
|||
if t then |
if t then |
||
collect.Test = t |
collect.Test = t |
||
end |
end |
||
if ns == nsDocs then |
if LuaModuleDoc.ns == LuaModuleDoc.nsDocs then |
||
s = string.format( "%s/%s", start, script ) |
s = string.format( "%s/%s", start, script ) |
||
if |
if LuaModuleDoc.title.text == s then |
||
super = |
super = LuaModuleDoc.title.text .. "/" |
||
elseif sub then |
elseif sub then |
||
collect.subDoc = sub |
collect.subDoc = sub |
||
collect.subModule = sub |
collect.subModule = sub |
||
s = string.format( "%s/%s/%s", start, script, sub ) |
s = string.format( "%s/%s/%s", start, script, sub ) |
||
if |
if LuaModuleDoc.title.text == s then |
||
s = string.format( "%s/%s", s, collect[ 3 ] ) |
s = string.format( "%s/%s", s, collect[ 3 ] ) |
||
t = mw.title.makeTitle( nsDocs, s ) |
t = mw.title.makeTitle( LuaModuleDoc.nsDocs, s ) |
||
if t.exists then |
if t.exists then |
||
super = |
super = LuaModuleDoc.title.text .. "/" |
||
end |
end |
||
end |
end |
||
Zeile 432: | Zeile 446: | ||
elseif lead and sub then |
elseif lead and sub then |
||
s = string.format( "%s/%s/%s", start, script, sub ) |
s = string.format( "%s/%s/%s", start, script, sub ) |
||
t = mw.title.makeTitle( nsDocs, s ) |
t = mw.title.makeTitle( LuaModuleDoc.nsDocs, s ) |
||
if t.exists then |
if t.exists then |
||
collect.subDoc = sub |
collect.subDoc = sub |
||
Zeile 446: | Zeile 460: | ||
end |
end |
||
end |
end |
||
r = |
r = LuaModuleDoc.frame:expandTemplate{ title = swift, |
||
args = collect } |
|||
if not low then |
if not low then |
||
t = |
t = LuaModuleDoc.title.talkPageTitle |
||
if ns == mw.site.namespaces.Module.id then |
if LuaModuleDoc.ns == mw.site.namespaces.Module.id then |
||
local doc |
local doc |
||
s = string.format( "%s/%s", start, script ) |
s = string.format( "%s/%s", start, script ) |
||
doc = mw.title.makeTitle( nsDocs, s ) |
doc = mw.title.makeTitle( LuaModuleDoc.nsDocs, s ) |
||
if not doc.exists then |
if not doc.exists then |
||
r = r .. createPage( "NoPageCentral", |
r = r .. createPage( "NoPageCentral", |
||
doc.prefixedText, |
doc.prefixedText, |
||
start, |
start, |
||
nsDocs, |
LuaModuleDoc.nsDocs, |
||
script ) |
script ) |
||
t = false |
t = false |
||
Zeile 465: | Zeile 480: | ||
if super then |
if super then |
||
s = "NoTalkCentral" |
s = "NoTalkCentral" |
||
elseif ns == nsDocs + 1 then |
elseif LuaModuleDoc.ns == LuaModuleDoc.nsDocs + 1 then |
||
s = false |
s = false |
||
else |
else |
||
Zeile 477: | Zeile 492: | ||
t.prefixedText, |
t.prefixedText, |
||
start, |
start, |
||
nsDocs + 1, |
LuaModuleDoc.nsDocs + 1, |
||
script ) ) |
script ) ) |
||
end |
end |
||
Zeile 488: | Zeile 503: | ||
local space, sub, support |
local space, sub, support |
||
for i = 3, #collect do |
for i = 3, #collect do |
||
t = mw.title.makeTitle( nsDocs, |
t = mw.title.makeTitle( LuaModuleDoc.nsDocs, |
||
super .. collect[ i ] ) |
|||
s = t:getContent() |
s = t:getContent() |
||
if s then |
if s then |
||
Zeile 499: | Zeile 515: | ||
else |
else |
||
r = r .. |
r = r .. |
||
LuaModuleDoc.frame:expandTemplate{ |
|||
title = t.prefixedText } |
|||
break -- for i |
break -- for i |
||
end |
end |
||
Zeile 513: | Zeile 530: | ||
swift = string.format( "%s/%s", swift, sub ) |
swift = string.format( "%s/%s", swift, sub ) |
||
end |
end |
||
r = r .. |
r = r .. |
||
LuaModuleDoc.frame:expandTemplate{ title = s, |
|||
args = { swift } } |
|||
end |
end |
||
end |
end |
||
Zeile 535: | Zeile 553: | ||
local function navPage( lead |
local function navPage( lead ) |
||
-- Return navigation text; analyze page location |
-- Return navigation text; analyze page location |
||
-- Precondition: |
-- Precondition: |
||
-- current namespace will support LuaModuleDoc |
-- current namespace will support LuaModuleDoc |
||
-- lead -- true: Module: namespace; false: text namespace |
-- lead -- true: Module: namespace; false: text namespace |
||
-- ns -- number; current namespace |
|||
-- nsDocs -- number; namespace for doc |
|||
-- Uses: |
-- Uses: |
||
-- > |
-- > LuaModuleDoc.title |
||
-- > LuaModuleDoc.transl |
|||
-- fetch() |
-- fetch() |
||
-- |
-- navLangs() |
||
-- navMerge() |
-- navMerge() |
||
-- navError() |
|||
local r |
local r |
||
local start = fetch( "pageDocRoot" ) |
local start = fetch( "pageDocRoot" ) |
||
Zeile 556: | Zeile 574: | ||
end |
end |
||
s = s .. "([^/]+)/(.*/?)$" |
s = s .. "([^/]+)/(.*/?)$" |
||
script, s = string.match( |
script, s = string.match( LuaModuleDoc.title.text .. "/", s ) |
||
if type( script ) == "string" then |
if type( script ) == "string" then |
||
local sub = false |
local sub = false |
||
local swift = fetch( "pageNav" ) |
local swift = fetch( "pageNav" ) |
||
navLangs( start, script ) |
|||
if type( s ) == "string" then |
if type( s ) == "string" then |
||
if #s > 1 then |
if #s > 1 then |
||
Zeile 568: | Zeile 587: | ||
if q.exists and q.contentModel == "Scribunto" then |
if q.exists and q.contentModel == "Scribunto" then |
||
sub = s |
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 |
end |
||
end |
end |
||
if type( swift ) == "string" then |
if type( swift ) == "string" then |
||
r = navMerge( start, |
r = navMerge( start, |
||
swift, |
|||
script, |
|||
sub, |
|||
lead ) |
|||
else |
else |
||
r = navError( "configMissing", "pageNav" ) |
r = navError( "configMissing", "pageNav" ) |
||
end |
end |
||
else |
else |
||
r = navError( "BadPage" ) .. |
r = navError( "BadPage" ) .. LuaModuleDoc.title.text |
||
end |
end |
||
else |
else |
||
Zeile 590: | Zeile 619: | ||
-- Start execution; return navigation text; analyze namespace |
-- Start execution; return navigation text; analyze namespace |
||
-- Uses: |
-- Uses: |
||
-- |
-- < LuaModuleDoc.title |
||
-- < LuaModuleDoc.ns |
|||
-- < LuaModuleDoc.nsDocs |
|||
-- fetch() |
-- fetch() |
||
-- mw.title.getCurrentTitle() |
-- mw.title.getCurrentTitle() |
||
Zeile 598: | Zeile 629: | ||
local nsDocs = fetch( "nsDocs" ) |
local nsDocs = fetch( "nsDocs" ) |
||
if nsDocs then |
if nsDocs then |
||
local lead |
|||
CurrentTitle = mw.title.getCurrentTitle() |
|||
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 |
else |
||
r = navError( "BadNamespace" ) |
r = navError( "BadNamespace" ) |
||
Zeile 615: | Zeile 650: | ||
LuaModuleDoc.failsafe = function ( assert ) |
|||
-- Provide template access |
|||
-- Retrieve versioning and check for compliance |
|||
-- Precondition: |
|||
-- assert -- string, with required version or "wikidata", |
|||
-- or false |
|||
-- Postcondition: |
|||
-- Returns string with appropriate version, or false |
|||
local r |
|||
if since == "wikidata" then |
|||
local item = LuaModuleDoc.item |
|||
since = false |
|||
if type( item ) == "number" and item > 0 then |
|||
local ent = mw.wikibase.getEntity( string.format( "Q%d", |
|||
item ) ) |
|||
if type( ent ) == "table" then |
|||
local vsn = ent:formatPropertyValues( "P348" ) |
|||
if type( vsn ) == "table" and |
|||
type( vsn.value) == "string" and |
|||
vsn.value ~= "" then |
|||
r = vsn.value |
|||
end |
|||
end |
|||
end |
|||
end |
|||
if not r then |
|||
if not since or since <= LuaModuleDoc.serial then |
|||
r = LuaModuleDoc.serial |
|||
else |
|||
r = false |
|||
end |
|||
end |
|||
return r |
|||
end -- LuaModuleDoc.failsafe() |
|||
-- Provide template access |
|||
local p = {} |
local p = {} |
||
function p.nav( frame ) |
function p.nav( frame ) |
||
-- Uses: |
-- Uses: |
||
-- < LuaModuleDoc.frame |
|||
-- navigation() |
-- navigation() |
||
local lucky, r |
local lucky, r |
||
LuaModuleDoc.frame = frame |
|||
lucky, r = pcall( navigation ) |
lucky, r = pcall( navigation ) |
||
if not lucky then |
if not lucky then |
||
Zeile 634: | Zeile 705: | ||
end |
end |
||
function p.failsafe() |
|||
return LuaModuleDoc.serial |
|||
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 LuaModuleDoc.failsafe( since ) or "" |
|||
end -- p.failsafe() |
end -- p.failsafe() |
||
Version vom 7. August 2018, 11:35 Uhr
Vorlagen- programmierung |
Diskussionen | Lua | Unterseiten | ||||||
Modul | Deutsch | English
|
Esperanto | Dolnoserbski | Hornjoserbsce | Modul: | WP:Lua |
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.
Wenn die serial-Information nicht übereinstimmt, müsste eine Kopie hiervon in das lokale Wiki geschrieben werden.
Versionsbezeichnung auf WikiData:
2024-03-01
Updating notwendig
(lokal:2018-08-01
)local LuaModuleDoc = { suite = "LuaModuleDoc",
serial = "2018-08-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 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( "fullurl", 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, t
if type( repo ) == "table" and
type( repo.value) == "string" and
repo.value:find( "//" ) then
repo = mw.uri.new( repo.value )
if type( repo.path ) == "string" and
repo.path:match( "^/wiki/" ) then
local space
space, s = repo.path:sub( 7 ):match( "^([^:]+):(.+)$" )
if space and s then
t = mw.title.makeTitle( space, s )
s = "//" .. repo.host
if 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" and bib.failsafe then
t = type( bib.failsafe )
if t == "function" then
bib = bib.failsafe( { args = { } } )
t = type( bib )
else
bib = bib.failsafe
end
if t == "number" then
bib = string.format( "%d", bib )
t = "string"
end
if t == "string" then
params.here = bib
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 = 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
i = mw.title.makeTitle( "Category", s )
if i.exists then
r = string.format( "%s[[%s|%s]]",
r, i.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()
LuaModuleDoc.failsafe = function ( assert )
-- Retrieve versioning and check for compliance
-- Precondition:
-- assert -- string, with required version or "wikidata",
-- or false
-- Postcondition:
-- Returns string with appropriate version, or false
local r
if since == "wikidata" then
local item = LuaModuleDoc.item
since = false
if type( item ) == "number" and item > 0 then
local ent = mw.wikibase.getEntity( string.format( "Q%d",
item ) )
if type( ent ) == "table" then
local vsn = ent:formatPropertyValues( "P348" )
if type( vsn ) == "table" and
type( vsn.value) == "string" and
vsn.value ~= "" then
r = vsn.value
end
end
end
end
if not r then
if not since or since <= LuaModuleDoc.serial then
r = LuaModuleDoc.serial
else
r = false
end
end
return r
end -- LuaModuleDoc.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 LuaModuleDoc.failsafe( since ) or ""
end -- p.failsafe()
return p