Module:Subpages 3

Revision as of 00:39, 10 August 2014 by Labster (talk | contribs)

Documentation for this module may be created at Module:Subpages 3/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 crowners = {
	["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 crownername = {
	["trope"] = "By Medium",
	["work"] = "Crowners",
	["creator"] = "Crowners"
}

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

    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 subpage_list = split(allsptxt, "|")
    
    local tree = build_tree(subpage_list)

    -- 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] }, page, 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] }, page, 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(arr) 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] }, page, 2 )
            if text ~= '' then
                table.insert(otherout, text)
            end
        end
    end


    local jsdata = '<div id="tm-data" style="display:none" '
        .. 'data-toplevelpage="' .. page .. '" '
        .. 'data-wanted="'       .. table.concat( missingout, "\t" ) .. '" '
        .. '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/' .. page .. '/|<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 build_tree ( subpage_list )
    local path_tree = { }
    
    for _, path in ipairs(subpage_list) do
        local list = split('/', path)
        local lastdir = path_tree
        
        for i, dir in ipairs(list) do
            if i ~= 1 then
                lastdir[dir] = { }
                lastdir = lastdir[dir]
            end
        end
    end
    return path_tree
end

function build_list ( tree, prefix, level )
    prefix = prefix or ''
    level  = level  or 1
    
    local libase = mw.ustring.rep('*', level)
    
    local ul = ''
    for page, branch in pairs(tree) do
        local li = libase
        
        if level <= 2 then
            li = libase .. " [["..prefix..page'|<span class="tm-'..page..'">'..page..']]\n'
--        elseif sp.special[prefix..page] then
--            li = libase ..' <strong>'..page..'</strong>\n'
        else
            li = libase ..' [['..prefix..page..'|'..page..']]\n'
        end
--        elseif sp.pathexists[prefix..page] then
--            li = libase ..' [['..prefix..page..'|'..page..']]\n'
--        else
--            li = libase ..' <strong>'..page..'</strong>\n'
        
        if next(branch) then
            local nextprefix = (prefix..page..'/')
            li = li .. build_list(branch, nextprefix, level+1)
        end
        ul = ul .. li
    end
    return 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

return sp