モジュール: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)
	init1, init3 = init3, init1
	return init
end
--Display short description using 
function p.shortdesc(text, frame)
	return frame:expandTemplate{title = 'Short description', args = {text, 'noreplace'}}
end
function p.category (cattype)
	local category = string.format(, 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 etxtraneous 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/subdivions
		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",
		"London, England" = "London"
	}
	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 subdivisions = {}
	local args = getArgs (frame, {frameOnly = true})
	local settlement_type = p.validate(plain(args1), "settlement type") or "Place"
	local short_description = plain(args2)
	subdivisions1 = p.validate(plain(args3))
	subdivisions2 = p.validate(plain(args4))
	subdivisions3 = p.validate(plain(args5))
	
	if short_description then
		if (short_description == 'no') then
			return
		else
			return p.shortdesc(short_description, frame)
		end
	end
	
	if not(subdivisions3 and
		(string.find(settlement_type, 'nNeighbou?rhood') or string.find(settlement_type, 'sSuburb'))) then
		subdivisions3 = nil --only display the third subdivision_type if suburb or neighborhood
	end
	
	for x, y in ipairs (subdivisions) do
		if y then
			if string.find(settlement_type, y, 1, true) then --if the subdivision is found within the settlement type
				subdivisionsx = 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 subdivisions
				subdivisionsx = nil --don't display redundancy
			end
		end
	end
	local location = table.concat(tableTools.compressSparseArray(p.reverseTable(subdivisions)), ', ')
	
	location = p.cleanupLoc (location)
	
	if location then location =  " in " .. location else location = "" end
	return p.shortdesc(settlement_type..location, frame)..p.categories
end
return p