Module:StringCount
Appearance
-- 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