词条 | Module:TemplateDataGenerator |
释义 | --[=[ 2013-08-05{{TemplateDataGenerator}} Basic idea by 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( "{{{([^|}\]+)" ) 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": "",\';-- 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,\%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\%s}\}", 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 end -- fun() -- Exportlocal 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 "" .. r .. ""; return r; end -- .f() return p; |
随便看 |
|
开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。