Module:Calendar TOC

local p = {}

local lang -- Lazy initialize
local function formatDate(fmt, d)
	lang = lang or mw.language.getContentLanguage()
	local success, newDate = pcall(lang.formatDate, lang, fmt, d)
	if success then
		return newDate
	else
		error(string.format(
			"invalid date '%s' passed to getDate",
			tostring(date)
		))
	end
end
	
local function caltoc(days, unk, footer, month, year)
	local weekdays = {'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'}
	local j = tonumber(formatDate('N','1 ' .. month .. ' ' .. year))
	local N = tonumber(formatDate('t','1 ' .. month .. ' ' .. year))
	local res = {}

	table.insert(res, '__NOTOC__<table role="navigation" id="toc" class="calendar-toc wikitable toc" style="text-align:center">')
	table.insert(res, '<tr><th colspan=7 style="background:inherit; color:inherit;"><span style="font-weight:bold">' .. month .. ' ' .. year .. '</span></th></tr>')
    table.insert(res, '<tr><th scope="col">' .. table.concat(weekdays, '</th><th scope="col">') .. '</th></tr>')

    local d = 1-j
    local skip = false
    while d <= N do
    	table.insert(res, '<tr>')
    	for i=1,7 do
    		d = d + 1
    		if d > 0 and d <= N then
    			local f = days[tostring(d)]
    			if f and f == 'df' then
    				table.insert(res, '<td>[[#' .. d .. ' ' .. month .. '|' .. d .. ']]</td>')
    			elseif f and f == 'mf' then
    				table.insert(res, '<td>[[#' .. month .. ' ' .. d .. '|' .. d .. ']]</td>')
    			else
    				table.insert(res, '<td>' .. d .. '</td>')
    			end
    			skip = false
    		elseif (skip == false) then
    			local cs = (d <= 0) and (1 - d) or (8 - i)
    			local v = ''
    			if d > N and cs > 2 and unk then
    				v = '[[#' .. unk .. '|' .. unk .. ']]'
    				unk = nil
    			end
    			if cs < 7 or v ~= '' then
	    			table.insert(res, '<td' .. (cs > 1 and ' colspan=' .. cs or '') .. '>' .. v .. '</td>')
	    		end
    			skip = true
    		end
    	end
    	table.insert(res, '</tr>')
    end
    if unk ~= nil then
		table.insert(res, '<tr><td colspan=7>[[#' .. unk .. '|' .. unk .. ']]</td></tr>')
	end
    if #footer > 0 then
    	table.insert(res, '<tr>')
    	if #footer > 1 then
    		table.insert(res, '<td colspan=7 style="padding: 0.2em;">')
	    	for k,v in ipairs(footer) do
				table.insert(res, '* [[#' .. v .. '|' .. v .. ']]')
			end
			table.insert(res, '</td>')
		else
			table.insert(res, '<td colspan=7>[[#' .. table.concat(footer,'') .. '|' .. table.concat(footer,'') .. ']]</td>')
		end
		table.insert(res, '</tr>')
	end
	table.insert(res, '</table>')
	
	return table.concat(res, '\n')
end

local function getYear(s,y)
	if y and mw.ustring.match(y, '^%d+$') then
		return y
	end
	y = mw.ustring.gsub(s, '^.-(%d+).-$', '%1')
	return y
end

local function getMonth(s,m)
	local mnames = {
		['January']=1,
		['February']=2, 
		['March']=3,
		['April']=4,
		['May']=5,
		['June']=6,
		['July']=7,
		['August']=8,
		['September']=9,
		['October']=10,
		['November']=11,
		['December']=12
	}
	if m and mnames[m] then
		return m
	end
	
	for k,n in pairs(mnames) do
		if mw.ustring.match(s or '', k) then
			return k
		end
	end
	
	return ''
end

function p.main(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	local current_title = mw.title.getCurrentTitle()
	local content = current_title:getContent()
	
	if args['_demo'] or pargs['_demo'] then
		content = args['_demo'] or pargs['_demo'] or ''
	end
	
	if not content then
		error "The current page has no content"
	end
	
	-- Remove comments
	content = mw.ustring.gsub(content, '<!--.-?-->', '')

	-- Get the month and year	
	local pagename = current_title.text
	local month = getMonth(pagename, args['month'] or pargs['month'] or '')
	local year = getYear(pagename, args['year'] or pargs['year'] or '')

	-- Get list of valid footer links	
	local extra = args['extra'] or pargs['extra'] or ''
	local footerlinks = {}
	if extra ~= '' then
		footerlinks = mw.text.split(extra, '%s*=%s*')
	else
		footerlinks = {"See also", "References", "Notes", "Further reading", "External links"}
	end
	local validfooter = {}
	for k,v in ipairs(footerlinks) do
		validfooter[v] = 1
	end
	
	-- Get all the level two headings for days of the month
	local days = {}
	local founddays = {}
	local footer = {}
	local unknown = nil
	for v in mw.ustring.gmatch(content, "%f[^\n]==%s*([^\r\n]-)%s*==%f[^=]") do
		v = mw.ustring.gsub(v,'^[=%s]*(.-)[%s=]*', '%1')
		local df = mw.ustring.gsub(v,'^(%d+[%-–%d]*)%s*' .. month .. '$', '%1')
		local mf = mw.ustring.gsub(v,'^' .. month .. '%s*(%d+[%-–%d]*)$', '%1')
		if tonumber(df) then
			days[df] = 'df'
			table.insert(founddays, df)
		elseif tonumber(mf) then
			days[df] = 'mf'
			table.insert(founddays, mf)
		elseif v == "Unknown date" then
			unknown = "Unknown date"
		elseif validfooter[v] then
			table.insert(footer, v)
		end
	end

	return caltoc(days, unknown, footer, month, year)
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.