Modul:Timetravel
Erscheinungsbild
Die Dokumentation für dieses Modul kann unter Modul:Timetravel/Doku erstellt werden
--[=[ 2014-10-25
timetravel
]=]
local p = { }
local lang = mw.language.new( "de" ) -- german localisation
local d14 =string.rep('%d',14)
local d16 =string.rep('%d',16)
local w9 =string.rep('%w',9)
local l_url
local l_title
local l_id
local l_wayback
local l_webcite
local l_archiveis
local l_archivedate
local l_archiveurl
local l_memento
local l_offline
local l_inline
local l_modus
local l_pretext
local l_posttext
local l_postmeta
-- local function for linking to known webarchives
local function linkInternetArchive(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'https://web.archive.org/web/'..valid .. '/'..valurl
rwebarchive = 'archive.org'
return rarchiveurl, rwebarchive
end
local function linkVefsafn(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'http://wayback.vefsafn.is/wayback/'..valid .. '/'..valurl
rwebarchive = 'vefsafn'
return rarchiveurl, rwebarchive
end
local function linkInternetArchiveAsterix(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'https://wayback.archive.org/web/*/'..valurl
rwebarchive = 'wayback.archive.org'
return rarchiveurl, rwebarchive
end
local function linkArchiveIs(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'https://archive.is/'..valid .. '/'..valurl
rwebarchive = 'archive.is'
return rarchiveurl, rwebarchive
end
local function linkWebcitationID(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'http://webcitation.org/'..valid .. '?url='..valurl
rwebarchive = 'WebCite'
return rarchiveurl, rwebarchive
end
local function linkWebcitationQuery(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'http://webcitation.org/?url='..valid
rwebarchive = 'WebCite'
return rarchiveurl, rwebarchive
end
local function linkWikiwix(valid,valurl)
local rarchiveurl
local rwebarchive
rarchiveurl = 'http://archive.wikiwix.com/cache/?url='..valid
rwebarchive = 'Wikiwix'
return rarchiveurl, rwebarchive
end
-- simple string-trim function
local function trim(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
-- simple null to zero function
local function nz(s,z)
-- Convert nil to sting function
if s == nil then
if z==nil then
s=''
else
s =z
end
end
return s
end
-- some date functions
local function mwtimestamp (d)
-- Convert 'yyyyMMddhhmiss' timestamp to longdate format
local Y, M, D, h, m, s = d:match("(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)")
rdate =lang:formatDate('j. F Y',os.date("!%Y%m%d%H%M%S", os.time({year=Y, month=M, day=D, hour=h, min=m, sec=s})))
return rdate -- todo: errorhandling
end
local function timestampunixtolocaldate (d)
-- Convert UNIX timesstamp to longdate format
rdate = lang:formatDate('j. F Y',os.date("!%Y%m%d%H%M%S", d))
return rdate -- todo: errorhandling
end
local function base62tolocaldate( value )
-- Convert base62 string to a longdate format
-- Precondition:
-- value -- string: base62
-- Lua limitation at 10^53; larger numbers are less precise
-- Postcondition:
-- returns string, or false
-- (source dewiki modul expr, user:PerfektesChaos, modified)
local r = false
local state = type( value )
if value:match( "^%w+$" ) then
local n = #value
local k = 1
local sh = {48,55,61}
local d
r = 0
for i = n, 1, -1 do
c = value:byte( i, i )
d = value:byte( i, i )
if d >= 48 and c <= 122 then
d= d - sh[math.floor(d/32)]
else -- How comes?
r = nil
break -- for i
end
r = r + d * k
k = k * 62
end -- for i
end
r=lang:formatDate('j. F Y',os.date("!%Y%m%d%H%M%S",math.floor(r/1000000)))
return r
end -- base62()
local function parsmemento(value)
local lvalid
local lurl
local rtype
local rarchiveurl
local rwebarchive
local rdate
if (string.sub(value,1,8)=='https://') or (string.sub(value,1,7)=='http://') or (string.sub(value,1,2)=='//') then
if value:match("//web%.archive%.org/") or value:match("//wayback%.archive%.org/") then --if match url
if value:match(".-/"..d14.."/%S+$") then
lvalid,lurl=value:match(".-/("..d14..")/(%S+)$")
rdate=mwtimestamp(lvalid)
rarchiveurl,rwebarchive=linkInternetArchive(lvalid,lurl)
rtype = 'url'
elseif value:match("/%*/%S") then
rdate=nil
lurl=value:match("/%*/(%S)")
rarchiveurl,rwebarchive=linkInternetArchiveAsterix('*',lurl)
rtype = '*'
else
rdate=nil
rarchiveurl = nil
rwebarchive = 'Error'
rtype = 'internet archive URL error'
end -- if internet archive
elseif value:match("//archive%.is/") or value:match("//archive%.today/") then
if value:match(".-/"..d14.."/%S+$") then
lvalid,lurl=value:match(".-/("..d14..")/(%S+)$")
rdate=mwtimestamp(lvalid)
rarchiveurl,rwebarchive=linkArchiveIs(lvalid,lurl)
rtype = 'url'
else
rdate=nil
rarchiveurl = nil
rwebarchive = 'Error'
rtype = 'archive.is error'
end -- if archive.is
elseif value:match("^http://wayback%.vefsafn%.is/wayback/") then
if value:match(".-/"..d14.."/%S+$") then
lvalid,lurl=value:match(".-/("..d14..")/(%S+)$")
rdate=mwtimestamp(lvalid)
rarchiveurl,rwebarchive=linkVefsafn(lvalid,lurl)
rtype = 'url'
else
rdate=nil
rarchiveurl = nil
rwebarchive = 'Error'
rtype = 'Vefsafn error'
end -- if vefsafn
elseif value:match("//www%.webcitation%.org/") or value:match("//webcitation%.org/") then
if value:match("^http://www%.webcitation%.org/query%?url=") then
lurl=value:match("^http://www%.webcitation%.org/query%?url=(%S+)")
rdate=value:match("^http://www%.webcitation%.org/%S*%p+date=(%d%d%d%d%-%d%d%-%d%d)")
rarchiveurl,rwebarchive=linkWebcitationQuery(lurl,lurl)
rtype="webcite query"
elseif value:match("^http://www%.webcitation%.org/"..w9.."$")
or value:match("^http://www%.webcitation%.org/"..w9.."%p+") then
lvalid=value:match("^http://www%.webcitation%.org/("..w9..")")
rdate=base62tolocaldate(lvalid)
rarchiveurl,rwebarchive=linkWebcitationID(lvalid,l_url)
rtype="url"
elseif value:match("^http://www%.webcitation%.org/"..d16.."$")
or value:match("^http://www%.webcitation%.org/"..d16.."p+") then
lvalid=value:match("^http://www%.webcitation%.org/("..d16..")")
rdate=timestampunixtolocaldate(lvalid/1000000)
rarchiveurl,rwebarchive=linkWebcitationID(lvalid,l_url)
rtype="url"
else
rdate=nil
rarchiveurl = nil
rwebarchive = 'Error'
rtype = 'webcite error'
end -- if webcite
elseif value:match("^http://wikiwix%.com/cache/%?url=") or value:match("^http://archive%.wikiwix%.com/cache/%?url=") then
lurl=value:match("wikiwix%.com/cache/%?url=(%S+)")
rdate=nil
rarchiveurl,rwebarchive=linkWikiwix(lurl,l_url)
rtype="webcite query"
else
rdate=nil
if l_url == l_memento then
rwebarchive = "Error"
rarchiveurl = nil
else
rarchiveurl = l_memento
rwebarchive = 'Webseite'
end
rtyp ="nicht unterstützte url"
end -- if match url
elseif l_url== nil or l_url=='' then
rdate=nil
rarchiveurl = nil
rwebarchive = 'Error'
rtype = 'url error'
elseif value:match("^"..d16.."$") or value:match("^cite/"..d16.."$") or value:match("^webcite/"..d16.."$") then
rvalid=string.sub(value,-16)
rdate=timestampunixtolocaldate(math.floor(rvalid/1000000))
rarchiveurl,rwebarchive=linkWebcitationID(rvalid,l_url)
rtype="memento"
elseif value:match("^"..w9.."$") or value:match("^cite/"..w9.."$")or value:match("^webcite/"..w9.."$") then
rvalid=string.sub(value,-9)
rdate=base62tolocaldate(rvalid)
rarchiveurl,rwebarchive=linkWebcitationID(rvalid,l_url)
rtype="memento"
elseif value:match("^cite/%d%d%d%d%-%d%d%-%d%d$")or value:match("^webcite/%d%d%d%d%-%d%d%-%d%d$") or value:match("^cite/%d%d%d%d%-%d%d%-%d%d%+%d%d%:%d%d%:%d%d%$")or value:match("^webcite/%d%d%d%d%-%d%d%-%d%d+%d%d%:%d%d%:%d%d%$") then
rvalid=value:match(".-%/(%S+)$") -- variant for backward compatibility, not recommendable
rdate=rvalid
rarchiveurl,rwebarchive=linkWebcitationQuery(mw.uri.encode( rvalid, "QUERY" )..'&date='..rdate , l_url)
rtype="memento encoded"
elseif value:match("^"..d14.."$") or value:match("^web/"..d14.."$") or value:match("^wayback/"..d14.."$") then
rvalid=string.sub(value,-14)
rdate=mwtimestamp(rvalid)
rarchiveurl,rwebarchive=linkInternetArchive(rvalid,l_url)
rtype = 'memento'
elseif value:match("^%d*%*$") or value:match("^web/%d*%*$") or value:match("^wayback/%d*%*$") then
rvalid='*'
rdate=nil
rarchiveurl,rwebarchive=linkInternetArchiveAsterix('*',l_url)
rtype = '*'
elseif value:match("^is/"..d14.."$") or value:match("^today/"..d14.."$") then
rvalid=string.sub(value,-14)
rdate=mwtimestamp(rvalid)
rarchiveurl,rwebarchive=linkArchiveIs(rvalid,l_url)
rtype="memento"
elseif value:match("^vefsafn/"..d14.."$") then
rvalid=string.sub(value,-14)
rdate=mwtimestamp(rvalid)
rarchiveurl,rwebarchive=linkVefsafn(rvalid,l_url)
rtype="memento"
elseif value:match("^wikiwix/?%S*$") then
rvalid=value:match("^wikiwix/?(%S*)$")
if #rvalid==0 then
rvalid=l_url
end
rdate=nil
rarchiveurl,rwebarchive=linkWikiwix(rvalid,l_url)
rtype="memento"
else
rvalid=value
rdate=nil
rarchiveurl=nil
rwebarchive='Error'
rtype="error memento"
end
return rdate, rtype, rurl, rvalid, rarchiveurl,rwebarchive
end -- parsmemento()
local function getparams (frame)
local l_pars
local l_localpars
l_pars = frame:getParent().args
l_url = l_pars.url or l_pars.URL
l_title = l_pars.text or l_pars.title or l_pars.Titel or l_pars.titel
l_id = l_pars.id or l_pars.ID
l_wayback = l_pars.wayback
l_webcite = l_pars.webcite or l_pars.webciteID -- structures of wayback and webciteid are distinct
l_archiveis = l_pars.archivetoday or l_pars['archive-is'] or l_pars['archive-today']
if l_archiveis then
l_archiveis='is/'..l_archiveis
end
l_archivedate = l_pars.archivedate or l_pars['archive-datum'] or l_pars['archiv-datum']
l_archiveurl = l_pars.archiveurl or l_pars['archiv-url'] or l_pars['archiv-URL'] or l_pars['archiveURL']
l_memento = l_pars.memento or l_wayback or l_webcite or l_archiveurl or l_archiveis
l_offline = l_pars.offline
l_inline = l_pars.inline or l_pars.NurURL or l_pars.nururl
l_localpars=frame.args
l_pretext= l_localpars.pretext
l_posttext= l_localpars.posttext
l_postmeta= l_localpars.postmeta
l_modus= l_localpars.modus or l_localpars.botlauf
return l_url
, l_title
, l_archivedate
, l_archiveurl
, l_memento
, l_offline
, l_inline
, l_pretext
, l_posttext
, l_postmeta
, l_modus
end --getparams
-- Funktion zum Anzeigen der übergebenen Parameter (für Testzwecke)
p.showparams = function(frame)
local r = ""
l_url, l_title , l_archivedate , l_archiveurl, l_memento , l_offline, l_inline , l_pretext, l_posttext, l_postmeta= getparams(frame)
r= r..'\n l_url: '.. nz(l_url)
..'\n l_title: '.. nz(l_title)
..'\n l_archivedate: '.. nz(l_archivedate)
..'\n l_archiveurl: '.. nz(l_archiveurl)
..'\n l_memento: '.. nz(l_memento)
..'\n l_offline: '.. nz(l_offline)
..'\n l_inline: '.. nz(l_inline)
..'\n l_pretext: '.. nz(l_pretext)
..'\n l_posttext: '.. nz(l_posttext)
..'\n l_postmeta: '.. nz(l_postmeta)
..'\n l_modus: '.. nz(l_modus)
return r
end
-- Basis für die Vorlage Webarchiv
p.webarchive = function(frame)
local r = ""
local archivetext=""
local ldate =""
l_url, l_title , l_archivedate , l_archiveurl, l_memento , l_offline, l_inline , l_pretext, l_posttext, l_postmeta, l_modus= getparams(frame)
if l_archiveurl and not l_url or (l_url=='' and l_archiveurl ) then
-- todo: extract url from archiveurl
l_url = l_archiveurl:gsub("%.+%/(https?:%/%/.+)","%1")
end
if l_title== nil or trim(l_title)=='' then
l_title=l_url
end
if l_memento == nil or trim(l_memento) =='' then
mwuri={}
l_memento=trim(l_url)
end
local tarchivetext ={}
tarchivetext = {["archive.org"]="([[Memonto]]%sim [[Inernet Archive]])"
,["wayback.archive.org"]="(Memonto-Suche%sim [[Inernet Archive]])"
,["vefsafn"]="(Memonto-Suche%sim''The Icelandic Web Archive'')"
,["archive.is"]="([[Memonto]]%sauf [[archive.is]])"
,["WebCite"]="([[Memonto]]%sauf [[WebCite]])"
,["Wikiwix"]="(Cache%sauf [[Wikiwix]])"
,["Webseite"]="(Kopie%s)"
,["Error"]=[=[<span style="display:none;">[[Vorlage:Webarchiv/Wartung/Parameter]]</span><span class="error">Bitte entweder ''memento''- oder ''wayback''- oder ''webciteID'' oder ''archive-today''-Parameter angeben</span>]=]
}
rdate, rtype, rurl, rvalid, rarchiveurl, rwebarchive = parsmemento(trim(l_memento)) -- todo analyse der Parameter und spezifische Zuweisung
ldate=' vom ' .. nz(rdate,nz(l_archivedate,''))..' '
if rwebarchive == "Webseite" then
local mwuri={}
mwuri=mw.uri.new(rarchiveurl)
ldate=ldate ..'auf ' .. mwuri.host .. ' '
end
if #ldate<8 then
ldate=' '
end
archivetext=string.format(tarchivetext[rwebarchive], ldate)
if l_modus=="hide" then
r= trim(r..nz(l_pretext)..' ['..l_url.. ' ' .. l_title..'] '
.. nz(l_posttext))
.. ' ' .. nz(postmeta)
.. [=[<span style="display:none;">]=]
.. trim(nz(rarchiveurl,nz(l_archiveurl,nz(l_url)))
.. [=[</span>]=]
)
else
r =trim( r .. nz(l_pretext)..' ['..trim(nz(rarchiveurl,nz(l_archiveurl,nz(l_url)))) .. ' ' .. l_title .. ']'
.. ' ' .. nz(l_posttext)
.. ' ' .. archivetext
.. ' ' .. nz(postmeta)
)
end
return r
end
-- Basis für die Vorlage Toter Link
p.deadurl= function(frame)
local mwuri={}
local mwtitle={ }
local setcategory=""
local setmaintainnenceurl=""
l_url, l_title , l_archivedate , l_archiveurl, l_memento , l_offline, l_inline , l_pretext, l_posttext, l_postmeta, l_modus= getparams(frame)
mwtitle=mw.title.getCurrentTitle()
mwuri=mw.uri.new(l_url)
r=""
if mwtitle:inNamespace(0) then
setcategory='[[Kategorie:Wikipedia:Weblink offline %s]]'
elseif mwtitle:inNamespace(1) then
setcategory='[[Kategorie:Wikipedia:Weblink offline %s (Diskussionsnamensraum)]]'
elseif mwtitle:inNamespace(1) then
setcategory='[[Kategorie:Wikipedia:Weblink offline %s (Benutzernamensraum)]]'
elseif mwtitle:inNamespace(6) then
setcategory='[[Kategorie:Wikipedia:Weblink offline %s (Dateinamensraum)]]'
elseif mwtitle:inNamespace(10) then
setcategory=''
else
setcategory='[[Kategorie:Wikipedia:Weblink offline %s (andere Namensräume)]]'
end
local groupby=""
if l_modus== nil or l_modus == '' then
setcategory=string.format(setcategory,'')
groupby='deadurl'
else
setcategory=string.format(setcategory,l_modus)
groupby=l_modus
end
if not(l_url== nil or l_url == '') and mwtitle:inNamespace(0) then
setmaintainnenceurl='<span style="display:none">'
.. '[http://'.. nz(groupby) .. '.invalid/'
.. l_url .. ' @1]'
..'[' .. l_url .. ' @2]'
..'[[Vorlage:Toter Link/' .. mwuri.host .. ']]'.. '</span>'
elseif mwtitle:inNamespace(0) then
setmaintainnenceurl='<span style="display:none">'
..'[[Vorlage:Toter Link/' .. nz(groupby) .. '!...nourl]]</span>'
end
if l_url then
if l_inline then
r=r.. 'https://de.wikipedia.org/wiki/Wikipedia:Defekte_Weblinks?dwl='
.. l_url .. ' <small>Seite nicht mehr abrufbar</small>],<small> Suche in Webarchiven:</small> '
.. setcategory .. setmaintainnenceurl
.. '[http://timetravel.mementoweb.org/list/2010/'
.. l_url
else
r=r ..'<small> ([[Wikipedia:Defekte Weblinks|Seite nicht mehr abrufbar]] ; Suche in [http://timetravel.mementoweb.org/list/2010/'
.. l_url ..' Webarchiven]</small>'.. setcategory .. setmaintainnenceurl
end
else
r= r.. '<small> ([[Wikipedia:Defekte Weblinks|Seite nicht mehr abrufbar]])</small>'.. setcategory .. setmaintainnenceurl
end
return r
end
-- Für Vorlagen zur Umleitung einer potentiell übernommen Domain auf eine sichere Suchseite zur Anzeige der ehemaligen Originalen url
p.defusedrottenoriginal= function(frame)
l_url, l_title , l_archivedate , l_archiveurl, l_memento , l_offline, l_inline , l_pretext, l_posttext, l_postmeta, l_modus= getparams(frame)
if l_url==nil or l_url=="" then
r=[=[<span class="error">Bitte den ''URL''-Parameter angeben.</span>]=]
else
r='(Anzeige der [http://timetravel.mementoweb.org/list/2010/'..l_url..' '..nz(l_title,'originalen URL')..'])'
end
return r
end
return p