<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplateDataGenerator</id>
	<title>Module:TemplateDataGenerator - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplateDataGenerator"/>
	<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:TemplateDataGenerator&amp;action=history"/>
	<updated>2026-05-18T12:44:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://wiki.stiles.casa/index.php?title=Module:TemplateDataGenerator&amp;diff=5881&amp;oldid=prev</id>
		<title>Maxwells: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:TemplateDataGenerator&amp;diff=5881&amp;oldid=prev"/>
		<updated>2022-06-11T21:02:48Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:02, 11 June 2022&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wikidb:diff::1.12:old-5880:rev-5881 --&gt;
&lt;/table&gt;</summary>
		<author><name>Maxwells</name></author>
	</entry>
	<entry>
		<id>https://wiki.stiles.casa/index.php?title=Module:TemplateDataGenerator&amp;diff=5880&amp;oldid=prev</id>
		<title>en&gt;Salix alba: don&#039;t really want to wrap the result in &lt;pre&gt;, better translation of parameters for getBlock</title>
		<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:TemplateDataGenerator&amp;diff=5880&amp;oldid=prev"/>
		<updated>2013-08-07T13:06:24Z</updated>

		<summary type="html">&lt;p&gt;don&amp;#039;t really want to wrap the result in &amp;lt;pre&amp;gt;, better translation of parameters for getBlock&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[ 2013-08-05&lt;br /&gt;
{{TemplateDataGenerator}}&lt;br /&gt;
Basic idea by [[w:en:User:Salix alba]]&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local config = {&lt;br /&gt;
    luxury = false,    -- default alphabetical order for parameter list&lt;br /&gt;
    start  = false,    -- preceeding lines&lt;br /&gt;
    shift  = &amp;quot;   &amp;quot;,    -- (not used now) indentation, like &amp;quot;   &amp;quot; or &amp;quot;\t&amp;quot;&lt;br /&gt;
    suffix = false,    -- following lines&lt;br /&gt;
    scheme = [=[&amp;quot;%s&amp;quot;:&lt;br /&gt;
              { &amp;quot;label&amp;quot;:       &amp;quot;%s&amp;quot;,&lt;br /&gt;
                &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;:        &amp;quot;string&amp;quot;,&lt;br /&gt;
                &amp;quot;required&amp;quot;:    false&lt;br /&gt;
              }]=]&lt;br /&gt;
    -- config.scheme has placeholders %s&lt;br /&gt;
    -- for the parameter name and for &amp;quot;label&amp;quot;.&lt;br /&gt;
    -- One of various indentation styles.&lt;br /&gt;
    -- Feel free to compose a different one, also using config.shift etc.&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function factory( analyze, alphabetical )&lt;br /&gt;
    -- Make parameter sequence from template source text&lt;br /&gt;
    --     analyze       -- string; template source text&lt;br /&gt;
    --     alphabetical  -- boolean or nil; sort parameter list&lt;br /&gt;
    -- Return:&lt;br /&gt;
    --     table (sequence) with parameter names&lt;br /&gt;
    local i, s;&lt;br /&gt;
    local r = { };&lt;br /&gt;
    for s in analyze:gmatch( &amp;quot;{{{([^|}\n]+)&amp;quot; ) do&lt;br /&gt;
        for i = 1, #r do&lt;br /&gt;
            if r[ i ] == s then&lt;br /&gt;
                s = false;&lt;br /&gt;
                break; -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        if s then&lt;br /&gt;
            table.insert( r, s );&lt;br /&gt;
        end&lt;br /&gt;
    end -- for s in :gmatch()&lt;br /&gt;
    if alphabetical then&lt;br /&gt;
        table.sort( r, nil );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- factory()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function format( analyze, alphabetical )&lt;br /&gt;
    -- Make JSON code from template source text&lt;br /&gt;
    --     analyze       -- string; template source text&lt;br /&gt;
    --     alphabetical  -- boolean or nil; sort parameter list&lt;br /&gt;
    -- Return:&lt;br /&gt;
    --     string with JSON code&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     &amp;gt;  config.shift&lt;br /&gt;
    --     &amp;gt;  config.scheme&lt;br /&gt;
    --     factory()&lt;br /&gt;
    local i;&lt;br /&gt;
    local params = factory( analyze, alphabetical );&lt;br /&gt;
    local r      = &amp;#039;{ &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;,\n&amp;#039;;&lt;br /&gt;
--  local shift  = config.shift or &amp;quot;&amp;quot;;    -- currently unused&lt;br /&gt;
    local start  = &amp;quot;            &amp;quot;;&lt;br /&gt;
    local show, symbol;&lt;br /&gt;
    r = r ..       &amp;#039;  &amp;quot;params&amp;quot;: { &amp;#039;;&lt;br /&gt;
    for i = 1, #params do&lt;br /&gt;
        if i &amp;gt; 1 then&lt;br /&gt;
            r = string.format( &amp;quot;%s,\n%s  &amp;quot;, r, start );&lt;br /&gt;
        end&lt;br /&gt;
        symbol = params[ i ];&lt;br /&gt;
        if mw.ustring.match( symbol, &amp;quot;^%u%u&amp;quot; ) then&lt;br /&gt;
            show = mw.ustring.sub( symbol, 1, 1 ) ..&lt;br /&gt;
                   mw.ustring.lower( mw.ustring.sub( symbol, 2 ) );&lt;br /&gt;
        else&lt;br /&gt;
            show = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. string.format( config.scheme, symbol, show );&lt;br /&gt;
        -- common JSON pattern is ASCII; string.format() will do&lt;br /&gt;
    end -- for i&lt;br /&gt;
    r = string.format( &amp;quot;%s\n%s}\n}&amp;quot;, r, start );&lt;br /&gt;
    return r;&lt;br /&gt;
end -- format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fun( attempt, alphabetical )&lt;br /&gt;
    -- Retrieve used template params and build TemplateData skeleton&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt       -- mw.title object; related to template code&lt;br /&gt;
    --     alphabetical  -- boolean or nil; sort parameter list&lt;br /&gt;
    -- Return:&lt;br /&gt;
    --     string to be applied&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     &amp;gt;  config.luxury&lt;br /&gt;
    --     &amp;gt;  config.start&lt;br /&gt;
    --     &amp;gt;  config.suffix&lt;br /&gt;
    --     format()&lt;br /&gt;
    local r;&lt;br /&gt;
    local source = string.match( attempt.baseText .. &amp;quot;/&amp;quot;,&lt;br /&gt;
                                 &amp;quot;^([^/]+)/&amp;quot; );&lt;br /&gt;
                   -- ensure top page in NS with no subpage property&lt;br /&gt;
                   -- note that pattern is ASCII; string.match() will do&lt;br /&gt;
    local title  = mw.title.makeTitle( attempt.namespace, source );&lt;br /&gt;
    if title.exists then&lt;br /&gt;
        local luxury = config.luxury;&lt;br /&gt;
        local spec   = &amp;quot;%s&amp;lt;templatedata&amp;gt;\n%s\n&amp;lt;/templatedata&amp;gt;\n%s&amp;quot;;&lt;br /&gt;
        if type( alphabetical ) == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
            luxury = alphabetical;&lt;br /&gt;
        end&lt;br /&gt;
        if config.start then&lt;br /&gt;
            r = config.start .. &amp;quot;\n&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        r = string.format( spec,&lt;br /&gt;
                           r,&lt;br /&gt;
                           format( title:getContent(), luxury ),&lt;br /&gt;
                           config.suffix or &amp;quot;&amp;quot; );&lt;br /&gt;
        -- note that format spec is ASCII only; string.format() will do&lt;br /&gt;
    else    -- test only&lt;br /&gt;
        r = &amp;quot;ERROR * no page &amp;quot; .. title.fullText;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- fun()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = {};&lt;br /&gt;
&lt;br /&gt;
function p.getBlock( pagetitle, namespace, alphabetical )&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     pagetitle     -- string; page title related to template code&lt;br /&gt;
    --     namespace     -- string, number or nil; namespace (Template:)&lt;br /&gt;
    --     alphabetical  -- boolean or nil; sort parameter list&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     fun()&lt;br /&gt;
    local title = mw.title.makeTitle( namespace or 10,  pagetitle );&lt;br /&gt;
    local lucky, r = pcall( fun, title, alphabetical );&lt;br /&gt;
    return r;&lt;br /&gt;
end -- .getBlock()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.f( frame )&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     frame  -- object&lt;br /&gt;
    --     Invoked on a template page or template subpage.&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     fun()&lt;br /&gt;
    local luxury;&lt;br /&gt;
    local parental = frame:getParent().args;&lt;br /&gt;
    local sort     = parental[ 1 ] or parental[ &amp;quot;1&amp;quot; ] or parental.sort;&lt;br /&gt;
    if sort then&lt;br /&gt;
        luxury = ( tonumber( sort) == 1 );&lt;br /&gt;
    end&lt;br /&gt;
    local lucky, r = pcall( fun, mw.title.getCurrentTitle(), luxury );&lt;br /&gt;
    -- return &amp;quot;&amp;lt;pre&amp;gt;&amp;quot; .. r .. &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    return r;&lt;br /&gt;
&lt;br /&gt;
end -- .f()&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>en&gt;Salix alba</name></author>
	</entry>
</feed>