Module:Delink : Différence entre versions

De louiki
Sauter à la navigation Sauter à la recherche
(Page créée avec « -- This module de-links most wikitext. local p = {} local function delinkReversePipeTrick(s) if s:find('^%[%[|.*[|\n]') or s == '[[|]]' then -- Check for newlines or... »)
 
(Aucune différence)

Version actuelle datée du 17 décembre 2018 à 00:43

-- 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