Module:Sandbox/Innesw/Infobox Australian place

-- This is Template:Infobox_Australian_place converted to Lua

local p = {} local lframe

local shortDescription = require('Module:GetShortDescription').main local plainText = require('Module:Plain text')._main local infobox = require('Module:Infobox').infobox local getArgs = require('Module:Arguments').getArgs local infoboxImage = require('Module:InfoboxImage').InfoboxImage local australianPlaceMap = require('Module:Australian place map').main local coordinates = require('Module:Coordinates').coordinsert local populationFromWikidata = require('Module:PopulationFromWikidata').ListForInfobox local url = require('Module:URL')._url local check = require('Module:Check for unknown parameters')._check

local lang = mw.language.getContentLanguage

local function inb(s) -- is not blank return s and s ~= '' end

local function backcolour(typ) local colour if typ == 'city' then colour = '#f9f6d2' elseif typ == 'town' then colour = '#e9f9d2' elseif typ == 'suburb' then colour = '#f9e2d2' elseif typ == 'lga' then colour = '#d2d5f9' elseif typ == 'region' then colour = '#e6c4fb' elseif typ == 'cadastral' then colour = '#ffffe0' elseif typ == 'protected' then colour = 'transparent' elseif typ == 'other' then colour = 'transparent' else colour = '#ccc' end return colour end

local function state_longname(state) state = string.lower(state) local longname if state == 'sa' then longname = 'South Australia' elseif state == 'vic' then longname = 'Victoria' elseif state == 'nsw' then longname = 'New South Wales' elseif state == 'qld' then longname = 'Queensland' elseif state == 'nt' then longname = 'Northern Territory' elseif state == 'wa' then longname = 'Western Australia' elseif state == 'tas' then longname = 'Tasmania' elseif state == 'act' then longname = 'Australian Capital Territory' elseif state == 'jbt' then longname = 'Jervis Bay Territory' elseif state == 'ni' then longname = 'Norfolk Island' elseif state == 'au' then longname = 'Australia' elseif inb(state) then -- state supplied, but with unrecognised value longname = lframe:expandTemplate{title = 'error', args = {'Error: unknown  value (=' .. state .. ') (help)'} } else -- state not supplied longname = lframe:expandTemplate{title = 'error', args = {'Error:  not defined (help)'} } end return longname end

local function coords_region(state) state = string.lower(state) local region if state == 'sa' then region = 'AU-SA' elseif state == 'vic' then region = 'AU-VIC' elseif state == 'nsw' then region = 'AU-NSW' elseif state == 'qld' then region = 'AU-QLD' elseif state == 'nt' then region = 'AU-NT' elseif state == 'wa' then region = 'AU-WA' elseif state == 'tas' then region = 'AU-TAS' elseif state == 'act' then region = 'AU-ACT' elseif state == 'jbt' then region = 'AU-JBT' elseif state == 'ni' then region = 'NF' else region = 'AU' end return region end

local function location(loc, dir, dist, list) if not (inb(loc) and inb(dist)) then return '' end local sloc = {} if list then table.insert(sloc, '') end table.insert(sloc, lframe:expandTemplate{title = 'convert', args = {dist, 'km', 'mi', 0, abbr='on'} }) if inb(dir) then table.insert(sloc, ' ' .. dir .. ' of ') else table.insert(sloc, ' from ') end if inb(loc) then table.insert(sloc, lframe:expandTemplate{title = 'auto link', args = {loc} }) end if list then table.insert(sloc, '') end return table.concat(sloc) end

local function lgas_article(state) state = string.lower(state) local art if state == 'sa' then art = 'LGA(s)' elseif state == 'vic' then art = 'LGA(s)' elseif state == 'nsw' then art = 'LGA(s)' elseif state == 'qld' then art = 'LGA(s)' elseif state == 'nt' then art = 'LGA(s)' elseif state == 'wa' then art = 'LGA(s)' elseif state == 'tas' then art = 'LGA(s)' elseif state == 'act' then art = 'District' else art = 'LGA(s)' end return art end

local function pageExists(pagename) local pageTitle = mw.title.makeTitle("", pagename) if pageTitle then return pageTitle.exists end return false end

