Module:Settlement short description

--generates auto short description for use in infobox settlement

local p = {}

p.categories = ""

local plain = require('Module:Plain text')._main

local getArgs = require('Module:Arguments').getArgs

local tableTools = require ('Module:TableTools')

function p.reverseTable (init)

init[1], init[3] = init[3], init[1]

return init

end

function p.assign (args, argname, num)

local val

local var = {}

for i = 0,num do

--handle initial "subdivision_foo" without number

if i == 0 then

val = ""

else

val = tostring(i)

end

var[i+1] = p.validate(plain(args[argname..val]))

end

return var

end

--Display short description using {{short description}}

function p.shortdesc(text, frame)

return frame:expandTemplate{title = 'Short description', args = {text, 'noreplace'}}

end

function p.category (cattype)

local category = string.format('Category:Pages using infobox settlement with bad %s', cattype)

if category then p.categories = p.categories..category end --categorize

end

--sanity and other checks

function p.validate (parameter, cat)

if not parameter then return nil end

parameter = parameter:gsub('%b()', '') --remove things in brackets as extraneous information

:gsub('%s+', ' ') --fix possible extra spaces from previous cleanup

:gsub('^%s+', '') --trim spaces from beginning

:gsub('%s+$', '') --trim spaces from end

if parameter:match("[,;]") or not parameter:match("%a") then --must have some letters, ignore if multiple types/subdivisions

if cat then p.category (cat) end

return nil

end

if (parameter == "") then return nil end

return parameter

end

--removes redundancy like "England, United Kingdom" and fixes issues like "Foo in United States" (to "Foo in the United States")

--also used in Module:Type in location

function p.cleanupLoc (location)

if location == "" then return nil end

local replacements = {

["England, United Kingdom"] = "England",

["Scotland, United Kingdom"] = "Scotland",

["Wales, United Kingdom"] = "Wales",

["New York City, New York, United States"] = "New York City",

["^United States$"] = "the United States",

["London, United Kingdom"] = "London, England"

}

for i, v in pairs(replacements) do

location = location:gsub(i, v) --series of replacements

end

return location

end

function p.main(frame)

local categories = ""

local subdivision_types = {}

local subdivision_names = {}

local args = getArgs (frame, {parentOnly = true})

local settlement_type = p.validate(plain(args.settlement_type or args.type), "settlement type") or "Place"

local short_description = plain(args.short_description)

subdivision_types = p.assign(args, "subdivision_type", 2)

subdivision_names = p.assign(args, "subdivision_name", 2)

if short_description then

if (short_description == 'no') then

return

else

local language = mw.language.getContentLanguage()

return p.shortdesc(language:ucfirst(short_description), frame)

end

end

if not(subdivision_names[3] and

(string.find(settlement_type, '[nN]eighbo[u]?rhood') or string.find(settlement_type, '[sS]uburb'))) then

subdivision_names[3] = nil --display the third subdivision_type only if suburb or neighborhood

end

--if say "Voivodeship" is found within the subdivision_type, then specially handle

--by adding Voivodeship to the end if not already present

for x, y in ipairs (subdivision_types) do

local special_types = {

"Voivodeship"

}

for i, j in ipairs(special_types) do

if subdivision_names[x] and string.find(y, j, 1, true)

and not string.find(subdivision_names[x], j, 1, true) then

subdivision_names[x] = subdivision_names[x].." "..j

end

end

end

for x, y in ipairs (subdivision_names) do

if y then

if string.find(settlement_type, y, 1, true) then --if the subdivision is found within the settlement type

subdivision_names[x] = nil --don't display redundancy

p.category ("settlement type")

end

if y == mw.title.getCurrentTitle().text then --if the title is the same as one of the subdivision_names

subdivision_names[x] = nil --don't display redundancy

end

end

end

local location = table.concat(tableTools.compressSparseArray(p.reverseTable(subdivision_names)), ', ')

location = p.cleanupLoc (location)

if location then location = " in " .. location else location = "" end

local language = mw.language.getContentLanguage()

return p.shortdesc(language:ucfirst(settlement_type..location), frame)..p.categories

end

return p