Jump to content

Module:ApplyLinkAnnotations

From Wikipedia, the free encyclopedia

local p = {};

local regex = "(:*%**)%*%s*%[%[([^%]|:][^%]:]*[^%]|:])%]%]%s*"
local repl  = "%1* {{Annotated link |%2}}"


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|teST]] \n:* [[name]]\n::*[[link]] - with existing annotation\n::* [[for|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