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 |state= value (=' .. state .. ') (help)'} }

else

-- state not supplied

longname = lframe:expandTemplate{title = 'error', args = {'Error: |state= 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, '{{short description|')

    if inb(args['short description']) then

    table.insert(sd, args['short description'])

    else

    local typ = (args.type or ''):lower()

    if typ == 'city' then

    table.insert(sd, 'City in')

    elseif typ == 'town' then

    table.insert(sd, 'Town in')

    elseif typ == 'suburb' then

    local subb

    local city = args.city or ''

    local lga = args.lga or ''

    if city ~= '' then

    subb = 'Suburb of ' .. city .. ','

    elseif lga ~= '' then

    subb = 'Suburb of ' .. lga .. ','

    else

    subb = 'Suburb in'

    end

    table.insert(sd, plainText(subb))

    elseif typ == 'lga' then

    table.insert(sd, 'Local government area in')

    elseif typ == 'region' then

    table.insert(sd, 'Region in')

    elseif typ == 'cadastral' then

    table.insert(sd, 'Cadastral in')

    elseif typ == 'protected' then

    table.insert(sd, 'Protected area in')

    else

    table.insert(sd, 'Place in')

    end

    local state = (args.state or ''):lower()

    if state == 'sa' then

    table.insert(sd, ' South Australia')

    elseif state == 'vic' then

    table.insert(sd, ' Victoria, Australia')

    elseif state == 'nsw' then

    table.insert(sd, ' New South Wales, Australia')

    elseif state == 'qld' then

    table.insert(sd, ' Queensland, Australia')

    elseif state == 'nt' then

    table.insert(sd, ' the Northern Territory, Australia')

    elseif state == 'wa' then

    table.insert(sd, ' Western Australia')

    elseif state == 'tas' then

    table.insert(sd, ' Tasmania, Australia')

    elseif state == 'act' then

    table.insert(sd, ' Australian Capital Territory')

    elseif state == 'jbt' then

    table.insert(sd, ' the Jervis Bay Territory, Australia')

    elseif state == 'ni' then

    table.insert(sd, ' Norfolk Island, Australia')

    elseif state == 'au' then

    table.insert(sd, ' Australia')

    else

    table.insert(sd, ' Australia')

    end

    end

    table.insert(sd, '|noreplace}}')

    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 .. '

    if inb(args.native_name_lang) then

    tmp = tmp .. ' lang="' .. args.native_name_lang .. '"'

    end

    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 {{coords}} 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 {{#invoke:PopulationFromWikidata | ListForInfobox }} 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 .. '

    • ' .. lframe:expandTemplate{title = 'auto link', args = {args.lga3} } .. '
    • '

      end

      if inb(args.lga4) then

      tmp = tmp .. '

    • ' .. lframe:expandTemplate{title = 'auto link', args = {args.lga4} } .. '
    • '

      end

      if inb(args.lga5) then

      tmp = tmp .. '

    • ' .. lframe:expandTemplate{title = 'auto link', args = {args.lga5} } .. '
    • '

      end

      if lga2 ~= '' then

      tmp = tmp .. '

    '

    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 = '

    • '

      else

      tmp = ''

      end

      tmp = tmp .. args.stategov

      if stategov2 ~= '' then

      tmp = tmp .. '

    • ' .. stategov2 .. '
    • '

      end

      if inb(args.stategov3) then

      tmp = tmp .. '

    • ' .. args.stategov3 .. '
    • '

      end

      if inb(args.stategov4) then

      tmp = tmp .. '

    • ' .. args.stategov4 .. '
    • '

      end

      if inb(args.stategov5) then

      tmp = tmp .. '

    • ' .. args.stategov5 .. '
    • '

      end

      if stategov2 ~= '' then

      tmp = tmp .. '

    '

    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 = '

    • '

      else

      tmp = ''

      end

      tmp = tmp .. args.fedgov

      if fedgov2 ~= '' then

      tmp = tmp .. '

    • ' .. fedgov2 .. '
    • '

      end

      if inb(args.fedgov3) then

      tmp = tmp .. '

    • ' .. args.fedgov3 .. '
    • '

      end

      if inb(args.fedgov4) then

      tmp = tmp .. '

    • ' .. args.fedgov4 .. '
    • '

      end

      if fedgov2 ~= '' then

      tmp = tmp .. '

    '

    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 = '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    else

    tmp = tmp .. '?'

    end

    tmp = tmp .. '

    '

    else

    tmp = tmp .. '?'

    end

    tmp = tmp .. '

    '

    else

    tmp = tmp .. '?'

    end

    tmp = tmp .. '

    ' .. '\'\'\'Mean max temp\'\'\ .. (args.maxtemp_footnotes or ) .. ' \'\'\'Mean min temp\'\'\ .. (args.mintemp_footnotes or ) .. ' \'\'\'Annual rainfall\'\'\ .. (args.rainfall_footnotes or ) .. '
    '

    if inb(args.maxtemp) then

    tmp = tmp .. lframe:expandTemplate{ title = 'convert', args = {args.maxtemp, 'C', 'F', 0, disp='br'} } .. '

    '

    if inb(args.mintemp) then

    tmp = tmp .. lframe:expandTemplate{ title = 'convert', args = {args.mintemp, 'C', 'F', 0, disp='br'} } .. '

    '

    if inb(args.rainfall) then

    tmp = tmp .. lframe:expandTemplate{ title = 'convert', args = {args.rainfall, 'mm', 'in', 1, disp='br', abbr='on'} } .. '

    '

    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 = '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    if inb(args['near']) then

    tmp = tmp .. '

    '

    else

    tmp = tmp .. '

    '

    end

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    '

    tmp = tmp .. '

    \'\'\''

    if typ == 'cadastral' then

    tmp = tmp .. 'Lands administrative divisions'

    elseif typ == 'lga' then

    tmp = tmp .. 'LGAs'

    elseif typ == 'suburb' then

    if city ~= '' then

    if pageExists('List of ' .. city .. ' suburbs') then

    tmp = tmp .. 'Suburbs'

    elseif pageExists('Category:Suburbs of the City of ' .. city) then

    tmp = tmp .. 'Suburbs'

    elseif pageExists('Category:Suburbs of ' .. city) then

    tmp = tmp .. 'Suburbs'

    else

    tmp = tmp .. 'Suburbs'

    end

    else

    tmp = tmp .. 'Suburbs'

    end

    else

    tmp = tmp .. 'Localities'

    end

    tmp = tmp .. ' around '

    if name ~= '' then

    tmp = tmp .. name

    else

    tmp = tmp .. lframe:expandTemplate{ title = 'PAGENAMEBASE'}

    end

    tmp = tmp .. '\'\'\'

    ' .. (args['near-nw'] or '') .. ' ' .. (args['near-n'] or '') .. ' ' .. (args['near-ne'] or '') .. '
    ' .. (args['near-w'] or '') .. ' ' .. args['near'] .. ' ' .. name .. ' ' .. (args['near-e'] or '') .. '
    ' .. (args['near-sw'] or '') .. ' ' .. (args['near-s'] or '') .. ' ' .. (args['near-se'] or '') .. '
    '

    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: |type= 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 |type= 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, '' .. name .. '')

    elseif state == 'vic' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'nsw' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'qld' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'nt' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'wa' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'tas' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'act' then

    table.insert(cats, '' .. name .. '')

    elseif state == 'ni' then

    table.insert(cats, '' .. name .. '')

    end

    elseif typ == 'suburb' then

    local city = args.city or ''

    if pageExists('Category:Suburbs of the City of ' .. city) then

    table.insert(cats, '' .. name .. '')

    elseif pageExists('Category:Suburbs of ' .. city) then

    table.insert(cats, '' .. name .. '')

    else

    if state == 'sa' and pageExists('Category:Suburbs of ' .. city .. ', South Australia') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'vic' and pageExists('Category:Suburbs of ' .. city .. ', Victoria') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'nsw' and pageExists('Category:Suburbs of ' .. city .. ', New South Wales') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'qld' and pageExists('Category:Suburbs of ' .. city .. ', Queensland') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'nt' and pageExists('Category:Suburbs of ' .. city .. ', Northern Territory') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'wa' and pageExists('Category:Suburbs of ' .. city .. ', Western Australi') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'tas' and pageExists('Category:Suburbs of ' .. city .. ', Tasmania') then

    table.insert(cats, '' .. name .. '')

    elseif state == 'act' and pageExists('Category:Suburbs of ' .. city .. ', ACT') then

    table.insert(cats, '' .. name .. '')

    end

    end

    elseif inb(args.est) and typ == 'lga' then

    if pageExists('Category:Populated places established in ' .. (args.est or '')) then

    table.insert(cats, '' .. name .. '')

    elseif pageExists('Category:Populated places established in the ' .. (args.est or '')) then

    table.insert(cats, '' .. name .. '')

    elseif pageExists('Category:' .. (args.est or '') .. ' establishments in Australia') then

    table.insert(cats, '' .. name .. '')

    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, '1')

    end

    if (args.type or ) == then

    table.insert(cats, 'U')

    end

    if (args.state or ) == then

    table.insert(cats, 'S')

    end

    if inb(args.pop) then

    if (args.pop_year or ) == then

    table.insert(cats, 'Category:Australian place articles with no population year')

    end

    if (args.pop_footnotes or ) == then

    table.insert(cats, 'Category:Australian place articles with no population footnotes')

    end

    end

    if inb(args.pop2) then

    if (args.pop2_year or ) == then

    table.insert(cats, 'Category:Australian place articles with no population year')

    end

    if (args.pop2_footnotes or ) == then

    table.insert(cats, 'Category:Australian place articles with no population footnotes')

    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, 'Category:Australian place articles with density errors')

    end

    end

    if args.imagesize or args.image2size or args.imagesize2 or args.image_alt2 then

    table.insert(cats, 'I')

    end

    if args.logosize then

    table.insert(cats, 'L')

    end

    if args.official_site then

    table.insert(cats, 'O')

    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, 'Category:Pages using infobox Australian place with lga type and location map')

    else

    table.insert(cats, 'Category:Pages using infobox Australian place with an implicitly suppressed location map')

    end

    else

    table.insert(cats, 'Category:Pages using infobox Australian place with lga type and location map')

    end

    elseif string.lower(args.map_type or '') == 'nomap' then

    table.insert(cats, 'Category:Pages using infobox Australian place with an explicitly suppressed location map')

    end

    end

    table.insert(cats, check({

    unknown='_VALUE_' .. lframe:expandTemplate{title = 'PAGENAME'} .. '',

    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