--[[ ----------------------------------
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 maxurls = 10 -- massimo numero di URL permessi
local encoded_date
local servizi = {
{ signature = 'europarchive.org', tailbracket = ' nella %sNational Library of Ireland%s' },
{ signature = 'webarchive.org.uk', tailbracket = ' in %sUK Web Archive%s' },
{ 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.li', 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', tailbracket = ' in %sArchive-It%s' },
{ signature = 'wikiwix.com', tail = ' in Wikiwix' },
{ signature = 'arquivo.pt', tail = ' nel Portuguese Web Archive' },
{ signature = 'webarchive.loc.gov', service = 'wayback', tailbracket = ' nella %sLibrary of Congress%s Web Archives' },
{ 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 = '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 = 'freezepage.com', tail = ' in Freezepage' },
{ signature = 'yorku.ca', tail = ' nella [[York University Libraries|York University Digital Library]]' },
{ signature = 'webcache.googleusercontent.com', tail = ' in Google Cache' },
{ signature = 'timetravel.mementoweb.org', tailbracket = ' nel %sMemento Project%s' },
{ signature = 'langzeitarchivierung.bib-bvb.de', tailbracket = ' nella %sBavarian State Library%s' },
{ signature = 'webrecorder.io', tail = ' in Webrecorder' }
}
local month_localized = { 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno',
'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'}
--[[--------------------------< inlineError >-----------------------
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
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)
--[[--------------------------< decodeWebciteDate >-----------------------
Ricava la data da un URLURI-path a Webcite (es. www.webcitation.org/67xHmVFWP)
]]
local function p.decodeWebciteDate(urlpath)
local path = mw.uri.new(url).path
local path_elements = mw.text.split(path, '/')
-- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e
if path == '' or not path_elements[2] or path_elements[2] == '' then
return
elseif mw.ustring.find(path_elements[2], 'query') or
--[[--------------------------< snapDateToString >-----------------------
Ricava la data da un URLURI-path a Wayback (es. web.archive.org/web/20160901010101/http://example.com ).
Gestisce anche le non cifre come "re_", "-" e "*".
]]
local function p.decodeWaybackDate(urlpath)
local path = mw.uri.new(url).path
if path == '' then return end
local snapdate = string.gsub(path, '^/all/', '') -- rimuove la sequenza iniziale "/all/"
snapdate = string.gsub(snapdate, '^/w?e?b?/?', '') -- rimuove la sequenza iniziale "/web/" o "/"
--[[--------------------------< decodeArchiveisDate >-----------------------
Ricava la data dadall'URI-path di un URLlink esteso ad Archive.is (es. https://archive.is/2016.08.28-144552/http://example.com).
Gestisce "." e "-" nella data, rendendo 2016.08.28-144552 uguale a 20160828144552.
]]
local function p.decodeArchiveisDate(urlpath)
local path = mw.uri.new(url).path
local path_elements = mw.text.split(path, '/')
local snapdate = path_elements[2]
if path == '' or 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
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 = ' su ' .. 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 >-----------------------
Analizza gli argomenti numerati da 2 a maxurls, come url2..url10, date2..date10, title2..title10
e li memorizza in una tabella.
Per esempio: {{webarchive |url=.. |url4=.. |url7=..}}
Tre argomenti url non in una sequenza numerica (1..4..7).
La funzione processa solo gli argomenti numerati 2 o maggiore (in questo caso 4 e 7).
Crea entrate in una tabella a sequenza numerica come:
urlx[1].url = <valore argomento di url4>
urlx[2].url = <valore argomento di url7>
Restituisce la tabella elaborata.
]]
local function parseExtraArgs(args, maxurls)
local i, index, argurl, argurl2, argdate, argtitle
local ulx = {}
index = 1
for i = 2, maxurls do
argurl = 'url' .. i
if args[argurl] then
ulx[index] = {}
ulx[index]['url'] = args[argurl]
ulx[index]['date'] = args['date' .. i] or args['data' .. i] or
inlineRed('Data mancante', 'warning')
ulx[index]['title'] = args['title' .. i] or args['titolo' .. i]
index = index + 1
end
end
return ulx
end
--[[--------------------------< createRendering >-----------------------
Restituisce la resa dei dati in ulxurl_data[][]
]]
local function createRendering(url_main, ulxurl_data)
local sand
local day = url_mainurl_data[1].date and mw.ustring.match(url_mainurl_data[1].date, '^%d+')
local article = (day == '8' or day == '11') and 'l\'' or 'il '
if not url_mainurl_data[1].title and not url_mainurl_data[1].date then
sand = mw.ustring.format('[%s Archiviato]%s.', url_mainurl_data[1].url, url_mainurl_data[1].tail)
elseif not url_mainurl_data[1].title and url_mainurl_data[1].date then
sand = mw.ustring.format('[%s Archiviato] %s%s%s.', url_mainurl_data[1].url, article, url_mainurl_data[1].date, url_mainurl_data[1].tail)
elseif url_mainurl_data[1].title and not url_mainurl_data[1].date then
sand = mw.ustring.format('[%s %s]%s.', url_mainurl_data[1].url, url_mainurl_data[1].title, url_mainurl_data[1].tail)
elseif url_mainurl_data[1].title and url_mainurl_data[1].date then
sand = mw.ustring.format('[%s %s]%s (archiviato %s%s).', url_mainurl_data[1].url, url_mainurl_data[1].title, url_mainurl_data[1].tail, article, url_mainurl_data[1].date)
else
return nil
end
if #ulxurl_data > 01 then -- per più URL di archivio
sand = sand .. ' Archivi aggiuntivi: '
local archives_output = {}
for _,urlxi in= 2, ipairs(ulx)#url_data do
archives_output[#archives_output+1] = mw.ustring.format('[%s %s]%s%s', urlxurl_data['i].url', url_data[i].title or url_data[i].date, urlxurl_data['i].title and (' (' .. url_data[i].date .. ')') or formatDate(urlx['date', url_data[i]).tail or '')
end
sand = sand .. table.concat(archives_output, ', ') .. '.'
--[[--------------------------------------------------------------------
Entry point per chiamata diretta da un modulo.
Funzione di interfaccia principale per implementazione del
Riceve l'URL di un archivio e ne restituisce la data se riesce a decodificarla.
Template:Webarchive
]]
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)
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]
-- verifica 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
end
local url_main = {}
url_data[i] = {}
url_main.url = url1
url_data[i].url = url
url_main.host = mw.uri.new(url1).host
url_data[i].uri = mw.uri.new(url)
if not url_main.host then return inlineError('url', 'URL non valido') end
url_data[i].host, url_data[i].path = url_data[i].uri.host, url_data[i].uri.path
serviceName(url_main, args.nolink)
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
if date then date = formatDate(date)
local udate = url_mainurl_data[i].service == 'wayback' and p.decodeWaybackDate(url_mainurl_data[i].urlpath) or
url_main url_data[i].service == 'webcite' and p.decodeWebciteDate(url_mainurl_data[i].urlpath) or
url_main url_data[i].service == 'archiveis' and p.decodeArchiveisDate(url_mainurl_data[i].urlpath)
if udate and udate ~= date then
date = date .. ' ' .. inlineRed('<sup>[Data nell\'URL non combaciante: ' .. udate .. ']</sup>', '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
elseif url_main.service == 'wayback' then
date = encoded_date == false and inlineRed('Data mancante', 'warning') or
date = p.decodeWaybackDate(url_main.url)
inlineRed('Data nell\'URL indecifrabile', 'error')
elseif url_main.service == 'webcite' then
end
date = p.decodeWebciteDate(url_main.url)
url_data[i].date = date
elseif url_main.service == 'archiveis' then
date = p.decodeArchiveisDate(url_main.url)
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_main.date = date
-- gestione del titolo
url_main 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]
local ulx = parseExtraArgs(args, maxurls)
local rend = createRendering(url_main, ulx)
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_templateDiscussioni template:Webarchive|pagina di discussione]] del template.</span>'
end
|