Modulo:Webarchive: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
(use require('strict') instead of require('Module:No globals')) |
m (modulo no globals obsoleto) |
||
Riga 1: | Riga 1: | ||
--[[ ---------------------------------- | --[[ ---------------------------------- | ||
Modulo Lua che implementa il template {{Webarchive}} e permette di | |||
decifrare la data negli URL di alcuni archivi anche ad altri moduli. | |||
]] | |||
require('strict') | |||
local getArgs = require('Modulo:Arguments').getArgs | |||
local cfg = mw.loadData('Modulo:Webarchive/Configurazione') | |||
local getArgs = require (' | |||
local | |||
local p = {} | |||
local track = {} -- array associativo per accumulare le categorie di tracciamento | |||
local maxurls = 10 -- massimo numero di URL permessi | |||
local encoded_date | |||
--[[--------------------------< inlineError >----------------------- | --[[--------------------------< inlineError >----------------------- | ||
Errore critico. Formatta l'output completamente in rosso. Aggiunge una categoria di tracciamento. | |||
]] | |||
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;">|' .. arg .. '=</code> (' .. msg .. ').</span>' | |||
]] | |||
local function inlineError (msg | |||
track[ | |||
return | |||
end | end | ||
--[[--------------------------< inlineRed >----------------------- | --[[--------------------------< inlineRed >----------------------- | ||
Formatta un frammento di testo in rosso, quale ad esempio un avvertimento da integrare nell'output finale. | |||
Aggiunge una categoria di tracciamento. | |||
]] | ]] | ||
local function inlineRed(msg, trackmsg) | local function inlineRed(msg, trackmsg) | ||
if trackmsg == | if trackmsg == 'warning' then | ||
track[ | track['Categoria:Errori di compilazione del template Webarchive - Avvisi'] = 1 | ||
elseif trackmsg == | elseif trackmsg == 'error' then | ||
track[ | track['Categoria:Errori di compilazione del template Webarchive'] = 1 | ||
end | end | ||
return '<span style="font-size:100%" class="error citation-comment">' .. msg .. '</span>' | return '<span style="font-size:100%" class="error citation-comment">' .. msg .. '</span>' | ||
end | end | ||
Riga 163: | Riga 37: | ||
--[[--------------------------< base62 >----------------------- | --[[--------------------------< base62 >----------------------- | ||
Converte base-62 in base-10 | |||
Crediti: https://de.wikipedia.org/wiki/Modul:Expr | |||
]] | |||
]] | |||
local function base62( value ) | local function base62( value ) | ||
local r = 1 | local r = 1 | ||
if value:match('^%w+$') then | |||
if value:match ('% | local n = #value | ||
local k = 1 | |||
local c | |||
r = 0 | |||
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 | |||
c = c | |||
else | else | ||
r = 1 | |||
break | |||
end | end | ||
r = r + c * k | |||
k = k * 62 | |||
end | end | ||
end | end | ||
return | return r | ||
end | end | ||
--[[--------------------------< tableLength >----------------------- | |||
--[[--------------------------< | Restituisce il numero di elementi in una tabella | ||
]] | |||
local function tableLength(t) | |||
local count = 0 | |||
for _ in pairs(t) do count = count + 1 end | |||
return count | |||
]] | |||
local function | |||
local | |||
return | |||
end | end | ||
--[[--------------------------< formatDate >----------------------- | |||
--[[--------------------------< | Verifica il formato di una data (dmy o iso) e se lo riconosce | ||
la riformatta in dmy, altrimenti restituisce il valore così com'è | |||
]] | |||
local function formatDate(date) | |||
local y, m, d | |||
local try_year | |||
local split = mw.text.split(date, '-') | |||
if tableLength(split) == 3 then | |||
]] | try_year = tonumber(split[1]) | ||
if try_year and try_year > 1900 and try_year < 2200 then -- iso | |||
local function | y, m, d = split[1], cfg.month_localized[tonumber(split[2])], split[3] | ||
local | |||
local | |||
local | |||
if | |||
end | end | ||
else | else | ||
split = mw.text.split(date, ' ') | |||
if tableLength(split) == 3 then | |||
try_year = tonumber(split[3]) | |||
if try_year and try_year > 1900 and try_year < 2200 and | |||
(split[1] == '1º' or tonumber(split[1])) then -- dmy | |||
d, m, y = split[1], split[2], split[3] | |||
end | |||
end | |||
end | end | ||
d = 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 | |||
if 1 > | --[[--------------------------< formatUrlDate >----------------------- | ||
return | Controlla la data prelevata automaticamente dall'url di un archivio. | ||
Se è valida la formatta in dmy, altrimenti restituisce nil. | |||
]] | |||
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 | |||
m < 1 or m > 12 or y < 1900 or y > current_year then | |||
return nil | |||
end | end | ||
m = cfg.month_localized[m] | |||
if d == 1 then d = '1º' end | |||
return mw.ustring.format('%s %s %s', d, m, y) | |||
end | end | ||
--[[--------------------------< decodeWebciteDate >----------------------- | --[[--------------------------< decodeWebciteDate >----------------------- | ||
Ricava la data da un URI-path a Webcite (es. /67xHmVFWP) | |||
]] | |||
local function decodeWebciteDate(path) | |||
local path_elements = mw.text.split(path, '/') | |||
-- formati URL validi che non sono base62: | |||
-- | |||
-- http://www.webcitation.org/query?id=1138911916587475 | -- http://www.webcitation.org/query?id=1138911916587475 | ||
Riga 345: | Riga 133: | ||
-- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e | -- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e | ||
if | if not path_elements[2] or path_elements[2] == '' then | ||
return | |||
elseif mw.ustring.find(path_elements[2], '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 | |||
return | |||
end | 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 | |||
return | |||
end | 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 decodeWaybackDate(path) | |||
local snapdate = string.gsub(path, '^/all/', '') -- rimuove la sequenza iniziale "/all/" | |||
snapdate = string.gsub(snapdate, '^/w?e?b?/?', '') -- rimuove la sequenza iniziale "/web/" o "/" | |||
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]?$', '') | |||
snapdate = string.gsub(snapdate, '[-]', '') | |||
snapdate = string.gsub(snapdate, '[*]$', '') | |||
local fulldate | |||
if tonumber(snapdate) and 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) | ||
local function decodeWaybackDate(path | |||
local | |||
snapdate = | |||
if snapdate == | |||
snapdate = | |||
if | |||
end | end | ||
return fulldate | |||
end | end | ||
--[[--------------------------< decodeArchiveisDate >----------------------- | --[[--------------------------< 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) | |||
local function decodeArchiveisDate(path | |||
end | end | ||
return fulldate | |||
end | end | ||
--[[--------------------------< serviceName >----------------------- | --[[--------------------------< serviceName >----------------------- | ||
Imposta la stringa di coda e l'ID del servizio in base al dominio | |||
estratto da mw.uri.new() (es. web.archive.org) | |||
]] | |||
]] | local function serviceName(url_data, nolink, notail) | ||
local tracking = 'Categoria:Template Webarchive - collegamenti ad altri archivi' | |||
local function serviceName( | local bracketopen, bracketclose = nolink and '' or '[[', nolink and '' or ']]' | ||
local tracking | encoded_date = nil -- reset | ||
local | for _,servizio in ipairs(cfg.servizi) do | ||
if string.gsub(url_data.host, 'www%.', '') == servizio.signature then | |||
url_data.service = servizio.service or 'altri' | |||
if not notail and servizio.tailbracket then | |||
url_data.tail = mw.ustring.format(servizio.tailbracket, bracketopen, bracketclose) | |||
elseif not notail then | |||
url_data.tail = servizio.tail | |||
end | end | ||
tracking = servizio.tracking or tracking | |||
encoded_date = servizio.service and true | |||
break | |||
end | end | ||
end | end | ||
if url_data.service == nil then | |||
if | tracking = 'Categoria:Template Webarchive - collegamenti ad archivi sconosciuti' | ||
url_data.tail = ' su ' .. url_data.host .. ' ' .. inlineRed('URL di servizio di archiviazione sconosciuto') | |||
end | end | ||
track[tracking] = 1 | track[tracking] = 1 | ||
end | end | ||
--[[--------------------------< createTracking >----------------------- | |||
--[[--------------------------< | Restituisce le categorie di tracciamento inserite in track[] | ||
]] | |||
local function createTracking() | |||
-- procede solo nel namespace 0 | |||
local current_namespace = mw.title.getCurrentTitle().namespace | |||
if current_namespace ~= 0 then return '' end | |||
local sand = '' | |||
if tableLength(track) > 0 then | |||
for key,_ in pairs(track) do | |||
sand = sand .. '[[' .. key .. ']]' | |||
local function | |||
local | |||
end | end | ||
end | end | ||
return sand | |||
end | |||
if | --[[--------------------------< createRendering >----------------------- | ||
Restituisce la resa dei dati in url_data[][] | |||
]] | |||
local function createRendering(url_data) | |||
local sand | |||
local day = url_data[1].date and mw.ustring.match(url_data[1].date, '^%d+') | |||
local article = (day == '8' or day == '11') and 'l\'' or 'il ' | |||
if not url_data[1].title and not url_data[1].date then | |||
sand = mw.ustring.format('[%s Archiviato]%s.', url_data[1].url, url_data[1].tail) | |||
elseif not url_data[1].title and url_data[1].date then | |||
sand = mw.ustring.format('[%s Archiviato] %s%s%s.', url_data[1].url, article, url_data[1].date, url_data[1].tail) | |||
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 (archiviato %s%s).', url_data[1].url, url_data[1].title, url_data[1].tail, article, url_data[1].date) | |||
else | else | ||
return | return nil | ||
end | end | ||
if #url_data > 1 then -- per più URL di archivio | |||
sand = sand .. ' Archivi aggiuntivi: ' | |||
local archives_output = {} | |||
for i = 2, #url_data do | |||
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 '') | |||
end | |||
sand = sand .. table.concat(archives_output, ', ') .. '.' | |||
end | |||
return sand | |||
end | end | ||
--[[-------------------------------------------------------------------- | |||
--[[------------------------- | Entry point per chiamata diretta da un modulo. | ||
Riceve l'URL di un archivio e ne restituisce la data se riesce a decodificarla. | |||
]] | |||
function p.decodeArchiveDate(url) | |||
local uri = mw.uri.new(url) | |||
local host, path = uri.host, uri.path | |||
if not url or not host or path == '' then return end | |||
host = string.gsub(host, 'www%.', '') | |||
for _, servizio in ipairs(cfg.servizi) do | |||
if host == servizio.signature then | |||
if servizio.service == 'wayback' then | |||
-- | return decodeWaybackDate(path) | ||
elseif servizio.service == 'webcite' then | |||
return decodeWebciteDate(path) | |||
elseif servizio.service == 'archiveis' then | |||
]] | return decodeArchiveisDate(path) | ||
local | |||
if | |||
if | |||
end | end | ||
end | end | ||
end | end | ||
return | |||
end | end | ||
--[[-------------------------------------------------------------------- | |||
--[[-------------------------- | Funzione di interfaccia principale per implementazione del | ||
Template:Webarchive | |||
]] | |||
function p.webarchive(frame) | |||
-- carica in args i parametri e se sono nulli li ignora, eccetto che per il parametro nolink | |||
local args = getArgs(frame, { | |||
valueFunc = function(key, value) | |||
if value then | |||
if key == 'nolink' then | |||
return true | |||
else | |||
value = mw.text.trim(value) | |||
]] | if value ~= '' then return value end | ||
local | |||
if | |||
end | end | ||
end | end | ||
return nil | |||
end | 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] | |||
local | |||
local | |||
-- verifica eventuali errori nel parametro url | |||
if i == 1 and not url then | |||
return inlineError('url', 'vuoto') .. createTracking() | |||
elseif not url or i > maxurls then | |||
break | |||
elseif mw.ustring.find(url, 'https://web.http') then | |||
track['Categoria:Errori di compilazione del template Webarchive'] = 1 | |||
return inlineError('url' .. n, 'https://web.http') .. createTracking() | |||
elseif url == 'https://web.archive.org/http:/' then | |||
track['Categoria:Errori di compilazione del template Webarchive'] = 1 | |||
return inlineError('url' .. n, 'URL non valido') .. createTracking() | |||
elseif | |||
end | end | ||
url_data[i] = {} | |||
url_data[i].url = url | |||
url_data[i].uri = mw.uri.new(url) | |||
url_data[i].host, url_data[i].path = url_data[i].uri.host, url_data[i].uri.path | |||
if not url_data[i].host or url_data[i].path == '' then | |||
return inlineError('url' .. n, 'URL non valido') .. createTracking() | |||
end | end | ||
serviceName(url_data[i], args.nolink, i > 1 and true) | |||
-- gestione delle date | |||
local date = i == 1 and (args.date or args.date1 or args.data or args.data1) or | |||
args['date' .. i] or args['data' .. i] | |||
if date then | if date then | ||
date = formatDate(date) | |||
local udate = url_data[i].service == 'wayback' and decodeWaybackDate(url_data[i].path) or | |||
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 | end | ||
elseif url_data[i].service == 'wayback' then | |||
date = decodeWaybackDate(url_data[i].path) | |||
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 | else | ||
date | date = inlineRed('Data mancante', 'warning') | ||
end | end | ||
if not date then | if not date then | ||
date = encoded_date == false and inlineRed('Data mancante', 'warning') or | |||
inlineRed('Data nell\'URL indecifrabile', 'error') | |||
end | 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 | |||
end | end | ||
local rend = createRendering(url_data) | |||
local rend = createRendering() | |||
if not rend then | 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 template:Webarchive|pagina di discussione]] del template.</span>' | |||
end | end | ||
return rend | return rend .. createTracking() | ||
end | end | ||
return p | |||
return |
Versione delle 21:27, 22 ott 2022
La documentazione per questo modulo può essere creata in Modulo:Webarchive/man
Errore script: Errore Lua: errore interno - l'interprete è uscito con stato 1.
--[[ ----------------------------------
Modulo Lua che implementa il template {{Webarchive}} e permette di
decifrare la data negli URL di alcuni archivi anche ad altri moduli.
]]
require('strict')
local getArgs = require('Modulo:Arguments').getArgs
local cfg = mw.loadData('Modulo:Webarchive/Configurazione')
local p = {}
local track = {} -- array associativo per accumulare le categorie di tracciamento
local maxurls = 10 -- massimo numero di URL permessi
local encoded_date
--[[--------------------------< inlineError >-----------------------
Errore critico. Formatta l'output completamente in rosso. Aggiunge una categoria di tracciamento.
]]
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;">|' .. arg .. '=</code> (' .. msg .. ').</span>'
end
--[[--------------------------< inlineRed >-----------------------
Formatta un frammento di testo in rosso, quale ad esempio un avvertimento da integrare nell'output finale.
Aggiunge una categoria di tracciamento.
]]
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>'
end
--[[--------------------------< base62 >-----------------------
Converte base-62 in base-10
Crediti: https://de.wikipedia.org/wiki/Modul:Expr
]]
local function base62( value )
local r = 1
if value:match('^%w+$') then
local n = #value
local k = 1
local c
r = 0
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
r = 1
break
end
r = r + c * k
k = k * 62
end
end
return r
end
--[[--------------------------< tableLength >-----------------------
Restituisce il numero di elementi in una tabella
]]
local function tableLength(t)
local count = 0
for _ in pairs(t) do count = count + 1 end
return count
end
--[[--------------------------< formatDate >-----------------------
Verifica il formato di una data (dmy o iso) e se lo riconosce
la riformatta in dmy, altrimenti restituisce il valore così com'è
]]
local function formatDate(date)
local y, m, d
local try_year
local split = mw.text.split(date, '-')
if tableLength(split) == 3 then
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
split = mw.text.split(date, ' ')
if tableLength(split) == 3 then
try_year = tonumber(split[3])
if try_year and try_year > 1900 and try_year < 2200 and
(split[1] == '1º' or tonumber(split[1])) then -- dmy
d, m, y = split[1], split[2], split[3]
end
end
end
d = 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
--[[--------------------------< formatUrlDate >-----------------------
Controlla la data prelevata automaticamente dall'url di un archivio.
Se è valida la formatta in dmy, altrimenti restituisce nil.
]]
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
m < 1 or m > 12 or y < 1900 or y > current_year then
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)
end
--[[--------------------------< decodeWebciteDate >-----------------------
Ricava la data da un URI-path a Webcite (es. /67xHmVFWP)
]]
local function decodeWebciteDate(path)
local path_elements = mw.text.split(path, '/')
-- formati URL validi che non sono base62:
-- http://www.webcitation.org/query?id=1138911916587475
-- http://www.webcitation.org/query?url=http..&date=2012-06-01+21:40:03
-- http://www.webcitation.org/1138911916587475
-- http://www.webcitation.org/cache/73e53dd1f16cf8c5da298418d2a6e452870cf50e
-- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e
if not path_elements[2] or path_elements[2] == '' then
return
elseif mw.ustring.find(path_elements[2], '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
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
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 decodeWaybackDate(path)
local snapdate = string.gsub(path, '^/all/', '') -- rimuove la sequenza iniziale "/all/"
snapdate = string.gsub(snapdate, '^/w?e?b?/?', '') -- rimuove la sequenza iniziale "/web/" o "/"
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]?$', '')
snapdate = string.gsub(snapdate, '[-]', '')
snapdate = string.gsub(snapdate, '[*]$', '')
local fulldate
if tonumber(snapdate) and 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
--[[--------------------------< 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 >-----------------------
Imposta la stringa di coda e l'ID del servizio in base al dominio
estratto da mw.uri.new() (es. web.archive.org)
]]
local function serviceName(url_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
for _,servizio in ipairs(cfg.servizi) do
if string.gsub(url_data.host, 'www%.', '') == servizio.signature then
url_data.service = servizio.service or 'altri'
if not notail and servizio.tailbracket then
url_data.tail = mw.ustring.format(servizio.tailbracket, bracketopen, bracketclose)
elseif not notail then
url_data.tail = servizio.tail
end
tracking = servizio.tracking or tracking
encoded_date = servizio.service and true
break
end
end
if url_data.service == nil then
tracking = 'Categoria:Template Webarchive - collegamenti ad archivi sconosciuti'
url_data.tail = ' su ' .. url_data.host .. ' ' .. inlineRed('URL di servizio di archiviazione sconosciuto')
end
track[tracking] = 1
end
--[[--------------------------< createTracking >-----------------------
Restituisce le categorie di tracciamento inserite in track[]
]]
local function createTracking()
-- procede solo nel namespace 0
local current_namespace = mw.title.getCurrentTitle().namespace
if current_namespace ~= 0 then return '' end
local sand = ''
if tableLength(track) > 0 then
for key,_ in pairs(track) do
sand = sand .. '[[' .. key .. ']]'
end
end
return sand
end
--[[--------------------------< createRendering >-----------------------
Restituisce la resa dei dati in url_data[][]
]]
local function createRendering(url_data)
local sand
local day = url_data[1].date and mw.ustring.match(url_data[1].date, '^%d+')
local article = (day == '8' or day == '11') and 'l\'' or 'il '
if not url_data[1].title and not url_data[1].date then
sand = mw.ustring.format('[%s Archiviato]%s.', url_data[1].url, url_data[1].tail)
elseif not url_data[1].title and url_data[1].date then
sand = mw.ustring.format('[%s Archiviato] %s%s%s.', url_data[1].url, article, url_data[1].date, url_data[1].tail)
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 (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
sand = sand .. ' Archivi aggiuntivi: '
local archives_output = {}
for i = 2, #url_data do
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 '')
end
sand = sand .. table.concat(archives_output, ', ') .. '.'
end
return sand
end
--[[--------------------------------------------------------------------
Entry point per chiamata diretta da un modulo.
Riceve l'URL di un archivio e ne restituisce la data se riesce a decodificarla.
]]
function p.decodeArchiveDate(url)
local uri = mw.uri.new(url)
local host, path = uri.host, uri.path
if not url or not host or path == '' then return end
host = string.gsub(host, 'www%.', '')
for _, servizio in ipairs(cfg.servizi) do
if host == servizio.signature then
if servizio.service == 'wayback' then
return decodeWaybackDate(path)
elseif servizio.service == 'webcite' then
return decodeWebciteDate(path)
elseif servizio.service == 'archiveis' then
return decodeArchiveisDate(path)
end
end
end
return
end
--[[--------------------------------------------------------------------
Funzione di interfaccia principale per implementazione del
Template:Webarchive
]]
function p.webarchive(frame)
-- carica in args i parametri e se sono nulli li ignora, eccetto che per il parametro nolink
local args = getArgs(frame, {
valueFunc = function(key, value)
if value then
if key == 'nolink' then
return true
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]
-- verifica eventuali errori nel parametro url
if i == 1 and not url then
return inlineError('url', 'vuoto') .. createTracking()
elseif not url or i > maxurls then
break
elseif mw.ustring.find(url, 'https://web.http') then
track['Categoria:Errori di compilazione del template Webarchive'] = 1
return inlineError('url' .. n, 'https://web.http') .. createTracking()
elseif url == 'https://web.archive.org/http:/' then
track['Categoria:Errori di compilazione del template Webarchive'] = 1
return inlineError('url' .. n, 'URL non valido') .. createTracking()
end
url_data[i] = {}
url_data[i].url = url
url_data[i].uri = mw.uri.new(url)
url_data[i].host, url_data[i].path = url_data[i].uri.host, url_data[i].uri.path
if not url_data[i].host or url_data[i].path == '' then
return inlineError('url' .. n, 'URL non valido') .. createTracking()
end
serviceName(url_data[i], args.nolink, i > 1 and true)
-- gestione delle date
local date = i == 1 and (args.date or args.date1 or args.data or args.data1) or
args['date' .. i] or args['data' .. i]
if date then
date = formatDate(date)
local udate = url_data[i].service == 'wayback' and decodeWaybackDate(url_data[i].path) or
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 url_data[i].service == 'wayback' then
date = decodeWaybackDate(url_data[i].path)
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
date = encoded_date == false and inlineRed('Data mancante', 'warning') or
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
end
local rend = createRendering(url_data)
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 template:Webarchive|pagina di discussione]] del template.</span>'
end
return rend .. createTracking()
end
return p