Module:User:Theknightwho/discussion

Hello, you have come here looking for the meaning of the word Module:User:Theknightwho/discussion. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:User:Theknightwho/discussion, but we will also tell you about its etymology, its characteristics and you will know how to say Module:User:Theknightwho/discussion in singular and plural. Everything you need to know about the word Module:User:Theknightwho/discussion you have here. The definition of the word Module:User:Theknightwho/discussion will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:User:Theknightwho/discussion, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

This is a private module sandbox of Theknightwho, for their own experimentation. Items in this module may be added and removed at Theknightwho's discretion; do not rely on this module's stability.


local export = {}

local function heading(level, text, pagename, section)
	return tostring(mw.html.create("h" .. level)
		:attr("data-source", pagename)
		:attr("data-section", section)
		:wikitext(text)
	)
end

--[==[
Headings must follow \n, \r or the page start, with no intervening characters (including whitespace). They must be followed by \n, \r or the page end, with any spaces and tabs after the final equals sign being ignored. The heading must have a length of at least 1 character (which can be whitespace), and cannot contain \n or \r.
The max heading level is 6. Any that try to go beyond this are still level 6, with the extra equals signs being incorporated into the start and end of the heading text.
The function below first removes any HTML comments, then iterates over all the section headings on a page. It accurately handles the following horrible inputs:
	"===abc==" (level 2 heading "=abc");
	"= =" (level 1 heading with just a space);
	"======" (level 2 heading "==");
	"=======abc=======" (level 6 heading "=abc=");
	"==" (plaintext "==", so no match).
]==]
local function replace_headings(title)
	local section = 0
	return (title:getContent()
		:gsub("<!%-%-.-%-%->", "")
		:gsub("<!%-%-.*", "")
		:gsub("%f(=+)(+)%1*%f", function(m1, m2)
			section = section + 1
			if #m1 <= 6 then
				return heading(#m1, m2, title.fullText, section)
			end
			local excess = ("="):rep(#m1 - 6)
			return heading(6, excess .. m2 .. excess, title.fullText, section)
		end))
end

function export.recent_months(frame)
	local title = mw.title.getCurrentTitle()
	
	local date = os.date("*t")
	date.month = date.month - 1
	if date.month == 0 then
		date.year = date.year - 1
		date.month = 12
	end
	local last_month = os.time{year = date.year, month = date.month, day = 1}
	
	local last_month_page = title:subPageTitle(os.date("%Y/%B", last_month))
	local this_month_page = title:subPageTitle(os.date("%Y/%B"))
	
	local content = tostring(mw.html.create("div")
		:tag("h1")
			:wikitext("]")
			:done()
		:wikitext(replace_headings(last_month_page))
		:tag("h1")
			:wikitext("]")
			:done()
		:wikitext(replace_headings(this_month_page)))
	
	return frame:preprocess(content)
end

function export.test(frame)
	return mw.getCurrentFrame():preprocess(replace_headings(mw.title.new(frame.args)))
end

return export