Modulo:Mapframe/sandbox
Vai alla navigazione
Vai alla ricerca
La documentazione per questo modulo può essere creata in Modulo:Mapframe/sandbox/man
require('Module:No globals') local getArgs = require('Module:Arguments').getArgs local mWikidata = require('Module:Wikidata') local errorCategory = '[[Categoria:Voci con errori del modulo Mapframe]]' local p = {} -- Error handler per xpcall, formatta l'errore. local function errhandler(msg) local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or '' return string.format('<span class="error">%s</span>%s', msg, cat) end local function getLegenda(points, ncols) local divStyle = { ['column-count'] = ncols, ['-moz-column-count'] = ncols, ['-webkit-column-count'] = ncols } local divNode = mw.html.create('div'):css(divStyle) local currNum = 1 local currChar = 'A' for _, point in ipairs(points) do local pNode = mw.html.create('p'):css('font-size', '90%') local codeNode = mw.html.create('code') :css('font-weight', 'bold') :css('color', 'white') :css('border-radius', '6px') :css('border', '2px solid ' .. point.col) :css('background', point.col) if point.simb:find('-number') == 1 then codeNode:wikitext(currNum) currNum = currNum + 1 elseif point.simb:find('-letter') == 1 then codeNode:wikitext(currChar) currChar = ('ABCDEFGHIJKLMNOPQRSTUVWXYZA'):match(currChar .. '(.)') elseif point.simb == '' then else codeNode :css('padding-left', '0') :css('padding-right', '0') :css('background', 'white') codeNode:wikitext(string.format('[[File:Maki2-%s-18.svg|18px]]', point.simb)) end pNode:node(codeNode):wikitext(' ' .. point.nome) divNode:node(pNode) end return tostring(divNode) end function p._mappa(args) local points = {} local geo = args.dati or -1 local sinottico = tonumber(args.sinottico) or 0 local colore = args.colore or '#b80000' --colore local simbolo = args.simbolo or (sinottico ~= 1 and '-number' or nil) --simbolo local gruppo = args.gruppo or '' local autozoom = args.autozoom or 's' local elenco = (args.elenco == '1' or args.elenco == '2') and args.elenco or nil local dsimbolo = 'medium' --if sinottico == 1 then dsimbolo = 'small' end local cornice if args.cornice then cornice = tonumber(args.cornice) or 1 else cornice = 1 end local lat1, lat2, lon1, lon2 = 400, -400, 400, -400 if geo == -1 then local num = 1 if sinottico == 1 and args.lat1 == nil and args.lon1 == nil then args.lat1 = mWikidata._getProperty({ 'P625', coord = 'latitude', n = 1 }) args.lon1 = mWikidata._getProperty({ 'P625', coord = 'longitude', n = 1 }) end while args['nome' .. num] do points[num] = { nome = args['nome' .. num], -- nome del punto desc = args['desc' .. num], -- descrizione del punto lat = tonumber(args['lat' .. num]) or -400, --latitudine lon = tonumber(args['lon' .. num]) or -400, --longitudine col = args['colore' .. num] or colore, -- colore del punto simb = args['simbolo' .. num] or simbolo, --simbolo da mostrare dsimb = args['dim_simbolo' .. num] or dsimbolo, --dimensione del simbolo da mostrare } if points[num].simb == '-number' and gruppo ~= '' then points[num].simb = '-number-' .. gruppo end if points[num].lat > 85 or points[num].lat < -85 then error(string.format('latitudine non valida per il punto %d', num), 2) elseif points[num].lon > 180 or points[num].lon < -180 then error(string.format('longitudine non valida per il punto %d', num), 2) else lat1 = math.min(lat1, points[num].lat) lat2 = math.max(lat2, points[num].lat) lon1 = math.min(lon1, points[num].lon) lon2 = math.max(lon2, points[num].lon) end num = num + 1 end end local m_args = {} -- valori predefiniti m_args.width = 350 m_args.height = 300 m_args.align = 'right' -- valori per sinottico if sinottico == 1 then m_args.width = 260 m_args.height = 260 m_args.align = 'center' end -- valori inseriti m_args.width = args.larghezza or m_args.width m_args.height = args.altezza or m_args.height m_args.align = args.allinea or m_args.align -- elimina cornice per cornice = 0 e per sinottico = 1 if cornice ~= 1 or sinottico == 1 then m_args.frameless = 1 end -- valore ingrandimento if args.zoom then m_args.zoom = tonumber(args.zoom) elseif geo == -1 then if #points == 1 then m_args.zoom = 10 -- valore predefinito per singolo punto if sinottico == 1 then m_args.zoom = 13 -- valore predefinito per sinottico con singolo punto end elseif autozoom == 's' then -- calcola zoom automaticamente local dx = 1.1 * (lon2 - lon1) / 360 local dy = 1.1 * (math.log(math.tan(math.pi * (1 + lat2 / 90) / 4)) - math.log(math.tan( math.pi * (1 + lat1 / 90) / 4))) / (2 * math.pi) local scalax, scalay if dx == 0 then scalax = 18 else scalax = math.floor(-math.log(dx) / math.log(2)) end if dy == 0 then scalay = 18 else scalay = math.floor(-math.log(dy) / math.log(2)) end if dx == 0 and dy == 0 then m_args.zoom = 10 -- valore default per singolo punto else m_args.zoom = math.max(0, math.min(18, scalax, scalay)) end end end -- esclude didascalia per cornice = 0 e per sinottico = 1 if cornice == 1 and sinottico ~= 1 then m_args.text = (args.didascalia or '') .. (elenco and getLegenda(points, elenco) or '') end if args.centro_lon then m_args.longitude = tonumber(args.centro_lon) elseif geo == -1 then if #points == 1 then m_args.longitude = points[1].lon else m_args.longitude = (lon1 + lon2) / 2 end end if args.centro_lat then m_args.latitude = tonumber(args.centro_lat) elseif geo == -1 then if #points == 1 then m_args.latitude = points[1].lat else local l1 = 1 - math.log(math.tan(math.pi * (1 + lat1 / 90) / 4)) / math.pi local l2 = 1 - math.log(math.tan(math.pi * (1 + lat2 / 90) / 4)) / math.pi local centroy = (l1 + l2) / 2 centroy = (math.atan(math.exp(math.pi * (1 - centroy))) - math.pi / 4) * 360 / math.pi m_args.latitude = centroy end end local m_dati if geo == -1 then m_dati = { type = 'FeatureCollection', features = {} } for i = 1, #points do m_dati.features[i] = { type = 'Feature', properties = {}, geometry = { type = 'Point', coordinates = { points[i].lon, points[i].lat } } } m_dati.features[i].properties['marker-symbol'] = points[i].simb m_dati.features[i].properties['marker-color'] = points[i].col m_dati.features[i].properties['marker-size'] = points[i].dsimb m_dati.features[i].properties.title = points[i].nome m_dati.features[i].properties.description = points[i].desc end m_dati = mw.text.jsonEncode(m_dati) else m_dati = mw.getCurrentFrame():preprocess(geo) end if args.debug then local mdebug = mw.text.jsonEncode(m_args) return string.format('<pre>%s\n\n%s</pre>', mdebug, m_dati) else return mw.getCurrentFrame():extensionTag('mapframe', m_dati, m_args) end end -- Funzione per il template {{Mappa OSM}}. function p.mappa(frame) return select(2, xpcall(function() return p._mappa(getArgs(frame, { parentOnly = true })) end, errhandler)) end return p