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

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.