Jump to content

Module:Sandbox/Innesw/Infobox Australian place

From Wikipedia, the free encyclopedia

-- 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 (state)|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 <code>|state=</code> value (=' .. state .. ') ([[Template:Infobox Australian place#state|help]])'} }
    else
        -- state not supplied
        longname = lframe:expandTemplate{title = 'error', args = {'Error: <code>|state=</code> not defined ([[Template:Infobox Australian place#state|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, '<li>')
    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, '</li>')
    end
    return table.concat(sloc)
end

local function lgas_article(state)
    state = string.lower(state)
    local art
    if state == 'sa' then
        art = '[[Local government areas of South Australia|LGA(s)]]'
    elseif state == 'vic' then
        art = '[[Local government in Victoria|LGA(s)]]'
    elseif state == 'nsw' then
        art = '[[Local government areas of New South Wales|LGA(s)]]'
    elseif state == 'qld' then
        art = '[[Local government areas of Queensland|LGA(s)]]'
    elseif state == 'nt' then
        art = '[[Local government areas of the Northern Territory|LGA(s)]]'
    elseif state == 'wa' then
        art = '[[Local government areas of Western Australia|LGA(s)]]'
    elseif state == 'tas' then
        art = '[[Local government areas of Tasmania|LGA(s)]]'
    elseif state == 'act' then
        art = 'District'
    else
        art = '[[Local government in Australia|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|Protected areas of<br />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|List of protected areas of<br />Western Australia]]'
    elseif state == 'tas' then
        prot = '[[Protected areas of Tasmania]]'
    elseif state == 'act' then
        prot = '[[List of Australian Capital Territory protected areas|Australian Capital Territory<br />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 = '<span class="fn org locality">' .. name .. '</span><br />'
        if inb(args.native_name) then
            tmp = tmp .. '<div style="font-weight:normal;font-size:88%;"'
            if inb(args.native_name_lang) then
                tmp = tmp .. ' lang="' .. args.native_name_lang .. '"'
            end
            tmp = tmp .. '>' .. args.native_name .. '</div>'
        end
        tmp = tmp .. '<span style="font-weight:normal; font-size:88%" class="region">'
        if city ~= '' then
            tmp = tmp .. lframe:expandTemplate{title = 'auto link', args = { city } } .. ',&nbsp;'
        end
        tmp = tmp .. state_longname(state) ..'</span>'
        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 = '<span style="white-space: nowrap">Nearest town or city</span>'
    InfoboxArgs.data3 = nil
    if typ == 'protected' then
        InfoboxArgs.data3 = lframe:expandTemplate{ title = 'auto link', args = {(args.nearest_town_or_city or '') } }
    end

    InfoboxArgs.label4 = '[[Geographic coordinate system|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 = '<ul style="margin-top: 0px; margin-bottom: 0px;"><li>'
        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 .. '&nbsp;(' .. args.pop_year .. ')'
        end
        tmp = tmp .. (args.pop_footnotes or '')
        if inb(args.poprank) then
            tmp = tmp .. '&nbsp;([[List of cities in Australia by population|' .. args.poprank .. ']])'
        end
        if inb(args.pop2) then
            tmp = tmp .. '</li><li> '
            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 .. '&nbsp;(' .. args.pop2_year .. ')'
            end
            tmp = tmp .. (args.pop2_footnotes or '')
            tmp = tmp .. '</li></ul>'
        end
    else
        local wdpop = populationFromWikidata{args = {type = typ, wikidata = (args.wikidata or '')} }
        if inb(wdpop) then
	          -- The <div> 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 = '<div>' .. wdpop .. '</div>'
        end
    end
    InfoboxArgs.data6 = tmp

    InfoboxArgs.label7 = '&nbsp;• 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 = '[[Gazetteer of Australia|Gazetted]]'
    InfoboxArgs.data10 = args.gazetted or ''
    InfoboxArgs.label11 = '[[Postcodes in Australia|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 in Australia|Time zone]]'
    if inb(args.timezone) then
        InfoboxArgs.data14 = args.timezone .. ' ' .. '([[UTC' .. (args.utc or '') .. ']])'
    end

    InfoboxArgs.label15 = '&nbsp;• Summer ([[Daylight saving time|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 = '<ul style="margin-top: 0px; margin-bottom: 0px;">'
        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 .. '</ul>'
    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 = '<ul style="margin-top: 0px; margin-bottom: 0px;"><li>'
        else
            tmp = ''
        end
        tmp = tmp .. lframe:expandTemplate{title = 'auto link', args = {args.lga} }
        if lga2 ~= '' then
            tmp = tmp .. '</li><li>' .. lframe:expandTemplate{title = 'auto link', args = {lga2} } .. '</li>'
        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 = '[[List of regions of Australia|Region]]'
    if inb(args.region) then
        InfoboxArgs.data20 = lframe:expandTemplate{title = 'auto link', args = {args.region} }
    end

    InfoboxArgs.label21 = '[[Lands administrative divisions of Australia|County]]'
    if inb(args.county) then
        InfoboxArgs.data21 = lframe:expandTemplate{title = 'auto link', args = {args.county} }
    end
    InfoboxArgs.label22 = '[[Parish (administrative division)|Parish]]'
    InfoboxArgs.data22 = args.parish or ''
    if typ == 'cadastral' then
        InfoboxArgs.label23 = '[[Hundred (county division)|Hundred]]'
        InfoboxArgs.data23 = args.hundred or ''
        InfoboxArgs.label24 = '[[Hundred (county division)|Hundred (former)]]'
        InfoboxArgs.data24 = args.former_hundred or ''
        InfoboxArgs.label25 = '[[Lands administrative divisions of New South Wales|Division]]'
        InfoboxArgs.data25 = args.division or ''
    end
    
    if state == 'act' or state == 'nt' or state == 'jbt' then
        InfoboxArgs.label26 = '[[Electorates of the Australian states and territories|Territory electorates(s)]]'
    else
        InfoboxArgs.label26 = '[[Electorates of the Australian states and territories|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 = '[[Divisions of the Australian House of Representatives|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 = '<span style="white-space: nowrap">Managing authorities</span>'
        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 = '<table cellpadding=4 cellspacing=0 style="width:100%; border: 1px #ddd solid;">'
        tmp = tmp .. '<tr class=mergedrow>'
        tmp = tmp .. '<td style="background-color:#f0f0ff;border: 1px #FFF solid; text-align:center; width:33%;">' .. '\'\'\'Mean max temp\'\'\'' .. (args.maxtemp_footnotes or '') .. '</td>'
        tmp = tmp .. '<td style="background-color:#f0f0ff;border: 1px #FFF solid; text-align:center; width:33%;">\'\'\'Mean min temp\'\'\'' .. (args.mintemp_footnotes or '') .. '</td>'
        tmp = tmp .. '<td style="background-color:#f0f0ff;border: 1px #FFF solid; text-align:center; width:33%;">\'\'\'Annual rainfall\'\'\'' .. (args.rainfall_footnotes or '') .. '</td>'
        tmp = tmp .. '</tr>'
        tmp = tmp .. '<tr style="border: 1px #FFF  solid" class=mergedrow>'
        tmp = tmp .. '<td style="padding: 2px 0px; text-align:center; width:33%;">'
        if inb(args.maxtemp) then
            tmp = tmp .. lframe:expandTemplate{ title = 'convert', args = {args.maxtemp, 'C', 'F', 0, disp='br'} } .. '</td>'
        else
            tmp = tmp .. '?</td>'
        end
        tmp = tmp .. '<td style="padding: 2px 0px; text-align:center; width:33%;">'
        if inb(args.mintemp) then
            tmp = tmp .. lframe:expandTemplate{ title = 'convert', args = {args.mintemp, 'C', 'F', 0, disp='br'} } .. '</td>'
        else
            tmp = tmp .. '?</td>'
        end
        tmp = tmp .. '<td style="padding: 2px 0px; text-align:center; width:33%;">'
        if inb(args.rainfall) then
            tmp = tmp .. lframe:expandTemplate{ title = 'convert', args = {args.rainfall, 'mm', 'in', 1, disp='br', abbr='on'} } .. '</td>'
        else
            tmp = tmp .. '?</td>'
        end
        tmp = tmp .. '</tr></td></table>'
    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 = '<table cellpadding=4 cellspacing=3 style="width:100%; border: 1px #ddd solid;">'
        tmp = tmp .. '<tr class=mergedrow><td colspan=3 style="background-color:#f0f0ff;padding: 2px 0px; text-align:center;">\'\'\''
        if typ == 'cadastral' then
            tmp = tmp .. '[[Lands administrative divisions of Australia|Lands administrative divisions]]'
        elseif typ == 'lga' then
            tmp = tmp .. '[[Local government in Australia|LGAs]]'
        elseif typ == 'suburb' then
            if city ~= '' then
                if pageExists('List of ' .. city .. ' suburbs') then
                    tmp = tmp .. '[[List of ' .. city .. ' suburbs|Suburbs]]'
                elseif pageExists('Category:Suburbs of the City of ' .. city) then
                    tmp = tmp .. '[[Category:Suburbs of the City of ' .. city .. '|Suburbs]]'
                elseif pageExists('Category:Suburbs of ' .. city) then
                    tmp = tmp .. '[[Category:Suburbs of ' .. city .. '|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 .. '\'\'\'</td></tr>'
        tmp = tmp .. '<tr class=mergedrow>'
        tmp = tmp .. '<td style="text-align:center; padding:3px 0px; width:33%;">' .. (args['near-nw'] or '') .. '</td>'
        tmp = tmp .. '<td style="text-align:center; padding:3px 0px; width:34%;">' .. (args['near-n'] or '') .. '</td>'
        tmp = tmp .. '<td style="text-align:center; padding:3px 0px; width:33%;">' .. (args['near-ne'] or '') .. '</td>'
        tmp = tmp .. '</tr><tr class=mergedrow>'
        tmp = tmp .. '<td style="text-align:center; vertical-align:middle; padding:3px 0px; width:33%;">' .. (args['near-w'] or '') .. '</td>'
        if inb(args['near']) then
            tmp = tmp .. '<td style="text-align:center; vertical-align:middle; padding:3px 0px; width:34%; font-weight:bold;">' .. args['near'] .. '</td>'
        else
            tmp = tmp .. '<td style="text-align:center; vertical-align:middle; padding:3px 0px; width:33%; font-weight:bold;">' .. name .. '</td>'
        end
        tmp = tmp .. '<td style="text-align:center; vertical-align:middle; padding:3px 0px; width:33%;">' .. (args['near-e'] or '') .. '</td>'
        tmp = tmp .. '</tr><tr class=mergedrow>'
        tmp = tmp .. '<td style="text-align:center; padding:3px 0px; width:33%;">' .. (args['near-sw'] or '') .. '</td>'
        tmp = tmp .. '<td style="text-align:center; padding:3px 0px; width:34%;">' .. (args['near-s'] or '') .. '</td>'
        tmp = tmp .. '<td style="text-align:center; padding:3px 0px; width:33%;">' .. (args['near-se'] or '') .. '</td>'
        tmp = tmp .. '</tr></table>'
    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: <code>|type=</code> not defined ([[Template:Infobox Australian place#type|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 <code>|type=</code> value (=' .. typ .. ') ([[Template:Infobox Australian place#type|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, '[[Category:Towns in South Australia|' .. name .. ']]')
                elseif state == 'vic' then
                    table.insert(cats, '[[Category:Towns in Victoria (state)|' .. name .. ']]')
                elseif state == 'nsw' then
                    table.insert(cats, '[[Category:Towns in New South Wales|' .. name .. ']]')
                elseif state == 'qld' then
                    table.insert(cats, '[[Category:Towns in Queensland|' .. name .. ']]')
                elseif state == 'nt' then
                    table.insert(cats, '[[Category:Towns in the Northern Territory|' .. name .. ']]')
                elseif state == 'wa' then
                    table.insert(cats, '[[Category:Towns in Western Australia|' .. name .. ']]')
                elseif state == 'tas' then
                    table.insert(cats, '[[Category:Towns in Tasmania|' .. name .. ']]')
                elseif state == 'act' then
                    table.insert(cats, '[[Category:Towns in the Australian Capital Territory|' .. name .. ']]')
                elseif state == 'ni' then
                    table.insert(cats, '[[Category:Populated places in Norfolk Island|' .. name .. ']]')
                end
            elseif typ == 'suburb' then
                local city = args.city or ''
                if pageExists('Category:Suburbs of the City of ' .. city) then
                    table.insert(cats, '[[Category:Suburbs of the City of ' .. city .. '|' .. name .. ']]')
                elseif pageExists('Category:Suburbs of ' .. city) then
                    table.insert(cats, '[[Category:Suburbs of ' .. city .. '|' .. name .. ']]')
                else
                    if state == 'sa' and pageExists('Category:Suburbs of ' .. city .. ', South Australia') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', South Australia|' .. name .. ']]')
                    elseif state == 'vic' and pageExists('Category:Suburbs of ' .. city .. ', Victoria') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', Victoria|' .. name .. ']]')
                    elseif state == 'nsw' and pageExists('Category:Suburbs of ' .. city .. ', New South Wales') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', New South Wales|' .. name .. ']]')
                    elseif state == 'qld' and pageExists('Category:Suburbs of ' .. city .. ', Queensland') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', Queensland|' .. name .. ']]')
                    elseif state == 'nt' and pageExists('Category:Suburbs of ' .. city .. ', Northern Territory') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', Northern Territory|' .. name .. ']]')
                    elseif state == 'wa' and pageExists('Category:Suburbs of ' .. city .. ', Western Australi') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', Western Australia|' .. name .. ']]')
                    elseif state == 'tas' and pageExists('Category:Suburbs of ' .. city .. ', Tasmania') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', Tasmania|' .. name .. ']]')
                    elseif state == 'act' and pageExists('Category:Suburbs of ' .. city .. ', ACT') then
                        table.insert(cats, '[[Category:Suburbs of ' .. city .. ', ACT|' .. 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, '[[Category:Populated places established in ' .. (args.est or '') .. '|' .. name .. ']]')
                elseif pageExists('Category:Populated places established in the ' .. (args.est or '')) then
                    table.insert(cats, '[[Category:Populated places established in the ' .. (args.est or '') .. '|' .. name .. ']]')
                elseif pageExists('Category:' .. (args.est or '') .. ' establishments in Australia') then
                    table.insert(cats, '[[Category:' .. (args.est or '') .. ' establishments in Australia|' .. 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, '[[Category:Australian place articles using missing parameters|1]]')
        end
        if (args.type or '') == '' then
            table.insert(cats, '[[Category:Australian place articles using missing parameters|U]]')
        end
        if (args.state or '') == '' then
            table.insert(cats, '[[Category:Australian place articles using missing parameters|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, '[[Category:Australian place articles using missing parameters|I]]')
        end
        if args.logosize then
            table.insert(cats, '[[Category:Australian place articles using missing parameters|L]]')
        end
        if args.official_site then
            table.insert(cats, '[[Category:Australian place articles using missing parameters|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='[[Category:Pages using infobox Australian place with unknown parameters|_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