-- <nowiki>
-- Multiline global substitution:
-- Like mw.ustring.gsub, but '^' and '$' match the beginning and end of each
-- line, respectively.
local checkType = require('libraryUtil').checkType
local checkTypeMulti = require('Dev:CheckTypeMulti')
-- Reduce table lookups
local uGsub = mw.ustring.gsub
return function (s, pttrn, repl, n)
    checkType('Dev:Mgsub', 1, s, 'string')
    checkType('Dev:Mgsub', 2, pttrn, 'string')
    checkTypeMulti('Dev:Mgsub', 3, repl, {'function', 'table', 'string'})
    checkType('Dev:Mgsub', 4, n, 'number', true)
    -- Return the original string if no matches are allowed.
    if n and n < 1 then
        return s, 0
    -- Use mw.ustring.gsub if multiline substitution does not make sense.
    if not s:find('\n') or pttrn:sub(1, 1) ~= '^' and pttrn:sub(-1) ~= '$' then
        return uGsub(s, pttrn, repl, n)
    local lines = mw.text.split(s, '\n')
    local totalMatches = 0
    local remainingMatches, newMatches
    for i = 1, #lines do
        -- Stop updating lines if no more matches are allowed.
        if n and totalMatches == n then
        remainingMatches = n and n - totalMatches
        lines[i], newMatches = uGsub(lines[i], pttrn, repl, remainingMatches)
        totalMatches = totalMatches + newMatches
    return table.concat(lines, '\n'), totalMatches
-- </nowiki>
-- (Add categories here.)

Ad blocker interference detected!

Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.