local function state_protectedPage(state) state = string.lower(state) local prot if state == 'sa' then prot = 'Protected areas of South Australia' elseif state == 'vic' then prot = 'Protected areas of Victoria' elseif state == 'nsw' then prot = 'Protected areas of New South Wales' elseif state == 'qld' then prot = 'Protected areas of Queensland' elseif state == 'nt' then prot = 'Protected areas of the Northern Territory' elseif state == 'wa' then prot = 'List of protected areas of Western Australia' elseif state == 'tas' then prot = 'Protected areas of Tasmania' elseif state == 'act' then prot = 'Australian Capital Territory protected areas' else prot = nil end return prot end

local function shortDesc(args) local sd = {}

-- only set short description in article namespace, and for articles where not already set local title = mw.title.getCurrentTitle if title.namespace == 0 and shortDescription({name=title.text, only='explicit'}) == '' then table.insert(sd, '') end

return table.concat(sd) end

local function ibox(args) local tmp

local InfoboxArgs = {} local typ = (args.type or ''):lower local city = args.city or '' local state = (args.state or ''):lower local name = args.name or ''

InfoboxArgs.bodyclass = 'vcard'

InfoboxArgs.abovestyle = 'font-size: 125%; line-height: 1.3em; background-color:' .. backcolour(typ) if inb(name) then tmp = ' ' .. name .. ' '       if inb(args.native_name) then tmp = tmp .. '' .. args.native_name .. ' '       end tmp = tmp .. ' '       if city ~= '' then tmp = tmp .. lframe:expandTemplate{title = 'auto link', args = { city } } .. ', '       end tmp = tmp .. state_longname(state) ..' ' InfoboxArgs.above = tmp end InfoboxArgs.aboveclass = 'adr' InfoboxArgs.subheaderstyle = 'font-size: 100%;' if typ == 'protected' then InfoboxArgs.subheader1 = lframe:expandTemplate{ title = 'IUCN banner', args = { (args.iucn_category or ), (args.iucn_ref or ) } } end

if inb(args.image) then local siz if inb(args.image_size) then siz = args.image_size elseif inb(args.imagesize) then siz = args.imagesize end local upr = '1.23' if inb(args.image_upright) then upr = args.image_upright end local ialt if inb(args.image_alt) then ialt = args.image_alt elseif inb(args.alt) then ialt = args.alt end InfoboxArgs.image = infoboxImage{args = {image = args.image, size = siz, sizedefault = 'frameless', upright = upr, alt = ialt} } end InfoboxArgs.imagestyle = nil InfoboxArgs.caption = (args.caption or '') InfoboxArgs.captionstyle = nil if inb(args.image2) then local siz if inb(args.image_size2) then siz = args.image_size2 elseif inb(args.imagesize2) then siz = args.imagesize2 end local upr = '1.23' if inb(args.image2_upright) then upr = args.image2_upright end local ialt if inb(args.image2_alt) then ialt = args.image2_alt elseif inb(args.alt2) then ialt = args.alt2 end InfoboxArgs.image2 = infoboxImage{args = {image = args.image2, size = siz, sizedefault = 'frameless', upright = upr, alt = ialt} } end InfoboxArgs.caption2 = (args.caption2 or '')

InfoboxArgs.headerstyle = 'background-color:#ddf;' InfoboxArgs.labelstyle = 'width:40%; background-color:' .. backcolour(typ) InfoboxArgs.datastyle = nil

InfoboxArgs.data1 = australianPlaceMap(lframe)

InfoboxArgs.data2 = nil if inb(args.local_map) then InfoboxArgs.data2 = lframe:expandTemplate{ title = 'Infobox mapframe', args = {zoom = (args.zoom or ), id = (args.local_map_id or )} } end

InfoboxArgs.label3 = ' Nearest town or city ' InfoboxArgs.data3 = nil if typ == 'protected' then InfoboxArgs.data3 = lframe:expandTemplate{ title = 'auto link', args = {(args.nearest_town_or_city or '') } } end

InfoboxArgs.label4 = 'Coordinates' InfoboxArgs.data4 = nil if inb(args.coordinates) then -- the type: and region: parameters to Module:Coordinates seem to be over-ridden by this code, even though they could be in the call that produces the content of the coordinates parameter local mtyp = '' if typ == 'protected' then mtyp = 'landmark' else mtyp = 'city' end InfoboxArgs.data4 = coordinates{args = {args.coordinates, 'type:' .. mtyp, 'region:' .. coords_region(state)} } .. (args.coord_ref or '') end

