Module:String count

From Meta, a Wikimedia project coordination wiki
Module documentation
-- This module counts the number of times a string appears on a given page.

local yesno = require('Module:Yesno')

local p = {}

local function escapePattern(s)
	-- Escape punctuation in a string so it can be used in a Lua pattern.
	s = s:gsub('%p', '%%%0')
	return s
end

function p._count(args)
	-- Get the page text, checking for common errors.
	if not args.page then
		error("no 'page' argument; please provide the name of the page you " ..
			"wish to count strings in", 2)
	end
	local title = mw.title.new(args.page)
	if not title then
		error(string.format(
			"'%s' is not a valid page name; check for invalid characters",
			args.page
		), 2)
	end
	local text = title:getContent()
	if not text then
		error(string.format(
			"could not get the content of page '%s'; check that it exists",
			title.prefixedText
		), 2)
	end
	
	-- Get the pattern
	local pattern = args.search
	if not pattern then
		error("no 'search' argument; please provide the string you wish to search for", 2)
	elseif yesno(args.plain) ~= false then
		pattern = escapePattern(pattern)
	end

	-- Find the count
	local temp, count = mw.ustring.gsub(text, pattern, '%0')
	return count
end

function p.count(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:String count'
	})
	return p._count(args)
end

return p