Module:Autolink

-- -- implements and --

local p = {} local ustring = mw.ustring local text = mw.text

function p.link( frame ) local args = frame:getParent.args -- for testing from console -- local args = frame -- marker used for support (doesn't have to be a zero-width non-joiner, that's just what was used in the template version) local zwnj = '&zwnj;' local links, listmarkup, el, link, txt, formatl, formatr

-- set default to stop errors args[1] = args[1] and text.trim( args[1] ) or ''

if ustring.find( args[1], zwnj ) == 1 then links = ustring.gsub( args[1], '%[%[[Cc]ategory:', '[[:Category:' )       links = ustring.gsub( links, '%[%[[Ff]ile:', '[[:File:' )        links = ustring.gsub( links, '%[%[[Ii]mage:', '[[:File:' )        links = ustring.gsub( links, zwnj, '' )        return links    else        links = text.split( args[1], '\n' )

args[2] = #links == 1 and args[2]

listmarkup = #links == 1 and ''

for i=1, #links do           el = text.trim( links[i] )

-- catch empty string at the start of lists if not ustring.match( el, '^[*#;:]?$' ) then if listmarkup ~= '' then listmarkup = ustring.match( el, '^([*#;:])' ) or '*' el = ustring.gsub( el, '^[*#;:]%s*', '' ) end

if ustring.find( el, zwnj ) or ustring.find( el, '%[%[' ) then links[i] = table.concat( { listmarkup, el }, '' ) else link = el                   txt = args[2] or el                    formatl = '' formatr = ''

link = ustring.gsub( link, '""', '' ) link = ustring.gsub( link, "'?",  )

-- check for formatting that can be moved out of the link entirely if ustring.find( txt, '^""' ) and ustring.find( txt, '""$' ) then formatl = '"'                       formatr = '"' txt = ustring.gsub( txt, '""', '' ) else txt = ustring.gsub( txt, '""', '"' )                   end                    if ustring.find( txt, "^" ) and ustring.find( txt, "$" ) then                        formatl = formatl .. ""                        formatr = "" .. formatr                        txt = ustring.gsub( txt, "^",  )                        txt = ustring.gsub( txt, "$",  )                    end                    if ustring.find( txt, "^" ) and ustring.find( txt, "$" ) then                        formatl = formatl .. ""                        formatr = "" .. formatr                        txt = ustring.gsub( txt, "^",  )                        txt = ustring.gsub( txt, "$",  )                    end

if link == txt then links[i] = table.concat( { listmarkup, formatl, , link, , formatr }, '' ) else links[i] = table.concat( { listmarkup, formatl, , txt, , formatr }, '' ) end end end end

links = table.concat( links, '\n' ) links = ustring.gsub( links, zwnj, '' ) links = ustring.gsub( links, '%[%[[Cc]ategory:', '[[:Category:' )       links = ustring.gsub( links, '%[%[[Ff]ile:', '[[:File:' )        links = ustring.gsub( links, '%[%[[Ii]mage:', '[[:File:' )        links = text.trim( links )        return links    end end

function p.unlink( frame ) local args = frame:getParent.args return args[1] and ( ustring.match( args[1], '%[%[:?(.-)[|%]]' ) or text.trim( args[1] ) ) end

return p