InfoboxArgs.label6 = 'Population' tmp = nil if inb(args.pop) then if inb(args.pop2) then tmp = '' else tmp = '' end if tonumber(args.pop) then -- pop looks like a number tmp = tmp .. lang:formatNum(tonumber(args.pop)) else -- just show it           tmp = tmp .. args.pop end if inb(args.pop_year) then tmp = tmp .. ' (' .. args.pop_year .. ')' end tmp = tmp .. (args.pop_footnotes or '') if inb(args.poprank) then tmp = tmp .. ' (' .. args.poprank .. ')' end if inb(args.pop2) then tmp = tmp .. ' ' if tonumber(args.pop2) then -- pop2 looks like a number tmp = tmp .. lang:formatNum(tonumber(args.pop2)) else -- just show it               tmp = tmp .. args.pop2 end if inb(args.pop2_year) then tmp = tmp .. ' (' .. args.pop2_year .. ')' end tmp = tmp .. (args.pop2_footnotes or '') tmp = tmp .. '' end else local wdpop = populationFromWikidata{args = {type = typ, wikidata = (args.wikidata or '')} } if inb(wdpop) then -- The here prevents the output from populationFromWikidata appearing above the infobox instead of within it. --   I don't know why, but the output from  in the template version is treated properly, --   but the output from calling require('Module:PopulationFromWikidata').ListForInfobox in this module is not, requiring this fix. tmp = ' ' .. wdpop .. ' '       end end InfoboxArgs.data6 = tmp

InfoboxArgs.label7 = ' • Density' tmp = nil if inb(args.density) then tmp = lframe:expandTemplate{ title = 'convert', args = {args.density, '/km2', '/sqmi', abbr='on'} } .. ' ' .. (args.density_footnotes or '') else if inb(args.pop) and lang:parseFormattedNumber(args.pop) and inb(args.area) then tmp = lframe:expandTemplate{ title = 'Pop density', args = {lang:parseFormattedNumber(args.pop), args.area, 'km2', 'sqmi'} } .. ' ' .. (args.density_footnotes or '') end end InfoboxArgs.data7 = tmp

InfoboxArgs.label8 = 'Established' tmp = nil if inb(args.established) then tmp = args.established .. (args.established_footnotes or '') elseif inb(args.est) then tmp = args.est .. (args.established_footnotes or '') end InfoboxArgs.data8 = tmp

InfoboxArgs.label9 = 'Abolished' InfoboxArgs.data9 = args.abolished or '' InfoboxArgs.label10 = 'Gazetted' InfoboxArgs.data10 = args.gazetted or '' InfoboxArgs.label11 = 'Postcode(s)' InfoboxArgs.data11 = args.postcode or '' InfoboxArgs.label12 = 'Elevation' if inb(args.elevation) then InfoboxArgs.data12 = lframe:expandTemplate{ title = 'convert', args = {args.elevation, 'm', 'ft', 0, abbr='on'} } .. (args.elevation_footnotes or '') end InfoboxArgs.label13 = 'Area' if inb(args.area) then InfoboxArgs.data13 = lframe:expandTemplate{ title = 'convert', args = {args.area, 'km2', 'sqmi', 1, abbr='on'} } .. (args.area_footnotes or '') end

InfoboxArgs.label14 = 'Time zone' if inb(args.timezone) then InfoboxArgs.data14 = args.timezone .. ' ' .. '(UTC' .. (args.utc or '') .. ')' end

InfoboxArgs.label15 = ' • Summer (DST)' if inb(args['timezone-dst']) then InfoboxArgs.data15 = args['timezone-dst'] .. ' ' .. '(UTC' .. (args['utc-dst'] or '') .. ')' end

InfoboxArgs.label16 = (args.mayortitle or 'Mayor') if typ == 'lga' and inb(args.mayor) then InfoboxArgs.data16 = args.mayor end

