Module:Infobox settlement

Documentation for this module may be created at Module:Infobox settlement/doc

Documentation for this module may be created at Module:Infobox settlement/doc

--
-- This template will implement {{Infobox settlement}}
--
local p = {}
local math_module = require( "Module:Math" )
local precision = math_module._precision
local infobox_module = require('Module:Infobox')
local image_module = require('Module:InfoboxImage')
local locationmap_module = require('Module:Location map')

local function isnotempty(s)
	return s and s:match( '^%s*(.-)%s*$' ) ~= ''
end

local function firstnonempty(s)
	for i=1,#s do
		if (s[i] and s[i]:match( '^%s*(.-)%s*$' ) ~= '') then
			return s[i]
		end
	end
	return ''
end

local function yesno(s, yes, no, ukn, blank)
	-- this function implements yesno
	local vals = {['yes'] = 1, ['y'] = 1, ['1'] = 1, ['no'] = 0, ['n'] = 0, ['0'] = 0}
	if( s and s:match( '^%s*(.-)%s*$' ) ~= '') then
		local outval = vals(s:lower())
		if( outval == nil ) then
			return ukn
		else
			return (outval == 1) and yes or no
		end
	else
		return blank
	end
end

local function rnd(num, digits)
	-- This function implements {{rnd}}
	return math_module._precision_format(tostring(num), tostring(digits))
end

local function order_of_magnitude(num)
	-- This function partially implements {{Order of magnitude}}
    if( num ) then
		num = math.abs(num)
		if( num == 0 ) then
			return 0
		else
			return math.floor( math.log10(num) )
		end
	else
		return 0
	end
end

local function page_exists( title )
    -- This function implements #ifexist
    local noError, titleObject = pcall(mw.title.new, title)
    if not noError then
        return false
    else
        if titleObject then
            return titleObject.exists
        else
            return false
        end
    end
end

local function link(pagelink, linktext, name)
    -- This function implements {{Infobox settlement/link}}
    pagelink = pagelink or ''
    linktext = linktext or ''
    name     = name or ''
    
    if( pagelink ~= '' ) then
        -- use "[[pagelink|linktext]]"
        return string.format('[[%s|%s]]', pagelink, linktext)
    else
        -- try "[[linktext of PAGENAME|linktext]]"
        pagelink = string.format('%s of %s',linktext, mw.title.getCurrentTitle().text)
        if( page_exists( pagelink ) ) then
            return string.format('[[%s|%s]]', pagelink, linktext)
        elseif( name ~= '' ) then
            -- try "[[linktext of name|linktext]]"
            pagelink = string.format('%s of %s', linktext, name)
            if( page_exists(pagelink) ) then
               return string.format('[[%s|%s]]', pagelink, linktext)
            end
        end
    end

    return linktext
end

local function columns(cell1, cell2, cell3, cell4)
    --- This function implements {{Infobox settlement/columns}} with no cell0
    local function makecell( c1 )
        if isnotempty(c1) then
			local root = mw.html.create('td')
			root:attr('align', 'center')
				:css('vertical-align', 'middle')
				:wikitext(c1)
            return tostring(root)
        end
        return ''
    end
    
    local function makerow( c1, c2 )
        local root = mw.html.create('')
        if isnotempty(c1) then
            if isnotempty(c2) then
            	root:tag('td')
					:attr('align', 'center')
					:css('vertical-align', 'middle')
					:wikitext(c1)
				root:tag('td')
					:attr('align', 'center')
					:css('vertical-align', 'middle')
					:wikitext(c2)
            else
            	root:tag('td')
					:attr('colspan', '2')
					:attr('align', 'center')
					:css('vertical-align', 'middle')
					:wikitext(c1)
            end
        elseif isnotempty(c2) then
			root:tag('td')
				:attr('colspan', '2')
				:attr('align', 'center')
				:css('vertical-align', 'middle')
				:wikitext(c2)
        end
        return tostring(root)
    end
    
    local count = 0
    count = count + (isnotempty(cell1) and 1 or 0)
    count = count + (isnotempty(cell2) and 1 or 0)
    count = count + (isnotempty(cell3) and 1 or 0)
    count = count + (isnotempty(cell4) and 1 or 0)

    if(count > 0) then
		local root = mw.html.create('table')
		root:css('width', '100%')
			:css('background', 'transparent')
		if(count > 2) then
			root:tag('tr')
					:wikitext(makerow(cell1, cell2))
			root:tag('tr')
					:wikitext(makerow(cell3, cell4))
		else
			root:tag('tr')
				:wikitext(makecell(cell1))
				:wikitext(makecell(cell2))
				:wikitext(makecell(cell3))
				:wikitext(makecell(cell4))
		end
		return tostring(root)
	else
		return ''
	end
