Jump to content

Module:Type in location: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
fix per VPT
New test entry point, handle unicode, allow lc patterns, Lua cleanup, fix whitespace bug. Created test cases: passed
Line 11: Line 11:
text = plaintext(text)
text = plaintext(text)
text = text..',' --comma at the end makes things convenient
text = text..',' --comma at the end makes things convenient
text = text:gsub('%b()', ', ') --remove things in brackets as extraneous information
text = mw.ustring.gsub(text,'%b()', ', ') --remove things in brackets as extraneous information
:gsub('[^%s,]*%d[^%s,]*', '') --remove things with digits as generally being unnecessary postal codes/road numbers etc
text = mw.ustring.gsub(text,'[^%s,]*%d[^%s,]*', '') --remove things with digits as generally being unnecessary postal codes/road numbers etc
:gsub('(,%s-),', '%1') --fix possible blank separated commas from previous cleanup
text = mw.ustring.gsub(text,'(,%s-),', '%1') --fix possible blank separated commas from previous cleanup
:gsub('%s%s', ' ') --fix possible extra spaces from previous cleanup
text = mw.ustring.gsub(text,'%s%s', ' ') --fix possible extra spaces from previous cleanup
:gsub('^[%s,]*', '') --trim commas and spaces from beginning
text = mw.ustring.gsub(text,'^[%s,]*', '') --trim commas and spaces from beginning
:gsub('[%s,]*$', '') --trim commas and spaces from end
text = mw.ustring.gsub(text,'[%s,]*$', '') --trim commas and spaces from end
return text
return text
end
end
Line 33: Line 33:
local num = 0
local num = 0
loc = loc..',' --comma at the end for convenient splitting with gmatch
loc = loc..',' --comma at the end for convenient splitting with gmatch
for k in loc:gmatch('([^,]*),') do --split by commas
for k in mw.ustring.gmatch(loc,'([^,]*),') do --split by commas
table.insert(split, k)
table.insert(split, k)
num = num + 1
num = num + 1
Line 46: Line 46:
--validate type parameter
--validate type parameter
function p.validateTyp (typ, args)
function p.validateTyp (typ, args)
args = args or {}
local checkpatterns = args['check-patterns']
local checkpatterns = args['check-patterns']
local invalidadd = args.invalidadd
local invalidadd = args.invalidadd
if checkpatterns then
if checkpatterns then
for k in (checkpatterns..';'):gmatch('([^;]*);') do --split checkpatterns by ;, check if one of the patterns is in type
for k in mw.ustring.gmatch(checkpatterns..';','([^;]*);') do --split checkpatterns by ;, check if one of the patterns is in type
if typ:match(k) then return typ end
if mw.ustring.match(mw.ustring.lower(typ),k) then
return typ
end
end
end
if invalidadd then --if invalid, add to make it valid
if invalidadd then --if invalid, add to make it valid
Line 60: Line 63:
end
end


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

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

function p._main (args, frame)
local cleanupLoc = require('Module:Settlement short description').cleanupLoc
local cleanupLoc = require('Module:Settlement short description').cleanupLoc
local typ = args[1]
local typ = args[1]
Line 82: Line 74:
if loc then
if loc then
loc = p[func](loc)
loc = p[func](loc)
loc = cleanupLoc (loc)
loc = mw.text.trim(cleanupLoc(loc))
if loc then loc = sep..loc else loc = "" end
loc = loc and sep..loc or ""
else
else
loc = ""
loc = ""
end
end
typ = p.validateTyp (typ, args)
typ = p.validateTyp (typ, args)
if typ then return p.shortdesc(language:ucfirst(typ..loc), frame) end
return typ and language:ucfirst(typ..loc)
end

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

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

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

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



Revision as of 14:32, 27 April 2023

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 (frame)
	return p._prepareLoc (frame.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 (frame)
	return p._generalLoc (frame.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]
	if typ then typ = plaintext(args[1]) end
	if not typ then return end --check after plaintexting if typ exists
	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]
	local func
	if args['full-loc'] then func = '_prepareLoc' else func =  '_generalLoc' end
	if loc then
		loc = p[func](loc)
		loc = mw.text.trim(cleanupLoc(loc))
		loc = loc and sep..loc or ""
	else
		loc = ""
	end
	typ = p.validateTyp (typ, args)
	return typ and language:ucfirst(typ..loc)
end

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

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

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

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

return p