Module:ApplyLinkAnnotations

local p = {};

local regex = "(:*%**)%*%s*%[%[([^%]|:][^%]:]*[^%]|:])%]%]%s*" local repl = "%1* "

function p.replaceLinksInUnorderedList(markup) -- provided for convenience to make console testing easier for development -- -- matches any wikilinks that are --   1. at the beginning of a list item --   2. with no existing annotation (or any text) following them -- -- must run twice because match utilizes the newlines on *both* sides -- of wikilinks and thus, "consumes" those chars during the first match -- such that every-other line is ineligible for matching until the second -- run. (which does the same thing but for all the other lines)

-- Test case(s?): -- =p.replaceLinksInUnorderedList("\n*teST \n:* name\n::*link - with existing annotation\n::* a friend \n*t\n")

local anls, cnt1, cnt2

-- pattern and replacement updated locally to require newlines -- on both sides local regex_line = '\n' .. regex .. '\n' local repl_line = '\n' .. repl .. '\n'

anls, cnt1 = mw.ustring.gsub(markup, regex_line, repl_line) anls, cnt2 = mw.ustring.gsub(anls,  regex_line, repl_line)

mw.log("Replaced " .. cnt1+cnt2 .. " links without existing annotations")

return anls end

function p.bySubstitutionInUnorderedList(frame) return p.replaceLinksInUnorderedList(frame.args[1]) end

function p._testline(line) -- testing function used to evaluate a single line against the pattern(regex) -- signature designed to accommodate Module:UnitTests:equals -- so frame args are NOT extracted, a raw string is expected local res, cnt = mw.ustring.gsub(line, '^'..regex..'$', repl) return res end

return p