Module:Sandbox/BrownHairedGirl/IrelandByCountyCatNav19 explained

--v19

each title consists of 3 parts * prefix * county name * suffix e.g. "Foo in County Mayo" * prefix = "Foo in " * county name = "County Mayo" * suffix = "" e.g. "County Sligo-related lists" * prefix = "" * county name = "County Sligo" * suffix = "-related lists"

-- configlocal textSize = '90%'local tableClass="infobox"local tableStyle="margin-left:auto; margin-right:auto; clear:left; float:left; width:auto;"local evenRowStyle = "background-color:#f3f3f3;"local oddRowStyle = ""local labelStyle = "text-align:right; font-weight: bold;"local listStyle = "text-align:left; font-weight: normal;"local greyLinkColor = "#888"

-- globals for this modulelocal debugging = falselocal debugmsg = ""local tableRowNum = 0local includeNewCounties = truelocal useCountyWord = truelocal title_prefix = ""local title_suffix = ""local displayAbbrevCounty = falselocal countySet = nillocal title_prefixlocal title_suffixlocal thisPageCounty

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

local TwentySixCounties =

local SixCounties =

local newCounties =

local Traditional32Counties =

local GAACounties =

local abbreviatedCountyName =

function makeTableRow(rowLabel, useCountyWord, countyList) debugLog(2, "makeTableRow, label: ") if (rowLabel

nil) then rowLabel = "By county" debugLog(nil, rowLabel) else rowLabel = mw.text.trim(rowLabel) debugLog(nil, " [" .. rowLabel .. "]") end tableRowNum = tableRowNum + 1 local thisRow if (tableRowNum % 2)

0 then debugLog(3, "Even-numbered") thisRow = '\n' else debugLog(3, "Odd-numbered") thisRow = '\n' end if not ((rowLabel

nil) or (rowLabel

"")) then thisRow = thisRow .. '' .. rowLabel .. '\n' end -- now begin making the row contents local countyWord = "" if useCountyWord then debugLog(3, "Using countyWord") countyWord = "County " else debugLog(3, "Not using countyWord") end thisRow = thisRow .. '

\n' local i, aCounty debugLog(3, "Process countyList") for i, aCounty in ipairs(countyList) do debugLog(4, "No. [" .. tostring(i) .. ": [" .. aCounty .. "]") myCatName = makeCatName(countyWord .. aCounty, title_prefix, title_suffix) thisRow = thisRow .. "* " .. makeCatLink(myCatName, aCounty) .. "\n" local j, nuCounty if (includeNewCounties and (aCounty

"Dublin")) then -- make a sub-list for the newCounties local subCatName for j, nuCounty in ipairs(newCounties) do subCatName = makeCatName(nuCounty, title_prefix, title_suffix) thisRow = thisRow .. "** " .. makeCatLink(subCatName, nuCounty) .. "\n" end subCatName = makeCatName("Dublin (city)", title_prefix, title_suffix) thisRow = thisRow .. "** " .. makeCatLink(subCatName, "City") .. "\n" end end thisRow = thisRow .. '

\n' return thisRowend

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

\n" return myTableend

function makeAbbreviatedCountyName(s) debugLog(5, "displayAbbrevCounty? ")

if not displayAbbrevCounty then debugLog(nil, " No") return s end debugLog(nil, " Yes") if (abbreviatedCountyName[s] ~= nil) then debugLog(5, "AbbreviatedCountyName for: [" .. s .. "] = [" .. abbreviatedCountyName[s] .. "]") return abbreviatedCountyName[s] end debugLog(5, "No abbreviatedCountyName for: [" .. s .. "]") return send

-- Make a piped link to a category, if it exists-- If it doesn't exist, just display the greyed the link title without linkingfunction 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+%(.+$", ""); displaytext = makeAbbreviatedCountyName(displaytext) else displaytext = catname end local fmtlink local catPage = mw.title.new(catname, "Category") if (catPage.exists) then fmtlink = "" .. displaytext .. "" else fmtlink = '