end

local function columns2(cell0, cell1, cell2, cell3, cell4, cell5)
    -- This function implements {{Infobox settlement/columns}} with cell0
    local function makerow( c1 )
		if isnotempty(c1) then
			local root = mw.html.create('tr')
			root:tag('td')
				:attr('align', 'center')
				:css('style', 'vertical-align:middle')
				:wikitext(c1)
			return tostring(root)
		else
			return ''
		end
	end
    
	local count = 0
	count = count + (isnotempty(cell1) and 1 or 0)
	count = count + (isnotempty(cell2) and 1 or 0)
	count = count + (isnotempty(cell3) and 1 or 0)
	count = count + (isnotempty(cell4) and 1 or 0)
	count = count + (isnotempty(cell5) and 1 or 0)

	if(count > 0) then
		local root = mw.html.create('table')
		root:css('width', '100%')
			:css('background', 'transparent')
		local row = root:tag('tr')
		row
			:tag('td')
				:tag('table')
					:css('width', '100%')
					:css('background', 'transparent')
					:wikitext(makerow(cell1))
					:wikitext(makerow(cell2))
					:wikitext(makerow(cell3))
					:wikitext(makerow(cell4))
					:wikitext(makerow(cell5))
        if isnotempty(cell0) then
			row
				:tag('td')
					:attr('align', 'center')
					:css('vertical-align', 'top')
					:wikitext(cell0)
		end
		return tostring(root)
	else
		return cell0
	end
end

local function translitlangbox(transtype, transinfo)
	local args = {}
	args['child'] = 'yes'
	local count = 0
	for i=0,6 do
		if(isnotempty(transinfo[i]) and isnotempty(transtype[i])) then
			args['rowclass' .. tostring(i+1)] = isnotempty(transtype[i+1]) and 'mergedrow' or 'mergedbottomrow'
			args['label' .. tostring(i+1)] = ' • ' .. transtype[i]
			args['data' .. tostring(i+1)] = transinfo[i]
			count = count + 1
		end
	end
	return ( count > 0 ) and args or nil
end

local function unitpref(pref, region, unit_type)
    -- This function implements {{Infobox settlement/pref}}
    local pref_impus = { ['imperial'] = 1, ['english'] = 1, ['uk'] = 1, ['us'] = 1, 
        ['u.s.'] = 1, ['standard'] = 1, ['us customary'] = 1, ['u.s. customary'] = 1}
    local pr = (pref and pref:lower()) or ''
    local r = region or ''
    local u = unit_type or ''

    pr = mw.ustring.gsub(pr, '^%s*([a-z].*[a-z\.])%s*$','%1')

    if( pref_impus[pr] ) then
        return 'impus'
    end
    if( mw.ustring.match( r, 'United States' ) ) then
        return 'impus'
    end
    if( mw.ustring.match( r, 'United Kingdom' ) ) then
        return 'impus'
    end
    if( (u .. '_' .. pr ) == 'area_dunam' ) then
        return 'dunam'
    end
    
    return 'metric'
end

