Modul:Peta lokasi
Penampilan
| Modul ini telah dinilai sedia untuk kegunaan am. Ia telah mencapai bentuk yang matang dan dianggap bebas daripada pepijat dan sedia untuk digunakan pada mana-mana laman yang sesuai. Ia juga sedia untuk dipanggil pada laman-laman bantuan dan sumber-sumber Wikipedia lain supaya pengguna-pengguna baharu dapat belajar penggunaannya. Untuk mengurangkan beban pelayan dan output buruk, ia patut diperbaikkan melalui kes ujian kotak pasir berbanding menyunting berulang kali secara cuba-dan-ralat. |
| Modul Lua ini digunakan di banyak laman dan perubahan mungkin disedari secara meluas. Sila uji perubahan di sublaman modul (kotak pasir atau kes ujian), atau di kotak pasir modul anda sendiri. Pertimbangkan untuk membincangkan perubahan di laman perbincangan sebelum menerapkannya. |
| Modul ini bergantung pada modul-modul lain: |
| This module uses TemplateStyles: |
Modul ini diterapkan pada {{Peta lokasi}} dan {{Peta lokasi~}}. Sila lihat laman templat untuk arahan penggunaan.
Masalah yang diketahui
Sejak pengenalan sokongan untuk kapsyen yang berbeza apabila berbilang peta digunakan, suatu masalah telah ditonjolkan.
Sesetengan templat kotak into menggunakan parameter kapsyennya secara terus berbanding dan bukannya menghantarnya ke modul ini.
Kategori penjejakan/penyenggaraan
- Kategori:Peta lokasi dengan kemungkinan ralat (2)
- Kategori:Peta lokasi dengan ketepatan longitud dan latitud yang berbeza (9)
- Kategori:Peta lokasi dengan tanda di luar peta dan di luar parameter yang tidak ditetapkan (21)
- Kategori:Peta lokasi dengan nama yang mengandungi simbol paip (0)
- Kategori:Peta lokasi dengan parameter yang dikeluarkan (0)
- Kategori:Peta lokasi dengan darjah dan minit atau saat negatif (3)
Lihat juga
require('strict')
local p = {}
local getArgs = require('Modul:Arguments').getArgs
local function round(n, decimals)
local pow = 10^(decimals or 0)
return math.floor(n * pow + 0.5) / pow
end
function p.getMapParams(map, frame)
if not map then
error('Nama takrifan peta lokasi yang hendak digunakan mesti dinyatakan', 2)
end
local moduletitle = mw.title.new('Modul:Peta lokasi/data/' .. map)
if not moduletitle then
error(string.format('%q bukan nama yang sah untuk takrifan peta lokasi', map), 2)
elseif moduletitle.exists then
local mapData = mw.loadData('Modul:Peta lokasi/data/' .. map)
return function(name, params)
if name == nil then
return 'Modul:Peta lokasi/data/' .. map
elseif mapData[name] == nil then
return ''
elseif params then
return mw.message.newRawMessage(tostring(mapData[name]), unpack(params)):plain()
else
return mapData[name]
end
end
else
error('Tidak dapat menemui takrifan peta lokasi yang dinyatakan: "Modul:Peta lokasi/data/' .. map .. '" tidak wujud', 2)
end
end
function p.data(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local params = {}
for k,v in ipairs(args) do
if k > 2 then
params[k-2] = v
end
end
return map(args[2], #params ~= 0 and params)
end
local hemisphereMultipliers = {
longitude = { W = -1, w = -1, E = 1, e = 1, B = -1, b = -1, T = 1, t = 1 },
latitude = { S = -1, s = -1, N = 1, n = 1, U = 1, u = 1 }
}
local function decdeg(degrees, minutes, seconds, hemisphere, decimal, direction)
if decimal then
if degrees then
error('Darjah perpuluhan dan DMS tidak boleh disediakan untuk kedua-duanya ' .. direction, 2)
elseif minutes then
error('Minit hanya boleh disediakan dengan darjah DMS untuk ' .. direction, 2)
elseif seconds then
error('Saat hanya boleh disediakan dengan darjah DMS untuk ' .. direction, 2)
elseif hemisphere then
error('Hemisfera hanya boleh disediakan dengan darjah DMS untuk ' .. direction, 2)
end
local retval = tonumber(decimal)
if retval then
return retval
end
error('Nilai "' .. decimal .. '" disediakan untuk ' .. direction .. ' adalah tidak sah', 2)
elseif seconds and not minutes then
error('Saat disediakan untuk ' .. direction .. ' tanpa minit juga disediakan', 2)
elseif not degrees then
if minutes then
error('Minit disediakan untuk ' .. direction .. ' tanpa darjah juga disediakan', 2)
elseif hemisphere then
error('Hemisfera disediakan untuk ' .. direction .. ' tanpa darjah juga disediakan', 2)
end
return nil
end
decimal = tonumber(degrees)
if not decimal then
error('Nilai darjah "' .. degrees .. '" disediakan untuk ' .. direction .. ' adalah tidak sah', 2)
elseif minutes and not tonumber(minutes) then
error('Nilai minit "' .. minutes .. '" disediakan untuk ' .. direction .. ' adalah tidak sah', 2)
elseif seconds and not tonumber(seconds) then
error('Nilai saat "' .. seconds .. '" disediakan untuk ' .. direction .. ' adalah tidak sah', 2)
end
decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600
if hemisphere then
local multiplier = hemisphereMultipliers[direction][hemisphere]
if not multiplier then
error('Hemisfera "' .. hemisphere .. '" disediakan untuk ' .. direction .. ' adalah tidak sah', 2)
end
decimal = decimal * multiplier
end
return decimal
end
-- Cari parameter dalam suatu transklusi bagi {{Koord}}.
local function coord2text(para, coord)
-- Read from the geo-dec span which contains proper decimal values
-- Output format from specPrinter: "3.087°S 101.708°T" or "3.087°U 101.708°T"
local geodec = mw.ustring.match(coord, '<span class="geo%-dec"[^>]*>([^<]+)</span>')
if geodec then
local latp, lonp = mw.ustring.match(geodec, '([%.%d]+°[US])%s+([%.%d]+°[TB])')
if latp and lonp then
local val = (para == 'longitude' or para == 'longitud') and lonp or latp
local num = tonumber(mw.ustring.match(val, '^([%.%d]+)'))
if num then
if mw.ustring.find(val, '[SB]$') then
num = -num
end
return num
end
end
end
-- Strategy 2: Fallback — match decimal DMS with Malay suffixes e.g. "3.5°U 101.7°T"
local result = mw.text.split(
mw.ustring.match(coord, '%-?[%.%d]+°[USu] %-?[%.%d]+°[TBt]') or '', '[ °]')
if para == 'longitude' or para == 'longitud' then
result = {result[3], result[4]}
end
if not tonumber(result[1]) or not result[2] then
mw.log('Nilai koordinat salah bentuk')
mw.logObject(para, 'para')
mw.logObject(coord, 'coord')
return error('Nilai koordinat salah bentuk', 2)
end
return tonumber(result[1]) * hemisphereMultipliers[para][result[2]]
end
-- effectively make removeBlanks false for caption and maplink, and true for everything else
-- if useWikidata is present but blank, convert it to false instead of nil
-- p.top, p.bottom, and their callers need to use this
function p.valueFunc(key, value)
if value then
value = mw.text.trim(value)
end
if value ~= '' or key == 'caption' or key == 'kapsyen' or key == 'maplink' or key == 'pautan_peta' then
return value
elseif key == 'useWikidata' or key == 'gunakan_Wikidata' then
return false
end
end
local function getContainerImage(args, map)
if (args.AlternativeMap or args['peta_alternatif']) then
return (args.AlternativeMap or args['peta_alternatif'])
elseif (args.relief or args['peta_bentuk_muka_bumi']) then
local digits = mw.ustring.match((args.relief or args['peta_bentuk_muka_bumi']),'^[1-9][0-9]?$') or '1' -- image1 to image99
if map('image' .. digits) ~= '' or map('imej' .. digits) ~= '' then
return map('image' .. digits) or map('imej' .. digits)
end
end
return map('image') or map('imej')
end
function p.top(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local width
local default_as_number = tonumber(mw.ustring.match(tostring(args.default_width or args['lebar_lalai']),"%d*"))
if not (args.width or args['lebar']) then
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1))
elseif mw.ustring.sub(args.width or args['lebar'], -2) == 'px' then
width = mw.ustring.sub(args.width or args['lebar'], 1, -3)
else
width = args.width or args['lebar']
end
local width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0;
if width_as_number == 0 then
-- check to see if width is junk. If it is, then use default calculation
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1))
width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0;
end
if (args.max_width ~= "" or args['lebar_maksimum'] ~= "") and (args.max_width ~= nil or args['lebar_maksimum'] ~= nil) then
-- check to see if width bigger than max_width
local max_as_number = tonumber(mw.ustring.match(args.max_width or args['lebar_maksimum'],"%d*")) or 0;
if width_as_number>max_as_number and max_as_number>0 then
width = args.max_width or args['lebar_maksimum'];
end
end
local retval = frame:extensionTag{name = 'templatestyles', args = {src = 'Modul:Peta lokasi/gaya.css'}}
if args.float == 'center' or args['penjajaran'] == 'center' then
retval = retval .. '<div class="center">'
end
if (args.caption or args['kapsyen']) and ((args.caption or args['kapsyen']) ~= '') and ((args.border or args['sempadan']) ~= 'infobox') then
retval = retval .. '<div class="locmap noresize thumb '
if args.float == '"left"' or args.float == 'left' or args['penjajaran'] == '"left"' or args['penjajaran'] == 'left' then
retval = retval .. 'tleft'
elseif args.float == '"center"' or args.float == 'center' or args.float == '"none"' or args.float == 'none' or args['penjajaran'] == '"center"' or args['penjajaran'] == 'center' or args['penjajaran'] == '"none"' or args['penjajaran'] == 'none' then
retval = retval .. 'tnone'
else
retval = retval .. 'tright'
end
retval = retval .. '"><div class="thumbinner" style="width:' .. (width + 2) .. 'px'
if args.border == 'none' or args['sempadan'] == 'none' then
retval = retval .. ';border:none'
elseif (args.border or args['sempadan']) then
retval = retval .. ';border-color:' .. (args.border or args['sempadan'])
end
retval = retval .. '"><div style="position:relative;width:' .. width .. 'px' .. ((args.border ~= 'none' or args['sempadan'] ~= 'none') and ';border:1px solid lightgray">' or '">')
else
retval = retval .. '<div class="locmap" style="width:' .. width .. 'px;'
if args.float == '"left"' or args.float == 'left' or args['penjajaran'] == '"left"' or args['penjajaran'] == 'left' then
retval = retval .. 'float:left;clear:left'
elseif args.float == '"center"' or args.float == 'center' or args['penjajaran'] == '"center"' or args['penjajaran'] == 'center' then
retval = retval .. 'float:none;clear:both;margin-left:auto;margin-right:auto'
elseif args.float == '"none"' or args.float == 'none' or args['penjajaran'] == '"none"' or args['penjajaran'] == 'none' then
retval = retval .. 'float:none;clear:none'
else
retval = retval .. 'float:right;clear:right'
end
retval = retval .. '"><div style="width:' .. width .. 'px;padding:0"><div style="position:relative;width:' .. width .. 'px">'
end
local image = getContainerImage(args, map)
local currentTitle = mw.title.getCurrentTitle()
retval = string.format(
'%s[[Fail:%s|%spx|%s%s|class=notpageimage noviewer]]',
retval,
image,
width,
(args.alt or args['alternatif']) or ((args.label or currentTitle.text) .. ' yang terletak di ' .. (map('name') or map('nama'))),
(args.maplink or args['pautan_peta'] ) and ('|link=' .. (args.maplink or args['pautan_peta'])) or ''
)
if (args.caption or args['kapsyen']) and ((args.caption or args['kapsyen']) ~= '') then
if (currentTitle.namespace == 0) and mw.ustring.find(args.caption or args['kapsyen'], '##') then
retval = retval .. '[[Kategori:Laman menggunakan peta lokasi dengan tanda nombor berganda pada kapsyen]]'
end
end
if (args.overlay_image or args['imej_tindanan']) then
return retval .. '<div style="position:absolute;top:0;left:0">[[Fail:' .. args.overlay_image .. '|' .. width .. 'px|class=notpageimage noviewer]]</div>'
else
return retval
end
end
function p.bottom(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local retval = '</div>'
local currentTitle = mw.title.getCurrentTitle()
if not (args.caption or args['kapsyen']) or (args.border or args['sempadan']) == 'infobox' then
if args.border or args['sempadan'] then
retval = retval .. '<div style="padding-top:0.2em">'
else
retval = retval .. '<div style="font-size:91%;padding-top:3px">'
end
retval = retval
.. ((args.caption or args['kapsyen']) or (args.label or currentTitle.text) .. ' (' .. (map('name') or map('nama')) .. ')')
.. '</div>'
elseif (args.caption or args['kapsyen']) ~= '' then
-- This is not the pipe trick. We're creating a link with no text on purpose, so that CSS can give us a nice image
retval = retval .. '<div class="thumbcaption"><div class="magnify">[[:Fail:' .. getContainerImage(args, map) .. '|class=notpageimage| ]]</div>' .. (args.caption or args['kapsyen']) .. '</div>'
end
if args.switcherLabel then
retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>'
elseif args.autoSwitcherLabel then
retval = retval .. '<span class="switcher-label" style="display:none">Paparkan peta bagi ' .. (map('name') or map('nama')) .. '</span>'
end
retval = retval .. '</div></div>'
if args.caption_undefined or args['kapsyen_tidak_ditakrifkan'] then
mw.log('Parameter kapsyen_tidak_ditakrifkan yang dikeluarkan telah digunakan.')
local parent = frame:getParent()
if parent then
mw.log('Induknya ialah ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
retval = retval .. '[[Kategori:Peta lokasi dengan parameter yang dikeluarkan|kapsyen_tidak_ditakrifkan]]'
end
end
if map('skew') ~= '' or map('pencongan') ~= '' or map('lat_skew') ~= '' or map('lat-pencongan') ~= '' or map('crosses180') ~= '' or map('melintasi_180') ~= '' or map('type') ~= '' or map('jenis') ~= '' then
mw.log('Parameter yang dikeluarkan telah digunakan dalam takrifan peta ' .. map())
if currentTitle.namespace == 0 then
local key = (map('skew') ~= '' or map('pencongan') ~= '' and 'skew' or 'pencongan' or '') ..
(map('lat_skew') ~= '' or map('lat-pencongan') ~= '' and 'lat_skew' or 'lat-pencongan' or '') ..
(map('crosses180') ~= '' or map('melintasi_180') ~= '' and 'crosses180' or 'melintasi_180' or '') ..
(map('type') ~= '' or map('jenis') ~= '' and 'type' or 'jenis' or '')
retval = retval .. '[[Kategori:Peta lokasi dengan parameter yang dikeluarkan|' .. key .. ' ]]'
end
end
if string.find(map('name') or map('nama'), '|', 1, true) then
mw.log('Simbol paip digunakan dalam nama takrifan peta ' .. map())
if currentTitle.namespace == 0 then
retval = retval .. '[[Kategori:Peta lokasi dengan nama yang mengandungi simbol paip]]'
end
end
if (args.float or args['penjajaran']) == 'center' then
retval = retval .. '</div>'
end
return retval
end
local function markOuterDiv(x, y, imageDiv, labelDiv, label_size)
return mw.html.create('div')
:addClass('od')
:addClass('notheme') -- T236137
:cssText('top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '%;font-size:' .. label_size .. '%')
:node(imageDiv)
:node(labelDiv)
end
local function markImageDiv(mark, marksize, label, link, alt, title)
local builder = mw.html.create('div')
:addClass('id')
:cssText('left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px')
:attr('title', title)
if marksize ~= 0 then
builder:wikitext(string.format(
'[[Fail:%s|%dx%dpx|%s|link=%s%s|class=notpageimage noviewer]]',
mark,
marksize,
marksize,
label,
link,
alt and ('|alt=' .. alt) or ''
))
end
return builder
end
local function markLabelDiv(label, label_size, label_width, position, background, x, marksize)
if tonumber(label_size) == 0 then
return mw.html.create('div'):addClass('l0'):wikitext(label)
end
local builder = mw.html.create('div')
:cssText('width:' .. label_width .. 'em')
local distance = round(marksize / 2 + 1)
if position == 'top' then -- specified top
builder:addClass('pv'):cssText('bottom:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em')
elseif position == 'bottom' then -- specified bottom
builder:addClass('pv'):cssText('top:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em')
elseif position == 'left' or (tonumber(x) > 70 and position ~= 'right') then -- specified left or autodetected to left
builder:addClass('pl'):cssText('right:' .. distance .. 'px')
else -- specified right or autodetected to right
builder:addClass('pr'):cssText('left:' .. distance .. 'px')
end
builder = builder:tag('div')
:wikitext(label)
if background then
builder:cssText('background-color:' .. background)
end
return builder:done()
end
local function getX(longitude, left, right)
local width = (right - left) % 360
if width == 0 then
width = 360
end
local distanceFromLeft = (longitude - left) % 360
-- the distance needed past the map to the right equals distanceFromLeft - width. the distance needed past the map to the left equals 360 - distanceFromLeft. to minimize page stretching, go whichever way is shorter
if distanceFromLeft - width / 2 >= 180 then
distanceFromLeft = distanceFromLeft - 360
end
return 100 * distanceFromLeft / width
end
local function getY(latitude, top, bottom)
return 100 * (top - latitude) / (top - bottom)
end
function p.mark(frame, args, map)
if not args then
args = getArgs(frame, {wrappers = 'Templat:Peta lokasi~'})
end
local mapnames = {}
if not map then
if args[1] then
map = {}
for mapname in mw.text.gsplit(args[1], '#', true) do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
mapnames[#mapnames + 1] = mapname
end
if #map == 1 then map = map[1] end
else
map = p.getMapParams('World', frame)
args[1] = 'World'
end
end
if type(map) == 'table' then
local outputs = {}
local oldargs = args[1]
for k,v in ipairs(map) do
args[1] = mapnames[k]
outputs[k] = tostring(p.mark(frame, args, v))
end
args[1] = oldargs
return table.concat(outputs, '#PlaceList#') .. '#PlaceList#'
end
local x, y, longitude, latitude
longitude = decdeg(args.lon_deg or args['long-darjah'], args.lon_min or args['long-minit'], args.lon_sec or args['long-saat'], args.lon_dir or args['long-arah'], args.long or args['longitud'], 'longitude')
latitude = decdeg(args.lat_deg or args['lat-darjah'], args.lat_min or args['lat-minit'], args.lat_sec or args['lat-saat'], args.lat_dir or args['lat-arah'], args.lat or args['latitud'], 'latitude')
if args.excludefrom then
-- If this mark is to be excluded from certain maps entirely (useful in the context of multiple maps)
for exclusionmap in mw.text.gsplit(args.excludefrom, '#', true) do
-- Check if this map is excluded. If so, return an empty string.
if args[1] == exclusionmap then
return ''
end
end
end
local builder = mw.html.create()
local currentTitle = mw.title.getCurrentTitle()
if args.coordinates or args['koordinat'] then
-- Temporarily removed to facilitate infobox conversion. See [[Wikipedia:Coordinates in infoboxes]]
-- if longitude or latitude then
-- error('Coordinates from [[Module:Coordinates]] and individual coordinates cannot both be provided')
-- end
longitude = coord2text('longitude', args.coordinates or args['koordinat'])
latitude = coord2text('latitude', args.coordinates or args['koordinat'])
elseif not longitude and not latitude and args.useWikidata then
-- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't.
local entity = mw.wikibase.getEntity()
if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1].mainsnak.snaktype == 'value' then
local value = entity.claims.P625[1].mainsnak.datavalue.value
longitude, latitude = value.longitude, value.latitude
end
if args.link and (currentTitle.namespace == 0) then
builder:wikitext('[[Kategori:Peta lokasi dengan penanda yang dipautkan dengan koordinat daripada Wikidata]]')
end
end
if not longitude then
error('Tiada nilai disediakan untuk longitud')
elseif not latitude then
error('Tiada nilai disediakan untuk latitud')
end
if currentTitle.namespace > 0 then
if (not (args.lon_deg or args['long-darjah'])) ~= (not (args.lat_deg or args['lat-darjah'])) then
builder:wikitext('[[Kategori:Peta lokasi dengan ketepatan longitud dan latitud yang berbeza|Darjah]]')
elseif (not (args.lon_min or args['long-min'])) ~= (not (args.lat_min or args['lat-minit'])) then
builder:wikitext('[[Kategori:Peta lokasi dengan ketepatan longitud dan latitud yang berbeza|Minit]]')
elseif (not (args.lon_sec or args['long-saat'])) ~= (not (args.lat_sec or args['lat-saat'])) then
builder:wikitext('[[Kategori:Peta lokasi dengan ketepatan longitud dan latitud yang berbeza|Saat]]')
elseif (not (args.lon_dir or args['long-arah'])) ~= (not (args.lat_dir or args['lat-arah'])) then
builder:wikitext('[[Kategori:Peta lokasi dengan ketepatan longitud dan latitud yang berbeza|Hemisfera]]')
elseif (not (args.long or args['longitud'])) ~= (not (args.lat or args['latitud'])) then
builder:wikitext('[[Kategori:Peta lokasi dengan ketepatan longitud dan latitud yang berbeza|Perpuluhan]]')
end
end
if ((tonumber(args.lat_deg or args['lat-darjah']) or 0) < 0) and ((tonumber(args.lat_min or args['lat-minit']) or 0) ~= 0 or (tonumber(args.lat_sec or args['lat-saat']) or 0) ~= 0 or (args.lat_dir and args.lat_dir ~='') or (args['lat-arah'] and args['lat-arah'] ~='')) then
builder:wikitext('[[Kategori:Peta lokasi dengan darjah dan minit atau saat negatif]]')
end
if ((tonumber(args.lon_deg or args['long-darjah']) or 0) < 0) and ((tonumber(args.lon_min or args['long-minit']) or 0) ~= 0 or (tonumber(args.lon_sec or args['long-saat']) or 0) ~= 0 or (args.lon_dir and args.lon_dir ~= '') or (args['long-arah'] and args['long-arah'] ~= '')) then
builder:wikitext('[[Kategori:Peta lokasi dengan darjah dan minit atau saat negatif]]')
end
if (((tonumber(args.lat_min or args['lat-minit']) or 0) < 0) or ((tonumber(args.lat_sec or args['lat-saat']) or 0) < 0)) then
builder:wikitext('[[Kategori:Peta lokasi dengan darjah dan minit atau saat negatif]]')
end
if (((tonumber(args.lon_min or args['long-minit']) or 0) < 0) or ((tonumber(args.lon_sec or args['long-saat']) or 0) < 0)) then
builder:wikitext('[[Kategori:Peta lokasi dengan darjah dan minit atau saat negatif]]')
end
if (args.skew or args['pencongan']) or (args.lon_shift or args['long-anjakan']) or (args.markhigh or args['tinggi_tanda']) then
mw.log('Parameter yang dikeluarkan telah digunakan dalam penyeruan.')
local parent = frame:getParent()
if parent then
mw.log('Induknya ialah ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
local key = ((args.skew or args['pencongan']) and 'skew' or '') ..
((args.lon_shift or args['long-anjakan']) and 'lon_shift' or '') ..
((args.markhigh or args['tinggi_tanda']) and 'markhigh' or '')
builder:wikitext('[[Kategori:Peta lokasi dengan parameter yang dikeluarkan|' .. key ..' ]]')
end
end
if map('x') ~= '' then
x = tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude })))
else
x = tonumber(getX(longitude, map('left'), map('right')))
end
if map('y') ~= '' then
y = tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude })))
else
y = tonumber(getY(latitude, map('top'), map('bottom')))
end
if (x < 0 or x > 100 or y < 0 or y > 100) and not (args.outside or args["luar"]) then
mw.log('Tanda diletakkan di luar sempadan peta tanpa set bendera luar. x = ' .. x .. ', y = ' .. y)
local parent = frame:getParent()
if parent then
mw.log('Induknya ialah ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
local key = currentTitle.prefixedText
builder:wikitext('[[Kategori:Peta lokasi dengan tanda di luar peta dan di luar parameter yang tidak ditetapkan|' .. key .. ' ]]')
end
end
local mark = (args.mark or args['tanda']) or (map('mark') or map('tanda'))
if mark == '' then
mark = 'Red Dot.svg'
end
local marksize = tonumber(args.marksize or args['saiz_tanda']) or tonumber(map('marksize') or map('saiz_tanda')) or 8
local imageDiv = markImageDiv(mark, marksize, args.label or mw.title.getCurrentTitle().text, args.link or args['pautan'] or '', args.alt or args['alternatif'], args[2])
local label_size = (args.label_size or args['saiz_label']) or 91
local labelDiv
if args.label and (args.position ~= 'none' or args['kedudukan'] ~= 'none') then
labelDiv = markLabelDiv(args.label, (args.label_size or args['saiz_label']), (args.label_width or args['lebar_label']) or 6, args.position or args['kedudukan'], args.background or args['latar_belakang'], x, marksize)
end
return builder:node(markOuterDiv(x, y, imageDiv, labelDiv, label_size))
end
local function switcherSeparate(s)
if s == nil then return {} end
local retval = {}
for i in string.gmatch(s .. '#', '([^#]*)#') do
i = mw.text.trim(i)
retval[#retval + 1] = (i ~= '' and i)
end
return retval
end
function p.main(frame, args, map)
local caption_list = {}
if not args then
args = getArgs(frame, {wrappers = 'Templat:Peta lokasi', valueFunc = p.valueFunc})
end
if (args.useWikidata or args["gunakan_Wikidata"]) == nil then
args.useWikidata = true
end
if not map then
if args[1] then
map = {}
for mapname in string.gmatch(args[1], '[^#]+') do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
end
if args['caption'] or args['kapsyen'] then
if args['caption'] == "" or args['kapsyen'] == "" then
while #caption_list < #map do
caption_list[#caption_list + 1] = args['caption'] or args['kapsyen']
end
else
for caption in mw.text.gsplit((args['caption'] or args['kapsyen']), '##', true) do
caption_list[#caption_list + 1] = caption
end
end
end
if #map == 1 then map = map[1] end
else
map = p.getMapParams('World', frame)
end
end
if type(map) == 'table' then
local altmaps = switcherSeparate((args.AlternativeMap or args['peta_alternatif']))
if #altmaps > #map then
error(string.format('Peta alternatif %d disediakan, tetapi hanya peta %d disediakan', #altmaps, #map))
end
local overlays = switcherSeparate((args.overlay_image or args['imej_tindanan']))
if #overlays > #map then
error(string.format('Imej tindanan %d disediakan, tetapi hanya peta %d disediakan', #overlays, #map))
end
if #caption_list > #map then
error(string.format('Kapsyen %d disediakan, tetapi hanya peta %d disediakan', #caption_list, #map))
end
local outputs = {}
args.autoSwitcherLabel = true
for k,v in ipairs(map) do
args.AlternativeMap = altmaps[k]
args.overlay_image = overlays[k]
args.caption = caption_list[k]
outputs[k] = p.main(frame, args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
else
return p.top(frame, args, map) .. tostring( p.mark(frame, args, map) ) .. p.bottom(frame, args, map)
end
end
return p