From Wikipedia, the free encyclopedia

--[[ v20



 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; padding-right: 1em"

local listStyle = "text-align:left; font-weight: normal;"

local greyLinkColor = "#888"



-- 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 displayAbbrevCounty = false

local countySet = nil

local title_prefix

local title_suffix

local thisPageCounty

local isNorniron = false



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'

}





local abbreviatedCountyName = {

--using ISO 3166-2:IE

	'Cork' = 'CO',

	'Clare' = 'CE',

	'Cavan' = 'CN',

	'Carlow' = 'CW',

	'Dublin' = 'D',

	'Donegal' = 'DL',

	'Galway' = 'G',

	'Kildare' = 'KE',

	'Kilkenny' = 'KK',

	'Kerry' = 'KY',

	'Limerick' = 'LK',

	'Longford' = 'LD',

	'Louth' = 'LH',

	'Leitrim' = 'LM',

	'Laois' = 'LS',

	'Meath' = 'MH',

	'Monaghan' = 'MN',

	'Mayo' = 'MO',

	'Offaly' = 'OY',

	'Roscommon' = 'RN',

	'Sligo' = 'SO',

	'Tipperary' = 'TA',

	'Waterford' = 'WD',

	'Westmeath' = 'WH',

	'Wexford' = 'WX',

	'Wicklow' = 'WW',

-- made-up codes for new counties

	'Fingal' = 'FL',

	'South Dublin' = 'DS',

	'South Dublin (county)' = 'DS',

	'Dún Laoghaire–Rathdown' = 'DLR',

-- made-up codes for Northern Ireland

	'Antrim' = 'AM',

	'Armagh' = 'AH',

	'Down' = 'DN',

	'Fermanagh' = 'FH',

	'Londonderry' = 'LY',

	'Tyrone' = 'TE',

-- made-up code for GAA county: Derry

	'Derry' = 'DY'

}





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 = '<tr style="' .. evenRowStyle .. '">\n'

	else

		debugLog(3, "Odd-numbered")

		thisRow = '<tr style="' .. oddRowStyle .. '">\n'

	end

	if not ((rowLabel == nil) or (rowLabel =="")) then

		thisRow = thisRow .. '<td style="' .. labelStyle .. '">' .. rowLabel .. '</td>\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 .. '<td style="' .. listStyle .. ';"><div class="hlist">\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 .. '</div></td>\n</tr>'

	return thisRow

end





function makeTable()

	debugLog(1, "makeTable")

	tableRowNum = 0

	local myTable = '<table class="' .. tableClass .. '" style="' .. tableStyle .. ' ; font-size:' .. textSize .. ';">\n'

	if (countySet == "thirtytwo") then

		myTable = myTable .. makeTableRow(nil, useCountyWord, Traditional32Counties)

	elseif (countySet == "twentysix") then

		myTable = myTable .. makeTableRow(nil, useCountyWord, TwentySixCounties)

	elseif (countySet == "six") then

		myTable = myTable .. makeTableRow(nil, useCountyWord, SixCounties)

	elseif (countySet == "gaa") then

		myTable = myTable .. makeTableRow("GAA&nbsp;counties", useCountyWord, GAACounties)

	else -- default to 26 plus 6

		if isNorniron then

			myTable = myTable .. makeTableRow("Northern&nbsp;Ireland", useCountyWord, SixCounties)

			myTable = myTable .. makeTableRow("Republic of Ireland", useCountyWord, TwentySixCounties)

		else

			myTable = myTable .. makeTableRow("Republic of Ireland", useCountyWord, TwentySixCounties)

			myTable = myTable .. makeTableRow("Northern&nbsp;Ireland", useCountyWord, SixCounties)

		end

	end

	myTable = myTable .. "</table>\n"

	return myTable

end





function makeAbbreviatedCountyName(s)

	debugLog(5, "displayAbbrevCounty? ")



	if not displayAbbrevCounty then

		debugLog(nil, " No")

		return s

	end

		debugLog(nil, " Yes")

	if (abbreviatedCountyNames ~= nil) then

		debugLog(5, "AbbreviatedCountyName for: [" .. s .. "] = [" .. abbreviatedCountyNames .. "]")

		return abbreviatedCountyNames

	end

	debugLog(5, "No abbreviatedCountyName for: [" .. s .. "]")

	return s

end



-- Make a piped link to a category, if it exists

-- If it doesn't exist, just display the greyed the link title without linking

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+%(.+$", "");

		displaytext = makeAbbreviatedCountyName(displaytext)

	else

		displaytext = catname

	end

	local fmtlink

	local catPage = mw.title.new( catname, "Category" )

	if (catPage.exists) then

		fmtlink = "[[:Category:" .. catname .. "|" .. displaytext .. "]]"

	else

		fmtlink = '<span style="color:' .. greyLinkColor .. '">' .. 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





function patternSearchEncode(s)

	return mw.ustring.gsub(s, "([%W])", "%%%1")

end



-- Does the pagename include a county name?

-- with or without the prefix "County", depending on value of useCountyWord

function findCountyNameInPagename(pn, countylist, description, prefixCountyWord)

	local i, aCounty, testCounty

	debugLog(2, "checking [" .. pn .."] for a county name in county set: " .. description)

	for i, aCounty in ipairs(countylist) do

		if prefixCountyWord then

			testCounty = "County " .. aCounty

		else

			testCounty = aCounty

		end

		debugLog(3, "testing: ["  .. testCounty .. "]")

		local testCountyEncoded = patternSearchEncode(testCounty)

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

		-- This check 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

		debugLog(4, "simple match? ")

		if (not mw.ustring.match(pn, testCountyEncoded)) then

			debugLog(nil, "Fail")

		else

			debugLog(nil, "Success")



			debugLog(4, "match at start, followed by separator? ")

			if mw.ustring.match(pn, "^" .. testCountyEncoded .. "[^%w]") then

				debugLog(nil, "Yes")

				return testCounty

			end

			debugLog(nil, "No")

			

			debugLog(4, "match at end, preceded by separator? ")

			if mw.ustring.match(pn, "[^%w]" .. testCountyEncoded .. "$") then

				debugLog(nil, "Yes")

				return testCounty

			end

			debugLog(nil, "No")



			debugLog(4, "match anywhere, preceded and followed by separator? ")

			if mw.ustring.match(pn, "[^%w]" .. testCountyEncoded .. "[^%w]") then

				debugLog(nil, "Yes")

				return testCounty

			end

			debugLog(nil, "No")

		end

	end

	return nil

end



-- check whether a given county name is in a particular set

function 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 false

end





-- parse the pagename to find 3 parts: prefix, county name, suffix

function parsePagename(pn)

	debugLog(1, "parsePagename: [" .. pn .. "]")

	isNorniron = false

	local validCountyName

	if (countySet == "twentysix") then

		validCountyName = findCountyNameInPagename(pn, TwentySixCounties, "twentysix", useCountyWord)

		if (validCountyName == nil and includeNewCounties) then 

			validCountyName = findCountyNameInPagename(pn, newCounties, "new counties", false)

		end

	elseif (countySet == "thirtytwo")  then

		 validCountyName = findCountyNameInPagename(pn, Traditional32Counties, "thirtytwo", useCountyWord)

		if (validCountyName == nil and includeNewCounties) then 

			validCountyName = findCountyNameInPagename(pn, newCounties, "new counties", false)

		end

	elseif (countySet == "six") then

		validCountyName = findCountyNameInPagename(pn, SixCounties, "six", useCountyWord, false)

		if validCountyName ~= nil then

			isNorniron = true

		end

	elseif (countySet == "gaa") then

		validCountyName = findCountyNameInPagename(pn, GAACounties, "gaa", useCountyWord, false)

	else -- default: treat as (countySet == "twentysixplussix")

		validCountyName = findCountyNameInPagename(pn, TwentySixCounties, "twentysix", useCountyWord)

		if validCountyName == nil then

			validCountyName = findCountyNameInPagename(pn, SixCounties, "six", useCountyWord)

			if validCountyName ~= nil then

				isNorniron = true

			end

		end

		if (validCountyName == nil and includeNewCounties) then 

			validCountyName = findCountyNameInPagename(pn, newCounties, "new counties", false)

		end



	end

	if validCountyName == nil then

		return false

	end

	

	-- if we get here, the page name "pn" includes a validCountyName

	-- so now we need to split the string

	

	debugLog(2, "split pagename around [" .. validCountyName .. "]")

	local validCountyEncoded = mw.ustring.gsub(validCountyName, "([%W])", "%%%1")

	match_prefix, match_county, match_suffix = mw.ustring.match(pn, "^(.*)(" .. validCountyEncoded .. ")(.*)$")

	

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

		local i

		for i = 1, level do

			if (i % 2) == 1 then

				debugmsg = debugmsg .. "#"

			else

				debugmsg = debugmsg .. "*"

			end

		end 

	end

	debugmsg = debugmsg .. " " .. msg

	return true

end





function getYesNoParam(args, thisParamName, defaultVal)

	local returnValue

	debugLog(2, "Evaluate yes/no parameter: [" .. thisParamName .. "] = [" .. (((argsthisParamName == nil) and "") or argsthisParamName]) .. "]")

	debugLog(3, "default = " .. ((defaultVal and "Yes") or "No"))

	debugLog(3, "Evaluate as: ")

	returnValue = yesno(argsthisParamName], defaultVal)

	if (returnValue) then

		debugLog(nil, "Yes")

	else

		debugLog(nil, "No")

	end

	return returnValue

