<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FNullzero%2FAutomaticTOC</id>
	<title>Module:Sandbox/Nullzero/AutomaticTOC - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FNullzero%2FAutomaticTOC"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Nullzero/AutomaticTOC&amp;action=history"/>
	<updated>2026-08-01T06:37:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Nullzero/AutomaticTOC&amp;diff=145928&amp;oldid=prev</id>
		<title>imported&gt;Pppery: Pppery moved page Module:AutomaticTOC to Module:Sandbox/Nullzero/AutomaticTOC without leaving a redirect: Moving this back into userspace, as the template it implements is still in userspace</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Nullzero/AutomaticTOC&amp;diff=145928&amp;oldid=prev"/>
		<updated>2019-02-20T18:04:44Z</updated>

		<summary type="html">&lt;p&gt;Pppery moved page &lt;a href=&quot;/index.php?title=Module:AutomaticTOC&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:AutomaticTOC (page does not exist)&quot;&gt;Module:AutomaticTOC&lt;/a&gt; to &lt;a href=&quot;/research/Module:Sandbox/Nullzero/AutomaticTOC&quot; title=&quot;Module:Sandbox/Nullzero/AutomaticTOC&quot;&gt;Module:Sandbox/Nullzero/AutomaticTOC&lt;/a&gt; without leaving a redirect: Moving this back into userspace, as &lt;a href=&quot;/index.php?title=User:Nullzero/sandbox/AutomaticTOC&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Nullzero/sandbox/AutomaticTOC (page does not exist)&quot;&gt;the template it implements&lt;/a&gt; is still in userspace&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;z = {};&lt;br /&gt;
