Module:Navseasoncats with year navigation
Jump to navigation
Jump to search
![]() | This module depends on the following other modules: |
This is a backend module for building navigation boxes in by-year chronology templates. It uses the {{Navseasoncats}}, and adds second row below of links to decades or centuries.
Usage
Typical usage
{{#invoke:Navseasoncats with year navigation|decadesBelowYear}}
{{#invoke:Navseasoncats with year navigation|centuriesBelowDecade}}
Testing
- An unnamed parameter may be used to test behavior as if placed on that category:
{{#invoke:Navseasoncats with year navigation|centuriesBelowDecade|Fiction set in the Template:NEXTDECADEs}}
Examples
{{#invoke:Navseasoncats with year navigation|decadesBelowYear}}
placed on Category:1973 in Japan will produce:
Lua error: expandTemplate: template "Navseasoncats" does not exist.
{{#invoke:Navseasoncats with year navigation|centuriesBelowDecade}}
placed on [[:Category:Fiction set in the Template:NEXTDECADEs]] will produce:
Wrapper templates
This module should be used by its templates {{Navseasoncats with decades below year}} and {{Navseasoncats with centuries below decade}}.
See also
- {{Navseasoncats}}
local p = {}
local nsc = require('Module:Navseasoncats')
local errorList = {
["FIND_VAR"] = "Function find_var can't recognize the decade for category %s.",
["NO_YEAR"] = "{{Navseasoncats with centuries below decade}} can't recognize the year for category %s.",
["NO_DECADE"] = "{{Navseasoncats with centuries below decade}} can't recognize the decade for category %s."
}
local function create_category(firstPart, lastPart, dateValue, dateWord)
local category = mw.text.trim(firstPart .. ' ' .. nsc.addord(dateValue) .. dateWord .. lastPart)
if (mw.title.new(category, 'Category').exists) then
return category
else
return nil
end
end
local function getCentury(decade)
decade = tonumber(decade)
local century = math.floor(((decade - 1) / 100) + 1) --from {{CENTURY}}
if (string.match(decade, '00$')) then
century = century + 1
end --'2000' is technically in the 20th, but the rest of the 2000s is in the 21st
return century
end
local function getDecade(year)
year = tonumber(year)
local decade = year / 10
decade = math.floor(decade)
return decade .. "0s"
end
local function getNestTierDateCategory(dateArgs, dateValue, firstPart, lastPart, decade)
local nextTierDateCategory = ""
if (dateArgs.dateType == "year") then
local decade = getDecade(dateValue)
nextTierDateCategory = create_category(firstPart, lastPart, decade, " ")
if (not nextTierDateCategory) then --check for "the YYYY"
nextTierDateCategory = create_category(firstPart, lastPart, "the " .. decade, " ")
end
elseif (dateArgs.dateType == "decade") then
local century = getCentury(dateValue)
nextTierDateCategory = create_category(firstPart, lastPart, century, " century ")
if (not nextTierDateCategory) then --check for hyphenated century
nextTierDateCategory = create_category(firstPart, lastPart, century, "-century ")
end
end
return nextTierDateCategory
end
local function isCategoryValid(dateValue, dateType, dateArgs)
if ((dateValue) and (dateType == dateArgs.dateType)) then
return true
else
return false
end
end
local function getError(pageName, avoidSelf, testcases, errorMessage)
local errorOut = ''
if (avoidSelf) then
local errors = nsc.errorclass(string.format(errorMessage, pageName))
errorOut = nsc.failedcat(errors, 'P')
if (testcases) then
string.gsub(errorOut, '(%[%[)(Category)', '%1:%2')
end
end
return errorOut
end
local function getAvoidSelf(currentTitle, testcases)
local avoidSelf = (currentTitle.text ~= 'Navseasoncats with year navigation' and
currentTitle.text ~= 'Navseasoncats with year navigation/doc' and
currentTitle.text ~= 'Navseasoncats with year navigation/sandbox' and
(currentTitle.nsText ~= 'Template' or testcases)) --avoid nested transclusion errors
return avoidSelf
end
local function main(frame, dateArgs)
local currentTitle = mw.title.getCurrentTitle()
local testcases = (currentTitle.subpageText == 'testcases')
local avoidSelf = getAvoidSelf(currentTitle, testcases)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame)
local testcase = args[1]
if ((testcase == nil) and (avoidself == false)) then
return ''
end
local pageName = testcase or currentTitle.baseText
local findVar = nsc.find_var(pageName) --picks up decades/seasons/etc.
if (findVar[1] == 'error') then
return getError(pageName, avoidSelf, testcases, errorList["FIND_VAR"])
end
local dateValue = tonumber(string.match(findVar[2], dateArgs.pattern))
if (not isCategoryValid(dateValue, findVar[1], dateArgs)) then
return getError(pageName, avoidSelf, testcases, dateArgs.errorMessage)
end
local nav1 = ''
if (testcase) then
nav1 = frame:expandTemplate{title = 'Navseasoncats', args = {testcase = testcase}} --not sure how else to pass frame & args together
else
nav1 = nsc.navseasoncats(frame)
end
local firstPart, lastPart = string.match(pageName, '^(.*)' .. findVar[2] .. '(.*)$')
firstPart = mw.text.trim(firstPart or '')
lastPart = mw.text.trim(lastPart or '')
local nextTierDateCategory = getNestTierDateCategory(dateArgs, dateValue, firstPart, lastPart, decade)
if (nextTierDateCategory) then
local nav2 = frame:expandTemplate{title = 'Navseasoncats', args = {[dateArgs.argName] = nextTierDateCategory}} --not sure how else to pass frame & args together
return '<div style="display:block !important; max-width: calc(100% - 25em);">' .."\n" .. nav1 .. nav2 .."\n" .. '</div>'
else
return nav1
end
end
function p.centuriesBelowDecade(frame)
local dateArgs = {dateType = "decade", pattern = '^(%d+)s', argName = "century-below-decade", errorMessage = errorList["NO_DECADE"]}
return main(frame, dateArgs)
end
function p.decadesBelowYear(frame)
local dateArgs = {dateType = "year", pattern = '^(%d+)', argName = "decade-below-year", errorMessage = errorList["NO_YEAR"]}
return main(frame, dateArgs)
end
return p