Jump to content

Module:StringCount

From Wikipedia, the free encyclopedia
-- Module:StringCount
-- Counts occurrences of a string in the wikitext of a given page.

local p = {}

local function countOccurrences(haystack, needle)
	if needle == "" then
		return nil, "empty-needle"
	end
	-- Non-overlapping count (standard "occurs" definition)
	-- Escape needle so it's treated as plain text, not a Lua pattern.
	local escaped = mw.ustring.gsub(needle, "([%%%^%$%(%)%.%[%]%*%+%-%?])", "%%%1")
	local _, n = mw.ustring.gsub(haystack, escaped, "")
	return n
end

function p.main(frame)
	local args = frame:getParent() and frame:getParent().args or frame.args
	local needle = (args[1] or args.string or ""):gsub("^%s+", ""):gsub("%s+$", "")
	local pageName = (args[2] or args.page or ""):gsub("^%s+", ""):gsub("%s+$", "")

	if pageName == "" then
		return "0"
	end
	if needle == "" then
		-- You can choose to return 0 instead, but empty-string "occurs" is undefined/infinite-ish.
		return "0"
	end

	local title = mw.title.new(pageName)
	if not title then
		return "0"
	end

	-- Fetch wikitext content
	-- Note: some wikis restrict access to certain pages/namespaces; this will then return nil.
	local content = title:getContent()
	if not content then
		return "0"
	end

	local n, err = countOccurrences(content, needle)
	if not n then
		return "0"
	end
	return tostring(n)
end

return p