Module:Autolink

-- -- implements and --

local p = {} local text = mw.text

function p.link( frame ) if frame == mw.getCurrentFrame then args = frame:getParent.args else args = frame end

-- 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 linkarr, links, listmarkup, el, ell, elr, link, raw, txt, formatl, formatr

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

-- check for nolink token at the front of the input, which prevents per-link/item processing if links:find( zwnj ) ~= 1 then linkarr = text.split( links, '\n' )

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

listmarkup = #linkarr == 1 and ''

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

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

if el:find( zwnj ) or el:find( '%[%[.-|.-%]%]' ) then linkarr[i] = table.concat( { listmarkup, el }, '' ) else raw = el:find( '%[%[' ) ell = el:match( '^"%[%[' ) and '"' or '' elr = el:match( '%]%]"$' ) and '"' or '' el = el:match( '%[%[(.-)%]%]' ) or el                   link = el                    txt = args[2] or el                    formatl = '' formatr = ''

if raw ~= 1 then link = link:gsub( '""',  ):gsub( "'?", '' )

-- check for formatting that can be moved out of the link entirely if txt:find( '^""' ) and txt:find( '""$' ) then formatl = '"'                           formatr = '"' txt = txt:gsub( '""', '' ) else txt = txt:gsub( '""', '"' )                       end                        if txt:find( "^" ) and txt:find( "$" ) then                            formatl = formatl .. ""                            formatr = "" .. formatr                            txt = txt:gsub( "$",  ):gsub( "^",  )                        end                        if txt:find( "^" ) and txt:find( "$" ) then                            formatl = formatl .. ""                            formatr = "" .. formatr                            txt = txt:gsub( "$",  ):gsub( "^",  )                        end                    else                        txt = txt:gsub( "'", '&apos;' )                    end                    if txt:find( '[^&]#' ) then                        txt = txt:gsub( '([^&])#', '%1 § ')                    end

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

links = table.concat( linkarr, '\n' ) end

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

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

return p