Module:TemplateDataGenerator
Module:TemplateDataGenerator – Module for generation of a skeleton for TemplateData from the parameter usage within template programming.
From wikitext
- f
- Trigger analysis of template around (base page).
- No parameters on
#invoke. - Yields block to be inserted by copy&paste.
- No parameters on
Template wrapping
The module is supposed to be wrapped for convenience into something like a template
{{#invoke:TemplateDataGenerator|f}}
Documentation
That template may be transcluded with one parameter: sort alias 1 – if that is provided with the value 1, parameter list will be sorted in alphabetical order.
Productive usage
When editing a template (documentation) page, users are supposed to insert the following line, where TemplateData shall appear:
{{subst:#invoke:TemplateDataGenerator|f}}
After click on [Preview], the generated lines are displayed and can be inserted by copy & paste to replace the temporary transclusion.
If forgotten to remove on saving, subst comes into effect and the plain lines are stored into source text. Next time someone will do the cleanup.
Functions for Lua modules
- getBlock( about, ahead, alphabetical )
- Trigger analysis of template like f but from Lua call.
- about – string; page title related to template code on base page
- ahead – string, number or nil; namespace (Template:)
- alphabetical – boolean or nil; sort parameter list
--[=[ 2013-08-05
{{TemplateDataGenerator}}
Basic idea by [[w:en:User:Salix alba]]
]=]
local config = {
luxury = false, -- default alphabetical order for parameter list
start = false, -- preceeding lines
shift = " ", -- (not used now) indentation, like " " or "\t"
suffix = false, -- following lines
scheme = [=["%s":
{ "label": "%s",
"description": "",
"type": "string",
"required": false
}]=]
-- config.scheme has placeholders %s
-- for the parameter name and for "label".
-- One of various indentation styles.
-- Feel free to compose a different one, also using config.shift etc.
};
local function factory( analyze, alphabetical )
-- Make parameter sequence from template source text
-- analyze -- string; template source text
-- alphabetical -- boolean or nil; sort parameter list
-- Return:
-- table (sequence) with parameter names
local i, s;
local r = { };
for s in analyze:gmatch( "{{{([^|}\n]+)" ) do
for i = 1, #r do
if r[ i ] == s then
s = false;
break; -- for i
end
end -- for i
if s then
table.insert( r, s );
end
end -- for s in :gmatch()
if alphabetical then
table.sort( r, nil );
end
return r;
end -- factory()
local function format( analyze, alphabetical )
-- Make JSON code from template source text
-- analyze -- string; template source text
-- alphabetical -- boolean or nil; sort parameter list
-- Return:
-- string with JSON code
-- Uses:
-- > config.shift
-- > config.scheme
-- factory()
local i;
local params = factory( analyze, alphabetical );
local r = '{ "description": "",\n';
-- local shift = config.shift or ""; -- currently unused
local start = " ";
local show, symbol;
r = r .. ' "params": { ';
for i = 1, #params do
if i > 1 then
r = string.format( "%s,\n%s ", r, start );
end
symbol = params[ i ];
if mw.ustring.match( symbol, "^%u%u" ) then
show = mw.ustring.sub( symbol, 1, 1 ) ..
mw.ustring.lower( mw.ustring.sub( symbol, 2 ) );
else
show = "";
end
r = r .. string.format( config.scheme, symbol, show );
-- common JSON pattern is ASCII; string.format() will do
end -- for i
r = string.format( "%s\n%s}\n}", r, start );
return r;
end -- format()
local function fun( attempt, alphabetical )
-- Retrieve used template params and build TemplateData skeleton
-- Precondition:
-- attempt -- mw.title object; related to template code
-- alphabetical -- boolean or nil; sort parameter list
-- Return:
-- string to be applied
-- Uses:
-- > config.luxury
-- > config.start
-- > config.suffix
-- format()
local r;
local source = string.match( attempt.baseText .. "/",
"^([^/]+)/" );
-- ensure top page in NS with no subpage property
-- note that pattern is ASCII; string.match() will do
local title = mw.title.makeTitle( attempt.namespace, source );
if title.exists then
local luxury = config.luxury;
local spec = "%s<templatedata>\n%s\n</templatedata>\n%s";
if type( alphabetical ) == "boolean" then
luxury = alphabetical;
end
if config.start then
r = config.start .. "\n";
else
r = "";
end
r = string.format( spec,
r,
format( title:getContent(), luxury ),
config.suffix or "" );
-- note that format spec is ASCII only; string.format() will do
else -- test only
r = "ERROR * no page " .. title.fullText;
end
return r;
end -- fun()
-- Export
local p = {};
function p.getBlock( pagetitle, namespace, alphabetical )
-- Precondition:
-- pagetitle -- string; page title related to template code
-- namespace -- string, number or nil; namespace (Template:)
-- alphabetical -- boolean or nil; sort parameter list
-- Uses:
-- fun()
local title = mw.title.makeTitle( namespace or 10, pagetitle );
local lucky, r = pcall( fun, title, alphabetical );
return r;
end -- .getBlock()
function p.f( frame )
-- Precondition:
-- frame -- object
-- Invoked on a template page or template subpage.
-- Uses:
-- fun()
local luxury;
local parental = frame:getParent().args;
local sort = parental[ 1 ] or parental[ "1" ] or parental.sort;
if sort then
luxury = ( tonumber( sort) == 1 );
end
local lucky, r = pcall( fun, mw.title.getCurrentTitle(), luxury );
-- return "<pre>" .. r .. "</pre>";
return r;
end -- .f()
return p;
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.