请输入您要查询的百科知识:

 

词条 Module:Current events calendar/sandbox
释义 -- This module renders the calendar seen on Current events.--[[

Incoming expected variables:

frame.args.year = Integer value for year

frame.args.month = Integer value for month, 1 based.

--]]

local p = {}

local function makeWikilink(link, display)

if display then

return string.format('%s', link, display)

else

return string.format('%s', link)

end

end

function p.main(frame)

local argsDate = nil

if (frame and frame.args and frame.args.year and frame.args.month) then

-- If a date is passed in, assume that the display page is an Archive page.

-- If no date passed in, assume that the display page is the current Current Events page

argsDate = frame.args.year .. "-" .. frame.args.month .. "-01" -- Construct a date, YYY-M-DD format.

end

local dateStuff = p.getDateStuff(argsDate)

local dayStrings = p.makeDayStrings(dateStuff)

return p.export(dayStrings, dateStuff)

end

function p.getDateStuff(argsDate)

--[[

Note: This function takes advantage of the formatDate's second argument to

create data for the archival calendars. If the second arg (argsDate) is nil,

then formatDate assumes the current date/time.

--]]

-- Gets date data.

local dateStuff = {}

local lang = mw.language.getContentLanguage()

dateStuff.argsDate = argsDate

--Year

local year = lang:formatDate('Y', argsDate)

year = tonumber(year)

dateStuff.year = year

-- Month

local month = lang:formatDate('F', argsDate)

dateStuff.month = month

-- Month and year

local monthAndYear = lang:formatDate('F Y', argsDate)

local firstOfMonth = lang:formatDate('01-m-Y', argsDate)

dateStuff.monthAndYear = monthAndYear

-- Previous month and year

dateStuff.previousMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' -1 month')

-- Next month and year

dateStuff.nextMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' +1 month')

-- Day

local day = lang:formatDate('j', argsDate)

day = tonumber(day)

dateStuff.day = day

-- Days in month

local daysInMonth = lang:formatDate('j', firstOfMonth .. ' +1 month -1 day')

daysInMonth = tonumber(daysInMonth)

dateStuff.daysInMonth = daysInMonth

-- Weekday of the first day of the month

local firstWeekday = lang:formatDate('w', firstOfMonth) -- Sunday = 0, Saturday = 6

firstWeekday = tonumber(firstWeekday)

firstWeekday = firstWeekday + 1 -- Make compatible with Lua tables. Sunday = 1, Saturday = 7.

dateStuff.firstWeekday = firstWeekday

return dateStuff

end

function p.makeDayStrings(dateStuff)

local calStrings = {}

local currentDay = dateStuff.day

local isLinkworthy = p.isLinkworthy

local currentMonth = dateStuff.month

local currentYear = dateStuff.year

local makeDayLink = p.makeDayLink

for day = 1, dateStuff.daysInMonth do

if dateStuff.argsDate or isLinkworthy(day, currentDay) then

calStrings[#calStrings + 1] = makeDayLink(day, currentMonth, currentYear)

else

calStrings[#calStrings + 1] = tostring(day)

end

end

return calStrings

end

function p.isLinkworthy(day, currentDay)

-- Returns true if the calendar day should be linked, and false if not.

-- Days should be linked if they are the current day or if they are within the six

-- preceding days, as that is the number of items on the current events page.

if currentDay - 6 <= day and day <= currentDay then

return true

else

return false

end

end

function p.makeDayLink(day, month, year)

return string.format("  %d  ", year, month, day, day)

end

function p.export(dayStrings, dateStuff)

-- Generates the calendar HTML.

local monthAndYear = dateStuff.monthAndYear

local root = mw.html.create('table')

-- The next two lines help to make the table-layout-based Archive pages look good. When the

-- Archives have been converted to a grid-based layout, this logic can be removed, and the

-- corressponding CSS margin attribute can be simplified.

local temporaryMarginAdjustment = "auto !important"

if dateStuff.argsDate then temporaryMarginAdjustment = "8px 8px 0 0" end

root

:addClass('infobox')

:css{

display = 'table',

width = '100%',

float = 'initial',

['max-width'] = '350px',

margin = temporaryMarginAdjustment,

['text-align'] = 'center',

['background-color'] = '#f5faff',

border = '1px solid #cedff2'

}

-- Headings

:tag('tr')

:css('background-color', '#cedff2')

:tag('th')

:css{['text-align'] = 'center'}

:wikitext(makeWikilink('Portal:Current events/' .. dateStuff.previousMonthAndYear, '◀'))

:done()

:tag('th')

:attr('colspan', '5')

:css{['text-align'] = 'center'}

:wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear))

:done()

:tag('th')

:css{['text-align'] = 'center'}

:wikitext(makeWikilink('Portal:Current events/' .. dateStuff.nextMonthAndYear, '▶'))

-- Day of week headings

local dayHeadingRow = root:tag('tr')

local weekdays = {'S', 'M', 'T', 'W', 'T', 'F', 'S'}

for i, weekday in ipairs(weekdays) do

dayHeadingRow:tag('th')

:css{['width'] = '14%', ['text-align'] = 'center'}

:wikitext(weekday)

end

-- Days

local cellCount = 1 - dateStuff.firstWeekday -- Tracks the number of day cells. Negative values used for initial blank cells.

while cellCount < #dayStrings do -- Weekly rows

local weeklyRow = root:tag('tr')

for i = 1, 7 do -- Always make 7 cells.

cellCount = cellCount + 1

local dayString = dayStrings[cellCount] or " " -- Use a blank cell if there is no corresponding dateString

weeklyRow:tag('td')

:css{['text-align'] = 'center'}

:wikitext(dayString)

end

end

-- Footer

if not dateStuff.argsDate then -- No footer necessary on Archive pages.

root:tag('tr')

:tag('td')

:attr('colspan', '7')

:css{['padding-top'] = '3px', ['padding-bottom'] = '5px', ['font-size'] = '78%', ['text-align'] = 'right'}

:wikitext('   ' .. makeWikilink('Portal:Current events/' .. monthAndYear, 'More ' .. monthAndYear .. ' events...   '))

end

return tostring(root)

end

return p

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/9/22 15:51:19