Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Aside

From Wikipedia, the free encyclopedia

-- This module is an experiment in an altered discussion dynamic for Wikipedia forums.
-- It presents a brief digest of the referenced discussion on a user's talk subpage.
-- The full conversation remains available via V-D-E buttons (V = view the talk subpage, 
-- D = file a comment to the user's MAIN talk page like if there's something you want him to 'admin' or to request an invite as applicable
-- E = edit the talk subpage
-- The digest should present usernames and the first words of each comment, for the past N comments
-- One intention is to allow off-topic conversations to be less obtrusive on the parent thread.
-- Another is that, potentially, some of these may be invite-only conversations in some forum where that is deemed appropriate.
-- Discussions of this type might be indexed in multiple specialized forums.
-- Part of the experiment is that if users feel *invited* to a discussion, it gives editors a chance to express mutual esteem,
-- as a counterbalance against the usual where they only really talk personally when in conflict.  Not sure this will really happen...

-- To try to keep things more accessible, I think the Lua module should only do the text processing to create the talk page extract
-- This then should get wrapped up in V-D-E boxes and cute formatting by an enveloping template.
-- There are some things I can't be perfect about - if you reply in the middle of someone's comment you'll get their beginning attributed to you.

local p = {}

function p.main(frame,header)
    local parent=frame.getParent(frame) or {}
    local currentpage,top
    user = frame.args.user or parent.args.user
    page = frame.args.page or parent.args.page
    local basepage, section = mw.ustring.match(page, "(.-)#(.*)")
    if section then page = basepage end
    comments = frame.args.comments or parent.args.comments
    length = frame.args.length or parent.args.length
    order = frame.args.order or parent.args.order or "new"
    if (order == "") then order = "new" end
    comments = comments or 6
    comments = tonumber(comments)
    if (comments == 0 or not(comments)) then comments = 6 end
    length = length or 80
    length = tonumber(length)
    local pagepointer=mw.title.new(page)
    if not(pagepointer) then return "''[[Module:Aside]]: The page " .. '"' .. page .. '"' .. " could not be accessed.''" end
    local text=pagepointer.getContent(pagepointer)
    
    if not(text) then return "''[[Module:Aside]]: The page " .. '"' .. page .. '"' .. " could not be read. Make sure it exists and is not empty.''" end

    if section then
    	local textbits = mw.text.split(text, section, true)
    	if #textbits > 1 then
    		local i = 2
    		repeat
    		    if (mw.ustring.match(textbits[i-1], "==*%s*$")) and (mw.ustring.match(textbits[i], "^%s*==*")) then
    			    text = mw.ustring.gsub(table.concat(textbits, "", i), "%s*==*", "", 1)
    			    text = mw.ustring.gsub(text, "\n%s*==*.*", "", 1)
    			    break
    		    end
    		    i = i + 1
	        until (i > #textbits)
	    else
	    	return "''[[Module:Aside]]: The section " .. '"' .. section .. '"' .. " could not be found in " .. '"' .. page .. '"'
	    end
    end
    		
    local output=mw.ustring.match(text, "<!%-%-+banner%-%-+>(.-)<!%-%-+/banner%-%-+>") or ""
    output = output .. "<br />"
    text = mw.ustring.gsub(text, "<!%-%-+banner%-%-+>(.-)<!%-%-+/banner%-%-+>%s*", "", 1)
    text = mw.ustring.gsub(text, "==+([^\n=]*)=+=%s*", "")
    text = mw.ustring.gsub(text, "<!%-%-+.-%-%-+>", "")
    
    local signaturematch = "%[%[(.-)%]%]%s*%(%[%[(.-)%]%]%)%s*(%d+):(%d+)%s*,%s*(%d+)%s*(.-)%s*(%d+)%s*%(%a%a%a%)%s*"
    local monthlookup = {["January"] = "01", ["February"] = "02", ["March"] = "03", ["April"] = "04", ["May"] = "05", ["June"] = "06", ["July"] = "07", ["August"] = "08", ["September"] = "09", ["October"] = "10", ["November"] = "11", ["December"] = "12"}
    local prowl = mw.ustring.gmatch(text,":*%s*(.-)"..signaturematch)
    local archive = {}
    local keys = {}
    repeat
        local comment, commentuser, commenttalk, commenthour, commentminute, commentday, commentmonth, commentyear = prowl()
        if not (comment) then break end
        comment = mw.ustring.gsub(comment, "$[:%s\n]*", "", 1)
        comment = mw.ustring.gsub(comment, "\n:*", "  ")
        comment = mw.ustring.gsub(comment, "<br ?\\?>", "  ")
        local commentmonthno = monthlookup[commentmonth] or "00"
        if mw.ustring.len(commentday) == 1 then commentday = "0" .. commentday end
        local key = commentyear .. commentmonthno .. commentday .. commenthour .. commentminute
        commentuser = mw.ustring.match(commentuser, "(.-)|") or commentuser
        commentuser = mw.ustring.match(commentuser, "User:(.*)") or commentuser
        commenttalk = mw.ustring.match(commenttalk, "(.-)|") or commenttalk
        commenttalk = mw.ustring.match(commenttalk, "(.-)#") or commenttalk
     
        commentdate = commentmonthno .. "/" .. commentday .. " " .. commenthour .. ":" .. commentminute
        archive[key] = {comment, commentuser, commenttalk, commentdate}
        table.insert(keys, key)
    until false

    if (order == "new") then table.sort(keys) end
    
  
    local lastkey = #keys
    local firstkey = math.max(1, lastkey - comments + 1)
    for i = firstkey, lastkey do
    	local key = keys[i]
    	local comment, commentuser, commenttalk, commentdate = archive[key][1], archive[key][2], archive[key][3], archive[key][4]
    	local longuser = mw.ustring.len(commentuser)
    	if (longuser>12) then commentuser = mw.ustring.sub(commentuser, 1, 5) .. ".." .. mw.ustring.sub(commentuser, longuser - 4, longuser) end
        output=output.. commentdate .." [["..commenttalk.."|"..commentuser.."]]: "..(mw.ustring.sub(comment, 1, length) or "").."<br />"
    end
    return frame.preprocess(frame,output)
end

return p