Tropedia

  • Before making a single edit, Tropedia EXPECTS our site policy and manual of style to be followed. Failure to do so may result in deletion of contributions and blocks of users who refuse to learn to do so. Our policies can be reviewed here.
  • All images MUST now have proper attribution, those who neglect to assign at least the "fair use" licensing to an image may have it deleted. All new pages should use the preloadable templates feature on the edit page to add the appropriate basic page markup. Pages that don't do this will be subject to deletion, with or without explanation.
  • All new trope pages will be made with the "Trope Workshop" found on the "Troper Tools" menu and worked on until they have at least three examples. The Trope workshop specific templates can then be removed and it will be regarded as a regular trope page after being moved to the Main namespace. THIS SHOULD BE WORKING NOW, REPORT ANY ISSUES TO Janna2000, SelfCloak or RRabbit42. DON'T MAKE PAGES MANUALLY UNLESS A TEMPLATE IS BROKEN, AND REPORT IT THAT IS THE CASE. PAGES WILL BE DELETED OTHERWISE IF THEY ARE MISSING BASIC MARKUP.

READ MORE

Tropedia
Advertisement

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

-- subpages = require('Module:Subpages).subpages
-- for page in subpages('Page') do ... end

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
        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

    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>\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
Advertisement