local function areadisp(frame, pref, name, mag, ha, km2, sqmi, acre, dunam, percent, link)
    -- This function implements {{Infobox settlement/areadisp}}
    local function formatnum(num)
        return frame:callParserFunction{ name = 'formatnum', args = num }
    end
    
    local metv, metu = '', ''
    local impv, impu = '', ''
    local dunv, dunu = '', ''
    local lstr1, lstr2 = '', ''
    local rndv = 0
    
    pref = pref or ''
    name = name or ''
    mag = mag or ''
    ha = ha or ''
    km2 = km2 or ''
    sqmi = sqmi or ''
    acre = acre or ''
    dunam = dunam or ''
    percent = percent or ''
    link = link or ''
    
    if ( ha ~= '' ) then
        metv = formatnum( ha )
        metu = 'ha'
    elseif ( km2 ~= '' ) then
        metv = formatnum( km2 )
        metu = 'km<sup>2</sup>'
    elseif ( dunam ~= '' ) then
        if (tonumber(dunam) < 1E3) then
            -- convert dunams to hectares
            metv = dunam/10
            metu = 'ha'
            rndv = precision(dunam)+1
            metv = rnd(metv,rndv)
        else
            -- convert dunams to square kilometers
            metv = dunam/1000
            metu = 'km<sup>2</sup>'
            rndv = precision(dunam)+3
            metv = rnd(metv,rndv)
        end
    elseif( acre ~= '' ) then 
        -- convert acres to hectares
        metv = acre*0.4046856422
        metu = 'ha'
        rndv = math.max(precision(acre),-1*order_of_magnitude(metv))
        metv = rnd(metv,rndv)
    elseif( sqmi ~= '' ) then
        -- convert sqmi to km2
        metv = sqmi*2.589988110336
        metu = 'km<sup>2</sup>'
        rndv = math.max(precision(sqmi)-1,-1*order_of_magnitude(metv))
        metv = rnd(metv,rndv)
    end

    if ( acre ~= '' ) then
        impv = formatnum( acre )
        impu = 'acre'
    elseif ( sqmi ~= '' ) then
        impv = formatnum( sqmi )
        impu = 'sq&nbsp;mi'
    elseif (ha ~= '' ) then
        -- convert hectares to acres
        impv = ha/0.4046856422
        impu = 'acre'
        rndv = precision(ha)
        impv = rnd(impv,rndv)
    elseif (km2 ~= '' ) then
        -- convert square kilometres to square miles
        impv = km2/2.589988110336
        impu = 'sq&nbsp;mi'
        rndv = math.max(precision(km2),-1*order_of_magnitude(impv))
        impv = rnd(impv,rndv)
    elseif (dunam ~= '' ) then
        if (tonumber(dunam) < 2589) then
            -- convert dunams to acres
            impv = dunam/4.046856422
            impu = 'acre'
            rndv = math.max(precision(dunam),-1*order_of_magnitude(impv))
            impv = rnd(impv,rndv)
        else
            -- convert dunams to square miles
            impv = dunam/2589.988110336
            impu = 'sq&nbsp;mi'
            rndv = math.max(precision(dunam)+3,-1*order_of_magnitude(impv))
            impv = rnd(impv,rndv)
        end
    end

    if( mw.ustring.match(pref:lower(), '^%s*dunam%s*$') and (dunam == '') ) then
        if( km2 ~= '' ) then
            -- convert square kilometres to dunams
            dunv = km2*1000
            rndv = precision(km2)-3
            dunv = rnd(dunv,rndv)
        elseif( ha ~= '' ) then
            -- convert hectares to dunams
            dunv = ha*10
            rndv = precision(ha)-1
            dunv = rnd(dunv,rndv)
        elseif( sqmi ~= '' ) then
            -- convert square miles to dunams
            dunv = sqmi*2589.988110336
            rndv = math.max(precision(sqmi)-4,-1*order_of_magnitude(dunv))
            dunv = rnd(dunv,rndv)
        elseif( acre ~= '' ) then
            -- convert acres to dunams
            dunv = acre*4.046856422
            rndv = math.max(precision(acre)-1,-1*order_of_magnitude(dunv))
            dunv = rnd(dunv,rndv)
        end
    else
        dunv = formatnum( dunam )
    end
    if( link ~= '' ) then
        dunu = '[[dunum]]'
    else
        dunu = 'dunam'
    end
    
    if( (impu == 'acre') and (tonumber(impv) ~= 1) ) then
        impu = impu .. 's'
    end    
    if( tonumber(dunv) ~= 1 ) then
        dunu = dunu .. 's'
    end
    
    if( metv ~= '' and impv ~= '' ) then
        pref = unitpref(pref, name, 'area')
        if( percent ~= '' ) then
            percent = ' &nbsp;' .. percent .. '%'
        end
        
        if( mag ~= '' ) then
            if( metu == 'ha' ) then
                lstr1 = tostring( order_of_magnitude( metv * 1E4 ) ) 
            else
                lstr1 = tostring( order_of_magnitude( metv * 1E6 ) )
            end
            lstr1 = '[[1_E+' .. lstr1 .. '_m²|'
            lstr2 = ']]'
         end
   
         if( pref == 'impus' ) then
             return string.format('%s&nbsp;%s (%s%s&nbsp;%s%s)%s', 
                 impv, impu, lstr1, metv, metu, lstr2, percent)
         elseif ( pref == 'dunam' ) then
             return string.format('%s&nbsp;%s (%s%s&nbsp;%s%s&nbsp;or&nbsp;%s&nbsp;%s)%s', 
                 dunv, dunu, lstr1, metv, metu, lstr2, impv, impu, percent)
         else
             return string.format('%s%s&nbsp;%s%s (%s&nbsp;%s)%s', 
                 lstr1, metv, metu, lstr2, impv, impu, percent)
         end
     end