&lt;br /&gt;
-- main function&lt;br /&gt;
function z.main(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local title = handle_param(args.title, nil)&lt;br /&gt;
    title = title and mw.title.new(args.title) or mw.title.getCurrentTitle()&lt;br /&gt;
    local delim = handle_param(args.delim, &amp;quot;,&amp;quot;)&lt;br /&gt;
    local sep = handle_param(args.sep, &amp;quot; &amp;quot;)&lt;br /&gt;
    local short = handle_param(args.short, nil)&lt;br /&gt;
    local name = handle_param(args.name, &amp;#039;&amp;#039;)&lt;br /&gt;
    name = (name == &amp;#039;&amp;#039;) and &amp;#039;&amp;#039; or &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. name .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
    name = &amp;quot;|&amp;quot; .. (short and name or &amp;quot;&amp;lt;center&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/center&amp;gt;\n|-&amp;quot;) .. &amp;quot;\n|&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local include = args.include and Set(Split(args.include, &amp;quot;%&amp;quot; .. delim)) or {}&lt;br /&gt;
    local exclude = args.exclude and Set(Split(args.exclude, &amp;quot;%&amp;quot; .. delim)) or {}&lt;br /&gt;
    &lt;br /&gt;
    local pre = args.pre and Split(args.pre, &amp;quot;%&amp;quot; .. delim) or {}&lt;br /&gt;
    local prebreak = handle_param(args.prebreak, sep)&lt;br /&gt;
    &lt;br /&gt;
    local post = args.post and Split(args.post, &amp;quot;%&amp;quot; .. delim) or {}&lt;br /&gt;
    local postbreak = handle_param(args.postbreak, sep)&lt;br /&gt;
    &lt;br /&gt;
    local prefix = handle_param(args.prefix, &amp;quot;&amp;quot;)&lt;br /&gt;
    local suffix = handle_param(args.suffix, &amp;quot;&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local anchor = handle_param(args.anchor, nil)&lt;br /&gt;
    local wiki_text = title:getContent()&lt;br /&gt;
    local all = {}&lt;br /&gt;
    &lt;br /&gt;
    local level = handle_param(tonumber(args.level), 1)&lt;br /&gt;
    &lt;br /&gt;
    eval = function(v)&lt;br /&gt;
        v = v:match &amp;quot;^%s*(.-)%s*$&amp;quot;&lt;br /&gt;
        if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            if (mw.ustring.len(v) &amp;lt;= level or include[v]) then table.insert(all, v) end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    for line in wiki_text:gmatch(&amp;quot;[^\n]+&amp;quot;) do&lt;br /&gt;
        ---&lt;br /&gt;
        eval(string.gsub(line:match(&amp;quot;^=+%s*(.-)%s*=+%s-$&amp;quot;) or &amp;quot;&amp;quot;, &amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        if anchor then&lt;br /&gt;
            for _, v in pairs(Split(line:match(&amp;quot;%{%{[Aa]nchor%|(.-)%}%}&amp;quot;) or &amp;quot;&amp;quot;, &amp;quot;%|&amp;quot;)) do eval(v) end&lt;br /&gt;
        end&lt;br /&gt;
        ---&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort(all, function(a, b) return mw.ustring.codepoint(a) &amp;lt; mw.ustring.codepoint(b) end)&lt;br /&gt;
    &lt;br /&gt;
    complete_list = {}&lt;br /&gt;
    for k, v in pairs(all) do&lt;br /&gt;
        if not exclude[v] and (k == 0 or (k &amp;gt; 0 and all[k - 1] ~= v)) then&lt;br /&gt;
            table.insert(complete_list, table.concat{&amp;quot;[[#&amp;quot;, v, &amp;quot;|&amp;quot;, prefix, v, suffix, &amp;quot;]]&amp;quot;})&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #complete_list == 0 then&lt;br /&gt;
        return errorPrinter({{&amp;quot;&amp;quot;, &amp;quot;no section link found[[Category:Page transcluded AutomaticTOC without section link]]&amp;quot;}})&lt;br /&gt;
    end&lt;br /&gt;
    if #pre == 0 then prebreak = &amp;quot;&amp;quot; end&lt;br /&gt;
    if #post == 0 then postbreak = &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    out = &amp;#039;{| class=&amp;quot;toccolours&amp;quot; style=&amp;quot;margin: 0px auto;&amp;quot;\n&amp;#039; .. name ..&lt;br /&gt;
          table.concat(pre, sep) .. prebreak .. table.concat(complete_list, sep) .. postbreak ..&lt;br /&gt;
          table.concat(post, sep) .. &amp;#039; __NOTOC__\n|}&amp;#039;&lt;br /&gt;
          &lt;br /&gt;
    if args.db then out = &amp;#039;&amp;lt;pre&amp;gt;&amp;#039; .. out .. &amp;#039;&amp;lt;/pre&amp;gt;&amp;#039; end&lt;br /&gt;
    return frame:preprocess(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- handle parameter&lt;br /&gt;
function handle_param(value, default)&lt;br /&gt;
    if (value == nil or value == &amp;quot;¬&amp;quot;) then&lt;br /&gt;
        return default&lt;br /&gt;
    else&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- from Module:Coordinates&lt;br /&gt;
function errorPrinter(errors)&lt;br /&gt;
    local result = &amp;quot;&amp;quot;&lt;br /&gt;
    for i,v in ipairs(errors) do&lt;br /&gt;
        local errorHTML = &amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;AutomaticTOC: &amp;#039; .. v[2] .. &amp;#039;&amp;lt;/strong&amp;gt;&amp;#039;&lt;br /&gt;
        result = result .. errorHTML .. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- http://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list&lt;br /&gt;
function Set (list)&lt;br /&gt;
    local set = {}&lt;br /&gt;
    for _, l in pairs(list) do set[l] = true end&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- http://lua-users.org/wiki/SplitJoin&lt;br /&gt;
function Split(str, delim, maxNb)&lt;br /&gt;
    -- Eliminate bad cases...&lt;br /&gt;
    if string.find(str, delim) == nil then&lt;br /&gt;
        if str == &amp;quot;&amp;quot; then return {} else return {str} end&lt;br /&gt;
    end&lt;br /&gt;
    if maxNb == nil or maxNb &amp;lt; 1 then&lt;br /&gt;
        maxNb = 0    -- No limit&lt;br /&gt;
    end&lt;br /&gt;
    local result = {}&lt;br /&gt;
    local pat = &amp;quot;(.-)&amp;quot; .. delim .. &amp;quot;()&amp;quot;&lt;br /&gt;
    local nb = 0&lt;br /&gt;
    local lastPos&lt;br /&gt;
    for part, pos in string.gfind(str, pat) do&lt;br /&gt;
        nb = nb + 1&lt;br /&gt;
        result[nb] = part&lt;br /&gt;
        lastPos = pos&lt;br /&gt;
        if nb == maxNb then break end&lt;br /&gt;
    end&lt;br /&gt;
    -- Handle the last field&lt;br /&gt;
    if nb ~= maxNb then&lt;br /&gt;
        nb = nb + 1&lt;br /&gt;
        result[nb] = string.sub(str, lastPos)&lt;br /&gt;
    end&lt;br /&gt;
    if result[nb] == &amp;quot;&amp;quot; then table.remove(result, nb) end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return z&lt;br /&gt;
&lt;br /&gt;
-- 2 May 2013:‎ Thanks to [[:en:User:Darklama]] for helping improving the code :)&lt;/div&gt;</summary>
		<author><name>imported&gt;Pppery</name></author>
	</entry>
</feed>