' .. displaytext .. "" end

return fmtlinkend

function makeCatName(countyName, prefix, suffix) local this_cat_name = ; this_cat_name = this_cat_name .. prefix this_cat_name = this_cat_name .. countyName this_cat_name = this_cat_name .. suffix return this_cat_nameend

-- Does the pagename include a bare county name? (i.e. without the prefix "County ")-- This would be one line in regex, but Lua pattern matching is cruder, so-- we need several passes to ensure that any match is of a complete wordfunction findBareCountyNameInPagename(pn, countylist, description) local i, testCounty debugLog(2, "trying bare_county name [" .. pn .."] in county set: " .. description) for i, testCounty in ipairs(countylist) do debugLog(3, "testing new_county: [" .. testCounty .. "]") local testCountyEncoded = mw.ustring.gsub(testCounty, "([%W])", "%%%1") -- For efficiency, the first test is a simple match as a a screening test -- If the bare county name is nowhere in the pagename, then no need for -- more precise checks if (mw.ustring.match(pn, testCountyEncoded)) then debugLog(4, "simple match success") debugLog(4, "match at start, followed by separator? ") if mw.ustring.match(pn, "^" .. testCountyEncoded .. "[^%w]") then debugLog(nil, "Yes") return testCounty else debugLog(nil, "No") end debugLog(4, "match at end, preceded by separator? ") if mw.ustring.match(pn, "[^%w]" .. testCountyEncoded .. "$") then debugLog(nil, "Yes") return testCounty else debugLog(nil, "No") end debugLog(4, "match anywhere, preceded and followed by separator? ") if mw.ustring.match(pn, "[^%w]" .. testCountyEncoded .. "[^%w]") then debugLog(nil, "Yes") return testCounty else debugLog(nil, "No") end else debugLog(4, "simple match fail") end end return nilend

-- check whether a given county name is in a particular setfunction isCountyInSet(s, aSet, description) local thisCounty = mw.ustring.gsub(s, "^County +", "") debugLog(4, "Checking [" .. thisCounty .. "] in set: " .. description) local aValidCounty for i, aValidCounty in ipairs(aSet) do debugLog(4, "Compare with [" .. aValidCounty .. "]: ") if mw.ustring.match(thisCounty, "^" .. aValidCounty .. "$") then debugLog(nil, " match") return true end debugLog(nil, " not matched") end return falseend

function isCountyValidCheck(s) local thisCounty = mw.ustring.gsub(s, "^County +", "") local aValidCounty if (countySet

"twentysix") then return isCountyInSet(thisCounty, TwentySixCounties, "twentysix") elseif (countySet

"thirtytwo") then return isCountyInSet(thisCounty, Traditional32Counties, "thirtytwo") elseif (countySet

"six") then return isCountyInSet(thisCounty, SixCounties, "six") elseif (countySet

"gaa") then return isCountyInSet(thisCounty, GAACounties, "gaa") else -- default: trear as (countySet

"twentysixplussix") if (isCountyInSet(thisCounty, TwentySixCounties, "twentysix")) then return true end return isCountyInSet(thisCounty, SixCounties, "six") end --shouldn't get here, but just in case return falseend

function parsePagename(pn) debugLog(1, "parsePagename: [" .. pn .. "]") debugLog(2, "simple parse") match_prefix, match_county, match_suffix = mw.ustring.match(pn, "^(.*)(County%s+%a+)(.*)$") if not (match_county

nil or match_county

) then debugLog(3, "County Foo = [" .. match_county .. "]") -- we have a "County Foo" ... but is it a valid county in this set? debugLog(3, "is [" .. match_county .. "] a valid county in this set? ") if isCountyValidCheck(match_county) then debugLog(3, "We have a valid county") else debugLog(3, "Not a valid county") return false end else -- simple parse failed debugLog(3, "No match 'County Foo'") --do we need to check newCounties if includeNewCounties then debugLog(3, "check newCounties") local new_county = findBareCountyNameInPagename(pn, newCounties, "New_counties") if new_county