InfoboxArgs.label17 = 'Location' tmp = '' if inb(args.dist2) then tmp = '' tmp = tmp .. location(args.location1, args.dir1, args.dist1, true) tmp = tmp .. location(args.location2, args.dir2, args.dist2, true) tmp = tmp .. location(args.location3, args.dir3, args.dist3, true) tmp = tmp .. location(args.location4, args.dir4, args.dist4, true) tmp = tmp .. location(args.location5, args.dir5, args.dist5, true) tmp = tmp .. '' elseif inb(args.location1) then tmp = location(args.location1, args.dir1, args.dist1, false) end InfoboxArgs.data17 = tmp

InfoboxArgs.label18 = lgas_article(state) tmp = nil if inb(args.lga) then local lga2 = args.lga2 or '' if lga2 ~= '' then tmp = '' else tmp = '' end tmp = tmp .. lframe:expandTemplate{title = 'auto link', args = {args.lga} } if lga2 ~= '' then tmp = tmp .. '' .. lframe:expandTemplate{title = 'auto link', args = {lga2} } .. '' end if inb(args.lga3) then tmp = tmp .. '<li>' .. lframe:expandTemplate{title = 'auto link', args = {args.lga3} } .. '</li>' end if inb(args.lga4) then tmp = tmp .. '<li>' .. lframe:expandTemplate{title = 'auto link', args = {args.lga4} } .. '</li>' end if inb(args.lga5) then tmp = tmp .. '<li>' .. lframe:expandTemplate{title = 'auto link', args = {args.lga5} } .. '</li>' end if lga2 ~= '' then tmp = tmp .. '</ul>' end end InfoboxArgs.data18 = tmp InfoboxArgs.label19 = 'Council seat' InfoboxArgs.data19 = args.seat or ''

InfoboxArgs.label20 = 'Region' if inb(args.region) then InfoboxArgs.data20 = lframe:expandTemplate{title = 'auto link', args = {args.region} } end

InfoboxArgs.label21 = 'County' if inb(args.county) then InfoboxArgs.data21 = lframe:expandTemplate{title = 'auto link', args = {args.county} } end InfoboxArgs.label22 = 'Parish' InfoboxArgs.data22 = args.parish or '' if typ == 'cadastral' then InfoboxArgs.label23 = 'Hundred' InfoboxArgs.data23 = args.hundred or '' InfoboxArgs.label24 = 'Hundred (former)' InfoboxArgs.data24 = args.former_hundred or '' InfoboxArgs.label25 = 'Division' InfoboxArgs.data25 = args.division or '' end if state == 'act' or state == 'nt' or state == 'jbt' then InfoboxArgs.label26 = 'Territory electorates(s)' else InfoboxArgs.label26 = 'State electorate(s)' end tmp = nil if inb(args.stategov) then local stategov2 = (args.stategov2 or '') if stategov2 ~= '' then tmp = '<ul style="margin-top: 0px; margin-bottom: 0px;"><li>' else tmp = '' end tmp = tmp .. args.stategov if stategov2 ~= '' then tmp = tmp .. '</li><li>' .. stategov2 .. '</li>' end if inb(args.stategov3) then tmp = tmp .. '<li>' .. args.stategov3 .. '</li>' end if inb(args.stategov4) then tmp = tmp .. '<li>' .. args.stategov4 .. '</li>' end if inb(args.stategov5) then tmp = tmp .. '<li>' .. args.stategov5 .. '</li>' end if stategov2 ~= '' then tmp = tmp .. '</ul>' end end InfoboxArgs.data26 = tmp

InfoboxArgs.label27 = 'Federal division(s)' tmp = nil if inb(args.fedgov) then local fedgov2 = args.fedgov2 or '' if fedgov2 ~= '' then tmp = '<ul style="margin-top: 0px; margin-bottom: 0px;"><li>' else tmp = '' end tmp = tmp .. args.fedgov if fedgov2 ~= '' then tmp = tmp .. '</li><li>' .. fedgov2 .. '</li>' end if inb(args.fedgov3) then tmp = tmp .. '<li>' .. args.fedgov3 .. '</li>' end if inb(args.fedgov4) then tmp = tmp .. '<li>' .. args.fedgov4 .. '</li>' end if fedgov2 ~= '' then tmp = tmp .. '</ul>' end end InfoboxArgs.data27 = tmp

if inb(args.logo) then local siz if inb(args.logosize) then siz = args.logosize end local upr = '0.8' if inb(args.logo_upright) then upr = args.logo_upright end local lalt if inb(args.logo_alt) then lalt = args.logo_alt end InfoboxArgs.data28 = infoboxImage{args = {image = args.logo, size = siz, sizedefault = 'frameless', upright = upr, alt = lalt} } end

