Modulo:Webarchive/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m taglio formati inutili in italiano
use require('strict') instead of require('Module:No globals')
 
(36 versioni intermedie di un altro utente non mostrate)
Riga 1:
--[[ ----------------------------------
Modulo Lua che implementa il template {{Webarchive}} e offrepermette alcunedi
decifrare la data negli URL di alcuni archivi anche ad altri moduli.
funzionalità ad altri moduli Lua per la gestione degli archivi.
]]
 
require('Module:No globalsstrict')
local getArgs = require('ModuleModulo:Arguments').getArgs
local cfg = mw.loadData('Modulo:Webarchive/Configurazione/sandbox')
 
local p = {}
local track = {} -- array associativo per accumulare le categorie di tracciamento
local maxurls = 10 -- massimo numero di URL permessi
local encoded_date
 
local servizi = {
{ signature = "archive.org", service = "wayback", tailbracket = " in %sInternet Archive%s", tracking = "Categoria:Template Webarchive - collegamenti all'Internet Archive" },
{ signature = "webcitation.org", service = "webcite", tailbracket = " in %sWebCite%s", tracking = "Categoria:Template Webarchive - collegamenti a WebCite" },
{ signature = "archive.is", service = "archiveis", tailbracket = " in %sArchive.is%s", tracking = "Categoria:Template Webarchive - collegamenti a archive.is" },
{ signature = "archive.fo", service = "archiveis", tailbracket = " in %sArchive.is%s", tracking = "Categoria:Template Webarchive - collegamenti a archive.is" },
{ signature = "archive.today", service = "archiveis", tailbracket = " in %sArchive.is%s", tracking = "Categoria:Template Webarchive - collegamenti a archive.is" },
{ signature = "archive.il", service = "archiveis", tailbracket = " in %sArchive.is%s", tracking = "Categoria:Template Webarchive - collegamenti a archive.is" },
{ signature = "archive.ec", service = "archiveis", tailbracket = " in %sArchive.is%s", tracking = "Categoria:Template Webarchive - collegamenti a archive.is" },
{ signature = "archive[-]it.org", service = "archiveit", tailbracket = " in %sArchive-It%s" },
{ signature = "arquivo.pt", tail = " nel Portuguese Web Archive" },
{ signature = "loc.gov", tailbracket = " nella %sLibrary of Congress%s" },
{ signature = "webharvest.gov", tailbracket = " nel %sNational Archives and Records Administration%s" },
{ signature = "bibalex.org", tail = " nella [[Bibliotheca Alexandrina#Struttura e collezioni|Bibliotheca Alexandrina]]" },
{ signature = "collectionscanada", tail = " nel Canadian Government Web Archive" },
{ signature = "haw.nsk", tail = " nel Croatian Web Archive (HAW)" },
{ signature = "veebiarhiiv.digar.ee", tail = " nell'Estonian Web Archive" },
{ signature = "vefsafn.is", tailbracket = " nella %sNational and University Library of Iceland%s]]" },
{ signature = "proni.gov", tailbracket = " nel %sPublic Record Office of Northern Ireland%s" },
{ signature = "uni[-]lj.si", tail = " nello Slovenian Web Archive" },
{ signature = "stanford.edu", tail = " nello [[Stanford University Libraries|Stanford Web Archive]]" },
{ signature = "nationalarchives.gov.uk", tailbracket = " in %sUK Government Web Archive%s" },
{ signature = "parliament.uk", tailbracket = " in %sUK Parliament's Web Archive%s" },
{ signature = "webarchive.org.uk", tailbracket = " in %sUK Web Archive%s" },
{ signature = "nlb.gov.sg", tail = " in Web Archive Singapore" },
{ signature = "pandora.nla.gov.au", tailbracket = " in %sPandora Archive%s" },
{ signature = "perma.cc", tailbracket = " in %sPerma.cc%s" },
{ signature = "perma-archives.cc", tailbracket = " in %sPerma.cc%s" },
{ signature = "screenshots.com", tail = " in Screenshots" },
{ signature = "wikiwix.com", tail = " in Wikiwix" },
{ signature = "freezepage.com", tail = " in Freezepage" },
{ signature = "webcache.googleusercontent.com", tail = " in Google Cache" }
}
 
