172.356
Bearbeitungen
wp>Xqt K (Änderte den Schutz von „Modul:WLink“: Häufig eingebundenes Modul ([Bearbeiten=Nur Sichter] (unbeschränkt) [Verschieben=Nur Administratoren] (unbeschränkt))) |
Keine Bearbeitungszusammenfassung |
||
(17 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
--[=[ | local WLink = { suite = "WLink", | ||
serial = "2019-06-17", | |||
item = 19363224 }; | |||
--[=[ | |||
ansiPercent() | ansiPercent() | ||
formatURL() | formatURL() | ||
getArticleBase() | getArticleBase() | ||
getBaseTitle() | getBaseTitle() | ||
getEscapedTitle() | |||
getExtension() | getExtension() | ||
getFile() | getFile() | ||
Zeile 10: | Zeile 13: | ||
getLanguage() | getLanguage() | ||
getNamespace() | getNamespace() | ||
getNamespaced() | |||
getPlain() | getPlain() | ||
getProject() | getProject() | ||
getTarget() | getTarget() | ||
getTalkPage() | |||
getTargetPage() | getTargetPage() | ||
getTitle() | getTitle() | ||
getWeblink() | |||
getWikilink() | |||
isBracketedLink() | isBracketedLink() | ||
isBracketedURL() | isBracketedURL() | ||
Zeile 22: | Zeile 29: | ||
isInterwiki() | isInterwiki() | ||
isMedia() | isMedia() | ||
isTalkPage() | |||
isTitledLink() | isTitledLink() | ||
isValidLink() | isValidLink() | ||
isValidLinktext() | |||
isWikilink() | isWikilink() | ||
pageLink() | |||
pageTarget() | |||
wikilink() | wikilink() | ||
failsafe() | |||
]=] | ]=] | ||
Zeile 31: | Zeile 43: | ||
-- local globals | -- local globals | ||
local URLutil = false; | local URLutil = false; | ||
local htmlInline = { b = true, | |||
big = true, | |||
code = true, | |||
em = true, | |||
i = true, | |||
kbd = true, | |||
s = true, | |||
samp = true, | |||
small = true, | |||
span = true, | |||
strong = true, | |||
sub = true, | |||
sup = true, | |||
tt = true, | |||
var = true }; | |||
Zeile 55: | Zeile 84: | ||
return URLutil; | return URLutil; | ||
end -- utilURL() | end -- utilURL() | ||
local cleanWikilink = function ( access ) | |||
-- Refine wikilink spacing and decode | |||
-- Precondition: | |||
-- access -- string, with presumable link | |||
-- Postcondition: | |||
-- Returns string, with pretty target | |||
local r = access:gsub( "_", " " ) | |||
:gsub( " ", " " ) | |||
:gsub( " ", " " ) | |||
:gsub( " ", " " ) | |||
:gsub( " ", " " ) | |||
:gsub( "%s+", " " ); | |||
r = mw.text.decode( r ); | |||
return r; | |||
end -- cleanWikilink() | |||
Zeile 185: | Zeile 232: | ||
r1 = false; | r1 = false; | ||
else | else | ||
r1 = | r1 = cleanWikilink( r1 ); | ||
end | end | ||
end | end | ||
Zeile 199: | Zeile 240: | ||
local prefix = function ( ask | local farming = function ( already ) | ||
-- Retrieve wikifarm project information | |||
-- Precondition: | |||
-- already -- table, with wikilink components | |||
-- Postcondition: | |||
-- Returns table, with wikilink components extended | |||
local r = already; | |||
if not r.project then | |||
local codes = { mediawiki = "mw", | |||
wikibooks = "b", | |||
wikidata = "d", | |||
wikinews = "n", | |||
wikipedia = "w", | |||
wikiquote = "q", | |||
wikisource = "s", | |||
wikiversity = "v", | |||
wikivoyage = "voy", | |||
wiktionary = "wikt" }; | |||
local server = mw.site.server:gsub( "([/.])m%.", | |||
"%1" ) | |||
:gsub( "%.beta%.wmflabs%.org$", | |||
".org" ); | |||
local site = server:match( "[/.](%l+)%.org$" ); | |||
r.project = codes[ site ]; | |||
if r.project then | |||
if not r.lang and | |||
r.project ~= "mw" and r.project ~= "d" then | |||
r.lang = server:match( "//(%l+)%." ); | |||
end | |||
else | |||
site = server:match( "//(%l+)%.wikimedia%.org$" ); | |||
if site == "commons" or site == "meta" then | |||
r.project = site; | |||
end | |||
end | |||
end | |||
if r.project and r.ns and | |||
( r.project == "commons" or | |||
r.project == "d" or | |||
r.project == "meta" or | |||
r.project == "mw" ) then | |||
r.language = true; | |||
end | |||
return r; | |||
end -- farming() | |||
local prefix = function ( ask ) | |||
-- Interprete prefix of language or project type | -- Interprete prefix of language or project type | ||
-- Precondition: | -- Precondition: | ||
-- ask -- string, with presumable prefix | -- ask -- string, with presumable prefix | ||
-- Postcondition: | -- Postcondition: | ||
-- Returns string,string or nil | -- Returns string,string or nil | ||
Zeile 238: | Zeile 326: | ||
}; | }; | ||
local s = mw.text.trim( ask ); | local s = mw.text.trim( ask ); | ||
if s | if s ~= "" then | ||
local p; | local p; | ||
s = s:lower(); | s = s:lower(); | ||
Zeile 267: | Zeile 350: | ||
function | local target = function ( attempt, lonely ) | ||
-- Retrieve first target (wikilink or URL), or entire string | -- Retrieve first target (wikilink or URL), or entire string | ||
-- Precondition: | -- Precondition: | ||
Zeile 294: | Zeile 377: | ||
function WLink.ansiPercent( attempt ) | function WLink.ansiPercent( attempt, alter ) | ||
-- Convert string by ANSI encoding rather than UTF-8 encoding | -- Convert string by ANSI encoding rather than UTF-8 encoding | ||
-- Precondition: | -- Precondition: | ||
-- attempt -- string, with presumable ANSI characters | -- attempt -- string, with presumable ANSI characters | ||
-- alter -- string or nil, to use for spaces instead of %20 | |||
-- Postcondition: | -- Postcondition: | ||
-- Returns string, encoded | -- Returns string, encoded | ||
local k, s; | local k, s; | ||
local r = attempt; | local r = attempt; | ||
for i = mw.ustring.len( | if alter then | ||
k = mw.ustring.codepoint( | r = r:gsub( " ", alter ); | ||
end | |||
for i = mw.ustring.len( r ), 1, -1 do | |||
k = mw.ustring.codepoint( r, i, i ); | |||
if k <= 32 or k > 126 then | if k <= 32 or k > 126 then | ||
if k > 255 then | if k > 255 then | ||
s = mw.ustring.sub( | s = mw.ustring.sub( r, i, i ); | ||
if k > 2047 then | if k > 2047 then | ||
s = string.format( "%%%2X%%%2X%%%2X", | s = string.format( "%%%2X%%%2X%%%2X", | ||
Zeile 318: | Zeile 405: | ||
end | end | ||
else | else | ||
s = string.format( "%%% | s = string.format( "%%%02X", k ); | ||
end | end | ||
r = string.format( "%s%s%s", | r = string.format( "%s%s%s", | ||
mw.ustring.sub( | mw.ustring.sub( r, 1, i - 1 ), | ||
s, | s, | ||
mw.ustring.sub( r, i + 1 ) ); | mw.ustring.sub( r, i + 1 ) ); | ||
Zeile 335: | Zeile 422: | ||
-- Precondition: | -- Precondition: | ||
-- adjust -- string, with URL or domain/path or bracketed link | -- adjust -- string, with URL or domain/path or bracketed link | ||
-- assure -- boolean, true for secure HTTP | |||
-- Postcondition: | -- Postcondition: | ||
-- Returns string, with bracketed link | -- Returns string, with bracketed link | ||
Zeile 348: | Zeile 436: | ||
host = URLutil.getHost( adjust ); | host = URLutil.getHost( adjust ); | ||
if not host then | if not host then | ||
url | url = "://" .. adjust; | ||
if assure then | |||
url = "s" .. url; | |||
end | |||
url = "http" .. url; | |||
host = URLutil.getHost( url ); | host = URLutil.getHost( url ); | ||
end | end | ||
Zeile 428: | Zeile 520: | ||
return r; | return r; | ||
end -- WLink.getBaseTitle() | end -- WLink.getBaseTitle() | ||
function WLink.getEscapedTitle( attempt ) | |||
-- Retrieve escaped link title | |||
-- Precondition: | |||
-- attempt -- string, with presumable link title | |||
-- Postcondition: | |||
-- Returns string, with suitable link title | |||
local s = mw.text.trim( attempt ); | |||
return s:gsub( "\n", " " ) | |||
:gsub( "%[", "[" ) | |||
:gsub( "%]", "]" ) | |||
:gsub( "|", "|" ); | |||
end -- WLink.getEscapedTitle() | |||
Zeile 478: | Zeile 585: | ||
r = find( "file" ); | r = find( "file" ); | ||
if not r then | if not r then | ||
local trsl = mw.site.namespaces[6]; | local trsl = mw.site.namespaces[ 6 ]; | ||
r = find( trsl.name ); | r = find( trsl.name ); | ||
if not r then | if not r then | ||
Zeile 573: | Zeile 680: | ||
return r; | return r; | ||
end -- WLink.getNamespace() | end -- WLink.getNamespace() | ||
function WLink.getNamespaced( area, attempt ) | |||
-- Retrieve page in namespace | |||
-- Precondition: | |||
-- area -- string or number, with some namespace spec | |||
-- attempt -- string, with wikilink or page title or page name | |||
-- Postcondition: | |||
-- Returns page prefixed by namespace, | |||
-- false if invalid | |||
local r = false; | |||
local s = type( area ); | |||
local room; | |||
if s == "string" then | |||
room = mw.site.namespaces[ tonumber( area ) or area ]; | |||
elseif s == "number" then | |||
room = mw.site.namespaces[ area ]; | |||
end | |||
if room then | |||
local m; | |||
s, m = WLink.getTarget( attempt ); | |||
if not s then | |||
s = attempt; | |||
elseif m ~= 2 then | |||
s = false; | |||
end | |||
if s then | |||
local w = WLink.wikilink( s ); | |||
if w and not w.lang and not w.project and | |||
( not w.ns or w.ns == room.id ) then | |||
r = string.format( "%s:%s", | |||
room.name, w.title ); | |||
end | |||
end | |||
end | |||
return r; | |||
end -- WLink.getNamespaced() | |||
Zeile 584: | Zeile 729: | ||
local r = attempt; | local r = attempt; | ||
local i = 1; | local i = 1; | ||
local j, k, n, lean, s, shift, space, suffix; | local j, k, n, lean, s, shift, span, space, suffix; | ||
while ( true ) do | while ( true ) do | ||
j = r:find( "[", i, true ); | j = r:find( "[", i, true ); | ||
Zeile 599: | Zeile 744: | ||
if k > 1 then | if k > 1 then | ||
n = n - k; | n = n - k; | ||
i = j + k; | i = j + k + 1; | ||
j = i - 1; | j = i - 1; | ||
suffix = r:sub( j ); | suffix = r:sub( j ); | ||
Zeile 605: | Zeile 750: | ||
if lean then | if lean then | ||
s, shift = extractWikilink( suffix ); | s, shift = extractWikilink( suffix ); | ||
space = s:match( "^([^:]+):" ) | if s then | ||
space = s:match( "^([^:]+):" ); | |||
if space then | if space then | ||
space = space.id; | space = mw.site.namespaces[ space ]; | ||
if space then | |||
space = space.id; | |||
end | |||
end | end | ||
if space == 6 or space == 14 then | |||
shift = ""; | |||
elseif not shift then | |||
shift = s; | |||
end | |||
else | |||
s = ""; | |||
shift = ""; | shift = ""; | ||
end | end | ||
else | else | ||
span, shift = extractExtlink( suffix ); | |||
if not shift then | if span then | ||
shift = ""; | if not shift then | ||
shift = ""; | |||
end | |||
else | |||
shift = string.format( "[%s]", s ); | |||
end | end | ||
i = i - 1; | i = i - 1; | ||
Zeile 638: | Zeile 792: | ||
break; -- while true | break; -- while true | ||
end | end | ||
end -- while true | end -- while true | ||
return r; | return r; | ||
end -- WLink.getPlain() | end -- WLink.getPlain() | ||
Zeile 661: | Zeile 815: | ||
return r; | return r; | ||
end -- WLink.getProject() | end -- WLink.getProject() | ||
function WLink.getTalkPage( attempt ) | |||
-- Retrieve talk page name for attempt, or that page name itself | |||
-- Precondition: | |||
-- attempt -- string, with presumable link somewhere | |||
-- Postcondition: | |||
-- Returns string or false | |||
local r = false; | |||
local s, m = WLink.getTarget( attempt ); | |||
if m ~= 2 and attempt then | |||
s = mw.text.trim( attempt ); | |||
end | |||
if s and s ~= "" then | |||
local w = mw.title.new( s ); | |||
if w then | |||
w = w.talkPageTitle; | |||
if w then | |||
r = w.prefixedText; | |||
end | |||
end | |||
end | |||
return r; | |||
end -- WLink.getTalkPage() | |||
Zeile 754: | Zeile 933: | ||
return r; | return r; | ||
end -- WLink.getTitle() | end -- WLink.getTitle() | ||
function WLink.getWeblink( attempt, anURLutil ) | |||
-- Retrieve bracketed link from resource URL | |||
-- Precondition: | |||
-- attempt -- string, with URL, or something different | |||
-- anURLutil -- library module object, or nil | |||
-- Postcondition: | |||
-- Returns string, with first detected link target | |||
-- false if nothing found | |||
local second = ".ac.co.go.gv.or."; | |||
local r; | |||
if type( anURLutil ) == "table" then | |||
URLutil = anURLutil; | |||
else | |||
utilURL(); | |||
end | |||
if URLutil.isResourceURL( attempt ) then | |||
local site = URLutil.getAuthority( attempt ); | |||
local service = attempt; | |||
local show; | |||
if #attempt == #site then | |||
site = site .. "/"; | |||
end | |||
show = URLutil.getTop3domain( "//" .. site ); | |||
if show then | |||
local scan = "[%./](%a[%a%%%-]*%a)(%.%l%l%.)(%a+)$"; | |||
local search = "." .. show; | |||
local s1, s2, s3 = search:match( scan ); | |||
if s2 then | |||
if not second:find( s2, 1, true ) then | |||
show = string.format( "%s%s", s2:sub( 2 ), s3 ); | |||
end | |||
else | |||
show = false; | |||
end | |||
end | |||
if not show then | |||
show = URLutil.getTop2domain( "//" .. site ); | |||
if not show then | |||
show = URLutil.getHost( "//" .. site ); | |||
end | |||
end | |||
if not service:match( "^[a-z:]*//.+/" ) then | |||
service = service .. "/"; | |||
end | |||
r = string.format( "[%s %s]", service, show ); | |||
else | |||
r = attempt; | |||
end | |||
return r; | |||
end -- WLink.getWeblink() | |||
function WLink.getWikilink( attempt, appear ) | |||
-- Retrieve bracketed link from text | |||
-- Precondition: | |||
-- attempt -- string, with current target, or plain | |||
-- appear -- string, with link title, or nil | |||
-- Postcondition: | |||
-- Returns string, with first detected link target | |||
-- false if nothing found | |||
local r = WLink.pageTarget( attempt ); | |||
if r then | |||
if appear then | |||
local show = WLink.getEscapedTitle( appear ); | |||
if show ~= r and show ~= "" then | |||
r = string.format( "%s|%s", r, show ); | |||
end | |||
end | |||
r = string.format( "[[%s]]", r ); | |||
end | |||
return r; | |||
end -- WLink.getWikilink() | |||
Zeile 887: | Zeile 1.142: | ||
return r; | return r; | ||
end -- WLink.isMedia() | end -- WLink.isMedia() | ||
function WLink.isTalkPage( attempt ) | |||
-- Does attempt describe a talk page? | |||
-- Precondition: | |||
-- attempt -- string, with presumable link somewhere | |||
-- Postcondition: | |||
-- Returns boolean | |||
local r = false; | |||
local s, m = WLink.getTarget( attempt ); | |||
if m ~= 2 and attempt then | |||
s = mw.text.trim( attempt ); | |||
end | |||
if s and s ~= "" then | |||
local w = mw.title.new( s ); | |||
if w then | |||
r = w.isTalkPage; | |||
end | |||
end | |||
return r; | |||
end -- WLink.isTalkPage() | |||
Zeile 926: | Zeile 1.203: | ||
-- Postcondition: | -- Postcondition: | ||
-- Returns boolean | -- Returns boolean | ||
local | local u, r = WLink.getTarget( attempt ); | ||
if r then | if r then | ||
r = true; | if r < 2 then | ||
if u:find( "''", 1, true ) then | |||
r = false; | |||
else | |||
r = true; | |||
end | |||
else | |||
r = true; | |||
end | |||
end | end | ||
return r; | return r; | ||
end -- WLink.isValidLink() | end -- WLink.isValidLink() | ||
function WLink.isValidLinktext( attempt, allow ) | |||
-- Is attempt a plain inline text? | |||
-- Precondition: | |||
-- attempt -- string, with presumable linktext | |||
-- allow -- boolean or nil, if multiline permitted | |||
-- Postcondition: | |||
-- Returns boolean | |||
local r = true; | |||
local i = attempt:find( "]", 1, true ); | |||
if i then | |||
r = false; | |||
else | |||
r = ( mw.text.unstrip( attempt ) == attempt ); | |||
end | |||
if r and not allow and attempt:find( "\n", 1, true ) then | |||
r = false; | |||
end | |||
if r then | |||
i = attempt:find( "<", 1, true ); | |||
if i then | |||
local s = mw.ustring.lower( attempt:sub( i ) ); | |||
local sign, skip; | |||
while i and r do | |||
skip, sign = s:match( "^([^<]*< *)(%l[%l%d]*)[ /]*.*>" ); | |||
if sign then | |||
r = htmlInline[ sign ]; | |||
if r then | |||
i = skip:len() + sign:len() + 1; | |||
s = s:sub( i ); | |||
end | |||
else | |||
i = false; | |||
end | |||
end -- while i and r | |||
end | |||
end | |||
if r then | |||
local s = attempt .. " "; | |||
i = s:find( "ISBN ", 1, true ); | |||
if i then | |||
r = not s:match( "ISBN %d[%-%d]+[%dxX]%W" ); | |||
end | |||
if r then | |||
i = s:find( "PMID ", 1, true ); | |||
if i then | |||
r = not s:match( "PMID %d+%W" ); | |||
end | |||
if r then | |||
i = s:find( "RFC ", 1, true ); | |||
if i then | |||
r = not s:match( "RFC [1-6]%d?%d?%d?%W" ); | |||
end | |||
end | |||
end | |||
end | |||
return r or false; | |||
end -- WLink.isValidLinktext() | |||
Zeile 944: | Zeile 1.289: | ||
return ( m == 2 ); | return ( m == 2 ); | ||
end -- WLink.isWikilink() | end -- WLink.isWikilink() | ||
function WLink.pageLink( attempt, appear, assure ) | |||
-- Create safely standardized wikilink target of a page | |||
-- attempt -- string, with presumable link | |||
-- appear -- string or true or nil, with link title | |||
-- assure -- string or nil, shield against wiki template syntax | |||
-- "URL" or "WIKI" | |||
-- Postcondition: | |||
-- Returns string with link target | |||
local r = WLink.pageTarget( attempt, assure ); | |||
if appear then | |||
local show; | |||
if type( appear ) == "string" then | |||
show = appear; | |||
else | |||
show = attempt; | |||
end | |||
r = string.format( "%s|%s", r, show ); | |||
end | |||
return r; | |||
end -- WLink.pageLink() | |||
function WLink.pageTarget( attempt, assure ) | |||
-- Create standardized wikilink target of a page | |||
-- Precondition: | |||
-- attempt -- string, with presumable link | |||
-- expected to be enclosed in "[[" "]]" | |||
-- else wikilink | |||
-- table, of assignments with { type, value } | |||
-- type is one of "lead", | |||
-- "project", "lang", | |||
-- "ns", "space", "title" | |||
-- assure -- string or nil, shield against wiki template syntax | |||
-- "URL" or "WIKI" | |||
-- Postcondition: | |||
-- Returns string with link target | |||
local p = type( attempt ); | |||
local s = assure; | |||
local r; | |||
if p == "string" then | |||
p = WLink.wikilink( attempt ); | |||
elseif p == "table" then | |||
p = attempt; | |||
else | |||
p = false; | |||
end | |||
if p then | |||
local site = p.project; | |||
local slang = p.lang; | |||
local lead; | |||
if p.title:sub( 1, 1 ) == "#" then | |||
p.title = mw.title.getCurrentTitle().text + p.title; | |||
end | |||
if p.ns then | |||
if not slang then | |||
p = farming( p ); | |||
end | |||
if p.lang and | |||
p.lang ~= mw.language.getContentLanguage():getCode() then | |||
p.language = true; | |||
end | |||
if p.language then | |||
p.space = mw.site.namespaces[ p.ns ].canonicalName; | |||
end | |||
lead = ( p.ns == 6 or p.ns == 14 ); | |||
end | |||
if slang then | |||
lead = true; | |||
end | |||
if s == "WIKI" then | |||
if not site and | |||
( lead or | |||
( not p.space and | |||
p.title and p.title:match( "^[*;]" ) ) ) then | |||
p = farming( p ); | |||
site = p.project; | |||
slang = p.lang; | |||
end | |||
s = false; | |||
end | |||
if site then | |||
r = site .. ":"; | |||
elseif lead then | |||
r = ":"; | |||
else | |||
r = ""; | |||
end | |||
if slang then | |||
r = string.format( "%s%s:", r, slang ); | |||
end | |||
if p.space then | |||
r = string.format( "%s%s:", r, p.space ); | |||
end | |||
if p.title then | |||
r = r .. p.title; | |||
end | |||
if r == "" then | |||
r = false; | |||
end | |||
end | |||
if not r then | |||
p = { lang = mw.language.getContentLanguage():getCode() }; | |||
if s == "WIKI" then | |||
r = WLink.pageTarget( p, s ); | |||
s = false; | |||
else | |||
r = string.format( ":%s:", p.lang ); | |||
end | |||
end | |||
if s == "URL" and r:match( "^[*#;:]" ) then | |||
r = mw.uri.encode( r:sub( 1, 1 ) ) .. r:sub( 2 ); | |||
end | |||
return r; | |||
end -- WLink.pageTarget() | |||
Zeile 955: | Zeile 1.418: | ||
-- Postcondition: | -- Postcondition: | ||
-- Returns table or false | -- Returns table or false | ||
-- table of assignments with { type, value} | -- table of assignments with { type, value } | ||
-- type is one of "lead", | -- type is one of "lead", | ||
-- "project", "lang", "ns", "space", "title" | -- "project", "lang", | ||
-- "ns", "space", "title" | |||
-- false if nothing found | -- false if nothing found | ||
local s = contentWikilink( attempt ); | local s = contentWikilink( attempt or "" ); | ||
local got, n, r; | local got, n, r; | ||
if not s then | if not s then | ||
s = attempt; | s = attempt; | ||
end | |||
if s:find( "%", 1, true ) then | |||
s = mw.uri.decode( s, "PATH" ); | |||
end | end | ||
i = s:find( "|", 1, true ); | i = s:find( "|", 1, true ); | ||
Zeile 975: | Zeile 1.442: | ||
local j, k, o, v; | local j, k, o, v; | ||
r = { title = "" }; | r = { title = "" }; | ||
while ( got[ 1 ] == "" ) do | |||
r.lead = true; | |||
table.remove( got, 1 ); | |||
n = n - 1; | |||
end -- while got[ 1 ] == "" | |||
if n > 4 then | if n > 4 then | ||
k = 4; | k = 4; | ||
elseif n > 1 then | |||
k = n - 1; | |||
else | else | ||
k = | k = 1; | ||
end | end | ||
j = k; | j = k; | ||
Zeile 984: | Zeile 1.458: | ||
s = mw.text.trim( got[ i ] ); | s = mw.text.trim( got[ i ] ); | ||
if s ~= "" then | if s ~= "" then | ||
o = mw.site.namespaces[ | o = mw.site.namespaces[ s ]; | ||
if o then | if o then | ||
r.ns = o.id; | r.ns = o.id; | ||
Zeile 995: | Zeile 1.469: | ||
end -- for i | end -- for i | ||
for i = 1, j do | for i = 1, j do | ||
o, v = prefix( got[ i ] | o, v = prefix( got[ i ] ); | ||
if o then | if o then | ||
if r[ o ] then | if r[ o ] then | ||
Zeile 1.001: | Zeile 1.475: | ||
break; -- for i | break; -- for i | ||
else | else | ||
if i >= k then | |||
k = i + 1; | |||
end | |||
r[ o ] = v; | r[ o ] = v; | ||
end | end | ||
else | else | ||
if i == 1 and r.ns then | |||
r.ns = false; | |||
r.space = false; | |||
end | |||
k = i; | k = i; | ||
break; -- for i | break; -- for i | ||
end | end | ||
end -- for i | end -- for i | ||
for i = k, n do | if k > 0 then | ||
for i = k, n do | |||
r.title = r.title .. got[ i ]; | |||
if i < n then | |||
r.title = r.title .. ":"; | |||
end | |||
end -- for i | |||
end | |||
end | end | ||
r.title = cleanWikilink( r.title ); | |||
if r.lead and | if r.lead and | ||
( r.project | ( r.project or | ||
( not r.lang and r.ns ~= 6 and r.ns ~= 14 ) ) then | ( not r.lang and r.ns ~= 6 and r.ns ~= 14 ) ) then | ||
r.lead = false; | r.lead = false; | ||
Zeile 1.022: | Zeile 1.506: | ||
return r; | return r; | ||
end -- WLink.wikilink() | end -- WLink.wikilink() | ||
function WLink.failsafe( assert ) | |||
-- Retrieve versioning and check for compliance | |||
-- Precondition: | |||
-- assert -- string, with required version or "wikidata", | |||
-- or false | |||
-- Postcondition: | |||
-- Returns string with appropriate version, or false | |||
local since = assert; | |||
local r; | |||
if since == "wikidata" then | |||
local item = WLink.item; | |||
since = false; | |||
if type( item ) == "number" and item > 0 then | |||
local ent = mw.wikibase.getEntity( string.format( "Q%d", | |||
item ) ); | |||
if type( ent ) == "table" then | |||
local vsn = ent:formatPropertyValues( "P348" ); | |||
if type( vsn ) == "table" and | |||
type( vsn.value ) == "string" and | |||
vsn.value ~= "" then | |||
r = vsn.value; | |||
end | |||
end | |||
end | |||
end | |||
if not r then | |||
if not since or since <= WLink.serial then | |||
r = WLink.serial; | |||
else | |||
r = false; | |||
end | |||
end | |||
return r; | |||
end -- WLink.failsafe() | |||
Zeile 1.034: | Zeile 1.555: | ||
-- Postcondition: | -- Postcondition: | ||
-- Return string; might be error message | -- Return string; might be error message | ||
local lucky = true; | local lucky = true; | ||
local s = false; | local s = false; | ||
local r = false; | local r = false; | ||
local safe, space; | |||
for k, v in pairs( frame.args ) do | for k, v in pairs( frame.args ) do | ||
if k == 1 then | if k == 1 then | ||
Zeile 1.045: | Zeile 1.566: | ||
s = mw.text.trim( v ); | s = mw.text.trim( v ); | ||
end | end | ||
elseif ( k == 2 and | |||
( action == "getNamespaced" or | |||
action == "getWikilink" or | |||
action == "pageLink" ) ) or | |||
( k == "space" and action == "ansiPercent" ) then | |||
v = mw.text.trim( v ); | |||
if v ~= "" then | |||
space = v; | |||
end | |||
elseif k == "safe" and action == "pageLink" then | |||
v = mw.text.trim( v ); | |||
if v ~= "" then | |||
safe = v; | |||
end | |||
elseif k == "lines" and action == "isValidLinktext" then | |||
space = ( k == "1" ); | |||
elseif k ~= "template" then | elseif k ~= "template" then | ||
lucky = false; | lucky = false; | ||
Zeile 1.057: | Zeile 1.594: | ||
if lucky then | if lucky then | ||
if s or lone then | if s or lone then | ||
lucky, r = pcall( WLink[ action ], s ); | lucky, r = pcall( WLink[ action ], s, space, safe ); | ||
else | else | ||
r = "Parameter missing"; | r = "Parameter missing"; | ||
Zeile 1.072: | Zeile 1.609: | ||
end | end | ||
else | else | ||
local e = mw.html.create( "span" ); | |||
r = tostring( e:addClass( "error" ) | |||
:wikitext( r ) ); | |||
end | end | ||
return r; | return r; | ||
Zeile 1.093: | Zeile 1.632: | ||
p.getBaseTitle = function ( frame ) | p.getBaseTitle = function ( frame ) | ||
return Template( frame, "getBaseTitle" ); | return Template( frame, "getBaseTitle" ); | ||
end | |||
p.getEscapedTitle = function ( frame ) | |||
return Template( frame, "getEscapedTitle" ); | |||
end | end | ||
p.getExtension = function ( frame ) | p.getExtension = function ( frame ) | ||
Zeile 1.102: | Zeile 1.644: | ||
p.getFragment = function ( frame ) | p.getFragment = function ( frame ) | ||
return Template( frame, "getFragment" ); | return Template( frame, "getFragment" ); | ||
end | |||
p.getInterwiki = function ( frame ) | |||
return Template( frame, "getInterwiki" ); | |||
end | end | ||
p.getLanguage = function ( frame ) | p.getLanguage = function ( frame ) | ||
Zeile 1.108: | Zeile 1.653: | ||
p.getNamespace = function ( frame ) | p.getNamespace = function ( frame ) | ||
return tostring( Template( frame, "getNamespace" ) ); | return tostring( Template( frame, "getNamespace" ) ); | ||
end | |||
p.getNamespaced = function ( frame ) | |||
return tostring( Template( frame, "getNamespaced" ) ); | |||
end | end | ||
p.getPlain = function ( frame ) | p.getPlain = function ( frame ) | ||
Zeile 1.114: | Zeile 1.662: | ||
p.getProject = function ( frame ) | p.getProject = function ( frame ) | ||
return Template( frame, "getProject" ); | return Template( frame, "getProject" ); | ||
end | |||
p.getTalkPage = function ( frame ) | |||
return Template( frame, "getTalkPage" ); | |||
end | end | ||
p.getTarget = function ( frame ) | p.getTarget = function ( frame ) | ||
Zeile 1.124: | Zeile 1.675: | ||
return Template( frame, "getTitle" ); | return Template( frame, "getTitle" ); | ||
end | end | ||
p. | p.getWeblink = function ( frame ) | ||
return Template( frame, " | return Template( frame, "getWeblink" ); | ||
end | |||
p.getWikilink = function ( frame ) | |||
return Template( frame, "getWikilink" ); | |||
end | end | ||
p.isBracketedLink = function ( frame ) | p.isBracketedLink = function ( frame ) | ||
Zeile 1.147: | Zeile 1.701: | ||
p.isMedia = function ( frame ) | p.isMedia = function ( frame ) | ||
return Template( frame, "isMedia" ); | return Template( frame, "isMedia" ); | ||
end | |||
p.isTalkPage = function ( frame ) | |||
return Template( frame, "isTalkPage" ); | |||
end | end | ||
p.isTitledLink = function ( frame ) | p.isTitledLink = function ( frame ) | ||
Zeile 1.153: | Zeile 1.710: | ||
p.isValidLink = function ( frame ) | p.isValidLink = function ( frame ) | ||
return Template( frame, "isValidLink" ); | return Template( frame, "isValidLink" ); | ||
end | |||
p.isValidLinktext = function ( frame ) | |||
return Template( frame, "isValidLinktext" ); | |||
end | end | ||
p.isWeblink = function ( frame ) | p.isWeblink = function ( frame ) | ||
Zeile 1.159: | Zeile 1.719: | ||
p.isWikilink = function ( frame ) | p.isWikilink = function ( frame ) | ||
return Template( frame, "isWikilink" ); | return Template( frame, "isWikilink" ); | ||
end | |||
p.pageLink = function ( frame ) | |||
return Template( frame, "pageLink" ); | |||
end | |||
p.failsafe = function ( frame ) | |||
local s = type( frame ); | |||
local since; | |||
if s == "table" then | |||
since = frame.args[ 1 ]; | |||
elseif s == "string" then | |||
since = frame; | |||
end | |||
if since then | |||
since = mw.text.trim( since ); | |||
if since == "" then | |||
since = false; | |||
end | |||
end | |||
return WLink.failsafe( since ) or ""; | |||
end | end | ||
p.WLink = function () | p.WLink = function () |