InfoboxArgs.label29 = 'Visitation' if typ == 'protected' then tmp = nil if inb(args.visitation_num) then if tonumber(args.visitation_num) then -- visitation_num looks like a number tmp = lang:formatNum(tonumber(args.visitation_num)) else -- just show it               tmp = args.visitation_num end if inb(args.visitation_year) then tmp = tmp .. ' (in ' .. args.visitation_year .. ')' end tmp = tmp .. (args.visitation_footnotes or '') InfoboxArgs.data29 = tmp end InfoboxArgs.label30 = ' Managing authorities ' if inb(args.managing_authorities) then InfoboxArgs.data30 = lframe:expandTemplate{title = 'auto link', args = {args.managing_authorities} } end end

InfoboxArgs.label31 = 'Website' if inb(args.url) then InfoboxArgs.data31 = url(args.url, name) .. ' '   end

tmp = nil if inb(args.maxtemp) or inb(args.mintemp) or inb(args.rainfall) then tmp = ' ' end InfoboxArgs.data32 = tmp

tmp = nil if inb(args['near']) or inb(args['near-nw']) or inb(args['near-n']) or inb(args['near-ne']) or inb(args['near-w']) or inb(args['near-e']) or inb(args['near-sw']) or inb(args['near-se']) or inb(args['near-s']) then tmp = ' ' end InfoboxArgs.data33 = tmp

InfoboxArgs.label34 = 'Footnotes' InfoboxArgs.data34 = args.footnotes or ''

InfoboxArgs.label35 = 'See also' if typ == 'protected' and inb(args.iucn_category) and state~= '' then InfoboxArgs.data35 = state_protectedPage(state) end

tmp = nil if typ == '' then tmp = lframe:expandTemplate{ title = 'Error', args = {'Error:  not defined (help)'} } elseif not (typ == 'city' or typ == 'town' or typ == 'suburb' or typ == 'lga' or typ == 'region' or typ == 'cadastral' or typ == 'protected' or typ == 'other') then tmp = lframe:expandTemplate{ title = 'Error', args = {'Error: unknown  value (=' .. typ .. ') (help)'} } end InfoboxArgs.data36 = tmp return infobox(InfoboxArgs) end

local function categories(args) local cats = {} local typ = string.lower(args.type or '') local state = string.lower(args.state or '') if mw.title.getCurrentTitle.namespace == 0 then -- no categories are created except in article namespace if inb(args._noautocat) then -- suppress auto categories. Note: does not suppress the tracking categories else local name = (args.name or '') if typ == 'town' then if state == 'sa' then table.insert(cats, '') elseif state == 'vic' then table.insert(cats, '') elseif state == 'nsw' then table.insert(cats, '') elseif state == 'qld' then table.insert(cats, '') elseif state == 'nt' then table.insert(cats, '') elseif state == 'wa' then table.insert(cats, '') elseif state == 'tas' then table.insert(cats, '') elseif state == 'act' then table.insert(cats, '') elseif state == 'ni' then table.insert(cats, '') end elseif typ == 'suburb' then local city = args.city or '' if pageExists('Category:Suburbs of the City of ' .. city) then table.insert(cats, '') elseif pageExists('Category:Suburbs of ' .. city) then table.insert(cats, '') else if state == 'sa' and pageExists('Category:Suburbs of ' .. city .. ', South Australia') then table.insert(cats, '') elseif state == 'vic' and pageExists('Category:Suburbs of ' .. city .. ', Victoria') then table.insert(cats, '') elseif state == 'nsw' and pageExists('Category:Suburbs of ' .. city .. ', New South Wales') then table.insert(cats, '') elseif state == 'qld' and pageExists('Category:Suburbs of ' .. city .. ', Queensland') then table.insert(cats, '') elseif state == 'nt' and pageExists('Category:Suburbs of ' .. city .. ', Northern Territory') then table.insert(cats, '') elseif state == 'wa' and pageExists('Category:Suburbs of ' .. city .. ', Western Australi') then table.insert(cats, '') elseif state == 'tas' and pageExists('Category:Suburbs of ' .. city .. ', Tasmania') then table.insert(cats, '') elseif state == 'act' and pageExists('Category:Suburbs of ' .. city .. ', ACT') then table.insert(cats, '') end end elseif inb(args.est) and typ == 'lga' then if pageExists('Category:Populated places established in ' .. (args.est or '')) then table.insert(cats, '') elseif pageExists('Category:Populated places established in the ' .. (args.est or '')) then table.insert(cats, '') elseif pageExists('Category:' .. (args.est or '') .. ' establishments in Australia') then table.insert(cats, '') end end end

