Jump to content

Module:Table row counter: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
add missing function parameter
allow finding tables with an "id" parameter
Line 5: Line 5:
function p.main(frame)
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {parentOnly = true})
local args = require('Module:Arguments').getArgs(frame, {parentOnly = true})
return p.luaMain(args) or ''
local tableNo = tonumber(args[1])
local ignoreRows = tonumber(args.ignore)
local page = args.page
local success, titleObj = pcall(mw.title.new, page)
if not success then
titleObj = nil
end
return p.luaMain(tableNo, ignoreRows, titleObj) or ''
end
end


function p.luaMain(tableNo, ignoreRows, titleObj)
function p.luaMain(args)
-- Get the title object.
titleObj = titleObj or mw.title.getCurrentTitle()
local titleObj
do
local success
success, titleObj = pcall(mw.title.new, args.page)
if not success or not titleObj then
titleObj = mw.title.getCurrentTitle()
end
end


-- Get the page content.
-- Get the page content.
Line 35: Line 36:


-- Find the wikitable to work on.
-- Find the wikitable to work on.
local wikitable
tableNo = tableNo or 1
if args.id then
local wikitable = wikitables[tableNo]
for i, s in ipairs(wikitables) do
if s:match('^{|[^\n]*id *= *" *(%w+) *"') == args.id then
wikitable = s
break
end
end
else
wikitable = wikitables[args.tableno or 1]
end
if not wikitable then
if not wikitable then
return nil
return nil
Line 58: Line 68:
end
end


-- Subtract the number of rows to ignore, and make sure the result isn't below zero.
-- Subtract the number of rows to ignore, and make sure the result isn't
-- below zero.
count = count - (tonumber(args.ignore) or 0)
ignoreRows = ignoreRows or 0
count = count - ignoreRows
if count < 0 then
if count < 0 then
count = 0
count = 0

Revision as of 03:56, 22 June 2014

-- This module counts table rows in wikitext.

local p = {}

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {parentOnly = true})
	return p.luaMain(args) or ''
end

function p.luaMain(args)
	-- Get the title object.
	local titleObj
	do
		local success
		success, titleObj = pcall(mw.title.new, args.page)
		if not success or not titleObj then
			titleObj = mw.title.getCurrentTitle()
		end
	end

	-- Get the page content.
	local content = titleObj:getContent()
	if not content then
		return nil
	end

	-- Find the wikitables on that page.
	local wikitables = {}
	do
		local iWikitable = 0
		for s in content:gmatch('\n({|.-\n|})') do
			iWikitable = iWikitable + 1
			wikitables[iWikitable] = s
		end
	end

	-- Find the wikitable to work on.
	local wikitable
	if args.id then
		for i, s in ipairs(wikitables) do
			if s:match('^{|[^\n]*id *= *" *(%w+) *"') == args.id then
				wikitable = s
				break
			end
		end
	else
		wikitable = wikitables[args.tableno or 1]
	end
	if not wikitable then
		return nil
	end

	-- Count the number of rows.
	local count
	do
		local temp
		temp, count = wikitable:gsub('\n|%-', '\n|-')
	end

	-- Control for missing row markers at the start.
	if not wikitable:match('^{|[^\n]-%s*\n|-') then
		count = count + 1
	end

	-- Control for extra row markers at the end.
	if wikitable:find('\n|%-[^\n]-%s*\n|}$') then
		count = count - 1
	end

	-- Subtract the number of rows to ignore, and make sure the result isn't
	-- below zero.
	count = count - (tonumber(args.ignore) or 0)
	if count < 0 then
		count = 0
	end
	return count
end

return p