Module:Delink: Difference between revisions
From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(expose _delink) |
(since mw.ustring is 30x slower than string, only use it when necessary) |
||
Line 4: | Line 4: | ||
local function delinkReversePipeTrick(s) |
local function delinkReversePipeTrick(s) |
||
if |
if s:match("^%[%[|.*[|\n]") then -- Check for newlines or multiple pipes. |
||
return s |
return s |
||
else |
else |
||
return |
return s:match("%[%[|(.*)%]%]") |
||
end |
end |
||
end |
end |
||
Line 16: | Line 16: | ||
-- First, remove the text before the first colon, if any. |
-- First, remove the text before the first colon, if any. |
||
if |
if s:match(":") then |
||
s = |
s = s:match("%[%[.-:(.*)|%]%]") |
||
-- If there are no colons, grab all of the text apart from the square brackets and the pipe. |
-- If there are no colons, grab all of the text apart from the square brackets and the pipe. |
||
else |
else |
||
s = |
s = s:match("%[%[(.*)|%]%]") |
||
end |
end |
||
-- Next up, brackets and commas. |
-- Next up, brackets and commas. |
||
if |
if s:match("%(.-%)$") then -- Brackets trump commas. |
||
s = |
s = s:match("(.-) ?%(.-%)$") |
||
elseif |
elseif s:match(",") then -- If there are no brackets, display only the text before the first comma. |
||
s = |
s = s:match("(.-),.*$") |
||
end |
end |
||
return s |
return s |
||
Line 35: | Line 35: | ||
local result = s |
local result = s |
||
-- Deal with the reverse pipe trick. |
-- Deal with the reverse pipe trick. |
||
if |
if result:match("%[%[|") then |
||
return delinkReversePipeTrick(result) |
return delinkReversePipeTrick(result) |
||
end |
end |
||
Line 45: | Line 45: | ||
-- title area of the link, i.e. the part before any pipes. |
-- title area of the link, i.e. the part before any pipes. |
||
local titlearea |
local titlearea |
||
if |
if result:match("|") then -- Find if we're dealing with a piped link. |
||
titlearea = |
titlearea = result:match("^%[%[(.-)|.*%]%]") |
||
else |
else |
||
titlearea = |
titlearea = result:match("^%[%[(.-)%]%]") |
||
end |
end |
||
-- Check for bad characters. |
-- Check for bad characters. |
||
Line 56: | Line 56: | ||
-- Check for categories, interwikis, and files. |
-- Check for categories, interwikis, and files. |
||
local colonprefix = |
local colonprefix = result:match("%[%[(.-):.*%]%]") or "" -- Get the text before the first colon. |
||
local ns = mw.site.namespaces[colonprefix] -- see if this is a known namespace |
local ns = mw.site.namespaces[colonprefix] -- see if this is a known namespace |
||
if mw.language.isKnownLanguageTag(colonprefix) |
if mw.language.isKnownLanguageTag(colonprefix) |
||
Line 64: | Line 64: | ||
-- Remove the colon if the link is using the [[Help:Colon trick]]. |
-- Remove the colon if the link is using the [[Help:Colon trick]]. |
||
if |
if result:match("%[%[:") then |
||
result = "[[" .. |
result = "[[" .. result:match("%[%[:(.*%]%])") |
||
end |
end |
||
Line 74: | Line 74: | ||
-- Find the display area of the wikilink |
-- Find the display area of the wikilink |
||
if |
if result:match("|") then -- Find if we're dealing with a piped link. |
||
result = |
result = result:match("^%[%[.-|(.+)%]%]") |
||
-- Remove new lines from the display of multiline piped links, |
-- Remove new lines from the display of multiline piped links, |
||
-- where the pipe is before the first new line. |
-- where the pipe is before the first new line. |
||
result = |
result = result:gsub("\n", "") |
||
else |
else |
||
result = |
result = result:match("^%[%[(.-)%]%]") |
||
end |
end |
||
Line 91: | Line 91: | ||
-- If the text contains a line break it is not formatted as a URL, regardless of other content. |
-- If the text contains a line break it is not formatted as a URL, regardless of other content. |
||
if |
if s:match("\n") then |
||
return s |
return s |
||
end |
end |
||
Line 109: | Line 109: | ||
return s |
return s |
||
end |
end |
||
s = |
s = s:match("^%[" .. url_prefix .. "(.*)%]") -- Grab all of the text after the URL prefix and before the final square bracket. |
||
s = |
s = s:match('^.-(["<> ].*)') or "" -- Grab all of the text after the first URL separator character ("<> ). |
||
s = mw.ustring.match(s, "^%s*(%S.*)$") or "" -- If the separating character was a space, trim it off. |
s = mw.ustring.match(s, "^%s*(%S.*)$") or "" -- If the separating character was a space, trim it off. |
||
Line 132: | Line 132: | ||
-- than just use gsub, otherwise nested links aren't detected properly. |
-- than just use gsub, otherwise nested links aren't detected properly. |
||
local result = "" |
local result = "" |
||
while |
while s ~= '' do |
||
-- Replace text using one iteration of gsub. |
-- Replace text using one iteration of gsub. |
||
s = mw.ustring.gsub(s, pattern, delinkFunction, 1) |
s = mw.ustring.gsub(s, pattern, delinkFunction, 1) |
||
Line 150: | Line 150: | ||
end |
end |
||
if not (args.comments == "no") then |
if not (args.comments == "no") then |
||
text = |
text = text:gsub("<!%-%-.-%-%->", "") -- Remove html comments. |
||
end |
end |
||
if not (args.wikilinks == "no") then |
if not (args.wikilinks == "no") then |
||
Line 162: | Line 162: | ||
-- and new lines only containing spaces or tabs before a second new line. |
-- and new lines only containing spaces or tabs before a second new line. |
||
text = mw.ustring.gsub(text, "([^\n \t][ \t]*)\n([ \t]*[^\n \t])", "%1 %2") |
text = mw.ustring.gsub(text, "([^\n \t][ \t]*)\n([ \t]*[^\n \t])", "%1 %2") |
||
text = |
text = text:gsub("[ \t]+", " ") -- Remove extra tabs and spaces. |
||
end |
end |
||
return text |
return text |