end



function p.main(frame)

	debugLog(1, "Check parameters")

	debugging = getYesNoParam(frame.args, "debug", false)

	useCountyWord = getYesNoParam(frame.args, "usecountyword", true)

	displayAbbrevCounty = getYesNoParam(frame.args, "abbrev", false)

	includeNewCounties = getYesNoParam(frame.args, "newcounties", true)



	countySetParam = "twentysixplussix" -- default

	debugLog(2, "countySet")

	if ((frame.args'countyset' == nil) or (frame.args'countyset' == "")) then

		debugLog(3, "not set")

		countySet = nil

	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 .. "]")

			if (countySetParam == "gaa") then

				useCountyWord = false

				includeNewCounties = false

				debugLog(5, "Yes/no parameter [newcounties] reset to [no]")

				debugLog(5, "Yes/no parameter [usecountyword] reset to [no]")

			end

		else

			countySet = nil

			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
From Wikipedia, the free encyclopedia

--[[ v20



 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; padding-right: 1em"

local listStyle = "text-align:left; font-weight: normal;"

local greyLinkColor = "#888"



-- 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 displayAbbrevCounty = false

local countySet = nil

local title_prefix

local title_suffix

local thisPageCounty

local isNorniron = false



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'

}





local abbreviatedCountyName = {

--using ISO 3166-2:IE

	'Cork' = 'CO',

	'Clare' = 'CE',

	'Cavan' = 'CN',

	'Carlow' = 'CW',

	'Dublin' = 'D',

	'Donegal' = 'DL',

	'Galway' = 'G',

	'Kildare' = 'KE',

	'Kilkenny' = 'KK',

	'Kerry' = 'KY',

	'Limerick' = 'LK',

	'Longford' = 'LD',

	'Louth' = 'LH',

	'Leitrim' = 'LM',

	'Laois' = 'LS',

	'Meath' = 'MH',

	'Monaghan' = 'MN',

	'Mayo' = 'MO',

	'Offaly' = 'OY',

	'Roscommon' = 'RN',

	'Sligo' = 'SO',

	'Tipperary' = 'TA',

	'Waterford' = 'WD',

	'Westmeath' = 'WH',

	'Wexford' = 'WX',

	'Wicklow' = 'WW',

-- made-up codes for new counties

	'Fingal' = 'FL',

	'South Dublin' = 'DS',

	'South Dublin (county)' = 'DS',

	'Dún Laoghaire–Rathdown' = 'DLR',

-- made-up codes for Northern Ireland

	'Antrim' = 'AM',

	'Armagh' = 'AH',

	'Down' = 'DN',

	'Fermanagh' = 'FH',

	'Londonderry' = 'LY',

	'Tyrone' = 'TE',

-- made-up code for GAA county: Derry

	'Derry' = 'DY'

}





function makeTableRow(rowLabel, useCountyWord, countyList)

	debugLog(2, "makeTableRow, label: ")

	if (rowLabel == nil) then

		rowLabel = "By&nbsp;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 = '<tr style="' .. evenRowStyle .. '">\n'

	else

		debugLog(3, "Odd-numbered")

		thisRow = '<tr style="' .. oddRowStyle .. '">\n'

	end

	if not ((rowLabel == nil) or (rowLabel =="")) then

		thisRow = thisRow .. '<td style="' .. labelStyle .. '">' .. rowLabel .. '</td>\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 .. '<td style="' .. listStyle .. ';"><div class="hlist">\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 .. '</div></td>\n</tr>'

	return thisRow

end





function makeTable()

	debugLog(1, "makeTable")

	tableRowNum = 0

	local myTable = '<table class="' .. tableClass .. '" style="' .. tableStyle .. ' ; font-size:' .. textSize .. ';">\n'

	if (countySet == "thirtytwo") then

		myTable = myTable .. makeTableRow(nil, useCountyWord, Traditional32Counties)

	elseif (countySet == "twentysix") then

		myTable = myTable .. makeTableRow(nil, useCountyWord, TwentySixCounties)

	elseif (countySet == "six") then

		myTable = myTable .. makeTableRow(nil, useCountyWord, SixCounties)

	elseif (countySet == "gaa") then

		myTable = myTable .. makeTableRow("GAA&nbsp;counties", useCountyWord, GAACounties)

	else -- default to 26 plus 6

		if isNorniron then

			myTable = myTable .. makeTableRow("Northern&nbsp;Ireland", useCountyWord, SixCounties)

			myTable = myTable .. makeTableRow("Republic of Ireland", useCountyWord, TwentySixCounties)

		else

			myTable = myTable .. makeTableRow("Republic of Ireland", useCountyWord, TwentySixCounties)

			myTable = myTable .. makeTableRow("Northern&nbsp;Ireland", useCountyWord, SixCounties)

		end

	end

	myTable = myTable .. "</table>\n"

	return myTable

end





function makeAbbreviatedCountyName(s)

	debugLog(5, "displayAbbrevCounty? ")



	if not displayAbbrevCounty then

		debugLog(nil, " No")

		return s

	end

		debugLog(nil, " Yes")

	if (abbreviatedCountyNames ~= nil) then

		debugLog(5, "AbbreviatedCountyName for: [" .. s .. "] = [" .. abbreviatedCountyNames .. "]")

		return abbreviatedCountyNames

	end

	debugLog(5, "No abbreviatedCountyName for: [" .. s .. "]")

	return s

end



-- Make a piped link to a category, if it exists

-- If it doesn't exist, just display the greyed the link title without linking

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+%(.+$", "");

		displaytext = makeAbbreviatedCountyName(displaytext)

	else

		displaytext = catname

	end

	local fmtlink

	local catPage = mw.title.new( catname, "Category" )

	if (catPage.exists) then

		fmtlink = "[[:Category:" .. catname .. "|" .. displaytext .. "]]"

	else

		fmtlink = '<span style="color:' .. greyLinkColor .. '">' .. 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





function patternSearchEncode(s)

	return mw.ustring.gsub(s, "([%W])", "%%%1")

end



-- Does the pagename include a county name?

-- with or without the prefix "County", depending on value of useCountyWord

function findCountyNameInPagename(pn, countylist, description, prefixCountyWord)

	local i, aCounty, testCounty

	debugLog(2, "checking [" .. pn .."] for a county name in county set: " .. description)

	for i, aCounty in ipairs(countylist) do

		if prefixCountyWord then

			testCounty = "County " .. aCounty

		else

			testCounty = aCounty

		end

		debugLog(3, "testing: ["  .. testCounty .. "]")

		local testCountyEncoded = patternSearchEncode(testCounty)

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

		-- This check 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

		debugLog(4, "simple match? ")

		if (not mw.ustring.match(pn, testCountyEncoded)) then

			debugLog(nil, "Fail")

		else

			debugLog(nil, "Success")



			debugLog(4, "match at start, followed by separator? ")

			if mw.ustring.match(pn, "^" .. testCountyEncoded .. "[^%w]") then

				debugLog(nil, "Yes")

				return testCounty

			end

			debugLog(nil, "No")

			

			debugLog(4, "match at end, preceded by separator? ")

			if mw.ustring.match(pn, "[^%w]" .. testCountyEncoded .. "$") then

				debugLog(nil, "Yes")

				return testCounty

			end

			debugLog(nil, "No")



			debugLog(4, "match anywhere, preceded and followed by separator? ")

			if mw.ustring.match(pn, "[^%w]" .. testCountyEncoded .. "[^%w]") then

				debugLog(nil, "Yes")

				return testCounty

			end

			debugLog(nil, "No")

		end

	end

	return nil

end



-- check whether a given county name is in a particular set

function 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 false

end





-- parse the pagename to find 3 parts: prefix, county name, suffix

function parsePagename(pn)

	debugLog(1, "parsePagename: [" .. pn .. "]")

	isNorniron = false

	local validCountyName

	if (countySet == "twentysix") then

		validCountyName = findCountyNameInPagename(pn, TwentySixCounties, "twentysix", useCountyWord)

		if (validCountyName == nil and includeNewCounties) then 

			validCountyName = findCountyNameInPagename(pn, newCounties, "new counties", false)

		end

	elseif (countySet == "thirtytwo")  then

		 validCountyName = findCountyNameInPagename(pn, Traditional32Counties, "thirtytwo", useCountyWord)

		if (validCountyName == nil and includeNewCounties) then 

			validCountyName = findCountyNameInPagename(pn, newCounties, "new counties", false)

		end

	elseif (countySet == "six") then

		validCountyName = findCountyNameInPagename(pn, SixCounties, "six", useCountyWord, false)

		if validCountyName ~= nil then

			isNorniron = true

		end

	elseif (countySet == "gaa") then

		validCountyName = findCountyNameInPagename(pn, GAACounties, "gaa", useCountyWord, false)

	else -- default: treat as (countySet == "twentysixplussix")

		validCountyName = findCountyNameInPagename(pn, TwentySixCounties, "twentysix", useCountyWord)

		if validCountyName == nil then

			validCountyName = findCountyNameInPagename(pn, SixCounties, "six", useCountyWord)

			if validCountyName ~= nil then

				isNorniron = true

			end

		end

		if (validCountyName == nil and includeNewCounties) then 

			validCountyName = findCountyNameInPagename(pn, newCounties, "new counties", false)

		end



	end

	if validCountyName == nil then

		return false

	end

	

	-- if we get here, the page name "pn" includes a validCountyName

	-- so now we need to split the string

	

	debugLog(2, "split pagename around [" .. validCountyName .. "]")

	local validCountyEncoded = mw.ustring.gsub(validCountyName, "([%W])", "%%%1")

	match_prefix, match_county, match_suffix = mw.ustring.match(pn, "^(.*)(" .. validCountyEncoded .. ")(.*)$")

	

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

		local i

		for i = 1, level do

			if (i % 2) == 1 then

				debugmsg = debugmsg .. "#"

			else

				debugmsg = debugmsg .. "*"

			end

		end 

	end

	debugmsg = debugmsg .. " " .. msg

	return true

end





function getYesNoParam(args, thisParamName, defaultVal)

	local returnValue

	debugLog(2, "Evaluate yes/no parameter: [" .. thisParamName .. "] = [" .. (((argsthisParamName == nil) and "") or argsthisParamName]) .. "]")

	debugLog(3, "default = " .. ((defaultVal and "Yes") or "No"))

	debugLog(3, "Evaluate as: ")

	returnValue = yesno(argsthisParamName], defaultVal)

	if (returnValue) then

		debugLog(nil, "Yes")

	else

		debugLog(nil, "No")

	end

	return returnValue

end



function p.main(frame)

	debugLog(1, "Check parameters")

	debugging = getYesNoParam(frame.args, "debug", false)

	useCountyWord = getYesNoParam(frame.args, "usecountyword", true)

	displayAbbrevCounty = getYesNoParam(frame.args, "abbrev", false)

	includeNewCounties = getYesNoParam(frame.args, "newcounties", true)



	countySetParam = "twentysixplussix" -- default

	debugLog(2, "countySet")

	if ((frame.args'countyset' == nil) or (frame.args'countyset' == "")) then

		debugLog(3, "not set")

		countySet = nil

	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 .. "]")

			if (countySetParam == "gaa") then

				useCountyWord = false

				includeNewCounties = false

				debugLog(5, "Yes/no parameter [newcounties] reset to [no]")

				debugLog(5, "Yes/no parameter [usecountyword] reset to [no]")

			end

		else

			countySet = nil

			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

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook