Module:Motd

From Thetacola Wiki
Revision as of 20:23, 10 May 2018 by en>Anomalocaris (<tt> → <samp>)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Usage

{{#invoke:Motd|read|archive}}

archives are pages like Wikipedia:Motto_of_the_day/Schedule/Archive_2012. (2012 to 2015)

{{#invoke:Motd|read11|archive}}

archives are pages like Wikipedia:Motto_of_the_day/Schedule/Archive_2009. (up to 2011)

The read routine produces an output that has been manually cut-and-pasted into Module:Motd/data/2012 etc., and in some cases further modified. Ideally, each year should have one motto per day, possibly appropriate to that day. The read function produces the data to paste and the main function calls on this data for its output.

{{#invoke:Motd|main|day = day|year = year}}

Picks a motto. Defaults to 2012 for year, current day for day. Years 2006 to 2015 exist, but 2006, 2014, 2015 themselves don't have a full set of days. Haven't checked the others to be sure either.



local p = {}

function leapyear(year)
	local rem = year - 4 * math.floor(year/4)
	local leapyear
	if (rem>0.01) then
		leapyear = 0
	else
		leapyear = 1 -- i.e. add a day to dates beyond February 28
	end
    return leapyear
end
	

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

function p.main(frame, rnd)
	local parent=frame.getParent(frame) or {}
	local yearparameter = (parent and parent.args.year) or frame.args.year
	local ydayparameter = (parent and parent.args.day) or frame.args.day
	local yday = ydayparameter
	if yday then
		yday = tonumber(yday) -- keep nil as nil, but tonumber otherwise; may be nil *now*.
	end
	local osdate = os.date("!*t", nil)
	math.randomseed(tonumber(osdate.sec) + 60 * tonumber(osdate.min) + 3600 * tonumber(osdate.hour) + 24 * 3600 * tonumber(osdate.yday)) -- random wasn't resetting, try this
	if rnd then
		yday = yday or math.random(366)
	else 
		yday = yday or osdate.yday
	end
	yday = tonumber(yday) or 1 -- setting to number.  Just in case, setting to 1
	local year
	if rnd then
		year = yearparameter or math.random(2006, 2015)
	else
		year = yearparameter or osdate.year
	end
	local flag, mottos = pcall(mw.loadData,"Module:Motd/data/" .. tostring(year))
	while ((flag == false) and (year > 2005)) do
		year = year - 1 -- look the year before for mottos
	    flag, mottos = pcall(mw.loadData,"Module:Motd/data/" .. tostring(year))
	    if ydayparameter and mottos then
	        if not mottos [yday+leapyear(year)] then
	    		flag = false -- if a specific day is required by parameter, throw out a year without this day
	        end
    	end
	end
	local motto
	local k = 0
	repeat
		k = k + 1
		motto = mottos[yday + leapyear(year)] -- if no motto for this day, try another day
		yday = math.random(366)
	until ((motto) or (k > 100))
	return frame:preprocess(motto or "No matter where you go, there you are")
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*%*?<samp>%[%[Wikipedia:Motto of the day/(.-)%]%]%s*</samp>%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