Module:Subpages 2

Everything About Fiction You Never Wanted to Know.

Documentation for this module may be created at Module:Subpages 2/doc

local sp = {}

local pageorder = {
    ["trope"] = {
    	"Analysis", "Haiku", "Headscratchers", "Image Links", "Laconic", "Playing With",
    	"Quotes", "Useful Notes"
    },
    ["work"] = {
    	"Analysis", "Characters", "Laconic", "Recap", "Trivia", "Setting", "YMMV",
    	"Fridge", "Fanfic Recs", "Haiku", "Headscratchers", "Ho Yay", "Image Links",
    	"Memes", "Radar", "Quotes", "Reviews", "Useful Notes", "WMG"
    },
    ["creator"] = {"YMMV", "Quotes", "Fanfic Recs", "Analysis", "Trivia", "WMG", "Image Links", "Haiku", "Laconic"}
}
local otherpages = {
	["trope"] = { "Animation", "Animated Films", "Anime", "Anime and Manga", "Board Games", "Comics", "Comic Books",
		"Fan Works", "Fanfiction", "Film", "Literature", "Live Action Television", "Live Action TV", "Machinima",
		"Manga", "Manga and Anime", "Music", "Musicians",
		"New Media", "Professional Wrestling", "Puppet Shows", "Radio", "Tabletop Games", "Television", "TV",
		"Theatre", "Theater", "Toys", 
		"Webcomics", "Video Games", "Visual Art", "Visual Novels",
		"Web Original", "Web Animation", "Web Comics", "Websites",
		"Western Animation", "Wikis", "Wrestling", "Other", "Real Life" },
	["work"] = { "Awesome", "Funny", "Heartwarming", "Nightmare Fuel", "Tear Jerker" },
	["creator"] = { "Awesome", "Funny", "Heartwarming", "Nightmare Fuel", "Tear Jerker" }
}
local otherpagename = {
	["trope"] = "By Medium",
	["work"] = "Crowners",
	["creator"] = "Crowners"
}

local subpagelist = { }
for tmpl, _ in pairs(pageorder) do
	subpagelist[tmpl] = { }
	for _, pg in pairs(pageorder[tmpl])  do subpagelist[tmpl][pg] = true end
	for _, pg in pairs(otherpages[tmpl]) do subpagelist[tmpl][pg] = true end
end

function sp.subpages( frame )
    local page = frame.args[1] or frame:callParserFunction('TOPLEVELPAGE')
    local template = frame.args[2] or "work"
    local wppage = frame.args[3] or page
    if wppage == "" then wppage = page end

    local mainpage = page;
    if template == "index" then
		template = "trope"
		mainpage = ":" .. page
		page = page:gsub("Category:", "", 1)
	end

    if pageorder[template] == nil then return "Module error: invalid template argument" end
    local pagelenoffset = string.len(page) + 2

    local allsptxt = frame:callParserFunction('SUBPAGES', { page, sep = "|" })
    local allsp = split(allsptxt, "|")

    local foundpages = { }
    for _, cat in ipairs(pageorder[template]) do foundpages[cat] = {} end
    for _, cat in ipairs(otherpages[template]) do foundpages[cat] = {} end
    foundpages["allother"] = {}

	categorytmp = { }

    for _, spfull in ipairs(allsp) do
        spx = string.sub(spfull, pagelenoffset)
        pageparts = split(spx, "/", 1)
        if pageparts[2] == nil then pageparts[2] = '' end

        if subpagelist[template][pageparts[1]] then
            table.insert(foundpages[pageparts[1]], pageparts[2])
        else
            table.insert(foundpages["allother"], spx)
        end
    end

    -- initialize result with Main link
    local linkout = { '* [[' .. mainpage .. '|<span id="tm-main"></span>Main]]\n' }
	local wantedpages = { }

    for _, cat in ipairs(pageorder[template]) do
        if next(foundpages[cat]) == nil then
            table.insert(wantedpages, cat)
        else
            table.insert( linkout, linkup( page, cat ))
            for _, ssp in ipairs(foundpages[cat]) do
                if ssp ~= "" then
                    table.insert( linkout, "*" .. linkup( page, cat .. '/' .. ssp ))
                end
            end
        end
    end
    local moments = 0
    for _, cat in ipairs(otherpages[template]) do
        if next(foundpages[cat]) ~= nil then
            moments = 1
        elseif template == "work" then
        	 table.insert(wantedpages, cat)
        end
    end
    if moments > 0 then
        table.insert(linkout, '* [[#top|<span id="tm-' .. otherpagename[template]
        	.. '"></span>'..otherpagename[template]..']]\n')
        for _,cat in ipairs(otherpages[template]) do
            for _, ssp in ipairs(foundpages[cat]) do
                if ssp == '' then
                    table.insert( linkout, "*" .. linkup( page, cat ))
                else
                    table.insert( linkout, "*" .. linkup( page, cat .. '/' .. ssp ))
                end
            end
        end
    end
    table.insert(linkout, "* [[wikipedia:" .. wppage .. '|<span id="tm-Wikipedia"></span>Wikipedia]]\n')
    table.insert(linkout, '* [[Special:PrefixIndex/' .. page .. '/|<span id="tm-Allothers"></span>All Subpages]]\n')
    for _, cat in ipairs(foundpages["allother"]) do
        table.insert(linkout, "*" .. linkup( page, cat ))
    end

local jsdata = '<div id="tm-data" style="display:none" '
	.. 'data-toplevelpage="' .. page .. '" '
	.. 'data-wanted="'       .. table.concat( wantedpages, "&#9;" ) .. '" '
	.. 'data-templatetype="' .. template .. '" '
	.. '></div>'

    return table.concat(linkout)
        .. '* <strong><span id="tm-New"></span>Create New</strong>'
        .. '<div id="tm-Wanted" style="display:none">' .. table.concat( wantedpages, "\t" ) .. '</div>'
        .. '<ul id="tm-wantedpages"></ul>\n'
        .. '<div style="display:none"><span id="tm-toplevelpage">/wiki/'..page
        .. '</span><span id="tm-templatetype">'.. template.. '</span></div>'..jsdata..'\n'
end

function linkup( pagename, subpage )
    return '* [[' .. pagename .. "/" .. subpage .. '|<span id="tm-' .. subpage .. '"></span>' .. subpage .."]]\n"
end

function split(str, sSeparator, nMax, bRegexp)
    assert(sSeparator ~= '')
    assert(nMax == nil or nMax >= 1)

    local aRecord = {}

    if string.len(str) > 0 then
        local bPlain = not bRegexp
        nMax = nMax or -1

        local nField=1 nStart=1
        local nFirst,nLast = string.find(str, sSeparator, nStart, bPlain)
        while nFirst and nMax ~= 0 do
            aRecord[nField] = string.sub(str, nStart, nFirst-1)
            nField = nField+1
            nStart = nLast+1
            nFirst,nLast = string.find(str, sSeparator, nStart, bPlain)
            nMax = nMax-1
        end
        aRecord[nField] = string.sub(str, nStart)
    end

    return aRecord
end

return sp