# Module:Type in location

local p = {}  
local plaintext = require("Module:Plain text")._main  
local language = mw.language.getContentLanguage  

--Cleanup/format location for use in short descriptions  
function p.prepareLoc  
return p._prepareLoc (.args[1])  
end  

function p._prepareLoc (text)  
text = plaintext(text)  
text = text..',' --comma at the end makes things convenient  
text = mw.ustring.gsub(text,'%b', ', ') --remove things in brackets as extraneous information  
text = mw.ustring.gsub(text,'[^%s,]*%d[^%s,]*', '') --remove things with digits as generally being unnecessary postal codes/road numbers etc  
text = mw.ustring.gsub(text,'(,%s-),', '%1') --fix possible blank separated commas from previous cleanup  
text = mw.ustring.gsub(text,'%s%s', ' ') --fix possible extra spaces from previous cleanup  
text = mw.ustring.gsub(text,'^[%s,]*', '') --trim commas and spaces from beginning  
text = mw.ustring.gsub(text,'[%s,]*$', '') --trim commas and spaces from end  
return text  
end  

--Gets general location from more specific one for short descriptions  
--i.e if a location is specified to be "P. Sherman 42 Wallaby Way Sydney, Australia", return "Sydney, Australia"  
--splits by commas and returns last two entries  

function p.generalLoc  
return p._generalLoc (.args[1])  
end  

function p._generalLoc (loc)  
loc = p._prepareLoc(loc)  
local split = {}  
local num = 0  
loc = loc..',' --comma at the end for convenient splitting with gmatch  
for k in mw.ustring.gmatch(loc,'([^,]*),') do --split by commas  
table.insert(split, k)  
num = num + 1  
end  
if num == 1 then --if only comma was the one at the end return the whole thing  
return split[1]  
else  
return split[num-1]..','..split[num] --return last two entries separated by commas  
end  
end  

--validate type parameter  
function p.validateTyp (typ, args)  
args = args or {}  
local checkpatterns = args['check-patterns']  
local invalidadd = args.invalidadd  
if checkpatterns then  
for k in mw.ustring.gmatch(checkpatterns..';','([^;]*);') do --split checkpatterns by ;, check if one of the patterns is in type  
if mw.ustring.match(mw.ustring.lower(typ),k) then  
return typ  
end  
end  
if invalidadd then --if invalid, add to make it valid  
return typ..' '..invalidadd  
end  
else  
return typ  
end  
end  

function p._generateDesc (args)  
local cleanupLoc = require('Module:Settlement short description').cleanupLoc  
local typ = args[1] or ""  
typ = plaintext(args[1]) or ""  
if #typ == 0 then return end -- bail out if type is empty  
local sep = ((args.sep == 'no') and '') or args.sep or ' in ' --if args.sep set to no, nothing between typ and loc, if it has other value put that  
local loc = args[2] or ""  
local func  
if args['full-loc'] then func = '_prepareLoc' else func = '_generalLoc' end  
loc = p[func](loc) or ""  
loc = cleanupLoc(loc) or ""  
loc = mw.text.trim(loc)  
loc = loc and #loc > 0 and sep..loc or ""  
typ = p.validateTyp (typ, args)  
return typ and language:ucfirst(typ..loc)  
end  

function p.generateDesc  
local args = require('Module:Arguments').getArgs  
return p._generateDesc(args) or ""  
end  

--Display short description using  
function p.shortdesc(text, )  
= or mw.getCurrentFrame  
return :expandTemplate{title = 'Short description', args = {text, 'noreplace'}}  
end  

function p._main(args, )  
= or mw.getCurrentFrame  
local desc = p._generateDesc(args)  
return desc and p.shortdesc(desc, )  
end  

--generates type in location  
function p.main  
local args = require('Module:Arguments').getArgs (, {frameOnly = true})  
return p._main(args, ) or ""  
end  

return p