Module:Geography: Difference between revisions
Robertbaxter (talk | contribs) No edit summary |
Robertbaxter (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local CLASS_INFO = { | |||
place = { | |||
standard_category = "Places in @@@@" | |||
}, event = { | |||
standard_category = "Events in @@@@", | |||
multi_category = { | |||
country = "International events", | |||
state_province = "Multi-state/province events", | |||
city = "Multi-city events" | |||
} | |||
} | |||
} | |||
function p.geoCategories(frame) | |||
local args = frame.args or frame:getParent().args | local args = frame.args or frame:getParent().args | ||
local class = args[ | local class = args["class"] | ||
local country = args[ | local country = args["country"] | ||
local regional = args[region] | local state_province = args["state_province"] | ||
local city = args["city"] | |||
local regional = args["region"] | |||
local result = "" | local result = "" | ||
if country ~= nil then | |||
result = result .. geographicCategory(countryWithArticle(country), class, "country") | |||
if country | end | ||
if state_province ~= nil then | |||
result = result .. geographicCategory(state_province, class, "state_province") | |||
end | |||
if city ~= nil then | |||
result = result .. geographicCategory(city, class, "city") | |||
end | |||
if regional and country ~= nil then | |||
result = result .. geographicCategory(getRegion(country), class, "region") | |||
end | end | ||
return result | |||
end | end | ||
-- DEPRECATED | -- DEPRECATED | ||
Line 66: | Line 59: | ||
-- the blank string). | -- the blank string). | ||
local function sharedPlace(list) | local function sharedPlace(list) | ||
local result = | local result = "" | ||
if type(list) == string then | |||
for name in string.gmatch(list, "[^,]+") do | |||
name = name:gsub("^%s*(.-)%s*$", "%1") | |||
if name ~= "" then | |||
if result == "" then | |||
result = name | |||
elseif result ~= name then | |||
return false | |||
end | |||
end | |||
end | end | ||
elseif type(list) == table then | |||
for name in list do | |||
if name ~= "" then | |||
if result == "" then | |||
result = name | |||
elseif result ~= name then | |||
return false | |||
end | |||
end | |||
end | |||
end | end | ||
if | return result | ||
end | |||
-- Base function to generate a category for a geographic division given a | |||
-- data string (the name of that division or a CSV list of multiple names | |||
-- (primarily for events taking place in multiple areas). | |||
function geographicCategory(data, class, division) | |||
if data == "" then return "" end | |||
if data:match(',') then | |||
-- Query is a list, determine if the items in the list are identical. | |||
local shared = sharedPlace(data) | |||
if shared == false then | |||
-- If they are differnt, need to render a multi-category (if there | |||
-- is one for the specified class + division) or each unique | |||
-- category (if not). | |||
if CLASS_INFO[class]["multi-category"] ~= nil | |||
and CLASS_INFO[class]["multi-category"][division] ~= nil then | |||
return "[[Category:" .. CLASS_INFO[class]["multi-category"][division] .. "]]" | |||
else | |||
local result = "" | |||
local history = {} | |||
for name in string.gmatch(list, "[^,]+") do | |||
name = name:gsub("^%s*(.-)%s*$", "%1") | |||
if name ~= "" and not history[name] then | |||
history[name] = true | |||
result = result .. geographicCategory(name, class, division) | |||
end | |||
end | |||
return result | |||
end | |||
else | |||
-- Items in the list match, just render the category for the | |||
-- shared value. | |||
data = shared | |||
end | |||
end | |||
return "[[Category:" .. CLASS_INFO[class]["standard_category"].gsub("@@@@", data) .. "]]" | |||
end | end | ||
function getRegion(country) | function getRegion(country) | ||
-- Switch on the provided country and return the region string. | -- Switch on the provided country and return the region string. | ||
end | |||
function countryWithArticle(country) | |||
-- Adds the article "the" to country names that use it | |||
-- (e.g. "the Netherlands"). | |||
end | end | ||
return p | return p |
Revision as of 03:09, 11 January 2025
Documentation for this module may be created at Module:Geography/doc
local p = {}
local CLASS_INFO = {
place = {
standard_category = "Places in @@@@"
}, event = {
standard_category = "Events in @@@@",
multi_category = {
country = "International events",
state_province = "Multi-state/province events",
city = "Multi-city events"
}
}
}
function p.geoCategories(frame)
local args = frame.args or frame:getParent().args
local class = args["class"]
local country = args["country"]
local state_province = args["state_province"]
local city = args["city"]
local regional = args["region"]
local result = ""
if country ~= nil then
result = result .. geographicCategory(countryWithArticle(country), class, "country")
end
if state_province ~= nil then
result = result .. geographicCategory(state_province, class, "state_province")
end
if city ~= nil then
result = result .. geographicCategory(city, class, "city")
end
if regional and country ~= nil then
result = result .. geographicCategory(getRegion(country), class, "region")
end
return result
end
-- DEPRECATED
function p.sharedPlace(frame)
local args = frame.args or frame:getParent().args
local a = ""
local b = true
for name in string.gmatch(args[1], "[^,]+") do
name = name:gsub("^%s*(.-)%s*$", "%1")
if a == "" then
a = name
elseif a ~= name then
b = false
end
end
if b then return a else return "" end
end
-- If all strings in the list are identical, returns the string, otherwise
-- returns nil (ignores blank string items, if all strings are blank returns
-- the blank string).
local function sharedPlace(list)
local result = ""
if type(list) == string then
for name in string.gmatch(list, "[^,]+") do
name = name:gsub("^%s*(.-)%s*$", "%1")
if name ~= "" then
if result == "" then
result = name
elseif result ~= name then
return false
end
end
end
elseif type(list) == table then
for name in list do
if name ~= "" then
if result == "" then
result = name
elseif result ~= name then
return false
end
end
end
end
return result
end
-- Base function to generate a category for a geographic division given a
-- data string (the name of that division or a CSV list of multiple names
-- (primarily for events taking place in multiple areas).
function geographicCategory(data, class, division)
if data == "" then return "" end
if data:match(',') then
-- Query is a list, determine if the items in the list are identical.
local shared = sharedPlace(data)
if shared == false then
-- If they are differnt, need to render a multi-category (if there
-- is one for the specified class + division) or each unique
-- category (if not).
if CLASS_INFO[class]["multi-category"] ~= nil
and CLASS_INFO[class]["multi-category"][division] ~= nil then
return "[[Category:" .. CLASS_INFO[class]["multi-category"][division] .. "]]"
else
local result = ""
local history = {}
for name in string.gmatch(list, "[^,]+") do
name = name:gsub("^%s*(.-)%s*$", "%1")
if name ~= "" and not history[name] then
history[name] = true
result = result .. geographicCategory(name, class, division)
end
end
return result
end
else
-- Items in the list match, just render the category for the
-- shared value.
data = shared
end
end
return "[[Category:" .. CLASS_INFO[class]["standard_category"].gsub("@@@@", data) .. "]]"
end
function getRegion(country)
-- Switch on the provided country and return the region string.
end
function countryWithArticle(country)
-- Adds the article "the" to country names that use it
-- (e.g. "the Netherlands").
end
return p