Jump to content

Module:Motd

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Wnt (talk | contribs) at 20:21, 18 May 2016 (Well, that's nil too. Forget it, using math.floor.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

--This module aims to a) extract motds from various sources and return a data file to be copied
                   -- b) use that data file to return a motd chosen from within it
--MOTD is [[WP:Motto of the day]], not message!
--Note: it's been a while since I last touched Lua, so I may have a slow start

local p = {}

function p.random(frame)
	return p.main(frame, true)
end

function p.main(frame, rnd)
	local parent=frame.getParent(frame) or {}
	local year = (parent and parent.args.year) or frame.args.year or "2012"
	 -- year *should* default to present, but there are no new mottos
	local yday = (parent and parent.args.day) or frame.args.day
	local throwaway,leapyear = year - 4 * math.floor(year/4)
	if ((yday > 31 + 28) and (leapyear>0.01)) then
		yday = yday + 1 -- To get the same day on different years, leave a hole for Feb. 29 on non-leap years
	end
	mottos = mw.loadData("Module:Motd/data/" .. year)
	yday = yday or os.date("!*t", nil).yday -- should be day of year, we'll see...
	yday = tonumber(yday) -- if it was a parameter it came as a string.
	return frame:preprocess(mottos[yday])
end

function p.read(frame)
    local parent=frame.getParent(frame) or {}
    local currentpage, from, to
    ---- args in the #invoke itself trump args in the parent frame
    currentpage = (parent and parent.args.page) or frame.args.page
    from = (parent and parent.args.from) or frame.args.from or 0
    to = (parent and parent.args.to) or frame.args.to or 9999
    from, to = tonumber(from), tonumber(to) -- they get passed in as strings!
    -- from and to are kludges to get part of the data when I start getting too much expanded template errors (not needed!)
    -- I'm not sure getting the current page makes sense but I had the code handy so I'll leave it.
    local pagepointer
    if not(currentpage) then
        pagepointer=mw.title.getCurrentTitle()
        assert(pagepointer,"failed to access getCurrentTitle")
        currentpage=pagepointer.fullText
    else pagepointer=mw.title.new(currentpage)
        assert(pagepointer,"failed to access mw.title.new("..tostring(currentpage)..")")
    end
    ---- get the text of the currentpage
    local text=pagepointer.getContent(pagepointer)
    assert (text,"error: failed to get text from ".. currentpage)
    local linkmatch = "%[%[(.-)%]%]"
    local prowl=mw.ustring.gmatch(text,linkmatch)
    local archive={}
    local link=prowl()
    local count = 0
    while link do
    	if (count >= from) and (count <= to) then
    	    link = mw.ustring.gmatch(link,"(.-)%|")() or link
    	    flag, contents = pcall(frame.expandTemplate, frame, {title = link, args = nil})
            -- table.insert(archive,'[==[' .. link .. ']==],</nowiki><br><nowiki>')
            -- I don't think I actually need to include the link for this use
            table.insert(archive,'[==[' .. contents .. ']==],</nowiki><br><nowiki>')
        end
        count = count + 1
        link=prowl()
    end
    
    local output=""
    for i = 1, table.maxn(archive) do
        output=output..(archive[i] or "")
    end
    output = mw.ustring.gsub(output,",</nowiki><br><nowiki>$","</nowiki><br><nowiki>")
    output = "<nowiki>return {</nowiki><br><nowiki>"..output.."}</nowiki>"
    return frame.preprocess(frame,output)
end

function p.read11(frame) -- this is a copy of p.read being customized for 2010-2011
    local parent=frame.getParent(frame) or {}
    local currentpage, from, to
    ---- args in the #invoke itself trump args in the parent frame
    currentpage = (parent and parent.args.page) or frame.args.page
    from = (parent and parent.args.from) or frame.args.from or 1
    to = (parent and parent.args.to) or frame.args.to or 9999
    from, to = tonumber(from), tonumber(to) -- they get passed in as strings!
    -- from and to are kludges to get part of the data when I start getting too much expanded template errors
    -- I'm not sure getting the current page makes sense but I had the code handy so I'll leave it.
    local pagepointer
    if not(currentpage) then
        pagepointer=mw.title.getCurrentTitle()
        assert(pagepointer,"failed to access getCurrentTitle")
        currentpage=pagepointer.fullText
    else pagepointer=mw.title.new(currentpage)
        assert(pagepointer,"failed to access mw.title.new("..tostring(currentpage)..")")
    end
    ---- get the text of the currentpage
    local text=pagepointer.getContent(pagepointer)
    assert (text,"error: failed to get text from ".. currentpage)
    local linkmatch = "(.-)%s*%*?<tt>%[%[Wikipedia:Motto of the day/(.-)%]%]%s*</tt>%s*"
    local prowl=mw.ustring.gmatch(text,linkmatch)
    local archive={}
    local contents, link = prowl()
    local count = 0
    while link do
    	if (count >= from) and (count <= to) then
    		contents = mw.ustring.gsub(contents,"%s*<br />$","")
    	    link = mw.ustring.gmatch(link,"(.-)%|")() or link
            -- table.insert(archive,'[==[' .. link .. ']==],</nowiki><br><nowiki>')
            -- I don't think I actually need to include the link for this use
            table.insert(archive,'[==[' .. contents .. ']==],</nowiki><br><nowiki>')
        end
        count = count + 1
        contents, link=prowl()
    end
    if contents then
    	table.insert(archive,'[==[' .. contents .. ']==],</nowiki><br><nowiki>')
    end
    
    local output=""
    for i = 1, table.maxn(archive) do
        output=output..(archive[i] or "")
    end
    output = mw.ustring.gsub(output,",</nowiki><br><nowiki>$","</nowiki><br><nowiki>")
    output = "<nowiki>return {</nowiki><br><nowiki>"..output.."}</nowiki>"
    return frame.preprocess(frame,output)
end

function p.read06(frame) -- this is a copy of p.read to be run once to get the 2006 data
    local parent=frame.getParent(frame) or {}
    local currentpage, from, to
    ---- args in the #invoke itself trump args in the parent frame
    currentpage = (parent and parent.args.page) or frame.args.page
    from = (parent and parent.args.from) or frame.args.from or 1
    to = (parent and parent.args.to) or frame.args.to or 9999
    from, to = tonumber(from), tonumber(to) -- they get passed in as strings!
    -- from and to are kludges to get part of the data when I start getting too much expanded template errors
    -- I'm not sure getting the current page makes sense but I had the code handy so I'll leave it.
    local pagepointer
    if not(currentpage) then
        pagepointer=mw.title.getCurrentTitle()
        assert(pagepointer,"failed to access getCurrentTitle")
        currentpage=pagepointer.fullText
    else pagepointer=mw.title.new(currentpage)
        assert(pagepointer,"failed to access mw.title.new("..tostring(currentpage)..")")
    end
    ---- get the text of the currentpage
    local text=pagepointer.getContent(pagepointer)
    assert (text,"error: failed to get text from ".. currentpage)
    local linkmatch = "(.-)%s*%*?<tt>(.-)</tt>%s*"
    local prowl=mw.ustring.gmatch(text,linkmatch)
    local archive={}
    local contents, link = prowl()
    local count = 0
    while link do
    	if (count >= from) and (count <= to) then
    		contents = mw.ustring.gsub(contents,"%s*<br />$","")
    	    link = mw.ustring.gmatch(link,"(.-)%|")() or link
            -- table.insert(archive,'[==[' .. link .. ']==],</nowiki><br><nowiki>')
            -- I don't think I actually need to include the link for this use
            table.insert(archive,'[==[' .. contents .. ']==],</nowiki><br><nowiki>')
        end
        count = count + 1
        contents, link=prowl()
    end
    if contents then
    	table.insert(archive,'[==[' .. contents .. ']==],</nowiki><br><nowiki>')
    end
    
    local output=""
    for i = 1, table.maxn(archive) do
        output=output..(archive[i] or "")
    end
    output = mw.ustring.gsub(output,",</nowiki><br><nowiki>$","</nowiki><br><nowiki>")
    output = "<nowiki>return {</nowiki><br><nowiki>"..output.."}</nowiki>"
    return frame.preprocess(frame,output)
end


return p