end

local function densdisp(frame, pref, name, perkm2, persqmi, pop, ha, km2, sqmi, acre, dunam)
    -- This function implements {{Infobox settlement/densdisp}}
    local function numorzero( num )
        num = num or ''
        num = tonumber(frame:callParserFunction{ name = 'formatnum', args = {num, 'R'}})
        if( num == nil ) then
            return 0
        else
            return num
        end
    end

    local function formatnum(num)
        return frame:callParserFunction{ name = 'formatnum', args = num }
    end
    
    local function formatnumR(num)
        return frame:callParserFunction{ name = 'formatnum', args = {num, 'R'} }
    end

    local metv, metu = '', 'km<sup>2</sup>'
    local impv, impu = '', 'sq&nbsp;mi'
    local rndv = 0
    local perkm2num = tonumber(formatnumR(perkm2 or ''))
    local persqminum = tonumber(formatnumR(persqmi or ''))
    local popnum = tonumber(formatnumR(pop or ''))

    pref = pref or ''
    name = name or ''
    perkm2 = perkm2 or ''
    persqmi = persqmi or ''
    pop = pop or ''
    ha = numorzero(ha)
    km2 = numorzero(km2)
    acre = numorzero(acre)
    sqmi = numorzero(sqmi)
    dunam = numorzero(dunam)
    
    if( (perkm2num == nil) and (persqminum == nil) ) then
       if( mw.ustring.match(perkm2:lower(), '^%s*auto%s*$') or mw.ustring.match(persqmi:lower(), '^%s*auto%s*$') ) then
           if( popnum ~= nil ) then
               if( km2 > 0 ) then
                   metv = popnum/km2
                   rndv = 1 - order_of_magnitude(metv)
                   metv = rnd(metv,rndv)
               elseif( ha > 0 ) then
                   metv = 100*popnum/ha
                   rndv = 1 - order_of_magnitude(metv)
                   metv = rnd(metv,rndv)
               elseif( dunam > 0 ) then
                   metv = 1000*popnum/dunam
                   rndv = 1 - order_of_magnitude(metv)
                   metv = rnd(metv,rndv)
               elseif( acre > 0 ) then
                   metv = (popnum/acre)/0.004046856422
                   rndv = 1 - order_of_magnitude(metv)
                   metv = rnd(metv,rndv)
               elseif( sqmi > 0 ) then
                   metv = (popnum/sqmi)/2.589988110336
                   rndv = 1 - order_of_magnitude(metv)
                   metv = rnd(metv,rndv)
               end
               if( sqmi > 0 ) then
                   impv = popnum/sqmi
                   rndv = 1 - order_of_magnitude(impv)
                   impv = rnd(impv,rndv)
               elseif( acre > 0 ) then
                   impv = 640*popnum/acre
                     rndv = 1 - order_of_magnitude(impv)
                   impv = rnd(impv,rndv)
               elseif( km2 > 0 ) then
                   impv = 2.589988110336*popnum/km2
                   rndv = 1 - order_of_magnitude(impv)
                   impv = rnd(impv,rndv)
               elseif( ha > 0 ) then
                   impv = 258.9988110336*popnum/ha
                   rndv = 1 - order_of_magnitude(impv)
                   impv = rnd(impv,rndv)
               elseif( dunam > 0 ) then
                   impv = 2589.988110336*popnum/dunam
                   rndv = 1 - order_of_magnitude(impv)
                   impv = rnd(impv,rndv)
               end
           end
       end
   elseif( perkm2num ~= nil ) then
       if( persqminum ~= nil ) then
           metv = formatnum( perkm2 )
           impv = formatnum( persqmi )
       else
           metv = formatnum( perkm2 )
           impv = perkm2num*2.589988110336
           rndv = math.max(precision(perkm2num)-1,-1*order_of_magnitude(impv)) 
           impv = rnd(impv,rndv)
       end
    elseif( persqminum ~= nil ) then
        metv = persqminum/2.589988110336
        rndv = math.max(precision(persqminum),-1*order_of_magnitude(metv))
        metv = rnd(metv,rndv)
        impv = formatnum( persqmi )
    end

    if( metv ~= '' and impv ~= '') then
      pref = unitpref(pref, name, 'area')
      if( pref == 'impus' ) then
         return string.format('%s/%s (%s/%s)', impv, impu, metv, metu)
      else
         return string.format('%s/%s (%s/%s)', metv, metu, impv, impu)
      end
    else
      return ''
    end  
