Module:Subpages 3: Difference between revisions

Undo revision 2020934 by Robkelk (talk)
No edit summary
(Undo revision 2020934 by Robkelk (talk))
Tag: Undo
 
(27 intermediate revisions by 2 users not shown)
Line 2:
 
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", "Source", "Useful Notes", "WMG"
},
["creator"] = {"YMMV", "Quotes", "Fanfic Recs", "Analysis", "Trivia", "WMG", "Image Links", "Haiku", "Laconic"}
}
local crowners = {
["trope"] = { "Animation", "Animated Films", "Anime", "Anime and Manga", "Board Games", "Comics", "Comic Books",
"Fan Works", "FanfictionFanfic", "FilmFanfiction", "LiteratureFan Fiction", "Live Action TelevisionFilm", "Live Action TVFolklore", "MachinimaLiterature",
"MangaLive Action Television", "MangaLive andAction Anime", "MusicTV", "MusiciansMachinima",
"New MediaManga", "ProfessionalManga Wrestling",and "Puppet ShowsAnime", "RadioMusic", "Tabletop GamesMusicians", "Television",New "TVMedia",
"Opera", "Professional Wrestling", "Puppet Shows", "Radio", "Tabletop Games", "Tabletop RPGs",
"Television", "TV",
"Theatre", "Theater", "Toys",
"Webcomics", "Video Games", "Visual Art", "Visual Novels",
Line 30 ⟶ 32:
["creator"] = "Crowners"
}
 
-- localize functions
local insert = table.insert
local concat = table.concat
local find = string.find
local len = string.len
local sub = string.sub
local rep = string.rep
local listlevel = { '*', '**', '***', '****', '*****' }
 
function sp.menu ( frame )
local page = frame.args[1] or frame:callParserFunction('TOPLEVELPAGE')
local template = frame.args[2] or "work"
local wppage = frame.args[3] or page
local haswp = true --(frame.args[4] == '')
if wppage == "" then wppage = page end
 
-- create variant top level page variables
local mainpage = page;
if template == "index" then
template = "trope"
crowners["trope"] = {}
mainpage = ":" .. page
page = page:gsub("Category:", "", 1)
Line 47 ⟶ 59:
local pageslash = page..'/'
 
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 subpage_list = split(allsptxt, "|")
 
local tree = build_tree(page, subpage_list)
-- local testt = { }
-- for k, _ in pairs(tree) do
-- table.insert(testt, k)
-- end
-- if true then return table.concat(testt, '||') end
 
-- initialize result with Main link
local linkout = { '* [[' .. mainpage .. '|<span id="tm-main"></span>Main]]\n' }
local crownerout = { }
local otherout = { }
local missingout = { }
 
for _, subpage in ipairs(pageorder[template]) do
text = build_list( { [subpage] = tree[subpage] }, pageslash, 1 )
if text ~= '' then
table. insert(linkout, text)
else
table. insert(missingout, subpage)
end
tree[subpage] = nil
end
for _, subpage in ipairs(crowners[template]) do
text = build_list( { [subpage] = tree[subpage] }, pageslash, 2 )
if text ~= '' then
table. insert(crownerout, text)
else
table. insert(missingout, subpage)
end
tree[subpage] = nil
end
--deal with the leftover subpages
if next(tree) then
local ordered_keys = {}
for k in pairs(tree) do
table. insert(ordered_keys, k)
end
table.sort(ordered_keys)
 
for i = 1, #ordered_keys do
local subpage = ordered_keys[i]
text = build_list( { [subpage] = tree[subpage] }, pageslash, 2 )
if text ~= '' then
table. insert(otherout, text)
end
end
end
end
 
 
local jsdata = '<div id="tm-data" style="display:none" '
.. 'data-toplevelpage="' .. page .. '" '
.. 'data-wanted="' .. table.concat( missingout, "\t&#9;" ) .. '" '
.. 'data-templatetype="' .. template .. '" '
.. '></div>'
local crowner_link = next(crownerout)
and '* [[#top|<span id="tm-' .. crownername[template].. '"></span>'..crownername[template]..']]\n'
or ''
local wikipedia_link = haswp
and "* [[wikipedia:" .. wppage .. '|<span id="tm-Wikipedia"></span>Wikipedia]]\n'
or ''
local all_sp_link = '* [[Special:PrefixIndex/' .. pageslash .. '/|<span id="tm-Allothers"></span>All Subpages]]\n'
 
 
return table.concat(linkout)
.. crowner_link
.. table.concat(crownerout)
.. wikipedia_link
.. all_sp_link
.. table.concat(otherout)
.. '* <strong><span id="tm-New"></span>Create New</strong><ul id="tm-wantedpages"></ul>\n'
.. jsdata
end
 
function sp.tree ( frame )
local page = frame.args[1] or frame:callParserFunction('TOPLEVELPAGE')
 
local allsptxt = frame:callParserFunction('SUBPAGES', { page, sep = "|" })
function build_tree ( subpage_list )
local path_treesubpage_list = {split(allsptxt, }"|")
 
local tree = for _build_tree(page, path in ipairs(subpage_list) do
 
local list = split(path, '/')
if page:match("^Category:") then page = ":"..page end
local lastdir = path_tree
return "; [["..page.."]]\n" .. build_list( tree, page..'/', 1 )
end
for i, dir in ipairs(list) do
 
if i ~= 1 then
 
lastdir[dir] = { }
function build_tree ( page, subpage_list )
lastdir = lastdir[dir]
local path_tree = { }
end
local pagelenoffset = len(page) + 2
end
 
end
for _, fullpath in ipairs(subpage_list) do
return path_tree
local path = sub(fullpath, pagelenoffset)
local list = split(path, '/')
local lastdir = path_tree
for i, dir in ipairs(list) do
if lastdir[dir] == nil then lastdir[dir] = { } end
lastdir = lastdir[dir]
end
end
return path_tree
end
 
function build_list ( tree, prefix, level )
local libase = listlevel[level] or rep('*', level)
prefix = prefix or ''
level = level or 1
local ul = {}
 
local libase = mw.ustring.rep('*', level)
local ordered_sp = {}
for page in pairs(tree) do
local ul = ''
insert(ordered_sp, page)
for page, branch in pairs(tree) do
end
local li = libase
table.sort(ordered_sp)
 
if level <= 2 then
for i = 1, #ordered_sp do
li = libase .. " [["..prefix..page..'|<span class="tm-'..page..'">'..page..']]\n'
local page = ordered_sp[i]
-- elseif sp.special[prefix..page] then
local branch = tree[page]
-- li = libase ..' <strong>'..page..'</strong>\n'
local li
else
li = libase ..' [['..prefix..page..'|'..page..']]\n'
if level <= 2 then
end
li = libase .. " [["..prefix..page..'|<span id="tm-'..page..'"></span>'..page..']]\n'
-- elseif sp.pathexists[prefix..page] then
else
-- li = libase ..' [['..prefix..page..'|'..page..']]\n'
li = libase ..' [['..prefix..page..'|'..page..']]\n'
-- else
end
-- li = libase ..' <strong>'..page..'</strong>\n'
insert(ul, li)
 
if next(branch) then
if next(branch) then
local nextprefix = (prefix..page..'/')
local nextprefix = (prefix..page..'/')
li = li .. build_list(branch, nextprefix, level+1)
insert(ul, build_list(branch, nextprefix, level+1))
end
end
ul = ul .. li
end
return concat(ul)
end
 
function split(str, sSeparator, nMax, bRegexp)
assert(sSeparator ~= '')
assert(nMax == nil or nMax >= 1)
 
local aRecord = {}
 
if mw.ustring.len(str) > 0 then
local bPlain = not bRegexp
nMax = nMax or -1
 
local nField=1 nStart=1
local nFirst,nLast = mw.ustring.find(str, sSeparator, nStart, bPlain)
while nFirst and nMax ~= 0 do
aRecord[nField] = mw.ustring.sub(str, nStart, nFirst-1)
nField = nField+1
nStart = nLast+1
nFirst,nLast = mw.ustring.find(str, sSeparator, nStart, bPlain)
nMax = nMax-1
end
aRecord[nField] = mw.ustring.sub(str, nStart)
end
 
return aRecord
end