Module:Selected current events
Appearance
From Wikipedia, the free encyclopedia
[画像:Ready for use] This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing.
[画像:Protected] This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing.
Usage
{{#invoke:Selected current events|main}}
Arguments come from the parent template {{Transclude selected current events }}; see documentation there for details.
See also
The above documentation is transcluded from Module:Selected current events/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
function cleanupArgs(argsTable) local cleanArgs = {} for key, val in pairs(argsTable) do if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val ~= '' then cleanArgs[key] = val end else cleanArgs[key] = val end end return cleanArgs end function isAffirmed(val) if not(val) then return false end local affirmedWords = ' add added affirm affirmed include included on true yes y ' return string.find(affirmedWords, ' '..string.lower(val)..' ', 1, true ) and true or false end function makeOutput(allItems, maxItems, more) local output = '' local itemIndex = 1 local maxCount = math.min(#allItems, maxItems) while itemIndex <= maxCount do output = output .. allItems[itemIndex] .. '\n' itemIndex = itemIndex + 1 end if more then output = output .. more end return mw.text.trim(output) end function cleanForPatternMatching(wikitext) -- remove wikilink brackets local cleaned = mw.ustring.gsub(wikitext, "%[%[(.-)%]%]","%1") -- remove pipes that would have been in piped links cleaned = mw.ustring.gsub(cleaned, "%|"," ") -- remove external links cleaned = mw.ustring.gsub(cleaned, "%[.-%]"," ") return cleaned end function formatDateString(dateString, mdyDates) if mdyDates then formattedDatePattern = "%2 %3, %1" else formattedDatePattern = "%3 %2 %1" end return '<span style="font-weight:normal;">' .. string.gsub(dateString, "(.*) (.*) (.*)", formattedDatePattern) .. ' –</span>' end function makeCollapsed(outerText, innerText) return "{{Hidden begin | titlestyle = font-weight:normal | title = " .. outerText .. "}}" .. innerText .. "{{Hidden end}}" end -- Get current events for a "YYYY Month D" date. Returns a table of list items. function getCurrentEvents(date, mdyDates, keepPatterns, skipPatterns, showWikitext) local title = mw.title.new("Portal:Current events/" .. date) local raw = title:getContent() if (not raw) or raw == '' then return {} end local lines = mw.text.split( raw , '\n') local items = {} local itemHeading = '' local cleanItemHeading = '' local previousItemPrefix = '' local formattedDate = formatDateString(date, mdyDates) for i, v in ipairs(lines) do local keep = false local skip = false local isSublistItem = ( string.sub( v, 0, 2 ) == '**' ) local isListItem = not isSublistItem and ( string.sub( v, 0, 1) == '*' ) local hasSublistItem = isListItem and i < #lines and ( string.sub( lines[i+1], 0, 2 ) == '**' ) if hasSublistItem then itemHeading = mw.text.trim(mw.ustring.gsub(v, '%*', '', 1)) cleanItemHeading = cleanForPatternMatching(itemHeading) elseif isListItem then itemHeading = "" cleanItemHeading = "" end if (isListItem and not hasSublistItem) or isSublistItem then local text = cleanForPatternMatching(v) for ii, keepPatt in pairs(keepPatterns) do if not keep and ( mw.ustring.find(text, keepPatt) or mw.ustring.find(cleanItemHeading, keepPatt) ) then keep = true end end if #skipPatterns > 0 then for iii, skipPatt in pairs(skipPatterns) do if not skip and ( mw.ustring.find(text, skipPatt) or mw.ustring.find(cleanItemHeading, skipPatt) ) then skip = true end end end end if keep and not skip then local itemPrefix = ";" .. formattedDate if itemHeading ~= "" then itemPrefix = itemPrefix .. " "..itemHeading.."" end itemPrefix = itemPrefix .. "\n:" if previousItemPrefix == itemPrefix then itemPrefix = ':' else previousItemPrefix = itemPrefix end local item = mw.ustring.gsub(v, '%*+', itemPrefix) if showWikitext then -- remove html comments local itemWikitext = mw.ustring.gsub(item, "%<%!%-%-(.-)%-%-%>", "") -- remove prefix from wikitext itemWikitext = mw.ustring.gsub(itemWikitext, ";(.-)\n", "") itemWikitext = "<pre>" .. mw.text.nowiki( itemWikitext ) .. "</pre>" -- remove prefix from item itemWithoutPrexix = mw.ustring.gsub(v, '%*+', '') item = itemPrefix .. makeCollapsed(itemWithoutPrexix, itemWikitext) end table.insert(items, item) end end return items end function getItems(maxDays, mdyDates, patterns, skipPatterns, showWikitext) local allItems = {} local lang = mw.language.new('en') local daysAgo = 0 while daysAgo < maxDays do local day = lang:formatDate('Y F j', 'now - '..daysAgo..' days') local dailyItems = getCurrentEvents(day, mdyDates, patterns, skipPatterns, showWikitext) for i, item in ipairs(dailyItems) do table.insert(allItems, item) end daysAgo = daysAgo + 1 end return allItems end function getPatterns(args, prefix) local patterns = {} local ii = 1 while args[prefix and prefix..ii or ii] do patterns[ii] = args[prefix and prefix..ii or ii] ii = ii + 1 end return patterns end local p = {} p.main = function(frame) local parent = frame.getParent(frame) local parentArgs = parent.args local args = cleanupArgs(parentArgs) if args['not'] and not args['not1'] then args['not1'] = args['not'] end local patterns = getPatterns(args) if #patterns < 1 then return error("Search pattern not set") end local skipPatterns = getPatterns(args, 'not') local days = tonumber(args.days) or 30 local mdyDates = args.dates and string.lower(args.dates) == 'mdy' local showWikitext = isAffirmed(args.wikitext) local allItems = getItems(days, mdyDates, patterns, skipPatterns, showWikitext) if #allItems < 1 then return args.header and '' or args.none or 'No recent news' end local maxItems = tonumber(args.max) or 6 local more = args.more if isAffirmed(args.more) then more = "'''[[Portal:Current events|More current events...]]'''" end local output = makeOutput(allItems, maxItems, more) if args.header then output = args.header .. '\n' .. output .. '\n' .. (args.footer or '{{Box-footer}}') end local needsExpansion = mw.ustring.find(output, '{{', 0, true) if needsExpansion then return frame:preprocess(output) else return output end end return p