end

local function lengthdisp(frame, pref, name, km, m, mi, ft)
    -- This function implements {{Infobox settlement/lengthdisp}}
    local function formatnum(num)
        return frame:callParserFunction{ name = 'formatnum', args = num }
    end
    
    local metv, metu = '', ''
    local impv, impu = '', ''
    local rndv = 0
    pref = pref or ''
    name = name or ''
    m = m or ''
    km = km or ''
    ft = ft or ''
    mi = mi or ''
    
    if ( km ~= '' ) then
        metv = formatnum( km )
        metu = 'km'
    elseif ( m ~= '' ) then
        metv = formatnum( m )
        metu = 'm'
    elseif ( mi ~= '' ) then
        metv = mi*1.609344
        metu = 'km'
        rndv = precision(mi)
        metv = rnd(metv,rndv)
    elseif ( ft ~= '' ) then
        metv = ft*0.3048
        metu = 'm'
        rndv = math.max(precision(ft),-1*order_of_magnitude(metv))
        metv = rnd(metv,rndv)
    end
    
    if ( mi ~= '' ) then
        impv = formatnum( mi )
        impu = 'mi'
    elseif ( ft ~= '' ) then
        impv = formatnum( ft )
        impu = 'ft'
    elseif ( km ~= '' ) then
        impv = km/1.609344
        impu = 'mi'
        rndv = math.max(precision(km),-1*order_of_magnitude(impv))
        impv = rnd(impv,rndv)
    elseif ( m ~= '' ) then
        impv = m/0.3048
        impu = 'ft'
        rndv = precision(m)
        impv = rnd(impv,rndv)
    end
    
    if( impv ~= '' and metv ~= '' ) then
        pref = unitpref(pref, name, 'length')
        if( pref == 'impus' ) then
           return string.format('%s&nbsp;%s (%s&nbsp;%s)', impv, impu, metv, metu)
        else
           return string.format('%s&nbsp;%s (%s&nbsp;%s)', metv, metu, impv, impu)
        end
    else
        return ''
    end    
end

function p.areadisp(frame)
    local args = frame.args
    return areadisp(frame, args['pref'], args['name'], args['mag'], 
        args['ha'], args['km2'], args['sqmi'], args['acre'], args['dunam'], args['percent'], args['link'])
end

function p.densdisp(frame)
    local args = frame.args
    return densdisp(frame, args['pref'], args['name'], 
        args['/km2'], args['/sqmi'], args['pop'], args['ha'], args['km2'], args['sqmi'], args['acre'], args['dunam'])
end

function p.lengthdisp(frame)
    local args = frame.args
    return lengthdisp(frame, args['pref'], args['name'], args['km'], args['m'], args['mi'], args['ft'])
end

function p.link(frame)
    local args = frame.args
    return link(args['link'], args['type'], args['name'])
end

function p.columns(frame)
    local args = frame.args
    if( args[0] and args[0] ~= '' ) then
      return columns2(args[0], args[1], args[2], args[3], args[4], args[5])
    else
      return columns(args[1], args[2], args[3], args[4])
    end
end

