Module:Subpages 2
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
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 = { '* [[' .. page .. '|<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