--[[ v16
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"
]]
-- config
local 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;"
-- globals for this module
local debugging = false
local debugmsg = ""
local tableRowNum = 0
local includeNewCounties = true
local useCountyWord = true
local title_prefix = ""
local title_suffix = ""
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local p = {}
local TwentySixCounties = {
'Carlow',
'Cavan',
'Clare',
'Cork',
'Donegal',
'Dublin',
'Galway',
'Kerry',
'Kildare',
'Kilkenny',
'Laois',
'Leitrim',
'Limerick',
'Longford',
'Louth',
'Mayo',
'Meath',
'Monaghan',
'Offaly',
'Roscommon',
'Sligo',
'Tipperary',
'Waterford',
'Westmeath',
'Wexford',
'Wicklow'
}
local SixCounties = {
'Antrim',
'Armagh',
'Down',
'Fermanagh',
'Londonderry',
'Tyrone'
}
local newCounties = {
'Dún Laoghaire–Rathdown',
'Fingal',
'South Dublin (county)'
}
local Traditional32Counties = {
'Antrim',
'Armagh',
'Carlow',
'Cavan',
'Clare',
'Cork',
'Donegal',
'Down',
'Dublin',
'Fermanagh',
'Galway',
'Kerry',
'Kildare',
'Kilkenny',
'Laois',
'Leitrim',
'Limerick',
'Londonderry',
'Longford',
'Louth',
'Mayo',
'Meath',
'Monaghan',
'Offaly',
'Roscommon',
'Sligo',
'Tipperary',
'Tyrone',
'Waterford',
'Westmeath',
'Wexford',
'Wicklow'
}
local GAACounties = {
'Antrim',
'Armagh',
'Carlow',
'Cavan',
'Clare',
'Cork',
'Donegal',
'Derry',
'Down',
'Dublin',
'Fermanagh',
'Galway',
'Kerry',
'Kildare',
'Kilkenny',
'Laois',
'Leitrim',
'Limerick',
'Longford',
'Louth',
'Mayo',
'Meath',
'Monaghan',
'Offaly',
'Roscommon',
'Sligo',
'Tipperary',
'Tyrone',
'Waterford',
'Westmeath',
'Wexford',
'Wicklow'
}
function makeTableRow(rowLabel, useCountyWord, countyList, description)
tableRowNum = tableRowNum + 1
local thisRow
if (tableRowNum % 2) == 0 then
thisRow = '<tr style="' .. evenRowStyle .. '">\n'
else
thisRow = '<tr style="' .. oddRowStyle .. '">\n'
end
if not ((rowLabel == nil) or (mw.ustring.match(rowLabel, "^%s*$"))) then
thisRow = thisRow .. '<td style="' .. labelStyle .. '">' .. rowLabel .. '</td>\n'
end
-- now begin making the row contents
local countyWord = ""
if useCountyWord then
countyWord = "County "
end
thisRow = thisRow .. '<td style="' .. listStyle .. ';"><div class="hlist">\n'
local i, aCounty
for i, aCounty in ipairs(countyList) do
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 .. '</div></td>\n</tr>'
return thisRow
end
function makeTable()
local myTable = '<table class="' .. tableClass .. '" style="' .. tableStyle .. ' ; font-size:' .. textSize .. ';">\n'
myTable = myTable .. makeTableRow("Republic of Ireland", useCountyWord, TwentySixCounties)
myTable = myTable .. makeTableRow("Northern Ireland", useCountyWord, SixCounties)
myTable = myTable .. "</table>\n"
return myTable
end
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 link = "[[:Category:" .. catname .. "|" .. displaytext .. "]]"
local fmtlink
local linktitle = mw.title.new( catname, "Category" )
if (linktitle.exists) then
fmtlink = link
else
fmtlink = "<span style=\"color:#888\">" .. displaytext .. "</span>"
end
return fmtlink
end
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_name
end
-- 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 word
function 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 nil
end
-- check whether a given county name is in a particular set
function isCountyInSet(s, countySet)
local thisCounty = mw.ustring.gsub(s, "^County +", "")
local aValidCounty
for i, aValidCounty in ipairs(countySet) do
if mw.ustring.match(thisCounty, "^" .. aValidCounty .. "$") then
return true
end
end
return false
end
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 one of the 32 counties?
debugLog(3, "is [" .. match_county .. "] one of the 32 counties?")
if isCountyInSet(match_county, Traditional32Counties) then
debugLog(nil, "Yes")
else
debugLog(nil, "No")
return false
end
else -- simple
debugLog(3, "No match_'County Foo'")
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 .. "]")
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
debugLog(2, "parse successful")
debugLog(3, "match_prefix = [" .. match_prefix .. "]")
debugLog(3, "match_county = [" .. match_county .. "]")
debugLog(3, "match_suffix = [" .. match_suffix .. "]")
return true
end
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 nil
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
if (level == 1) then
debugmsg = debugmsg .. "# "
elseif (level == 2) then
debugmsg = debugmsg .. "#* "
elseif (level == 3) then
debugmsg = debugmsg .. "#*# "
elseif (level == 4) then
debugmsg = debugmsg .. "#*#* "
end
end
debugmsg = debugmsg .. " " .. msg
return true
end
function argValueFunc(value)
if (value == nil) then
value = '' -- nil value = blank
end
value = mw.ustring.gsub(value, "^%s+$", "") -- only whitespace, so replace with ''
return value
end
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) 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) 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, "newcounties")
if (frame.args['newcounties'] == nil) 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
-- still need to add a "mode" parameter, to choose [all 32]/[32+new]/[only 26]/[26+new]/[only 6]/[GAACounties]/[26+32]/[26+32+new]
-- 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