<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3APageListTools</id>
	<title>Module:PageListTools - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3APageListTools"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:PageListTools&amp;action=history"/>
	<updated>2026-05-01T00:35:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:PageListTools&amp;diff=492&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local p = {}  local libraryUtil = require(&#039;libraryUtil&#039;) local checkType = libraryUtil.checkType local arr = require(&#039;Module:Array&#039;) local dpl = require(&#039;Module:DPLlua&#039;)  -- Given a list of pages, this function returns lists of pages that are either -- non-existing (invalid), redirects or duplicates. -- The maximum list length is constrained only by MediaWiki&#039;s maximum  -- &#039;Expensive parser function count&#039;, which at the time of writing is set to 100. function p.pagelistc...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:PageListTools&amp;diff=492&amp;oldid=prev"/>
		<updated>2024-10-11T22:37:02Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libraryUtil.checkType local arr = require(&amp;#039;Module:Array&amp;#039;) local dpl = require(&amp;#039;Module:DPLlua&amp;#039;)  -- Given a list of pages, this function returns lists of pages that are either -- non-existing (invalid), redirects or duplicates. -- The maximum list length is constrained only by MediaWiki&amp;#039;s maximum  -- &amp;#039;Expensive parser function count&amp;#039;, which at the time of writing is set to 100. function p.pagelistc...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local arr = require(&amp;#039;Module:Array&amp;#039;)&lt;br /&gt;
local dpl = require(&amp;#039;Module:DPLlua&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Given a list of pages, this function returns lists of pages that are either&lt;br /&gt;
-- non-existing (invalid), redirects or duplicates.&lt;br /&gt;
-- The maximum list length is constrained only by MediaWiki&amp;#039;s maximum &lt;br /&gt;
-- &amp;#039;Expensive parser function count&amp;#039;, which at the time of writing is set to 100.&lt;br /&gt;
function p.pagelistchecks(pages, logging)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pagelistchecks&amp;#039;, 1, pages, &amp;#039;table&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pagelistchecks&amp;#039;, 2, logging, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
&lt;br /&gt;
    local invalid = {}&lt;br /&gt;
    local redirect = {}&lt;br /&gt;
    local duplicate = {}&lt;br /&gt;
    local pageid = {}&lt;br /&gt;
&lt;br /&gt;
    local t1 = os.clock()&lt;br /&gt;
    for _, page in ipairs(pages) do&lt;br /&gt;
        local title = mw.title.new(page, &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
        if title.exists then &lt;br /&gt;
            if title.isRedirect then&lt;br /&gt;
                table.insert(redirect, page)&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if arr.contains(pageid, title.id) then&lt;br /&gt;
                table.insert(duplicate, page)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(pageid, title.id)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(invalid, page)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local t2 = os.clock()&lt;br /&gt;
&lt;br /&gt;
    if logging then&lt;br /&gt;
        mw.log(string.format(&amp;#039;Checks (pagelist): total pages: %d, non-existing: %d, redirects: %d, duplicates: %d, time elapsed: %.3f ms.&amp;#039;,&lt;br /&gt;
            #pages, #invalid, #redirect, #duplicate, (t2 - t1) * 1000))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
        invalid   = invalid,&lt;br /&gt;
        redirect  = redirect,&lt;br /&gt;
        duplicate = duplicate &lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a list of pages with the specified categories. Uses DPL.&lt;br /&gt;
-- Each entry can consist of several categories AND-ed together with &amp;#039;&amp;amp;&amp;#039;.&lt;br /&gt;
function p.pageswithcatsdpl(cats, logging)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithcatsdpl&amp;#039;, 1, cats, &amp;#039;table&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithcatsdpl&amp;#039;, 2, logging, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
    assert(#cats &amp;gt; 0, &amp;#039;You must supply at least one category&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    local catlist = {}&lt;br /&gt;
    for _, c in ipairs(cats) do&lt;br /&gt;
        table.insert(catlist, { category = c })&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p.pageswithconditionsdpl(catlist, logging)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a list of pages that satisfies the given DPL conditions&lt;br /&gt;
function p.pageswithconditionsdpl(conditions, logging)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithconditionsdpl&amp;#039;, 1, conditions, &amp;#039;table&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithconditionsdpl&amp;#039;, 2, logging, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
&lt;br /&gt;
    local plistraw = {}&lt;br /&gt;
&lt;br /&gt;
    local t1 = os.clock()&lt;br /&gt;
    for _, c in ipairs(conditions) do&lt;br /&gt;
        local pages = dpl.ask(c)&lt;br /&gt;
&lt;br /&gt;
        for _, p in ipairs(pages) do&lt;br /&gt;
            table.insert(plistraw, p)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local t2 = os.clock()&lt;br /&gt;
&lt;br /&gt;
    local plist = arr.unique(plistraw)&lt;br /&gt;
    table.sort(plist)&lt;br /&gt;
&lt;br /&gt;
    if logging then&lt;br /&gt;
        mw.log(string.format(&amp;#039;DPL (pagelist): found: %d, unique: %d, time elapsed: %.3f ms.&amp;#039;,&lt;br /&gt;
            #plistraw, #plist, (t2 - t1) * 1000))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return plist&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a list of pages with the specified categories. Uses SMW.&lt;br /&gt;
-- Each entry can consist of several categories AND-ed together with &amp;#039; &amp;#039;.&lt;br /&gt;
function p.pageswithcats(cats, logging)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithcats&amp;#039;, 1, cats, &amp;#039;table&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithcats&amp;#039;, 2, logging, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
    assert(#cats &amp;gt; 0, &amp;#039;You must supply at least one category&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    return p.pageswithconditions(table.concat(cats, &amp;#039; OR &amp;#039;), logging)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a list of pages that satisfies the given SMW conditions&lt;br /&gt;
function p.pageswithconditions(conditions, logging)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithconditions&amp;#039;, 1, conditions, &amp;#039;string&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;Module:PageListTools.pageswithconditions&amp;#039;, 2, logging, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
&lt;br /&gt;
    -- Build query&lt;br /&gt;
    local query = {}&lt;br /&gt;
    table.insert(query, conditions)&lt;br /&gt;
    table.insert(query, &amp;#039;?=#-&amp;#039;)&lt;br /&gt;
    query.offset = 0&lt;br /&gt;
    query.limit = 1000&lt;br /&gt;
&lt;br /&gt;
    -- Fetch data&lt;br /&gt;
    --mw.logObject (query)&lt;br /&gt;
    local t1 = os.clock()&lt;br /&gt;
    local smw = mw.smw.ask(query)&lt;br /&gt;
    local t2 = os.clock()&lt;br /&gt;
    if not smw then&lt;br /&gt;
        smw = {}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Post-process&lt;br /&gt;
    local data = {}&lt;br /&gt;
&lt;br /&gt;
    for _, e in ipairs(smw) do&lt;br /&gt;
        table.insert(data, e[1])&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    assert(#smw == #data)&lt;br /&gt;
&lt;br /&gt;
    -- Statistics&lt;br /&gt;
    if logging then&lt;br /&gt;
        mw.log(string.format(&amp;#039;SMW (pagelist): found %i, offset %i, limit %i, time elapsed %.3f ms.&amp;#039;, &lt;br /&gt;
            #smw, query.offset, query.limit, (t2 - t1) * 1000))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[ DEBUG COPYPASTA&lt;br /&gt;
mw.logObject( p.pagelistchecks({&amp;#039;Verac\&amp;#039;s brassard#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s flail#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s helm#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s plateskirt#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s helm#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s plateskirt#Undamaged&amp;#039;, &amp;#039;Nonexistent&amp;#039;, &amp;#039;Area-51&amp;#039;, &amp;#039;Addy scim&amp;#039;, &amp;#039;Rune scim&amp;#039;}, true) )&lt;br /&gt;
mw.logObject( p.pageswithcatsdpl({&amp;#039;Monsters&amp;amp;Discontinued content&amp;#039;, &amp;#039;Monsters&amp;amp;Deadman Mode&amp;#039;}, true) )&lt;br /&gt;
mw.logObject( p.pageswithcats({&amp;#039;[[Category:Monsters]] [[Category:Discontinued content]]&amp;#039;, &amp;#039;[[Category:Monsters]] [[Category:Deadman Mode]]&amp;#039;}, true) )&lt;br /&gt;
mw.logObject( p.pageswithconditionsdpl({{ category = &amp;#039;Monsters&amp;amp;Discontinued content&amp;#039; }}, true) )&lt;br /&gt;
mw.logObject( p.pageswithconditions(&amp;#039;[[Category:Monsters]] [[Category:Discontinued content]]&amp;#039;, true) )&lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>