Modul:Table row counter

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Quelle w:Module:Table row counter, zu Parametern, siehe w:Template:Table row counter

Verwendung ohne Parameter

[Quelltext bearbeiten]

{{#invoke:table row counter|main}}

Beispiel mit Parameter

[Quelltext bearbeiten]
Column 1 Column 2
Cell 1 Cell 2
Cell 3 Cell 4
Cell 5 Cell 6
Code
{{#invoke:table row counter|main|id=foo|page=Modul:Table row counter/Doku}}
Resultat
3
Code
{{#invoke:table row counter|main|kopf=Denkmalliste Schweiz Tabellenkopf|fuss=Denkmalliste Schweiz Tabellenfuss|zeile=Denkmalliste Schweiz Tabellenzeile|page=Vorlage:Denkmalliste Schweiz Tabellenzeile/Doku}}
Resultat
1

-- Original bei https://en.wikipedia.org/wiki/Module:Table_row_counter Parameter kopf, fuss, zeile hinzugefügt
-- Verwendung: {{#invoke:table row counter|main}}
-- Zweck: zählt Zeilen einer Tabelle
-- This module counts table rows in wikitext.

local p = {}
local getArgs

function p.main(frame)
	if not getArgs then
		getArgs = require('Modul:Arguments').getArgs
	end
	return p._main(getArgs(frame, {wrappers = 'Vorlage:Table row counter'}))
end

function p._main(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
		if args.fuss then
			args.fuss = args.fuss:gsub('%-' , "%%-")
			args.fuss = "{{" .. args.fuss
		else
			args.fuss = "\n|}"
		end
		if args.kopf then
			args.kopf = args.kopf:gsub('%-' , "%%-")
			local s1 = content:match('^({{' .. args.kopf .. '.-' .. args.fuss .. ')')
		else
			local s1 = content:match('^({|.-\n|})')
		end
		if s1 then
			iWikitable = iWikitable + 1
			wikitables[iWikitable] = s1
		end
		if args.kopf then
			for s in content:gmatch('({{' .. args.kopf .. '.-' .. args.fuss .. ')') do
				iWikitable = iWikitable + 1
				wikitables[iWikitable] = s
			end
		else
			for s in content:gmatch('\n({|.-\n|})') do
				iWikitable = iWikitable + 1
				wikitables[iWikitable] = s
			end
		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[tonumber(args.tableno) or 1]
	end
	if not wikitable then
		return nil
	end

	-- Count the number of rows.
	local count
	if args.zeile then
		args.zeile = args.zeile:gsub('%-' , "%%-")
		do
			local temp
			temp, count = wikitable:gsub('{{' .. args.zeile, "")
		end
		count = count - (tonumber(args.ignore) or 0)
	else
		do
			local temp
			temp, count = wikitable:gsub('\n|%-', '\n|-')
		end

		-- Control for missing row markers at the start.
		if not wikitable:find('^{|[^\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, or the number of header
		--  rows if it's empty, and make sure the result isn't below zero.
		local headers
		do
			local temp
			temp, headers = wikitable:gsub('\n|%-\n!', '\n|-\n!')
		end
		if not wikitable:find('^{|[^\n]*%s*\n|%-\n!') then
			headers = headers + 1
		end
		count = count - (tonumber(args.ignore) or headers)
	end

	if count < 0 then
		count = 0
	end
	return count
end

return p