Module:IrelandByProvinceCatNav explained

--v00.1

each title consists of 3 parts * prefix * province name * suffix e.g. "Foo in Ulster" * prefix = "Foo in " * province name = "Ulster" * suffix = "" e.g. "Connacht-related lists" * prefix = "" * province name = "Connacht" * suffix = "-related lists"

-- configlocal textSize = '90%'local tableClass="toc"local tableFallbackMaxWidth="auto"local tableMaxWidth="calc(100% - 25em)" -- Template:GeoGroup has width: 23em<-- local tableStyle="margin-left:0; margin-right:auto; clear:left !important; margin-top:0 !important; float:left; width:auto;"local tableStyle="margin-left:0; margin-right:auto; clear:left !important; margin-top:0 !important; width:auto;"local tableRowStyle = "vertical-align:top; background-color:#f3f3f3;"-- local labelStyle = "text-align:right; font-weight: bold; padding: 0.25em 0.5em 0.25em 0.5em;"local labelStyle = "text-align:right; font-weight: normal; font-style: italic; padding: 0.25em 0.5em 0.25em 0.5em;"local listStyle = "text-align:left; font-weight: normal; padding: 0.25em 0.5em 0.25em 0.5em;"local greyLinkColor = "#888"

local callingTemplates =

-- globals for this modulelocal debugging = falselocal debugmsg = ""local title_prefix = ""local title_suffix = ""local title_prefixlocal title_suffixlocal thisPageProvincelocal greyLinkCount = 0local blueLinkCount = 0local parentname = ""local templateName

local horizontal = require('Module:List').horizontallocal getArgs = require('Module:Arguments').getArgslocal yesno = require('Module:Yesno')local p =

local IrelandProvinces =

local function publishDebugLog if not debugging then return "" end return "

Debugging

\n\n" .. debugmsg .. "\n

Output

\n"end

-- debugLog builds a log which can be output if debuging is enabled-- each log entry is given a level, so that the output is not simply a flat list-- a debug msg may be appended to the previous msg by setting the level to nillocal function debugLog(level, msg)

if (debugmsg

nil) then debugmsg = "" end

if (level ~= nil) then -- not appending, so make a new line debugmsg = debugmsg .. "\n" -- then add the level local i for i = 1, level do if (i % 2)

1 then debugmsg = debugmsg .. "#" else debugmsg = debugmsg .. "*" end end end debugmsg = debugmsg .. " " .. msg return trueend

local function trackingCategory -- discount this page, which will always be coded as a blue link, but rendered as bold un-navigable blueLinkCount = blueLinkCount - 1 if greyLinkCount

0 then return "" end if blueLinkCount

0 then return "" end if greyLinkCount

1 then return "" elseif greyLinkCount

2 then return "" end return ""end

-- Make a piped link to a category, if it exists-- If it doesn't exist, just display the greyed the link title without linkinglocal function makeCatLink(catname, disp) local displaytext if (disp ~= "") and (disp ~= nil) then -- use 'disp' parameter, but strip any trailing disambiguator displaytext = mw.ustring.gsub(disp, "%s+%(.+$", ""); else displaytext = catname end local fmtlink local catPage = mw.title.new(catname, "Category") if (catPage.exists) then fmtlink = "" .. displaytext .. "" blueLinkCount = blueLinkCount + 1 else fmtlink = '

' .. displaytext .. "" greyLinkCount = greyLinkCount + 1 end

return fmtlinkend

local function makeCatName(provinceName, prefix, suffix) return prefix .. provinceName .. suffixend

local function makeTableRow(rowLabel, provinceList) debugLog(2, "makeTableRow, label: ") if (rowLabel

nil) then rowLabel = "By province" debugLog(nil, rowLabel) else rowLabel = mw.text.trim(rowLabel) debugLog(nil, " [" .. rowLabel .. "]") end local thisRow thisRow = '\n' if not ((rowLabel

nil) or (rowLabel

"")) then thisRow = thisRow .. '' .. rowLabel .. '\n' end -- now begin making the row contents debugLog(3, "Process provinceList") local list_args = for i, aProvince in ipairs(provinceList) do debugLog(4, "No. [" .. tostring(i) .. ": [" .. aProvince .. "]") myCatName = makeCatName(aProvince, title_prefix, title_suffix) table.insert(list_args, makeCatLink(myCatName, aProvince)) end return thisRow .. '' .. horizontal(list_args) .. '\n'end

local function makeTable debugLog(1, "makeTable") local myTable = '

\n" return myTableend

