<?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%3ADatabase_report</id>
	<title>Module:Database report - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ADatabase_report"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Database_report&amp;action=history"/>
	<updated>2026-06-07T08:39:31Z</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:Database_report&amp;diff=135940&amp;oldid=prev</id>
		<title>imported&gt;SD0001: output_page: allow sub-subpages</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Database_report&amp;diff=135940&amp;oldid=prev"/>
		<updated>2022-11-20T09:21:36Z</updated>

		<summary type="html">&lt;p&gt;output_page: allow sub-subpages&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function error(text)&lt;br /&gt;
	return &amp;#039;*&amp;#039; .. require(&amp;#039;Module:Error&amp;#039;).error{ text, tag = &amp;#039;p&amp;#039; }&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
local function arr_contains(array, val)&lt;br /&gt;
    for _, value in ipairs(array) do&lt;br /&gt;
        if value == val then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function str_split(inputstr, sep)&lt;br /&gt;
    local t = {}&lt;br /&gt;
    for str in string.gmatch(inputstr, &amp;quot;([^&amp;quot;..sep..&amp;quot;]+)&amp;quot;) do&lt;br /&gt;
		table.insert(t, str)&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_integer(str) &lt;br /&gt;
	if str:match(&amp;quot;%D&amp;quot;) then &lt;br /&gt;
		return false&lt;br /&gt;
	end &lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
   return s:match(&amp;quot;^%s*(.-)%s*$&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Called from {{Database report}}&lt;br /&gt;
function p.check_syntax(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	-- check that required parameters are provided&lt;br /&gt;
	if not args.sql then&lt;br /&gt;
		return error(&amp;#039;Invalid config: required parameter &amp;quot;sql&amp;quot; is missing&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local deprecated_params = {&lt;br /&gt;
		[&amp;#039;frequency&amp;#039;] = &amp;#039;interval&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- check for invalid parameters&lt;br /&gt;
	for param, _ in pairs(args) do&lt;br /&gt;
		if arr_contains(deprecated_params, param) then&lt;br /&gt;
			return error(param .. &amp;#039; is deprecated, please use &amp;#039; .. deprecated_params[param] .. &amp;#039; instead&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if not arr_contains({&lt;br /&gt;
			&amp;#039;sql&amp;#039;, &amp;#039;wikilinks&amp;#039;, &amp;#039;excerpts&amp;#039;, &amp;#039;comments&amp;#039;, &amp;#039;widths&amp;#039;, &amp;#039;hide&amp;#039;,&lt;br /&gt;
			&amp;#039;table_style&amp;#039;, &amp;#039;remove_underscores&amp;#039;, &amp;#039;pagination&amp;#039;, &amp;#039;output_page&amp;#039;,&lt;br /&gt;
			&amp;#039;max_pages&amp;#039;, &amp;#039;interval&amp;#039;, &amp;#039;row_template&amp;#039;, &amp;#039;skip_table&amp;#039;, &amp;#039;header_template&amp;#039;&lt;br /&gt;
		}, param) then&lt;br /&gt;
			return error(&amp;#039;Unknown parameter &amp;quot;&amp;#039; .. param .. &amp;#039;&amp;quot; used, ignoring&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check incompatible param combinations&lt;br /&gt;
	if not args.row_template then&lt;br /&gt;
		if args.skip_table then &lt;br /&gt;
			return error(&amp;#039;Invalid config: skip_table can only be used with row_template&amp;#039;)&lt;br /&gt;
		end &lt;br /&gt;
		if args.header_template then &lt;br /&gt;
			return error(&amp;#039;header_template can be used only when row_template is being used&amp;#039;)&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.output_page then&lt;br /&gt;
		if args.pagination then &lt;br /&gt;
			return error(&amp;#039;pagination and output_page cannot be used together; output_page will be ignored&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local t1 = mw.title.getCurrentTitle()&lt;br /&gt;
		local t2 = mw.title.new(args.output_page)&lt;br /&gt;
		if t1.namespace ~= t2.namespace or t2.text:find(t1.text..&amp;#039;/&amp;#039;, 1, true) ~= 1 then&lt;br /&gt;
			return error(&amp;#039;output_page must be a subpage of the current page&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- check wikilinks config&lt;br /&gt;
	if args.wikilinks then&lt;br /&gt;
		local configs = str_split(args.wikilinks, &amp;#039;,&amp;#039;)&lt;br /&gt;
		for _, config in ipairs(configs) do&lt;br /&gt;
			local parts = str_split(trim(config), &amp;#039;:&amp;#039;)&lt;br /&gt;
			local srcColNum = parts[1]&lt;br /&gt;
			if not is_integer(srcColNum) then&lt;br /&gt;
				return error(&amp;#039;Invalid wikilink config: Non-numeral source column number: &amp;#039;..parts[1]..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			local ns = parts[2]&lt;br /&gt;
			if ns and ns:match(&amp;quot;^c?%d+$&amp;quot;) == nil then &lt;br /&gt;
				return error(&amp;#039;Invalid namespace number &amp;quot;&amp;#039;.. ns..&amp;#039;&amp;quot; in wikilinks parameter: refer to [[WP:NS]] for namespace numbers, or use &amp;quot;cN&amp;quot; to take namespace number from column number N&amp;#039;)&lt;br /&gt;
			end &lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check excerpts config&lt;br /&gt;
	if args.excerpts then&lt;br /&gt;
		local configs = str_split(args.excerpts, &amp;#039;,&amp;#039;)&lt;br /&gt;
		for _, config in ipairs(configs) do&lt;br /&gt;
			local parts = str_split(trim(config), &amp;#039;:&amp;#039;)&lt;br /&gt;
			local srcColNum = parts[1]&lt;br /&gt;
			if not is_integer(srcColNum) then&lt;br /&gt;
				return error(&amp;#039;Invalid excerpts config: Non-numeral source column number: &amp;#039;..parts[1]..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			local dstColNum = parts[2]&lt;br /&gt;
			if dstColNum and not is_integer(dstColNum) then&lt;br /&gt;
				return error(&amp;#039;Invalid excerpts config: Non-numeral destination column number: &amp;#039;..parts[2]..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			local ns = parts[3]&lt;br /&gt;
			if ns and ns:match(&amp;quot;^c?%d+$&amp;quot;) == nil then &lt;br /&gt;
				return error(&amp;#039;Invalid namespace number &amp;quot;&amp;#039;.. ns..&amp;#039;&amp;quot; in excerpts parameter: refer to [[WP:NS]] for namespace numbers, or use &amp;quot;cN&amp;quot; to take namespace number from column number N&amp;#039;)&lt;br /&gt;
			end &lt;br /&gt;
			local charLimit = parts[4]&lt;br /&gt;
			if charLimit and not is_integer(charLimit) then &lt;br /&gt;
				return error(&amp;#039;Invalid excerpts config: Non-numeral in charLimit: &amp;#039;..parts[4]..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end &lt;br /&gt;
			local hardCharLimit = parts[5]&lt;br /&gt;
			if hardCharLimit and not is_integer(hardCharLimit) then &lt;br /&gt;
				return error(&amp;#039;Invalid excerpts config: Non-numeral in hardCharLimit: &amp;#039;..parts[5]..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end &lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check column numbers in widths param&lt;br /&gt;
	if args.widths then&lt;br /&gt;
		local configs = str_split(args.widths, &amp;#039;,&amp;#039;)&lt;br /&gt;
		for _, config in ipairs(configs) do &lt;br /&gt;
			local parts = str_split(trim(config), &amp;#039;:&amp;#039;)&lt;br /&gt;
			local column = parts[1]&lt;br /&gt;
			if not is_integer(column) then&lt;br /&gt;
				return error(&amp;#039;Invalid widths config: Non-numeral column number: &amp;#039;..parts[1]..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check numeric configs&lt;br /&gt;
	if args.comments then&lt;br /&gt;
		local columns = str_split(args.comments, &amp;#039;,&amp;#039;)&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			if not is_integer(trim(column)) then&lt;br /&gt;
				return error(&amp;#039;Invalid comments parameter: Non-numeral column number: &amp;#039;..column..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.remove_underscores then&lt;br /&gt;
		local columns = str_split(args.remove_underscores, &amp;#039;,&amp;#039;)&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			if not is_integer(trim(column)) then&lt;br /&gt;
				return error(&amp;#039;Invalid remove_underscores parameter: Non-numeral column number: &amp;#039;..column..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.hide then&lt;br /&gt;
		local columns = str_split(args.hide, &amp;#039;,&amp;#039;)&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			if not is_integer(trim(column)) then&lt;br /&gt;
				return error(&amp;#039;Invalid hide parameter: Non-numeral column number: &amp;#039;..column..&amp;#039;. Will be ignored.&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.pagination and not is_integer(args.pagination) then &lt;br /&gt;
		return error(&amp;#039;pagination should be an integer. Will be ignored.&amp;#039;)&lt;br /&gt;
	end &lt;br /&gt;
	if args.max_pages and not is_integer(args.max_pages) then&lt;br /&gt;
		return error(&amp;#039;max_pages should be an integer. Will be ignored.&amp;#039;)&lt;br /&gt;
	end &lt;br /&gt;
	if args.interval and not is_integer(args.interval) then&lt;br /&gt;
		return error(&amp;#039;interval should be an integer. Will be ignored.&amp;#039;)&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Called from {{Database report/footer}} and {{Database report/subpage}} &lt;br /&gt;
function p.navlinks(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	if args.page then&lt;br /&gt;
		local page = tonumber(args.page)&lt;br /&gt;
		local num_pages = tonumber(args.num_pages)&lt;br /&gt;
		&lt;br /&gt;
		local title = mw.title.getCurrentTitle()&lt;br /&gt;
		&lt;br /&gt;
		local nextPage = title.nsText..&amp;#039;:&amp;#039;..title.baseText..&amp;#039;/&amp;#039;..(page + 1)&lt;br /&gt;
		local prevPage = title.nsText..&amp;#039;:&amp;#039;..title.baseText..&amp;#039;/&amp;#039;..(page - 1)&lt;br /&gt;
		-- page 1 has no subpage name &lt;br /&gt;
		if page == 1 then &lt;br /&gt;
			nextPage = title.nsText..&amp;#039;:&amp;#039;..title.text..&amp;#039;/2&amp;#039;&lt;br /&gt;
		elseif page == 2 then&lt;br /&gt;
			prevPage = title.nsText..&amp;#039;:&amp;#039;..title.baseText &lt;br /&gt;
		end &lt;br /&gt;
		&lt;br /&gt;
		local prevPageText = &amp;#039;&amp;lt;&amp;lt; Previous page&amp;#039;&lt;br /&gt;
		local nextPageText = &amp;#039;Next page &amp;gt;&amp;gt;&amp;#039;&lt;br /&gt;
		&lt;br /&gt;
		local prevPageLink = (page == 1 or page &amp;gt; num_pages + 1) and &amp;#039;&amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;&amp;#039;..prevPageText..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			or &amp;#039;[[&amp;#039;..prevPage..&amp;#039;|&amp;#039;..prevPageText..&amp;#039;]]&amp;#039;&lt;br /&gt;
		local nextPageLink = page &amp;gt;= num_pages and &amp;#039;&amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;&amp;#039;..nextPageText..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			or &amp;#039;[[&amp;#039;..nextPage..&amp;#039;|&amp;#039;..nextPageText..&amp;#039;]]&amp;#039;&lt;br /&gt;
		&lt;br /&gt;
		return prevPageLink..&amp;#039; || &amp;#039;..nextPageLink&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;SD0001</name></author>
	</entry>
</feed>