| Jewiki unterstützen. Jewiki, die größte Online-Enzyklopädie zum Judentum.
Helfen Sie Jewiki mit einer kleinen oder auch größeren Spende. Einmalig oder regelmäßig, damit die Zukunft von Jewiki gesichert bleibt ... Vielen Dank für Ihr Engagement! (→ Spendenkonten) |
How to read Jewiki in your desired language · Comment lire Jewiki dans votre langue préférée · Cómo leer Jewiki en su idioma preferido · בשפה הרצויה Jewiki כיצד לקרוא · Как читать Jewiki на предпочитаемом вами языке · كيف تقرأ Jewiki باللغة التي تريدها · Como ler o Jewiki na sua língua preferida |
Modul:Vorlage:Defekter Weblink
local Serial = "2016-06-04"
--[=[
Defekter Weblink *
*** Botlauf fehlt: Pflichtangabe!
]=]
local Ausnahmen = "Modul:Vorlage:Defekter Weblink/Ignorieren" local Domains = "Modul:Vorlage:Defekter Weblink/Domains" local Fehler = false local KategorieBeginn = "Kategorie:Wikipedia:Defekte Weblinks/Bot" local Kategorien =
{ Bot = { s = "" },
Archiviert = { s = "/Archiviert" },
Deaktiviert = { s = "/Deaktiviert" },
Domain = { s = "/Domains" },
FalschPositiv = { s = "/Funktioniert vermutlich" },
Intern = { s = "/Interner Fehler" },
Klammer = { s = "/Eckige Klammer in URL" },
Leer = { s = "/Keine URL mehr" },
Namensraum = { s = "/Falscher Namensraum" },
NonASCII = { s = "/Zeichen jenseits ASCII" },
ResourceURL = { s = "/URL keine URL" },
SchreibR = { s = "/Schreibrichtung in URL" },
Solidus = { s = "/Lemma im Unterseitenformat" },
Sonderzeichen = { s = "/URL endet auf Sonderzeichen" },
Spam = { s = "/Spam" },
SyntaxPipe = { s = "/Pipe-Symbol in URL" },
Unauffindbar = { s = "/Keine auffindbaren URL" },
Unicode = { s = "/Unicode in URL" },
Unterseite = { s = "/Einbindung auf Unterseite" },
Vorlage = { s = "/Vorlagensyntax" },
Waise = { s = "/Artikel fehlt" }
}
local Vorlage = "Vorlage:Defekter Weblink" local Same = "Artikel mit gleicher URL:" local Satzzch = "URL endet auf Satzzeichen; ggf. besser ohne" local Schemes = ":http:https:ftp:sftp:mailto:telnet:gopher:" local Schonmal = "Im Jahr %s bereits defekt gewesen." local SchreibR = "Links-Rechts-Schreibrichtungszeichen in URL" local Secure = "Wechsel zwischen http und https erforderlich" local Selbst = "Modul:" .. Vorlage local Serie = "2015-10" local Silent = "%s%d deaktivierte URL vorhanden" local Shrinked = "Leere oder vermutlich abgearbeitete URL-Liste; Einbindung kann dann entfernt werden" local Skip = "Vermutlich im Browser funktionierend. Ausprobieren; falls okay, dann diesen Eintrag löschen." local Solved = "Dieser Link ist vermutlich nicht mehr im Quelltext des Artikels vorhanden; falls insgesamt weg, dann diesen Eintrag löschen." local Sonderz = "Eckige Klammer [ in der URL – siehe Hilfe:Links #Sonderzeichen." local Source = "Details im Quelltext nachlesbar." local Spam = "Spam-Link aus dem Artikel entfernen" local Stat_1_2 = "Seite hat Besonderheit" local Stat_3nn = "Seite wurde umgeleitet; anpassen?" local Stat_4nn = "Problem mit Ressource" local Stat_502 = "Server / ganze Domain anscheinend unerreichbar" local Stat_5nn = "Serverproblem" local Stat_9nn = "Netzwerk-Fehler (%d)" local Steuer = "|Archiv|Bot|Lauf|Unterseite|" local Stored = "Vielleicht ist eine archivierte Version geeignet:" local Strange = "Unicode in URL" local Sub = Vorlage .. "/Anleitung" local Suche500 = "andere Artikel, gleiche Domain" local Suffix = "URL ohne Sonderzeichen am Ende funktioniert" local Superz = "Zeichen jenseits von ASCII gefunden" local SyntPipe = "Pipe-Symbol in URL; mal ohne Anhang probieren" local SyntURL = "URL-Syntax: Keine Domain/IP, nicht im www erreichbar" local Class = "deadlink-bot" local HelpLink = { HTTPstat = 1378713,
NonASCII = 9063042,
Pipe = 9063048,
Spec = 9063045 }
local DomainFamilies, ExceptionCount, Exceptions, ExtLinks, Frame local PageText, Refs, TemplUtl, URLutil
-- Privatfunktionen Benutzer:Boshomi -- Ohne offiziell zugesicherte Wirkung
local HideURLs = "%s" local PraefixedURLsAll = "" local function addpraefixURL(url,praefix) -- Add a praefix for finding URL of tht template table in special:LinkSearch -- default is http://giftbot.dwl.invalid/ -- return space separated string of urls local r ="" if praefix == nil then praefix="http://giftbot.dwl.invalid/" end if url==nil then r="" else r =praefix .. url .. " " end
return r end
local function fair( access )
-- URL egalisieren
-- Parameter:
-- access -- string, mit URL
-- Returns: 1. string, mit egalisierter authority
-- 2. string, mit egalisiertem Pfad+query nach "/"
local r1 = URLutil.getNormalized( access ):sub( 3 )
local i, r2
if r1:match( "[,%.;:!%?%)]$" ) then
r1 = r1:sub( 1, #r1 - 1 )
end
i = r1:find( "#", 5, true )
if i then
r1 = r1:sub( 1, i - 1 )
end
i = r1:find( "/", 4, true )
if i then
r2 = r1:sub( i + 1 )
r1 = r1:sub( 1, i - 1 ):lower()
else
r2 = ""
end
return r1, r2
end -- fair()
local function fallback( about, archive )
-- Archivversion zum Weblink darstellen, falls archiviert
-- Parameter:
-- about -- table mit aktivem Weblink
-- .url
-- .cit
-- .wba
-- archive -- Kennung ("cit", "wba")
-- Returns: string mit betiteltem Archivlink, oder false
local sign = about[ archive ]
local r
if sign then
local seek = about.url
local less, repo, repos, show, sub
if sign:sub( 1, 1 ) == "-" then
less = true
sign = sign:sub( 2 )
if about.lastChSz then
sub = seek:match( "^(.+)%A$" )
if sub then
seek = sub
show = Satzzch
end
elseif about.syntaxPipe then
-- sub = seek:match( "^(.+)%%7C$" )
if sub then
seek = sub
show = SyntPipe
end
end
else
less = false
end
repos =
{ cit = { scheme = "http://www.webcitation.org/%s",
show = "webcitation.org",
params = { sign } },
wba = { scheme = "http://wayback.archive.org/web/%s/%s",
show = "archive.org",
params = { sign, seek } }
}
repo = repos[ archive ]
if show then
repo.show = string.format( "%s (%s)", repo.show, show )
end
r = string.format( repo.scheme, unpack( repo.params ) )
r = string.format( "[%s %s]", r, repo.show )
else
r = false
end
return r
end -- fallback()
local function falsified( attempt )
-- Check URL for exception
-- Returns: true, if probably false positive
local r
if Exceptions then
local s
for i = 1, ExceptionCount do
s = Exceptions[ i ]
r = ( s == string.sub( attempt, 1, #s ) )
if r then
break -- for i
end
end -- for i
end
return r
end -- falsified()
local function families( achieve )
-- Domain-Liste abarbeiten
-- Parameter:
-- achieve -- nil: Initialisierung
-- 1: Kategorie
-- 2: Wikitext-Ausgabe
-- Returns: string mit Liste, oder ""
local r = ""
if type( Domains ) == "string" then
local lucky
lucky, Domains = pcall( mw.loadData, Domains )
if type( Domains ) ~= "table" then
Domains = false
end
end
if not DomainFamilies and Domains then
DomainFamilies = { }
for k, v in pairs( Domains ) do
table.insert( DomainFamilies,
{ seek = v } )
end -- for k, v
end
if DomainFamilies then
local n = table.maxn( DomainFamilies )
local d
for i = 1, n do
d = DomainFamilies[ i ]
d.suite = d.seek
end -- for i
if achieve == 1 then
local s
for i = 1, n do
d = DomainFamilies[ i ]
s = d.spot
if s then
r = string.format( "%s%s",
r, KategorieBeginn, d.suite, s )
end
end -- for i
elseif achieve == 2 then
for i = 1, n do
d = DomainFamilies[ i ]
r = string.format( "%s\nVorlage:%s/DomainCat",
r, Vorlage, d.suite )
end -- for i
end
end
return r
end -- families()
local function family( address )
-- URL eine der interessanten Domains?
-- Parameter:
-- address -- string mit URL
if DomainFamilies then
local n = table.maxn( DomainFamilies )
local d, k, s
for i = 1, n do
d = DomainFamilies[ i ]
k = mw.ustring.find( address, d.seek, 2, true )
if k then
s = mw.ustring.sub( address, k - 2, k - 1 )
if s == "//" or
mw.ustring.codepoint( s, 2, 2 ) == 46 then
local m = mw.ustring.len( d.seek )
local j
s = mw.ustring.sub( address, k + m )
if s == "" then
s = "/"
j = 47
else
j = mw.ustring.codepoint( s, 1, 1 )
end
if j == 47 or j == 58 then
d.spot = s:sub( 2 ) .. " "
break -- for i
end
end
end
end -- for i
end
end -- family()
local function fault( a )
-- Formatiere Fehler mit class=error
-- Parameter:
-- a -- string mit Text
return string.format( "%s", a )
end -- fault()
local function favour( a )
-- Generiere Link auf Hilfe -- Parameter: -- a -- string mit Text return string.format( "(Details)", HelpLink[ a ] )
end -- favour()
local function fehler( art, anzeige )
-- Ein Fehler ist aufgetreten
-- Parameter:
-- art -- string mit Schlagwort zum Typ
-- anzeige -- string mit Einzelheiten
local t
if not Fehler then
Fehler = { Intern = { s = "Interner Fehler",
k = "Intern" },
Kennung = { s = "Unerlaubte Syntax",
k = "Vorlage" },
Lauf = { s = "Botlauf fehlt",
k = "Vorlage" },
Modul = { s = "Modul-Seite fehlt",
k = "Intern" },
Namensraum = { s = "Falscher Namensraum",
k = "Namensraum" },
Ohne = { s = "URL fehlt, Parameter ",
k = "Vorlage" },
Seite = { s = "Fehlerhafte Seiten-ID ",
k = "Vorlage" },
Spam = { s = "Spam-URL kaputt",
k = "Vorlage" },
Unbekannt = { s = "Unbekannter Parameter",
k = "Vorlage" },
Unterseite = { s = "Archivseite",
k = "Unterseite" },
Waise = { s = "Kein Artikel vorhanden",
k = "Waise" },
Zuviel = { s = "Unerlaubte Daten",
k = "Vorlage" }
}
end
t = Fehler[ art ]
if t then
if t.e then
t.e = string.format( "%s; %s", t.e, anzeige )
elseif anzeige then
t.e = anzeige
else
t.e = ""
end
if t.k then
local wk = Kategorien[ t.k ]
if wk then
wk.e = true
else
Fehler.Intern.e = string.format( "Wartungskat %s",
wk )
Kategorien.Intern.e = true
end
end
else
Fehler.Intern.e = string.format( "fehler(%s) %s",
art, anzeige )
Kategorien.Intern.e = true
end
end -- fehler()
local function fehlerliste()
-- Gesamt-Fehlermeldung
-- Returns:
-- string mit formatiertem Ergebnis, oder false
local r
if Fehler then
r = ""
for k, v in pairs( Fehler ) do
if v.e and v.s then
r = string.format( "%s*** %s: %s ", r, v.s, v.e )
end
end -- for k, v
r = "
" .. fault( r )
else
r = false
end
return r
end -- fehlerliste()
local function fertig()
-- Artikeltext herbeischaffen, so gut es geht
-- Returns:
-- string mit Artikeltext, oder nil
local r
if Frame then
if type( PageText ) == "string" then
local page = mw.title.new( PageText, 0 )
r = page:getContent()
if r then
if #r < 185000 then
local lucky
lucky, TemplUtl = pcall( require, "Modul:TemplUtl" )
if type( TemplUtl ) == "table" then
TemplUtl = TemplUtl.TemplUtl()
else
fehler( "Modul", TemplUtl )
end
r = TemplUtl.flat( r ):gsub( "<", " " )
r = r:gsub( "%{%{#tag", "{{NULL|" )
:gsub( "%{%{Exzellent", "{{NULL|" )
:gsub( "%{%{Informativ", "{{NULL|" )
:gsub( "%{%{Lesenswert", "{{NULL|" )
:gsub( "%{%{Gesprochene Version", "{{NULL|" )
:gsub( "%{%{SEITENTITEL:", "{{NULL|" )
:gsub( "%{%{DISPLAYTITLE:", "{{NULL|" )
:gsub( "%{%{Taxobox", "", "%%7D%%7D" )
r = string.format( "[%s/%s?%s&%s%s %s]",
mw.site.server, "w/index.php",
"title=Special:LinkSearch",
"target=", r, anzeige )
else
r = string.format( "[%s/%s?%s=%s%% %s]",
"https://tools.wmflabs.org",
"giftbot/weblinksuche.fcgi",
"namespace=0&target",
ask:gsub( "_", "\\_" )
:gsub( "%%20", "%%2520" )
:gsub( "%%", "\\%%" )
:gsub( "&", "%%26" ),
anzeige )
end
return r
end -- flink()
local function flip( access )
-- Wikilink auf Artikel mit curid zeigen
-- Parameter:
-- access -- string mit curid
-- Returns: string mit Wikilink und vermutetem Lemma, oder false
local r
if access:match( "^%d+$" ) then
local show = mw.title.new( tonumber( access ) )
if show then
show = show.text
else
show = string.format( "(Seite #%s nicht gefunden)",
access )
end
r = string.format( " %s",
access, show )
else
fehler( "Seite", access )
r = false
end
return r
end -- flip()
local function flipper( about )
-- Links auf weitere Artikel mit gleicher URL auflisten
-- Parameter:
-- about -- table mit aktivem Weblink
-- .url
-- .weitere
-- string mit Komma-getrennter Liste von curid
-- Returns: string, oder false
local got = mw.text.split( about.weitere, "," )
local n = table.maxn( got )
local r = ""
local s
if n == 1 then
r = flip( got[ 1 ] )
else
for i = 1, n do
s = got[ i ]
if s:match( "^%d+$" ) then
s = string.format( " %s",
s, s )
r = r .. s
else
fehler( "Seite", s )
end
end -- for i
end
if r == "" then
r = false
else
r = string.format( "%s (%s)",
r, flink( about.url, "aktuell" ) )
-- oder immer anzeigen, nicht nur zur Bot-Zeit?? Dann eins rauf.
end
return r
end -- flipper()
local function flop( about )
-- Spam-Weblink darstellen
-- Parameter:
-- about -- table mit aktivem Weblink
-- .scheme
-- .url
-- Returns: string
local r = about.url
if about.scheme ~= "mailto:" then
local i = r:find( "%\\%\\" )
if i then
r = r:sub( i + 2 )
else
r = r:substr( 9 )
fehler( "Spam", "backslash fehlt" )
end
end
fire( "Spam" )
r = string.format( "%s: %s", Spam, r )
return r
end -- flop()
local function flutsch( about )
-- Korrigierbares Weblink darstellen
-- Parameter:
-- about -- table mit aktivem Weblink
-- .strangeCh
-- .lastChSz
-- .leave
-- .lethal
-- .linkBrackets
-- .locked
-- .loose
-- .syntaxPipe
-- .mode
-- (.scheme)
-- .schonmal
-- .url
-- .cit
-- .wba
-- (.weitere)
-- Returns: string mit Item-Text und ggf. Unterpunkten
local k = about.mode
local repos = { "cit", "wba" }
local saved = false
local r, s
if about.linkBrackets then
r = string.format( "[%s %s]", about.url, about.url )
else
r = about.url
end
if about.leave then
r = string.format( "%s\n** %s", r, Skip )
fire( "FalschPositiv" )
end
for j, v in pairs( repos ) do
s = fallback( about, v )
if s then
if saved then
saved = string.format( "%s * %s", s, saved )
else
saved = s
end
end
end -- for j, v
if saved then
r = string.format( "%s\n** %s %s",
r, Stored, saved )
end
if k and k ~= 404 then
local linksearch
r = string.format( "%s\n** ", r )
if k == 502 or k == 505 then
r = r .. Stat_502
linksearch = true
elseif k < 100 or k > 599 then
r = r .. string.format( Stat_9nn, k )
linksearch = true
k = false
elseif k >= 500 then
r = r .. Stat_5nn
linksearch = true
elseif k < 300 then
r = r .. Stat_1_2
elseif k < 400 then
r = r .. Stat_3nn
else
r = r .. Stat_4nn
end
if k then
r = string.format( "%s (HTTP-Statuscode %d)",
r, k )
end
if linksearch then
s = URLutil.getHost( about.url )
if s then
s = string.format( "%s%s/",
URLutil.getScheme( about.url ),
s )
r = string.format( "%s %s",
r, flink( s, Suche500 ) )
end
end
end
if about.lethal then
r = string.format( "%s\n** %s", r, SyntURL )
fire( "ResourceURL" )
end
if about.loose then
r = string.format( "%s\n** %s", r, Solved )
end
if about.locked then
r = string.format( "%s\n** %s", r, Secure )
end
if about.schonmal then
s = string.format( Schonmal, about.schonmal )
r = string.format( "%s\n** %s", r, s )
end
if about.url:find( "%[" ) then
r = string.format( "%s\n** %s", r, Sonderz )
fire( "Klammer" )
end
if about.syntaxPipe then
r = string.format( "%s\n** %s %s",
r, SyntPipe, favour( "Pipe" ) )
s = about.url:match( "^(.+)%%7C" )
if s then
local suffix
if about.syntaxPipe == "" then
suffix = "|"
else
suffix = string.format( "|%s]",
about.syntaxPipe )
end
r = string.format( "%s\n** [%s %s]%s",
r, s, s, suffix )
end
fire( "SyntaxPipe" )
end
if about.lunatic then
if about.lastChLRM then
r = string.format( "%s\n** %s", r, SchreibR )
s = "SchreibR"
else
r = string.format( "%s\n** %s", r, Strange )
s = "Unicode"
end
fire( s )
end
-- if about.lastChSz then -- s = about.url:match( "^(.+)%A$" ) -- if s then -- r = string.format( "%s\n** %s\n**: %s", -- r, Satzzch, s ) -- fire( "Sonderzeichen" ) -- end -- end
if about.lastRemove and
not about.url:match( "^%l*:?//[^/]+/$" ) then
r = string.format( "%s\n** %s", r, Suffix )
fire( "Sonderzeichen" )
end
if about.strangeCh then
r = string.format( "%s\n** %s %s: %s",
r,
Superz,
favour( "NonASCII" ),
about.strangeCh )
fire( "NonASCII" )
end
family( about.url )
-- Privatfunktion Benutzer:Boshomi
r = string.format( HideURLs, r, addpraefixURL( about.url ) )
return r
end -- flutsch()
local function focus( args )
-- Analysiere Steuerparameter und Einbindung
-- Parameter:
-- args -- table mit Steuerungs-Infos
-- Returns:
-- false wenn Analyse sinnvoll
-- string wenn etwas auszugeben
local r = ""
if args.Lauf then
if args.Lauf == Serie then
local current = mw.title.getCurrentTitle()
if current.namespace == 1 then
PageText = current.text
if current.isSubpage then
local artikel = mw.title.new( PageText, 0 )
if artikel.exists then
r = false
else
if not args.Archiv or args.Archiv == "0" then
args.Archiv = false
else
args.Archiv = true
fire( "Archiviert" )
end
if not args.Unterseite
or args.Unterseite == "0" then
args.Unterseite = false
else
args.Unterseite = true
fire( "Solidus" )
end
if ( args.Archiv or args.Unterseite ) and
( args.Archiv ~= args.Unterseite ) then
if args.Archiv then
r = ""
else
r = false
end
else
fehler( "Unterseite", "ohne Parameter" )
end
end
else
r = false
end
else
fehler( "Namensraum", "Nur Artikel-Diskussion" )
end
else
r = "Ehemaliger Bot-Lauf: " .. args.Lauf
if args.Bot then
r = string.format( "%s (%s)", r, args.Bot )
end
end
else
fehler( "Lauf", "Pflichtangabe!" )
end
return r
end -- focus()
local function format( about )
-- Weblink menschenfreundlich darstellen
-- Parameter:
-- about -- table mit aktivem Weblink
-- (.lazy)
-- .lastRemove
-- .listedBlack
-- .mode
-- .scheme
-- .schonmal
-- .url
-- .cit
-- .wba
-- .weitere
-- Returns: string mit *-Auflistungspunkt
local r = "\n* "
if about.listedBlack then
r = r .. flop( about )
else
r = r .. flutsch( about )
end
if about.weitere then
local s = flipper( about )
if s then
r = string.format( "%s\n** %s %s",
r, Same, s )
end
end
return r
end -- format()
local function furnish( alle, action )
-- Weblink-tables menschenfreundlich darstellen -- Parameter: -- alle -- table mit aktiven Weblink-tables -- action -- string mit Lauf-Kennung -- Returns: string mit Auflistung der Weblinks families()
r = string.format( "
Class, action, Class )
for k, v in pairs( alle ) do
r = r .. format( v )
end -- for k, v
r = string.format( "%s\n%s", r, families( 1 ) )
return r
end -- furnish()
local function f( args, frame )
-- Hauptfunktion zur Steuerung des Gesamtablaufs
-- Parameter:
-- args -- table mit Parameterliste
-- frame -- Umgebungsobjekt, oder nil
-- Returns: string mit formatiertem Gesamtergebnis
local m = 0
local r = ""
local ctrl, el = fetch( args )
local s = focus( ctrl )
if not s then
local lucky, j, n, span, wl
lucky, URLutil = pcall( require, "Modul:URLutil" )
if type( URLutil ) == "table" then
local exc
URLutil = URLutil.URLutil()
lucky, exc = pcall( mw.loadData, Ausnahmen )
if type( exc ) == "table" then
Exceptions = { }
for k, v in pairs( exc ) do
if type( v ) == "string" then
table.insert( Exceptions, v )
else
fehler( "Modul",
"Tabelle der Ausnahmen defekt: "
.. tostring( v ) )
Exceptions = false
break -- for k, v
end
end -- for k, v
if Exceptions then
ExceptionCount = table.maxn( Exceptions )
if ExceptionCount == 0 then
Exceptions = false
end
end
Frame = frame
n, m, wl, j = finde( el )
else
fehler( "Modul", exc )
m = -1
n = -1
end
else
fehler( "Modul", URLutil )
m = -1
n = -1
end
if n > 0 then
if Frame then
local params = { tostring( n ),
args.Bot }
r = Frame:expandTemplate{ title = Sub, args = params }
else
r = string.format( "((template/sub %d %s))",
n, args.Bot )
end
r = r .. furnish( wl, ctrl.Lauf )
fire( "Bot" )
end
r = r .. Frame:preprocess(
"
" )
if m > 0 then
s = string.format( Silent, "\n", m )
if n == 0 and not args.Archiv then
fire( "Deaktiviert" )
end
span = "0"
elseif n == 0 then
s = Shrinked
fire( "Leer" )
span = "00"
elseif j == n and not Refs then
s = Shrinked
fire( "Unauffindbar" )
span = "000"
Source = ""
end
if span then
span = string.format( "class='%s %s-%s'",
Class, Class, span )
s = string.format( "%s",
Class, ctrl.Lauf, span, s )
end
end
if s then
if r == "" then
r = string.format( "Defekter Weblink * ",
Vorlage )
end
r = r .. s
if not Fehler then
if s ~= "" then
r = r .. "
"
end
if m > 0 then
r = r .. Source
end
end
end
if Fehler then
r = r .. fehlerliste()
end
return string.format( "%s%s\n", r, firelist() )
end -- f()
-- Export local p = {}
function p.test( a )
local lucky, r = pcall( f, a ) return r
end
function p.f( frame )
local lucky, r = pcall( f, frame:getParent().args, frame )
if not lucky then
r = string.format( "%s%s%s",
tostring( r ),
KategorieBeginn,
Kategorien.Intern.s )
end
return r
end
function p.failsafe()
return Serial
end
function p.families()
return families( 2 )
end
function p.focus()
return Serie
end
return p