<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>http://tarikhnema.ir/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3ACoordinates2</id>
	<title>پودمان:Coordinates2 - تاریخچهٔ ویرایش‌ها</title>
	<link rel="self" type="application/atom+xml" href="http://tarikhnema.ir/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3ACoordinates2"/>
	<link rel="alternate" type="text/html" href="http://tarikhnema.ir/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Coordinates2&amp;action=history"/>
	<updated>2026-08-04T19:37:33Z</updated>
	<subtitle>تاریخچهٔ ویرایش‌های این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://tarikhnema.ir/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Coordinates2&amp;diff=150&amp;oldid=prev</id>
		<title>Hasaninasab: صفحه‌ای تازه حاوی «--[[ * Modulo per implementare le funzionalità di Coord * * Traduce in lua: * Template:Coord * Template:Coord/input/dec * Template:Coord/i...» ایجاد کرد</title>
		<link rel="alternate" type="text/html" href="http://tarikhnema.ir/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Coordinates2&amp;diff=150&amp;oldid=prev"/>
		<updated>2017-08-20T09:38:08Z</updated>

		<summary type="html">&lt;p&gt;صفحه‌ای تازه حاوی «--[[ * Modulo per implementare le funzionalità di Coord * * Traduce in lua: * Template:Coord * Template:Coord/input/dec * Template:Coord/i...» ایجاد کرد&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
* Modulo per implementare le funzionalità di Coord&lt;br /&gt;
*&lt;br /&gt;
* Traduce in lua:&lt;br /&gt;
* Template:Coord&lt;br /&gt;
* Template:Coord/input/dec&lt;br /&gt;
* Template:Coord/input/d&lt;br /&gt;
* Template:Coord/input/dm&lt;br /&gt;
* Template:Coord/input/dms&lt;br /&gt;
* Template:Coord/input/ERROR&lt;br /&gt;
* Template:Coord/input/error2&lt;br /&gt;
* Template:Coord/link&lt;br /&gt;
* Template:Coord/prec dec&lt;br /&gt;
* Template:Coord/dms2dec&lt;br /&gt;
* Template:Coord/dec2dms&lt;br /&gt;
* Template:Coord/dec2dms/d&lt;br /&gt;
* Template:Coord/dec2dms/d1&lt;br /&gt;
* Template:Coord/dec2dms/dm&lt;br /&gt;
* Template:Coord/dec2dms/dm1&lt;br /&gt;
* Template:Coord/dec2dms/dms&lt;br /&gt;
* Template:Coord/dec2dms/dms1&lt;br /&gt;
* Template:Precision1&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- Variabili globali&lt;br /&gt;
local p = {}           -- per l'esportazione delle funzioni del modulo&lt;br /&gt;
local args = {}        -- argomenti passati al template&lt;br /&gt;
local errorTable = {}  -- table per contenere gli errori da ritornare&lt;br /&gt;
&lt;br /&gt;
-- Configurazione&lt;br /&gt;
local cfg = mw.loadData(&amp;quot;Module:Coord2/config&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
--                      Funzioni di utilità&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Ritorna il numero arrotondato al numero di cifre decimali richiesto&lt;br /&gt;
local function round(num, idp)&lt;br /&gt;
    local mult = 10^(idp or 0)&lt;br /&gt;
&lt;br /&gt;
    return math.floor(num * mult + 0.5) / mult&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ritorna la stringa &amp;quot;0 + numero&amp;quot; quando il numero è di una sola cifra, altrimenti lo stesso numero&lt;br /&gt;
local function padleft0(num)&lt;br /&gt;
    return (num &amp;lt; 10 and &amp;quot;0&amp;quot; or &amp;quot;&amp;quot;) .. num&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converte un numero in stringa senza usare la notazione scientifica, esempio tostring(0.00001)&lt;br /&gt;
local function numberToString(num)&lt;br /&gt;
    -- la parentesi () extra serve per non ritornare anche il gsub.count&lt;br /&gt;
    return (string.format(&amp;quot;%f&amp;quot;, num):gsub(&amp;quot;%.?0+$&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ritorna latitudine e longitudine della [[d:property:p625]]&lt;br /&gt;
-- o nil nel caso non siano presenti&lt;br /&gt;
local function getWikidataCoordinates()&lt;br /&gt;
    local entity, value, lat, long&lt;br /&gt;
&lt;br /&gt;
    entity = mw.wikibase.getEntityObject()&lt;br /&gt;
    if entity and entity.claims and&lt;br /&gt;
       entity.claims.P625 and #entity.claims.P625 &amp;gt; 0 and&lt;br /&gt;
       entity.claims.P625[1].mainsnak.snaktype == &amp;quot;value&amp;quot; then&lt;br /&gt;
        value = entity.claims.P625[1].mainsnak.datavalue.value&lt;br /&gt;
        lat = round(value.latitude, 6)&lt;br /&gt;
        long = round(value.longitude, 6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return lat, long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
--                      Parsing parametri&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Error handler per xpcall, formatta l'errore&lt;br /&gt;
-- nel namespace principale aggiunge una categoria di warning&lt;br /&gt;
local function errhandler(msg)&lt;br /&gt;
    local cat = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
        cat = &amp;quot;[[Categoria:&amp;quot; .. cfg.categorie[&amp;quot;warning&amp;quot;] .. &amp;quot;]]\n&amp;quot;&lt;br /&gt;
    end    &lt;br /&gt;
&lt;br /&gt;
    return string.format(&amp;quot;%s&amp;lt;span style=\&amp;quot;color:red;\&amp;quot;&amp;gt;Il template {{Coord}} ha riscontrato degli errori &amp;quot; ..&lt;br /&gt;
                         &amp;quot;([[Template:Coord|istruzioni]]):\n%s&amp;lt;/span&amp;gt;\n&amp;quot;, cat, msg:match(&amp;quot;.+%d:%s(.+)$&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Raccoglie più messaggi di errore in un'unica table prima di usare error()&lt;br /&gt;
local function dumpError(...)&lt;br /&gt;
    local arg = {...}&lt;br /&gt;
&lt;br /&gt;
    table.insert(errorTable, &amp;quot;* &amp;quot;)&lt;br /&gt;
    for _, val in ipairs(arg) do&lt;br /&gt;
        table.insert(errorTable, val)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(errorTable, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Parsifica il parametro &amp;quot;display&amp;quot;&lt;br /&gt;
local function getDisplay()&lt;br /&gt;
    local display = {}&lt;br /&gt;
    &lt;br /&gt;
    display.inline = not args[&amp;quot;display&amp;quot;] or args[&amp;quot;display&amp;quot;] == &amp;quot;inline&amp;quot; or args[&amp;quot;display&amp;quot;] == &amp;quot;inline,title&amp;quot;&lt;br /&gt;
    display.title = args[&amp;quot;display&amp;quot;] == &amp;quot;title&amp;quot; or args[&amp;quot;display&amp;quot;] == &amp;quot;inline,title&amp;quot;&lt;br /&gt;
    display.debug = args[&amp;quot;display&amp;quot;] == &amp;quot;debug&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    return display&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Con le richieste &amp;quot;dm&amp;quot; e &amp;quot;dms&amp;quot; verifica se ci sono&lt;br /&gt;
-- parametri lasciati vuoti in modo valido.&lt;br /&gt;
-- Ritorna il tipo di richiesta dopo la eventuale semplificazione.&lt;br /&gt;
local function paramsEmpty(reqFormat)&lt;br /&gt;
    if reqFormat == &amp;quot;dms&amp;quot; then&lt;br /&gt;
        -- {{coord|1|2||N|5|6||E}} valido&lt;br /&gt;
        if args[3] == &amp;quot;&amp;quot; and args[7] == &amp;quot;&amp;quot; then&lt;br /&gt;
            table.remove(args, 7)&lt;br /&gt;
            table.remove(args, 3)&lt;br /&gt;
            reqFormat = &amp;quot;dm&amp;quot;&lt;br /&gt;
        -- {{coord|1|2|3|N|5|6||E}} non valido&lt;br /&gt;
        elseif args[3] == &amp;quot;&amp;quot; or args[7] == &amp;quot;&amp;quot; then&lt;br /&gt;
            error(&amp;quot;* lat e long hanno diversa precisione&amp;quot;)&lt;br /&gt;
        -- {{coord|1||3|N|5||7|E}} valido&lt;br /&gt;
        elseif args[2] == &amp;quot;&amp;quot; and args[6] == &amp;quot;&amp;quot; then&lt;br /&gt;
            args[2], args[6] = 0, 0&lt;br /&gt;
        -- {{coord|1|2|3|N|5||7|E}} non valido&lt;br /&gt;
        elseif args[2] == &amp;quot;&amp;quot; or args[6] == &amp;quot;&amp;quot; then&lt;br /&gt;
            error(&amp;quot;* lat e long hanno diversa precisione&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if reqFormat == &amp;quot;dm&amp;quot; then&lt;br /&gt;
        -- {{coord|1||N|4||E}} valido&lt;br /&gt;
        if args[2] == &amp;quot;&amp;quot; and args[5] == &amp;quot;&amp;quot; then&lt;br /&gt;
            table.remove(args, 5)&lt;br /&gt;
            table.remove(args, 2)&lt;br /&gt;
            reqFormat = &amp;quot;d&amp;quot;&lt;br /&gt;
        -- {{coord|1|2|N|4||E}} non valido&lt;br /&gt;
        elseif args[2] == &amp;quot;&amp;quot; or args[5] == &amp;quot;&amp;quot; then&lt;br /&gt;
            error(&amp;quot;* lat e long hanno diversa precisione&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return reqFormat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Riconosce il tipo di richiesta (&amp;quot;dec&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;dm&amp;quot; o &amp;quot;dms&amp;quot;) e parsifica i parametri posizionali&lt;br /&gt;
-- Ritorna il tipo di richiesta.&lt;br /&gt;
local function paramsParse()&lt;br /&gt;
    local reqFormat, globe, earth, prefix, num, str&lt;br /&gt;
    local param = {}&lt;br /&gt;
&lt;br /&gt;
    -- riconoscimento tipo di richiesta&lt;br /&gt;
    if #args &amp;lt; 2 then&lt;br /&gt;
        error(&amp;quot;* coordinate non specificate&amp;quot;)&lt;br /&gt;
    elseif #args &amp;lt; 4 then&lt;br /&gt;
        reqFormat = &amp;quot;dec&amp;quot;&lt;br /&gt;
    elseif #args &amp;lt; 6 then&lt;br /&gt;
        reqFormat = &amp;quot;d&amp;quot;&lt;br /&gt;
    elseif #args &amp;lt; 8 then&lt;br /&gt;
        reqFormat = &amp;quot;dm&amp;quot;&lt;br /&gt;
    elseif #args &amp;lt; 10 then&lt;br /&gt;
        reqFormat = &amp;quot;dms&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        error(&amp;quot;* errato numero di parametri&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- valida i parametri che possono essere lasciati vuoti&lt;br /&gt;
    reqFormat = paramsEmpty(reqFormat)&lt;br /&gt;
&lt;br /&gt;
    -- validazione parametri posizionali&lt;br /&gt;
    currFormat = cfg.params[reqFormat]&lt;br /&gt;
    globe = args[#args]:match(&amp;quot;globe:(%w+)&amp;quot;)&lt;br /&gt;
    earth = not globe or globe == &amp;quot;earth&amp;quot;&lt;br /&gt;
    for k, v in ipairs(args) do&lt;br /&gt;
        if currFormat[k] then&lt;br /&gt;
            param.type = currFormat[k][1]&lt;br /&gt;
            param.name = currFormat[k][2]&lt;br /&gt;
            param.min = currFormat[k][3]&lt;br /&gt;
            param.max = currFormat[k][4]&lt;br /&gt;
            prefix = reqFormat .. &amp;quot; format: &amp;quot; .. param.name&lt;br /&gt;
            -- valida un parametro di tipo numero&lt;br /&gt;
            if param.type == &amp;quot;number&amp;quot; then&lt;br /&gt;
                num = tonumber(v)&lt;br /&gt;
                if num then&lt;br /&gt;
                    if earth and num &amp;lt; param.min then&lt;br /&gt;
                        dumpError(prefix, &amp;quot; &amp;lt; &amp;quot;, param.min)&lt;br /&gt;
                    elseif earth and math.floor(num) &amp;gt; param.max then&lt;br /&gt;
                        dumpError(prefix, &amp;quot; &amp;gt; &amp;quot;, param.max)&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    dumpError(prefix, &amp;quot; non è un numero&amp;quot;)&lt;br /&gt;
                end&lt;br /&gt;
            -- valida un parametro di tipo stringa&lt;br /&gt;
            elseif param.type == &amp;quot;string&amp;quot; then&lt;br /&gt;
                if v ~= param.min and v ~= param.max then&lt;br /&gt;
                    dumpError(prefix, &amp;quot; diverso da &amp;quot;, param.min, &amp;quot; e da &amp;quot;, param.max)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #errorTable &amp;gt; 0 then&lt;br /&gt;
        error(table.concat(errorTable))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return reqFormat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
--                      classi DecCoord e DmsCoord&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Rappresenta una coordinata (lat o long) in gradi decimali &lt;br /&gt;
local DecCoord = {}&lt;br /&gt;
&lt;br /&gt;
-- Rappresenta una coordinata (lat o long) in gradi/minuti/secondi&lt;br /&gt;
local DmsCoord = {}&lt;br /&gt;
&lt;br /&gt;
-- Costruttore di DecCoord&lt;br /&gt;
-- deg: gradi decimali, positivi o negativi, se negativi viene cambiato il segno e&lt;br /&gt;
--      la direzione cardinale eventualmente invertita&lt;br /&gt;
-- card: direzione cardinale (N|S|E|W)&lt;br /&gt;
function DecCoord:new(deg, card)&lt;br /&gt;
    local self = {}&lt;br /&gt;
&lt;br /&gt;
    setmetatable(self, { __index = DecCoord,&lt;br /&gt;
                         __tostring = function(t) return self:__tostring() end,&lt;br /&gt;
                         __concat = function(t, t2) return tostring(t) .. tostring(t2) end })&lt;br /&gt;
&lt;br /&gt;
    self.deg = tonumber(deg)&lt;br /&gt;
    if self.deg &amp;lt; 0 then&lt;br /&gt;
        self.card = card == &amp;quot;N&amp;quot; and &amp;quot;S&amp;quot; or (card == &amp;quot;E&amp;quot; and &amp;quot;W&amp;quot; or card)&lt;br /&gt;
        self.deg = -self.deg&lt;br /&gt;
    else&lt;br /&gt;
        self.card = card&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Richiamata automaticamente ogni volta che è richiesto un tostring o un concatenamento&lt;br /&gt;
function DecCoord:__tostring()&lt;br /&gt;
    return numberToString(self.deg) .. &amp;quot;°&amp;quot; .. self.card&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ritorna i gradi con segno&lt;br /&gt;
function DecCoord:getDeg()&lt;br /&gt;
    local deg = self.deg * ((self.card == &amp;quot;N&amp;quot; or self.card ==&amp;quot;E&amp;quot;) and 1 or -1)&lt;br /&gt;
    &lt;br /&gt;
    return numberToString(deg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ritorna un nuovo oggetto DmsCoord, convertendo in gradi/minuti/secondi&lt;br /&gt;
function DecCoord:toDms()&lt;br /&gt;
    local deg, min, sec&lt;br /&gt;
    &lt;br /&gt;
    deg = round(self.deg * 3600, 2)&lt;br /&gt;
    sec = round(math.floor(deg) % 60 + deg - math.floor(deg), 2)&lt;br /&gt;
    deg = math.floor((deg - sec) / 60)&lt;br /&gt;
    min = deg % 60&lt;br /&gt;
    deg = math.floor((deg - min) / 60) % 360&lt;br /&gt;
&lt;br /&gt;
    return DmsCoord:new(deg, min, sec, self.card)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Costruttore di DmsCoord&lt;br /&gt;
-- deg: gradi&lt;br /&gt;
-- min: minuti, può essere nil&lt;br /&gt;
-- sec: secondi, può essere nil&lt;br /&gt;
-- card: direzione cardinale (N|S|E|W)&lt;br /&gt;
function DmsCoord:new(deg, min, sec, card)&lt;br /&gt;
    local self = {}&lt;br /&gt;
&lt;br /&gt;
    setmetatable (self, { __index = DmsCoord,&lt;br /&gt;
                          __tostring = function(t) return self:__tostring() end,&lt;br /&gt;
                          __concat = function(t, t2) return tostring(t) .. tostring(t2) end })&lt;br /&gt;
&lt;br /&gt;
    self.deg = tonumber(deg)&lt;br /&gt;
    self.min = min and tonumber(min)&lt;br /&gt;
    self.sec = sec and tonumber(sec)    &lt;br /&gt;
    self.card = card&lt;br /&gt;
&lt;br /&gt;
    return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Richiamata automaticamente ogni volta che è richiesto un tostring o un concatenamento&lt;br /&gt;
function DmsCoord:__tostring()&lt;br /&gt;
    return self.deg .. &amp;quot;°&amp;quot; ..&lt;br /&gt;
           (self.min and (padleft0(self.min) .. &amp;quot;′&amp;quot;) or &amp;quot;&amp;quot;) ..&lt;br /&gt;
           (self.sec and (padleft0(self.sec) .. &amp;quot;″&amp;quot;) or &amp;quot;&amp;quot;) ..&lt;br /&gt;
           self.card&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ritorna un nuovo oggetto DecCoord, convertendo in gradi decimali&lt;br /&gt;
function DmsCoord:toDec()&lt;br /&gt;
    local deg = round((self.deg + ((self.min or 0) + (self.sec or 0) / 60) / 60), 6)&lt;br /&gt;
    &lt;br /&gt;
    return DecCoord:new(deg, self.card)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
--                                Coord&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Nel namespace principale e con display.title legge la [[d:property:p625]]&lt;br /&gt;
-- e la utilizza come latitudine e longitudine se non fornite dall'utente.&lt;br /&gt;
-- Ritorna la categoria appropriata per [[Categoria:Wikidata]], altrimenti una stringa vuota&lt;br /&gt;
local function checkWikidata(display)&lt;br /&gt;
    local wdLat, wdLong, cat&lt;br /&gt;
&lt;br /&gt;
    if mw.title.getCurrentTitle().namespace == 0 and display.title then&lt;br /&gt;
        wdLat, wdLong = getWikidataCoordinates()&lt;br /&gt;
        if wdLat and wdLong then&lt;br /&gt;
            -- se l'utente non ha fornito lat e long usa quelli di Wikidata&lt;br /&gt;
            if #args == 0 or (#args == 1 and not tonumber(args[1])) then&lt;br /&gt;
                table.insert(args, numberToString(wdLat))&lt;br /&gt;
                table.insert(args, numberToString(wdLong))&lt;br /&gt;
                if #args == 3 then&lt;br /&gt;
                    table.insert(args, table.remove(args, 1))&lt;br /&gt;
                end&lt;br /&gt;
                cat = &amp;quot;Coordinate assenti ma presenti su Wikidata&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            cat = &amp;quot;Coordinate non presenti su Wikidata&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return cat and (&amp;quot;[[Categoria:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Crea l'HTML ritornato da Coord&lt;br /&gt;
local function buildHTML(decLat, decLong, dmsLat, dmsLong, geohackParams, defaultFormat, display)&lt;br /&gt;
    local root, text, url, htmlTitle, noprint&lt;br /&gt;
&lt;br /&gt;
    -- geohack url e parametri&lt;br /&gt;
    url = cfg.geohackUrl ..&lt;br /&gt;
          &amp;quot;&amp;amp;pagename=&amp;quot; .. mw.uri.encode(mw.title.getCurrentTitle().prefixedText, &amp;quot;WIKI&amp;quot;) ..&lt;br /&gt;
          &amp;quot;&amp;amp;params=&amp;quot; .. geohackParams ..&lt;br /&gt;
          (args[&amp;quot;name&amp;quot;] and (&amp;quot;&amp;amp;title=&amp;quot; .. mw.uri.encode(args[&amp;quot;name&amp;quot;])) or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    root = mw.html.create(&amp;quot;&amp;quot;)&lt;br /&gt;
    root&lt;br /&gt;
        :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
            :addClass(&amp;quot;plainlinks nourlexpansion&amp;quot;)&lt;br /&gt;
            :wikitext(&amp;quot;[&amp;quot; .. url)&lt;br /&gt;
            :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                :addClass(defaultFormat == &amp;quot;dec&amp;quot; and &amp;quot;geo-nondefault&amp;quot; or &amp;quot;geo-default&amp;quot;) &lt;br /&gt;
                :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :addClass(&amp;quot;geo-dms&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;title&amp;quot;, &amp;quot;Mappe, foto aeree e altri dati per questa posizione&amp;quot;)&lt;br /&gt;
                    :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                        :addClass(&amp;quot;latitude&amp;quot;)&lt;br /&gt;
                        :wikitext(tostring(dmsLat))&lt;br /&gt;
                        :done()&lt;br /&gt;
                    :wikitext(&amp;quot; &amp;quot;)&lt;br /&gt;
                    :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                        :addClass(&amp;quot;longitude&amp;quot;)&lt;br /&gt;
                        :wikitext(tostring(dmsLong))&lt;br /&gt;
                        :done()&lt;br /&gt;
                    :done()&lt;br /&gt;
                 :done()&lt;br /&gt;
            :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                :addClass(&amp;quot;geo-multi-punct&amp;quot;)&lt;br /&gt;
                :wikitext(&amp;quot;&amp;amp;#xfeff; / &amp;amp;#xfeff;&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
            :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                :addClass(defaultFormat == &amp;quot;dec&amp;quot; and &amp;quot;geo-default&amp;quot; or &amp;quot;geo-nondefault&amp;quot;)&lt;br /&gt;
                :wikitext(args[&amp;quot;name&amp;quot;] and &amp;quot;&amp;lt;span class=\&amp;quot;vcard\&amp;quot;&amp;gt;&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
                :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :addClass(&amp;quot;geo-dec&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;title&amp;quot;, &amp;quot;Mappe, foto aeree e altri dati per questa posizione&amp;quot;)&lt;br /&gt;
                    :wikitext(decLat .. &amp;quot; &amp;quot; .. decLong)&lt;br /&gt;
                    :done()&lt;br /&gt;
                :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;style&amp;quot;, &amp;quot;display:none&amp;quot;)&lt;br /&gt;
                    :tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                        :addClass(&amp;quot;geo&amp;quot;)&lt;br /&gt;
                        :wikitext(decLat:getDeg() .. &amp;quot;; &amp;quot; .. decLong:getDeg())&lt;br /&gt;
                        :done()&lt;br /&gt;
                    :done()&lt;br /&gt;
                :wikitext(args[&amp;quot;name&amp;quot;] and (&amp;quot;&amp;lt;span style=\&amp;quot;display:none\&amp;quot;&amp;gt;﻿ (&amp;lt;span class=\&amp;quot;fn org\&amp;quot;&amp;gt;&amp;quot; ..&lt;br /&gt;
                          args[&amp;quot;name&amp;quot;] .. &amp;quot;&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;) or &amp;quot;&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
            :wikitext(&amp;quot;]&amp;quot;)&lt;br /&gt;
            :done()&lt;br /&gt;
&lt;br /&gt;
    -- formatta il risultato a seconda di args[&amp;quot;display&amp;quot;] (nil, &amp;quot;inline&amp;quot;, &amp;quot;title&amp;quot;, &amp;quot;inline,title&amp;quot;)&lt;br /&gt;
    text = tostring(root) .. (args[&amp;quot;notes&amp;quot;] or &amp;quot;&amp;quot;)&lt;br /&gt;
    -- se inline e title, in stampa deve apparire solo il primo&lt;br /&gt;
    noprint = display.inline and &amp;quot;class=\&amp;quot;noprint\&amp;quot; &amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
    htmlTitle = &amp;quot;&amp;lt;span style=\&amp;quot;font-size: small;\&amp;quot;&amp;gt;&amp;lt;span &amp;quot; .. noprint .. &amp;quot;id=\&amp;quot;coordinates\&amp;quot;&amp;gt;[[مختصات جغرافیایی|مختصات]]: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return (display.inline and text or &amp;quot;&amp;quot;) ..&lt;br /&gt;
           (display.title and (htmlTitle .. text .. &amp;quot;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;) or &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Dato un input fino a 9 parametri posizionali e 4 con nome, ritorna un html&lt;br /&gt;
-- contenente le coordinate in formato dec e dms come collegamento esterno a geohack.php.&lt;br /&gt;
local function coord()&lt;br /&gt;
    local decLat, degLong, dmsLat, dmsLong&lt;br /&gt;
    local reqFormat, defaultFormat, geohackParams, display, wdCat, gdStr, gdRet, ret&lt;br /&gt;
    &lt;br /&gt;
    -- parsifica il parametro &amp;quot;display&amp;quot;&lt;br /&gt;
    display = getDisplay()&lt;br /&gt;
&lt;br /&gt;
    -- legge [[d:property:p625]] ed eventualmente la utilizza&lt;br /&gt;
    wdCat = checkWikidata(display)&lt;br /&gt;
&lt;br /&gt;
    -- parsifica i parametri posizionali&lt;br /&gt;
    ret, reqFormat = xpcall(paramsParse, errhandler)&lt;br /&gt;
    if not ret then&lt;br /&gt;
        return reqFormat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if reqFormat == &amp;quot;dec&amp;quot; then    &lt;br /&gt;
        -- {{coord|1.111|2.222}}&lt;br /&gt;
        decLat = DecCoord:new(args[1], &amp;quot;N&amp;quot;)&lt;br /&gt;
        decLong = DecCoord:new(args[2], &amp;quot;E&amp;quot;)&lt;br /&gt;
    elseif reqFormat == &amp;quot;d&amp;quot; then&lt;br /&gt;
        -- {{coord|1.111|N|3.333|W}}&lt;br /&gt;
        decLat = DecCoord:new(args[1], args[2])&lt;br /&gt;
        decLong = DecCoord:new(args[3], args[4])&lt;br /&gt;
    elseif reqFormat == &amp;quot;dm&amp;quot; then&lt;br /&gt;
        -- {{coord|1|2|N|4|5|W}}&lt;br /&gt;
        dmsLat = DmsCoord:new(args[1], args[2], nil, args[3])&lt;br /&gt;
        dmsLong = DmsCoord:new(args[4], args[5], nil, args[6])&lt;br /&gt;
    elseif reqFormat == &amp;quot;dms&amp;quot; then&lt;br /&gt;
        -- {{coord|1|2|3|N|5|6|7|W}}&lt;br /&gt;
        dmsLat = DmsCoord:new(args[1], args[2], args[3], args[4])&lt;br /&gt;
        dmsLong = DmsCoord:new(args[5], args[6], args[7], args[8])&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- conversioni dec &amp;lt;=&amp;gt; dms&lt;br /&gt;
    if reqFormat == &amp;quot;dec&amp;quot; or reqFormat == &amp;quot;d&amp;quot; then&lt;br /&gt;
        dmsLat = decLat:toDms()&lt;br /&gt;
        dmsLong = decLong:toDms()&lt;br /&gt;
        -- rimuove secondi e minuti se zero e presenti in lat e long&lt;br /&gt;
        if dmsLat.sec == 0 and dmsLong.sec == 0 then&lt;br /&gt;
            dmsLat.sec, dmsLong.sec = nil, nil&lt;br /&gt;
            if dmsLat.min == 0 and dmsLong.min == 0 then&lt;br /&gt;
                dmsLat.min, dmsLong.min = nil, nil&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif reqFormat == &amp;quot;dm&amp;quot; or reqFormat == &amp;quot;dms&amp;quot; then&lt;br /&gt;
        decLat = dmsLat:toDec()&lt;br /&gt;
        decLong = dmsLong:toDec()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if args[&amp;quot;format&amp;quot;] then&lt;br /&gt;
        defaultFormat = args[&amp;quot;format&amp;quot;]&lt;br /&gt;
    elseif reqFormat == &amp;quot;dec&amp;quot; then&lt;br /&gt;
        defaultFormat = &amp;quot;dec&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        defaultFormat = &amp;quot;dms&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- crea la stringa param per geohack.php&lt;br /&gt;
    if reqFormat == &amp;quot;dec&amp;quot; then&lt;br /&gt;
        geohackParams = args[1] .. &amp;quot;_N_&amp;quot; .. args[2] .. &amp;quot;_E&amp;quot; .. (args[3] and (&amp;quot;_&amp;quot; .. args[3]) or &amp;quot;&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
        -- concatena solo i posizionali&lt;br /&gt;
        geohackParams = table.concat(args, &amp;quot;_&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- utilizza l'estensione [[:mw:Extension:GeoData]]&lt;br /&gt;
    gdStr = string.format(&amp;quot;{{#coordinates:%s|%s|name=%s}}&amp;quot;, table.concat(args, &amp;quot;|&amp;quot;),&lt;br /&gt;
    	                  (display.title and mw.title.getCurrentTitle().namespace == 0) and &amp;quot;primary&amp;quot; or &amp;quot;&amp;quot;,&lt;br /&gt;
                          args[&amp;quot;name&amp;quot;] or &amp;quot;&amp;quot;)&lt;br /&gt;
    gdRet = mw.getCurrentFrame():preprocess(gdStr)&lt;br /&gt;
&lt;br /&gt;
    return display.debug and (decLat .. &amp;quot; &amp;quot; .. decLong .. &amp;quot; &amp;quot; .. dmsLat .. &amp;quot; &amp;quot; .. dmsLong) or&lt;br /&gt;
           wdCat .. buildHTML(decLat, decLong, dmsLat, dmsLong, geohackParams, defaultFormat, display) .. gdRet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Entry-point per eventuale {{dms2dec}}&lt;br /&gt;
function p.dms2dec(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
&lt;br /&gt;
    -- {{dms2dec|N|2|3|4}}&lt;br /&gt;
    return DmsCoord:new(args[2], args[3], args[4], args[1]):toDec():getDeg()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Entry-point per eventuale {{dec2dms}}&lt;br /&gt;
function p.dec2dms(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    &lt;br /&gt;
    -- {{dec2dms|1.111|N|S}}&lt;br /&gt;
    return DecCoord:new(args[1], tonumber(args[1]) &amp;gt;= 0 and args[2] or args[3]):toDms()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Entry-point per {{coord}}&lt;br /&gt;
function p.coord(frame)&lt;br /&gt;
    -- copia i parametri ricevuti, eccetto quelli con nome valorizzati a stringa vuota&lt;br /&gt;
    for k, v in pairs(frame:getParent().args) do&lt;br /&gt;
        if v ~= &amp;quot;&amp;quot; or tonumber(k) then&lt;br /&gt;
            args[k] = string.gsub(v, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- retrocompatibilità con una funzionalità nascosta del precedente template:&lt;br /&gt;
    -- ignorava qualunque parametro posizionale vuoto dopo longitudine e parametri geohack&lt;br /&gt;
    for i = #args, 1, -1 do&lt;br /&gt;
        if args[i] == &amp;quot;&amp;quot; then&lt;br /&gt;
            table.remove(args, i)&lt;br /&gt;
        else&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- rimuove i parametri posizionali vuoti front to back fermandosi al primo non vuoto&lt;br /&gt;
    while args[1] == &amp;quot;&amp;quot; do&lt;br /&gt;
        table.remove(args, 1)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return coord()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Hasaninasab</name></author>
		
	</entry>
</feed>