Documentation for this module may be created at Module:Sandbox/Firefly/doc

local p = {}

local function prepareText( inputString )
	local retVal = inputString
	local cleanupPatterns = {}
	-- Note, these are invoked in order, which may be important!
	cleanupPatterns[1] = '=+[^=]+=+[ ]-\n' -- no headers
	cleanupPatterns[2] = '[^[]%[[^[ ]+[]%a%d]' -- no external link URLs
	cleanupPatterns[3] = '{{[^|]-|' -- no template invocations
	cleanupPatterns[4] = '<!%-%-.-%-%->' -- no HTML comments
	cleanupPatterns[5] = '\n' -- strip newlines
	
	for _, pattern in ipairs(cleanupPatterns) do
		retVal = mw.ustring.gsub(retVal, pattern, '')
	end

	return retVal
end

local function getWordcount( text )
	return (table.maxn(mw.text.split(prepareText(text), '[ ]+')) + 1)
end

local function getWordcountsForSections( targetPage, sectionLevel )
	
	local success, targetTitle = pcall( mw.title.new, targetPage )
	if not success or ( success and not targetTitle ) then
	    return nil
	end
	
	local targetContent = targetTitle:getContent()
	
	local headerMarkup = string.rep( "=", sectionLevel )
	local sections = mw.text.split(targetContent, '\n[ ]-'.. headerMarkup ..'[^=]+'.. headerMarkup ..'[ ]-\n')
	
	local wordCounts = {}
	for i, section in ipairs(sections) do
		if (i>1) then -- Skip preamble section
			wordCounts[#wordCounts + 1] = getWordcount(section)
		end
	end
	
	local resultTable = {}
	local headersIterator = mw.ustring.gmatch(targetContent, '\n[ ]-'.. headerMarkup ..'([^=]+)'.. headerMarkup ..'[ ]-\n')
	local i = 1
	for header in headersIterator do
		if mw.ustring.match(header, '{your user name}') == nil then -- we don't care about example sections
			resultTable[i .. " " .. header] = wordCounts[i] -- first capture group
		end
		i = i+1
	end
	return resultTable
end

local function getRowsFromWordcountTable( wordcountTable )
	local ret = ""
	for section, count in pairs(wordcountTable) do
		ret = ret .. string.format("\n|-\n| %s || %s", section, count)
	end
	return ret
end

local function makeWordcountTable( args )
	return 
end

function p.main( frame )
	local frame = mw.getCurrentFrame()
	local targetPage = frame.args["target"]
	
	local sectionLevel = frame.args["sectionlevel"]
	sectionLevel = tonumber(sectionLevel, 10)
	if sectionLevel == nil then
		sectionLevel = 2
	end

	local tableCss = frame.args["tablecss"]
	if tableCss == nil then
		tableCss = ''
	end
	
	local wordcountTable = getWordcountsForSections( targetPage, sectionLevel )

	return mw.ustring.format( '\n{| class="wikitable sortable" %s \n|-\n! Section !! Word Count%s\n|-\n|}', tableCss, getRowsFromWordcountTable(wordcountTable) )
end

return p