Module:Delink
Révision datée du 30 août 2018 à 21:51 par Alexandrep (discussion | contributions) (3 révisions importées)
La documentation pour ce module peut être créée à Module:Delink/doc
-- This module de-links most wikitext. local p = {} local function delinkReversePipeTrick(s) if s:find('^%[%[|.*[|\n]') or s == '[[|]]' then -- Check for newlines or multiple pipes. return s else return s:match('%[%[|(.*)%]%]') end end local function delinkPipeTrick(s) -- s the tile area, without bracket nor pipe -- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]]. -- First, remove the text before the first colon, if any. s = s:gsub('^(.-:)', '') -- Next up, brackets and commas. if s:find('%(.-%)$') then -- Brackets trump commas. s = s:match('(.-) ?%(.-%)$') elseif s:find(',') then -- If there are no brackets, display only the text before the first comma. s = s:match('(.-),.*$') end return s end local function delinkWikilink(s) -- s is a string starting with '[[' and ending with ']]'. It does not contain any other ']]' strings. -- Deal with nested links local nested = '[[' .. s:sub(3):gsub('%[%[.-%]%]$', delinkWikilink) if nested ~= s then return nested end -- Deal with the reverse pipe trick. if s:find('^%[%[|') then return delinkReversePipeTrick(s) end -- Check for bad titles. To do this we need to find the -- title area of the link, i.e. the part before any pipes. local titlearea, display = s:match('^%[%[(.-)|(.*)%]%]$') titlearea = titlearea or s:sub(3, -3) titlearea = mw.uri.decode(titlearea, 'PATH') -- decode percent-encoded entities. Leave underscores and plus signs. titlearea = mw.text.decode(titlearea, true) -- decode HTML entities. local temptitlearea, fragment = titlearea:match('^(.-)#(.*)$') temptitlearea = temptitlearea or titlearea fragment = fragment or '' -- Check for bad characters. if not mw.ustring.isutf8(titlearea) or temptitlearea:find('[%[%]<>|{}%z%c\n]') or temptitlearea:find('%%%x%x') or temptitlearea:find('&..-;') or fragment:find('[%[%]{}%c\n]') then return s end -- Check for categories, interwikis, and files. local colonprefix = titlearea:match('^(.-):') or '' -- Get the text before the first colon. local ns = mw.site.namespaces[colonprefix] -- see if this is a known namespace if mw.language.isKnownLanguageTag(colonprefix) or ns and (ns.id == 6 or ns.id == 14) then return '' end -- Remove the colon if the link is using the [[Help:Colon trick]]. if titlearea:sub(1, 1) == ':' then titlearea = titlearea:sub(2) end -- Deal with links using the [[Help:Pipe trick]]. if display == '' then return delinkPipeTrick(titlearea ) end -- Find the display area of the wikilink if not display then -- Find if we're dealing with a piped link. -- Remove new lines from the display of multiline piped links, -- where the pipe is before the first new line. titlearea = titlearea:gsub('\n', '') end return display or titlearea end local function delinkURL(s) -- Assume we have already delinked internal wikilinks, and that -- we have been passed some text between two square brackets [foo]. -- If the text contains a line break it is not formatted as a URL, regardless of other content. if s:find('\n') then return s end -- Check if the text has a valid URL prefix and at least one valid URL character. local valid_url_prefixes = {'//', 'http://', 'https://', 'ftp://', 'gopher://', 'mailto:', 'news:', 'irc://'} local url_prefix for i,v in ipairs(valid_url_prefixes) do if s:find( '^%[' .. v ..'[^"%s].*%]' ) then url_prefix = v break end end -- Get display text if not url_prefix then -- Deal with nested links or send back original string. return "[" .. mw.ustring.gsub( mw.ustring.sub(s, 2), "%[.-%]", delinkURL ) end s = s:match('^%[' .. url_prefix .. '(.*)%]') -- Grab all of the text after the URL prefix and before the final square bracket. s = s:match('^.-(["<> [].*)') or '' -- Grab all of the text after the first URL separator character ("<> ). s = s:match('^%s*(%S.*)$') or '' -- If the separating character was a space, trim it off. local s_decoded = mw.text.decode(s, true) if s_decoded:find('%c') then return s else return s_decoded end end function p._delink(args) local text = args[1] or '' if args.refs == 'yes' then -- Remove any [[Help:Strip markers]] representing ref tags. In most situations -- this is not a good idea - only use it if you know what you are doing! text = mw.text.unstrip(text) end if not (args.comments == 'no') then text = text:gsub('<!%-%-.-%-%->', '') -- Remove html comments. end if not (args.wikilinks == 'no') then text = text:gsub('%[%[.-%]%]', delinkWikilink) -- De-link wikilinks. end if not (args.urls == 'no') then text = text:gsub('%[.-%]', delinkURL) -- De-link URLs. end if not (args.whitespace == 'no') then -- Replace single new lines with a single space, but leave double new lines -- and new lines only containing spaces or tabs before a second new line. text = text:gsub('([^\n \t])[ \t]*\n\t*([^\n \t])', '%1 %2') text = text:gsub('\n\t+', '\n') -- Remove leading tab. text = text:gsub('[ \t]+', ' ') -- Remove extra tabs and spaces. end if not (args.nowiki == 'no') then text = mw.text.unstripNoWiki(text) end return text end function p.delink(frame) local args if frame == mw.getCurrentFrame() then -- We're being called via #invoke. If the invoking template passed any args, use -- them. Otherwise, use the args that were passed into the template. args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame end return p._delink(args) end return p