local month_localized = { 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno',
'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'}
 
--[[--------------------------< inlineError >-----------------------
Line 51 ⟶ 17:
]]
local function inlineError(arg, msg)
track["'Categoria:Errori di compilazione del template Webarchive"'] = 1
return '<span style="font-size:100%" class="error citation-comment">Errore di compilazione del template Webarchive: controllare il valore di <code style="color:inherit; border:inherit; padding:inherit;">&#124;' .. arg .. '=</code> (' .. msg .. ').</span>'
end
Line 60 ⟶ 26:
]]
local function inlineRed(msg, trackmsg)
if trackmsg == "'warning"' then
track["'Categoria:Errori di compilazione del template Webarchive - Avvisi"'] = 1
elseif trackmsg == "'error"' then
track["'Categoria:Errori di compilazione del template Webarchive"'] = 1
end
return '<span style="font-size:100%" class="error citation-comment">' .. msg .. '</span>'
Line 75 ⟶ 41:
local function base62( value )
local r = 1
if value:match( "'^%w+$" ') then
local n = #value
local k = 1
Line 82 ⟶ 48:
for i = n, 1, -1 do
c = value:byte( i, i )
if c >= 48 and c <= 57 then
c = c - 48
elseif c >= 65 and c <= 90 then
c = c - 55
elseif c >= 97 and c <= 122 then
c = c - 61
else -- How comes?
r = 1
break -- for i
end
r = r + c * k
k = k * 62
end -- for i
end
return r
Line 109 ⟶ 75:
 
--[[--------------------------< formatDate >-----------------------
Verifica il formato di una data (dmy, o iso) e se lo riconosce
la riformatta in dmy, altrimenti restituisce il valore così com'è
]]
Line 119 ⟶ 85:
try_year = tonumber(split[1])
if try_year and try_year > 1900 and try_year < 2200 then -- iso
y, m, d = split[1], cfg.month_localized[tonumber(split[2])], split[3]
end
else
Line 131 ⟶ 97:
end
end
ifd = tonumber(d) or d
if d == 1 then d = '1º' end
return m and mw.ustring.format('%s %s %s', d, m, y) or date
end
Line 140 ⟶ 107:
]]
local function formatUrlDate(y, m, d)
local current_year = tonumber(os.date("'%Y"'))
y, m, d = tonumber(y), tonumber(m), tonumber(d)
if not y or y == '' or not m or m == '' or not d or d == '' or d > 31 or
Line 146 ⟶ 113:
return nil
end
m = cfg.month_localized[m]
if d == 1 then d = '1º' end
return mw.ustring.format('%s %s %s', d, m, y)
Line 154 ⟶ 121:
Ricava la data da un URI-path a Webcite (es. /67xHmVFWP)
]]
local function p.decodeWebciteDate(path)
local path_elements = mw.text.split(path, "'/"')
 
-- Formatiformati URL validi che non sono base62:
 
-- http://www.webcitation.org/query?id=1138911916587475
Line 165 ⟶ 132:
-- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e
 
if mw.ustring.find(not path_elements[2], "query") or path_elements[2] == '' then
return
mw.ustring.find(path_elements[2], "cache") or
elseif mw.ustring.find(path_elements[2], "getfile"'query') or
mw.ustring.find(path_elements[2], 'cache') or
mw.ustring.find(path_elements[2], 'getfile') or
tonumber(path_elements[2]) then
encoded_date = false
return nil
return
end
local snapdate = os.date("'%Y %m %d"', string.sub(string.format("'%d"', base62(path_elements[2])),1,10))
local dt = mw.text.split(snapdate, "' "')
local fulldate = formatUrlDate(dt[1], dt[2], dt[3])
return fulldate or inlineRed("Collegamento non valido", "error")
end
 
--[[--------------------------< snapDateToString >-----------------------
Ricava la data da un URI-path a Wayback (es. /web/20160901010101/http://example.com ).
Gestisce anche le non cifre come "re_", "-" e "*".
]]
local function p.decodeWaybackDate(path)
local snapdate = string.gsub(path, "'^/w?e?b?all/?"', ""'') -- rimuove la sequenza iniziale "/web/" o "all/"
snapdate = string.gsub(snapdate, '^/w?e?b?/?', '') -- rimuove la sequenza iniziale "/web/" o "/"
local path_elements = mw.text.split(snapdate, "/")
local path_elements = mw.text.split(snapdate, '/')
snapdate = path_elements[1]
if snapdate == '*' then return end
snapdate = string.gsub(snapdate, '[a-z][a-z]_[0-9]?$', '')
return inlineRed("Collegamento non valido", "error")
snapdate = string.gsub(snapdate, '[-]', '')
end
snapdate = string.gsub(snapdate, "'[a-z*][a-z]_[0-9]?$"', ""'')
snapdate = string.gsub(snapdate, "[-]", "")
snapdate = string.gsub(snapdate, "[*]$", "")
local fulldate
localif dlentonumber(snapdate) =and string.len(snapdate) >= 8 then
if tonumber(snapdate) and dlen >= 8 then
local year = string.sub(snapdate, 1, 4)
local month = string.sub(snapdate, 5, 6)
Line 199 ⟶ 167:
fulldate = formatUrlDate(year, month, day)
end
return fulldate or inlineRed("Collegamento non valido", "error")
end
 
--[[--------------------------< decodeArchiveisDate >-----------------------
Ricava la data dall'URI-path di un link esteso ad Archive.is (es. /2016.08.28-144552/http://example.com).
Gestisce "." e "-" nella data, rendendo 2016.08.28-144552 uguale a 20160828144552.
]]
local function decodeArchiveisDate(path)
local path_elements = mw.text.split(path, '/')
local snapdate = path_elements[2]
if not path_elements[2] or path_elements[2] == '' then return end
snapdate = string.gsub(snapdate, '[%.%-]', '')
if not tonumber(snapdate) then encoded_date = false return end -- formato link breve
local fulldate
if string.len(snapdate) >= 8 then
local year = string.sub(snapdate, 1, 4)
local month = string.sub(snapdate, 5, 6)
local day = string.sub(snapdate, 7, 8)
fulldate = formatUrlDate(year, month, day)
end
return fulldate
end
 
--[[--------------------------< serviceName >-----------------------
Line 206 ⟶ 194:
estratto da mw.uri.new() (es. web.archive.org)
]]
local function serviceName(url_mainurl_data, nolink, notail)
local tracking = 'Categoria:Template Webarchive - collegamenti ad altri archivi'
local bracketopen, bracketclose = nolink and '' or '[[', nolink and '' or ']]'
encoded_date = nil -- reset
url_main.service = 'altri'
for _,servizio in ipairs(cfg.servizi) do
if mwstring.ustring.findgsub(url_mainurl_data.host, 'www%.', '') == servizio.signature) then
url_mainurl_data.service = servizio['.service'] or url_main.service'altri'
if not notail and servizio['.tailbracket'] then
url_mainurl_data.tail = mw.ustring.format(servizio.tailbracket, bracketopen, bracketclose)
elseif not notail then
else
url_mainurl_data.tail = servizio['.tail']
end
tracking = servizio['.tracking'] or tracking
encoded_date = servizio.service and true
break
end
end
if url_mainurl_data.tailservice == nil then
tracking = 'Categoria:Template Webarchive - collegamenti ad archivi sconosciuti'
url_main.tail = " a " .. url_main.host .. " " .. inlineRed("Errore: URL di servizio di archiviazione sconosciuto")
url_data.tail = ' su ' .. url_data.host .. ' ' .. inlineRed('URL di servizio di archiviazione sconosciuto')
end
track[tracking] = 1
end
 
--[[--------------------------< parseExtraArgs >-----------------------
Parse numbered arguments from 2 to maxurls, such as url2..url10, date2..date10, title2..title10
e memorized them in a table
For example: {{webarchive |url=.. |url4=.. |url7=..}}
Three url arguments not in numeric sequence (1..4..7).
Function only processes arguments numbered 2 or greater (in this case 4 and 7)
It creates numeric sequenced table entries like:
urlx[1].url = <argument value for url4>
urlx[2].url = <argument value for url7>
Returns the parsed table
]]
local function parseExtraArgs(args, maxurls)
local i, indx, argurl, argurl2, argdate, argtitle
local ulx = {}
indx = 1
for i = 2, maxurls do
argurl = "url" .. i
if args[argurl] then
ulx[indx] = {}
ulx[indx]["url"] = args[argurl]
ulx[indx]["date"] = args["date" .. i] or args["data" .. i]
if not ulx[indx]["date"] then
ulx[indx]["date"] = inlineRed("[Data mancante]", "warning")
end
ulx[indx]["title"] = args["title" .. i] or args["titolo" .. i]
indx = indx + 1
end
end
return ulx
end
 
--[[--------------------------< comma >-----------------------
Given a date string, return "," if it's MDY
]]
local function comma(date)
local n = mw.text.split(date, " ")
local o = mw.text.split(n[1], "-") -- for ISO
if o[1] == "index" then return "" end
if not tonumber(o[1]) then
return ","
else
return ""
end
end
 
--[[--------------------------< createTracking >-----------------------
Restituisce ile daticategorie di tracciamento inserite in track[], ovvero le categorie di tracciamento
]]
local function createTracking()
-- Procedeprocede solo nel namespace 0
local current_namespace = mw.title.getCurrentTitle().namespace
if current_namespace ~= 0 then return '' end
Line 290 ⟶ 235:
 
--[[--------------------------< createRendering >-----------------------
Restituisce la resa dei dati in url_data[][]
Return a rendering of the data in ulx[][]
]]
local function createRendering(url_main, ulxurl_data)
local sand, displayheader, displayfield
local day = url_data[1].date and mw.ustring.match(url_data[1].date, '^%d+')
local period1 = "" -- For backwards compat with {{wayback}}
local article = (day == '8' or day == '11') and 'l\'' or 'il '
local period2 = "."
if not url_data[1].title and not url_data[1].date then
--local url_main = ulx[1]
sand = mw.ustring.format('[%s Archiviato]%s.', url_data[1].url, url_data[1].tail)
local indexstr = "archiviato"
elseif not url_data[1].title and url_data[1].date then
if url_main.date == "index" then
sand = mw.ustring.format('[%s Archiviato] %s%s%s.', url_data[1].url, article, url_data[1].date, url_data[1].tail)
indexstr = "archivio"
elseif url_data[1].title and not url_data[1].date then
sand = mw.ustring.format('[%s %s]%s.', url_data[1].url, url_data[1].title, url_data[1].tail)
elseif url_data[1].title and url_data[1].date then
sand = mw.ustring.format('[%s %s]%s&#32;(archiviato %s%s).', url_data[1].url, url_data[1].title, url_data[1].tail, article, url_data[1].date)
else
return nil
end
if #url_data > 1 then -- per più URL di archivio
-- For {{wayback}}, {{webcite}}
sand = sand .. ' Archivi aggiuntivi: '
if url_main.format == "none" then
local archives_output = {}
if not url_main.title and not url_main.date then -- No title. No date
for i = 2, #url_data do
sand = mw.ustring.format("[%s Archiviato]%s", url_main.url, url_main.tail)
archives_output[#archives_output+1] = mw.ustring.format('[%s %s]%s%s', url_data[i].url, url_data[i].title or url_data[i].date, url_data[i].title and (' (' .. url_data[i].date .. ')') or '', url_data[i].tail or '')
elseif not url_main.title and url_main.date then -- No title. Date.
if url_main.service == "wayback" then
period1 = "."
period2 = ""
end
sand = mw.ustring.format("[%s Archiviato] il %s%s%s%s", url_main.url, url_main.date, comma(url_main.date), url_main.tail, period1)
elseif url_main.title and not url_main.date then -- Title. No date.
sand = mw.ustring.format("[%s %s]%s", url_main.url, url_main.title, url_main.tail)
elseif url_main.title and url_main.date then -- Title. Date.
sand = mw.ustring.format("[%s %s]%s&#32;(%s %s)", url_main.url, url_main.title, url_main.tail, indexstr, url_main.date)
else
return nil
end
sand = sand .. table.concat(archives_output, ', ') .. '.'
if #ulx > 0 then -- For multiple archive URLs
end
sand = sand .. period2 .. " Archivi aggiuntivi: "
return sand
local archives_output = {}
end
for indx,urlx in ipairs(ulx) do
archives_output[#archives_output+1] = mw.ustring.format("[%s %s]", urlx["url"], urlx["title"] or urlx["date"] )
end
sand = sand .. table.concat(archives_output, ", ") .. "."
end
return sand
 
--[[--------------------------------------------------------------------
-- For {{cite archives}}
Entry point per chiamata diretta da un modulo.
else
Riceve l'URL di un archivio e ne restituisce la data se riesce a decodificarla.
if url_main.format == "addlarchives" then -- Multiple archive services
]]
displayheader = "Archivi aggiuntivi: "
function p.decodeArchiveDate(url)
else -- Multiple pages from the same archive
local uri = mw.uri.new(url)
displayheader = mw.ustring.format("Pagine di archivio aggiuntive su %s: ", url_main.date)
local host, path = uri.host, uri.path
end
if not url or not host or path == '' then return end
local sand = displayheader
host = string.gsub(host, 'www%.', '')
local archives_output = {}
for indx_, urlxservizio in ipairs(ulxcfg.servizi) do
if host == servizio.signature then
displayfield = urlx["title"]
if url_mainservizio.formatservice == "addlarchives"'wayback' then
return decodeWaybackDate(path)
if not displayfield then displayfield = urlx["date"] end
elseif servizio.service == 'webcite' then
else
return decodeWebciteDate(path)
if not displayfield then displayfield = "Pagina " .. indx+1 end
elseif servizio.service == 'archiveis' then
return decodeArchiveisDate(path)
end
archive_ouptut[#archives_output+1] = mw.ustring.format("[%s %s]", urlx["url"], displayfield )
end
sand = mw.ustring.format("%s%s.", sand, table.concat(archive_output, ", "))
return sand
end
return
end
 
--[[--------------------------< createRendering >------------------------------------------
Funzione di interfaccia principale per implementazione del
Template:Webarchive
]]
function p.webarchive(frame)
-- caricocarica in args i parametri, e se sono nulli sonoli ignoratiignora, eccetto che per il parametro nolink
local args = getArgs(frame, {
valueFunc = function(key, value)
if key == 'nolink'value then
if key == 'nolink' then
return true
return true
elseif value then
else
value = mw.text.trim(value)
if value ~= '' then return value end
end
end
return nil
end
})
local url_data = {}
local i = 1
while true do
local n = i == 1 and args.url and '' or i
local url = i == 1 and (args.url or args.url1) or args['url' .. i]
 
-- Verificaverifica eventuali errori nel parametro url
if i == 1 and not url then
local url1 = args.url or args.url1
return inlineError('url', 'vuoto') .. createTracking()
if not url1 then
elseif not url or i > maxurls then
return inlineError("url", "vuoto") .. createTracking()
break
elseif mw.ustring.find(url1, "https://web.http") then
elseif mw.ustring.find(url, 'https://web.http') then
track["Categoria:Errori di compilazione del template Webarchive"] = 1
track['Categoria:Errori di compilazione del template Webarchive'] = 1
return inlineError("url", "https://web.http") .. createTracking()
elseif return url1inlineError('url' ==.. n, "'https://web.archive.org/http:/"') .. thencreateTracking()
elseif url == 'https://web.archive.org/http:/' then
track["Categoria:Errori di compilazione del template Webarchive"] = 1
track['Categoria:Errori di compilazione del template Webarchive'] = 1
return inlineError("url", "URL non valido") .. createTracking()
return inlineError('url' .. n, 'URL non valido') .. createTracking()
end
 
local url_main = {}
url_main.url = url1
local uri1 = mw.uri.new(url1)
url_main.host = uri1.host
serviceName(url_main, args.nolink)
 
-- Date argument
local date = args.date or args.date1 or args.data or args.data1
if date and (url_main.service == 'wayback' or url_main.service == 'webcite') then
date = formatDate(date)
local udate = url_main.service == 'wayback' and p.decodeWaybackDate( uri1.path ) or
p.decodeWebciteDate( uri1.path )
if udate ~= date then
date = date .. inlineRed("<sup>[Date non combacianti]</sup>", "warning")
end
url_data[i] = {}
elseif not date and url_main.service == "wayback" then
url_data[i].url = url
date = p.decodeWaybackDate( uri1.path, "iso" )
url_data[i].uri = mw.uri.new(url)
elseif not date and url_main.service == "webcite" then
url_data[i].host, url_data[i].path = url_data[i].uri.host, url_data[i].uri.path
date = p.decodeWebciteDate( uri1.path, "iso" )
if datenot url_data[i].host or url_data[i].path == "query"'' then
return inlineError('url' .. n, 'URL non valido') .. createTracking()
date = inlineRed("[Data mancante]", "warning")
elseif not date then
date = inlineRed("[Errore nella data] (1)]", "error")
end
serviceName(url_data[i], args.nolink, i > 1 and true)
elseif not date then
date = inlineRed("[Data mancante]", "warning")
end
url_main.date = date
 
-- gestione delle date
-- Format argument
local formatdate = i == 1 and (args.formatdate or args.formatodate1 or "none"args.data or args.data1) or
args['date' .. i] or args['data' .. i]
if not format ~= "none" then
if format == "addlpages"date then
ifdate not= url_main.formatDate(date then)
local udate = url_data[i].service == 'wayback' and decodeWaybackDate(url_data[i].path) or
format = "none"
url_data[i].service == 'webcite' and decodeWebciteDate(url_data[i].path) or
url_data[i].service == 'archiveis' and decodeArchiveisDate(url_data[i].path)
if udate and udate ~= date then
date = date .. ' ' .. inlineRed('Data nell\'URL non combaciante: ' .. udate, 'warning')
elseif not udate and encoded_date == true then
date = date .. ' ' .. inlineRed('Data nell\'URL indecifrabile', 'error')
end
elseif formaturl_data[i].service ~== "addlarchives"'wayback' then
date = decodeWaybackDate(url_data[i].path)
format = "none"
elseif url_data[i].service == 'webcite' then
date = decodeWebciteDate(url_data[i].path)
elseif url_data[i].service == 'archiveis' then
date = decodeArchiveisDate(url_data[i].path)
else
date = inlineRed('Data mancante', 'warning')
end
if not date then
end
date = encoded_date == false and inlineRed('Data mancante', 'warning') or
url_main.format = format
inlineRed('Data nell\'URL indecifrabile', 'error')
end
url_data[i].date = date
 
-- gestione del titolo
url_data[i].title = i == 1 and (args.title or args.title1 or args.titolo or args.titolo1) or
args['title' .. i] or args['titolo' .. i]
 
i = i + 1
-- Title argument
end
url_main.title = args.title or args.title1 or args.titolo or args.titolo1
local ulxrend = parseExtraArgscreateRendering(args, maxurlsurl_data)
--if true then return mw.text.jsonEncode(ulx, mw.text.JSON_PRETTY) end
local rend = createRendering(url_main, ulx)
if not rend then
track['Categoria:Errori di compilazione del template Webarchive'] = 1
rend = '<span style="font-size:100%" class="error citation-comment">Errori in [[:Template:Webarchive]]: problema sconosciuto. Si prega di segnalarlo nella [[Discussioni_templateDiscussioni template:Webarchive|pagina di discussione]] del template.</span>'
track["Category:Webarchive template errors"] = 1
end