function p.infobox(frame)
    local args = {}
    local oargs = frame:getParent().args
    local pname = firstnonempty({oargs['name'], oargs['official_name'], mw.title.text})
    local narrowmap = isnotempty(oargs['pushpin_map_narrow']) and isnotempty(oargs['pushpin_map'])
    args['bodyclass'] = 'geography vcard'
    args['bodystyle'] = 'width:23em'
    args['headerstyle'] = 'text-align:left'
    args['abovestyle'] = 'font-size:1.25em; white-space:nowrap'
    -- build the names, type, and transliterations subbox
    local sargs = {}
    local scount = 0
    sargs['child'] = 'yes'
    if( (isnotempty(oargs['name']) or isnotempty(oargs['official_name']) ) and
    	(isnotempty(oargs['settlement_type']) or isnotempty(oargs['type']) ) ) then
	    sargs['subheaderstyle'] = 'background-color:#cddeff; font-weight:bold;'
    	sargs['subheader'] = '<span class="category">'
    		.. firstnonempty(oargs['settlement_type'], oargs['type']) .. '</span>'
    	scount = scount + 1
    end
    if( isnotempty(oargs['name']) and isnotempty(oargs['official_name']) ) then
    	sargs['rowclass1'] = 'mergedtoprow'
    	sargs['header1'] = oargs['official_name']
    	scount = scount + 1
    end
    if( isnotempty(oargs['translit_lang1']) ) then
    	local targs = translitlangbox(
    		{oargs['translit_lang1_type'],
    		 oargs['translit_lang1_type1'],
    		 oargs['translit_lang1_type2'],
    		 oargs['translit_lang1_type3'],
    		 oargs['translit_lang1_type4'],
    		 oargs['translit_lang1_type5'],
    		 oargs['translit_lang1_type6']},
    		{oargs['translit_lang1_info'],
    		 oargs['translit_lang1_info1'],
    		 oargs['translit_lang1_info2'],
    		 oargs['translit_lang1_info3'],
    		 oargs['translit_lang1_info4'],
    		 oargs['translit_lang1_info5'],
    		 oargs['translit_lang1_info6']})
    	if( targs ) then
    		sargs['rowclass2'] = 'mergedtoprow'
    		sargs['header2'] = oargs['translit_lang1'] .. '&nbsp;transcription(s)' .. infobox_module._infobox(targs)
	    	scount = scount + 1
    	end
    end
    if( isnotempty(oargs['translit_lang2']) ) then
    	local targs = translitlangbox(
    		{oargs['translit_lang2_type'],
    		 oargs['translit_lang2_type1'],
    		 oargs['translit_lang2_type2'],
    		 oargs['translit_lang2_type3'],
    		 oargs['translit_lang2_type4'],
    		 oargs['translit_lang2_type5'],
    		 oargs['translit_lang2_type6']},
    		{oargs['translit_lang2_info'],
    		 oargs['translit_lang2_info1'],
    		 oargs['translit_lang2_info2'],
    		 oargs['translit_lang2_info3'],
    		 oargs['translit_lang2_info4'],
    		 oargs['translit_lang2_info5'],
    		 oargs['translit_lang2_info6']})
    	if( targs ) then
    		sargs['rowclass3'] = 'mergedtoprow'
    		sargs['header3'] = oargs['translit_lang2'] .. '&nbsp;transcription(s)' .. infobox_module._infobox(targs)
	    	scount = scount + 1
    	end
	end
    -- End of names, type, and transliterations

    args['above'] =  '<span class="fn org">' .. pname .. '</span>'
    if(isnotempty(oargs['native_name'])) then
    	args['above'] = args['above'] .. '<br /><span class="nickname"'
    		.. isnotempty(oargs['native_name_lang']) and ' lang="' .. oargs['native_name_lang'] .. '">'
    		.. oargs['native_name'] .. '</span>'
    end
    if(isnotempty(oargs['other_name'])) then
    	args['above'] = args['above'] .. '<br /><span class="nickname" style="font-size:78%">'
    		.. oargs['other_name'] .. '</span>'
    end
   	if( scount > 0 ) then
	    args['above'] = args['above'] .. infobox_module._infobox(sargs)
	end
	-- Skyline image
	if( isnotempty(oargs['image_skyline']) ) then
		args['imagestyle'] = 'padding:0.7em 0.8em'
		args['image'] = image_module._InfoboxImage(
			{['image'] = oargs['image_skyline'], 
			 ['size'] = oargs['imagesize'], 
			 ['sizedefault'] = '250px', 
			 ['alt'] = oargs['image_alt'],
			 ['title'] = oargs['image_caption'] or ('Skyline of ' .. pname)
			 })
		if( isnotempty(oargs['image_caption']) ) then
			args['image'] = args['image'] .. '<br /><small>' .. oargs['image_caption'] .. '</small>'
		end
	end
	-- Other image
	if( isnotempty(oargs['image']) ) then
		args['image2'] = oargs['image']
	end
	-- Primary map
	local image_map = nil
	if( isnotempty(oargs['image_map']) ) then
		local msize = narrowmap and '100px' or '250px'
		
		image_map = image_module._InfoboxImage({
			['image'] = oargs['image_map'],
			['size'] = oargs['mapsize'],
			['sizedefault'] = msize,
			['alt'] = oargs['map_alt'],
			['title'] = oargs['map_caption'] or 'Location of ' .. pname,
			})
		if( isnotempty(oargs['map_caption'])) then
			image_map = image_map .. '<br /><small>' .. oargs['map_caption'] .. '</small>'
		end
	end
	-- Primary pushpin map
	local pushpin_map = nil
	if( isnotempty(oargs['pushpin_map']) and isnotempty(oargs['latd']) and isnotempty(oargs['longd'])) then
		local plabel
		if(oargs['pushpin_label_position'] and oargs['pushpin_label_position']:lower() == 'none') then
			plabel = ''
		else if( isnotempty(oargs['pushpin_label']) ) then
			plabel = oargs['pushpin_label']
		else
			plabel = pname
		end
		local pwidth = ''
		if(narrowmap) then
			pwidth = firstnonempty(oargs['pushpin_mapsize'], '150')
		end
		local lat, lat_deg, lat_min, lat_sec
		if(isnotempty(oargs['latm']) or isnotempty(oargs['latNS'])) then
			lat = ''
			lat_deg = oargs['latd'] or ''
			lat_min = oargs['latm'] or ''
			lat_sec = oargs['lats'] or ''
		else
			lat = oargs['latd'] or ''
		end
		local long, lon_deg, lon_min, lon_sec
		if(isnotempty(oargs['longm']) or isnotempty(oargs['longEW'])) then
			long = ''
			lon_deg = oargs['longd'] or ''
			lon_min = oargs['longm'] or ''
			lon_sec = oargs['longs'] or ''
		else
			long = oargs['longd'] or ''
		end
		local caption = firstnonempty({oargs['pushpin_map_caption'], oargs['map_caption']})
		pushpin_map = '<center>' .. locationmap_module._main({
			['1'] = oargs['pushpin_map'],
			['border'] = 'none',
			['alt'] = oargs['pushpin_map_alt'],
			['caption'] = '',
			['float'] = 'none',
			['width'] = pwidth,
			['default_width'] = '250',
			['relief'] = oargs['pushpin_relief'],
			['AlternativeMap'] = oargs['pushpin_image'],
			['label'] = plabel,
			['lat'] = lat, ['long'] = long,
			['lat_deg'] = lat_deg, ['lat_min'] = lat_min, ['lat_sec'] = lat_sec,
			['lat_dir'] = oargs['latNS'] or '',
			['lon_deg'] = lon_deg, ['lon_min'] = lon_min, ['lon_sec'] = lon_sec,
			['lon_dir'] = oargs['lonEW'] or '',
			['marksize'] = '6',
			['position'] = oargs['pushpin_label_position'] or ''
			})
		if( caption ) then
			pushpin_map = pushpin_map .. '<small>' .. caption .. '</small>'
		end
			pushpin_map = pushpin_map .. '</center>'
		end
	end
	-- Flag, Seal, Shield and Coat of arms
	if( isnotempty(oargs['image_flag']) or isnotempty(oargs['image_seal']) 
		or isnotempty(oargs['image_shield']) or isnotempty(oargs['image_blank_emblem'])
		or narrowmap) then
		args['rowclass1'] = 'mergedtoprow'
		args['class1'] = 'maptable'
		local isize = (isnotempty(oargs['pushpin_map_narrow']) and isnotempty(oargs['pushpin_map'])) and '85px' or '100px'
		local targs = {}
		if( isnotempty(oargs['image_flag']) ) then
			local iborder = yesno(oargs['flag_border'], 'yes', '', 'yes', 'yes')
			targs[1] = image_module._InfoboxImage({
				['image'] = oargs['image_flag'],
				['size'] = oargs['flag_size'],
				['sizedefault'] = isize,
				['border'] = iborder,
				['alt'] = oargs['flag_alt'],
				['title'] = 'Flag of ' .. pname,
				}) .. '<br /><small>\'\'\'' .. link(oargs['flag_link'], 'Flag', oargs['official_name']) .. '\'\'\'</small>'
		end
		if( isnotempty(oargs['image_seal']) ) then
			targs[2] = image_module._InfoboxImage({
				['image'] = oargs['image_seal'],
				['size'] = oargs['seal_size'],
				['sizedefault'] = isize,
				['alt'] = oargs['seal_alt'],
				['title'] = 'Official seal of ' .. pname,
				}) .. '<br /><small>\'\'\'' .. link(oargs['seal_link'], firstnonempty(oargs['seal_type'], 'Seal'), oargs['official_name']) .. '\'\'\'</small>'
		end
		if( isnotempty(oargs['image_shield']) ) then
			targs[3] = image_module._InfoboxImage({
				['image'] = oargs['image_shield'],
				['size'] = oargs['shield_size'],
				['sizedefault'] = isize,
				['alt'] = oargs['shield_alt'],
				['title'] = 'Coat of arms of ' .. pname,
				}) .. '<br /><small>\'\'\'' .. link(oargs['shield_link'], 'Coat of arms', oargs['official_name']) .. '\'\'\'</small>'
		end
		if( isnotempty(oargs['image_blank_emblem']) ) then
			targs[4] = image_module._InfoboxImage({
				['image'] = oargs['image_blank_emblem'],
				['size'] = oargs['blank_emblem_size'],
				['sizedefault'] = isize,
				['alt'] = oargs['blank_emblem_alt'],
				['title'] = 'Official logo of ' .. pname,
				}) .. '<br /><small>\'\'\'' .. link(oargs['blank_emblem_link'], firstnonempty(oargs['blank_emblem_type'], 'Logo'), oargs['official_name']) .. '\'\'\'</small>'
		end
		targs[5] = image_map
		if( narrowmap and pushpin_map) then
			args['data1'] = columns2(pushpin_map, targs[1], targs[2], targs[3], targs[4], targs[5])
		else
			args['data1'] = columns(targs[1], targs[2], targs[3], targs[4])
		end
	end
	-- Nickname
	if( isnotempty(oargs['nickname']) ) then
		args['rowclass2'] = 'mergedrow'
		args['data2'] = 'Nickname(s): <span class="nickname">' .. oargs['nickname'] .. '</span>'
	end
	-- Motto
	if( isnotempty(oargs['motto']) ) then
		args['rowclass3'] = 'mergedrow'
		args['data3'] = 'Motto: ' .. oargs['motto']
	end
	-- Anthem
	if( isnotempty(oargs['anthem']) ) then
		args['rowclass4'] = 'mergedrow'
		args['data4'] = 'Anthem: ' .. oargs['anthem']
	end
	-- Map
	if( narrowmap  and image_map ) then
		args['rowclass5'] = mergedrow
		args['data5'] = image_map
	end
	if( isnotempty(oargs['image_map1']) ) then
		args['rowclass6'] = mergedrow
		args['data6'] = image_module._InfoboxImage({
			['image'] = oargs['image_map1'],
			['size'] = oargs['mapsize1'],
			['sizedefault'] = '250px',
			['alt'] = oargs['map_alt1'],
			['title'] = oargs['map_caption1'] or 'Location of ' .. pname,
			})
		if( isnotempty(oargs['map_caption1'])) then
			image_map = image_map .. '<br /><small>' .. oargs['map_caption1'] .. '</small>'
		end
	end
	-- Dot map
	if( isnotempty(oargs['image_dot_map']) ) then
		args['rowclass7'] = 'mergedrow'
		args['data7'] = '<center>Dot maps not supported!</center>'
	end
	
    -- Pushpin map
	if( narrowmap == nil and pushpin_map) then
		args['rowclass8'] = 'mergedtoprow'
		args['data8'] = pushpin_map
	end

    return infobox_module._infobox(args)
 
end
 
return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.