-- Tracking categories if args['1'] then -- The '1' parameter occurs when there is a missing equals sign, or spurious pipes. Usually harmless, but can mask other issues, so it is better to track them. table.insert(cats, '') end if (args.type or ) ==  then table.insert(cats, '') end if (args.state or ) ==  then table.insert(cats, '') end if inb(args.pop) then if (args.pop_year or ) ==  then table.insert(cats, '') end if (args.pop_footnotes or ) ==  then table.insert(cats, '') end end if inb(args.pop2) then if (args.pop2_year or ) ==  then table.insert(cats, '') end if (args.pop2_footnotes or ) ==  then table.insert(cats, '') end end if (args.density or ) ==  and inb(args.pop) and inb(args.area) then if lang:parseFormattedNumber(args.pop) and type(args.area) == 'number' then -- density calculation should be OK           else table.insert(cats, '') end end if args.imagesize or args.image2size or args.imagesize2 or args.image_alt2 then table.insert(cats, '') end if args.logosize then table.insert(cats, '') end if args.official_site then table.insert(cats, '') end if args.coordinates then if typ == 'lga' then if string.lower(args.map_type or ) ==  or string.lower(args.map_type or '') == 'auto' then if inb(args.alternative_location_map) or inb(args.force_national_map) or inb(args.use_lga_map) then table.insert(cats, '') else table.insert(cats, '') end else table.insert(cats, '') end elseif string.lower(args.map_type or '') == 'nomap' then table.insert(cats, '') end end table.insert(cats, check({ unknown='', preview='Page using Template:Infobox Australian place with unknown parameter "_VALUE_"', ignoreblank='y', '_noautocat', 'abolished', 'alternative_location_map', 'area', 'area_footnotes', 'caption', 'caption2', 'city', 'coord_ref', 'coordinates ', 'county', 'density', 'density_footnotes', 'dir1', 'dir2', 'dir3', 'dir4', 'dir5', 'dist1', 'dist2', 'dist3', 'dist4', 'dist5', 'division', 'elevation', 'elevation_footnotes', 'est', 'established', 'established_footnotes', 'fedgov', 'fedgov2', 'fedgov3', 'fedgov4', 'footnotes', 'force_national_map', 'former_hundred', 'gazetted', 'hundred', 'image', 'image_alt', 'image_upright', 'image2', 'image2_alt', 'image2_upright', 'iucn_category', 'iucn_ref', 'lga', 'lga2', 'lga3', 'lga4', 'lga5', 'local_map', 'local_map_id', 'location1', 'location2', 'location3', 'location4', 'location5', 'logo', 'logo_upright', 'managing_authorities', 'map_alt', 'map_type', 'maxtemp', 'maxtemp_footnotes', 'mayor', 'mayortitle', 'mintemp', 'mintemp_footnotes', 'name', 'native_name_lang', 'native_name', 'near', 'near-e', 'nearest_town_or_city', 'near-n', 'near-ne', 'near-nw', 'near-s', 'near-se', 'near-sw', 'near-w', 'parish', 'pop', 'pop_footnotes', 'pop_year', 'pop2', 'pop2_footnotes', 'pop2_year', 'poprank', 'postcode', 'pushpin_label_position', 'pushpin_map_caption', 'rainfall', 'rainfall_footnotes', 'region', 'relief', 'seat', 'state', 'stategov', 'stategov2', 'stategov3', 'stategov4', 'stategov5', 'timezone', 'timezone-dst', 'type', 'url', 'use_lga_map', 'utc', 'utc-dst', 'visitation_footnotes', 'visitation_num', 'visitation_year', 'wikidata', 'zoom' }, args)) end return table.concat(cats) end

function p.main(frame) lframe = frame local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame) return shortDesc(args) .. ibox(args) .. categories(args) end

return p