-- Does the pagename include a province name?local function findProvinceNameInPagename(pn) debugLog(2, "checking [" .. pn .."] for a province name") for i, aProvince in ipairs(IrelandProvinces) do debugLog(3, "testing: [" .. aProvince .. "]") if (string.find(pn, aProvince, 1, true)

nil) then debugLog(nil, "Fail") else debugLog(nil, "Success")

debugLog(4, "match whole name? ") if (pn

aProvince) then debugLog(nil, "Yes") return aProvince end debugLog(nil, "No")

debugLog(4, "match at start, followed by separator? ") if mw.ustring.match(pn, "^" .. aProvince .. "[^%w]") then debugLog(nil, "Yes") return aProvince end debugLog(nil, "No") debugLog(4, "match at end, preceded by separator? ") if mw.ustring.match(pn, "[^%w]" .. aProvince .. "$") then debugLog(nil, "Yes") return aProvince end debugLog(nil, "No")

debugLog(4, "match anywhere, preceded and followed by separator? ") if mw.ustring.match(pn, "[^%w]" .. aProvince .. "[^%w]") then debugLog(nil, "Yes") return aProvince end debugLog(nil, "No") end end return nilend

-- parse the pagename to find 3 parts: prefix, province name, suffixlocal function parsePagename(pn) debugLog(1, "parsePagename: [" .. pn .. "]") local validProvinceName validProvinceName = findProvinceNameInPagename(pn)

if validProvinceName

nil then return false end -- if we get here, the page name "pn" includes a validProvinceName -- so now we need to split the string debugLog(2, "split pagename around [" .. validProvinceName .. "]") match_prefix, match_province, match_suffix = mw.ustring.match(pn, "^(.*)(" .. validProvinceName .. ")(.*)$") title_prefix = match_prefix title_suffix = match_suffix thisPageProvince = match_province debugLog(2, "parse successful") debugLog(3, "title_prefix = [" .. title_prefix .. "]") debugLog(3, "thisPageProvince = [" .. thisPageProvince .. "]") debugLog(3, "title_suffix = [" .. title_suffix .. "]") return trueend

local function getYesNoParam(args, thisParamName, defaultVal) local paramVal = args[thisParamName] if paramVal

nil then paramVal = "" end

debugLog(2, "Evaluate yes/no parameter: [" .. thisParamName .. "] = [" .. paramVal .. "]") debugLog(3, "default = " .. ((defaultVal and "Yes") or "No")) debugLog(3, "Evaluate as: ") local returnValue if paramVal

"" then returnValue = defaultVal else returnValue = yesno(args[thisParamName], defaultVal) end if (returnValue) then debugLog(nil, "Yes") else debugLog(nil, "No") end return returnValueend

local function makeErrorMsg(s) return '

' .. parentname .. ' Error: ' .. s .. '

\n'end

local function isValidParent(p) local i, aParent for i, aParent in ipairs(callingTemplates) do if p

aParent then return true end end return falseend

function p.main(frame) local parent = frame:getParent if parent then parentname = parent:getTitle:gsub('/sandbox$', ) end

if (parentname

nil) or not isValidParent(parentname) then local errormsg = '

Error: ' .. parentname .. ' is not a valid wrapper for \n' errormsg = errormsg .. '

Valid wrappers: ' local i, aParent for i, aParent in ipairs(callingTemplates) do errormsg = errormsg .. '' .. aParent .. '' end errormsg = errormsg .. '

' return errormsg end templateName = mw.ustring.gsub(parentname, "^Template:", "") debugLog(1, "Check parameters") debugging = getYesNoParam(frame.args, "debug", false)

-- get the page title thispage = mw.title.getCurrentTitle thispagename = thispage.text; debugLog(1, "mw.title.getCurrentTitle") debugLog(2, "thispage.text = [" .. thispage.text .."]") debugLog(2, "thispage.namespace = [" .. thispage.namespace .."]") debugLog(2, "thispage.nsText = [" .. thispage.nsText .."]") debugLog(2, "is it a cat? using (thispage:inNamespace(14)): ") if not (thispage:inNamespace(14)) then debugLog(nil, "No, this is not a category") debugLog(1, "Not a category, so no output") return makeErrorMsg("only for use on a category page") .. publishDebugLog end debugLog(nil, "Yes, this is a category")

if not parsePagename(thispagename) then -- some error parsing the title, so don't proceed to output local trackingCatInvalid = "" return makeErrorMsg('the name of this category does not include a valid Irish province') .. publishDebugLog .. trackingCatInvalid end debugLog(1, "all parse done") debugLog(2, "title_prefix = [" .. title_prefix .. "]") debugLog(2, "title_suffix = [" .. title_suffix .. "]")

return publishDebugLog .. makeTable .. trackingCategory

end

return p