Modul:Timetravel

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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.&#160;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>&nbsp;Suche in Webarchiven:</small> '
   		  .. setcategory .. setmaintainnenceurl
   		  .. '[http://timetravel.mementoweb.org/list/2010/'
   		  .. l_url
   		else
   		r=r ..'<small>&nbsp;([[Wikipedia:Defekte Weblinks|Seite nicht mehr abrufbar]] &#59; Suche in [http://timetravel.mementoweb.org/list/2010/'
   		    .. l_url ..' Webarchiven]</small>'.. setcategory .. setmaintainnenceurl
   	    end
   	else
   		r= r.. '<small>&nbsp;([[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