nil then debugLog(3, "no match in new counties") return false end debugLog(3, "found new county: [" .. new_county .. "]") end debugLog(3, "parse pagename for [" .. new_county .. "]") local testCountyEncoded = mw.ustring.gsub(new_county, "([%W])", "%%%1") match_prefix, match_county, match_suffix = mw.ustring.match(pn, "^(.*)(" .. testCountyEncoded .. ")(.*)$") end title_prefix = match_prefix title_suffix = match_suffix thisPageCounty = mw.ustring.gsub(match_county, "^County%s+", "") debugLog(2, "parse successful") debugLog(3, "title_prefix = [" .. title_prefix .. "]") debugLog(3, "thisPageCounty = [" .. thisPageCounty .. "]") debugLog(3, "title_suffix = [" .. title_suffix .. "]") return trueend

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 nilfunction 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

function p.main(frame)-- getArgs-- In all cases, convert to blank (i.e. )-- * a nil value-- * a value consisting only of whitespace

debugLog(1, "Check parameters") debugLog(2, "debug") if (frame.args['debug']

nil) or (frame.args['debug']

"") then debugLog(3, "not set") else debugLog(3, "debug=[" .. frame.args['debug'] .. "]") debugLog(4, "Evaluate as: ") if (yesno(frame.args['debug'], false)) then debugLog(nil, "Yes") debugging = true else debugLog(nil, "No, or invalid") debugging = false end end

debugLog(2, "usecountyword") if ((frame.args['usecountyword']

nil) or (frame.args['usecountyword']

"")) then debugLog(3, "not set") else debugLog(3, "debug=[" .. frame.args['usecountyword'] .. "]") debugLog(4, "Evaluate as: ") if (yesno(frame.args['usecountyword'], true)) then debugLog(nil, "Yes, or invalid") useCountyWord = true else debugLog(nil, "No") useCountyWord = false end end

debugLog(2, "abbrev") if ((frame.args['abbrev']

nil) or (frame.args['abbrev']

"")) then debugLog(3, "not set") else debugLog(3, "abbrev=[" .. frame.args['abbrev'] .. "]") debugLog(4, "Evaluate as: ") if (yesno(frame.args['abbrev'], false)) then debugLog(nil, "Yes") displayAbbrevCounty = true else debugLog(nil, "No, or invalid") displayAbbrevCounty = false end end

debugLog(2, "newcounties") if ((frame.args['newcounties']

nil) or (frame.args['newcounties']

"")) then debugLog(3, "not set") else debugLog(3, "debug=[" .. frame.args['newcounties'] .. "]") debugLog(4, "Evaluate as: ") if (yesno(frame.args['newcounties'], false)) then debugLog(nil, "Yes, or invalid") includeNewCounties = true else debugLog(nil, "No") includeNewCounties = false end end

countySetParam = "twentysixplussix" -- default debugLog(2, "countySet") if ((frame.args['countyset']

nil) or (frame.args['countyset']

"")) then debugLog(3, "not set") else debugLog(3, "countyset=[" .. frame.args['countyset'] .. "]") local countySetParam = mw.text.trim(mw.ustring.lower(frame.args['countyset'])) debugLog(4, "Evaluate as: ") if (countySetParam

"twentysix") or (countySetParam

"six") or (countySetParam

"thirtytwo") or (countySetParam

"gaa") or (countySetParam

"twentysixplussix") then countySet = countySetParam debugLog(nil, "[" .. countySetParam .. "]") else debugLog(nil, "not a valid set") end end

-- 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 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 return publishDebugLog end debugLog(1, "all parse done") debugLog(2, "title_prefix = [" .. title_prefix .. "]") debugLog(2, "title_suffix = [" .. title_suffix .. "]")

return publishDebugLog .. makeTable

end

return p