Jump to content

Module:EB1911 contributor table

From Wikisource

require('strict')

local p = {}

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local TableTools = require('Module:TableTools')

local function _contributor_table_entry(args)
	local tr = mw.html.create('tr')
		:tag('td'):wikitext(args.initials)
		:allDone()
	
	local name_td = tr:tag('td')
	
	name_td:tag('span')
			:addClass('wst-eb1911-contributor-name')
			:wikitext(args.name)
			:done()
	if args.description then
		name_td:tag('dl'):tag('dd'):wikitext(args.description)
	end
	
	local subject_data = {}
	for k, v in pairs(args) do
		local text = string.match(k, '^(%w*subject)%d+$')
		local n = tonumber(string.match(k, '%d+$'))
		if text and n then
			subject_data[n] = subject_data[n] or {}
			subject_data[n][text] = v
		end
	end
	subject_data = TableTools.compressSparseArray(subject_data)
	
	local subject_data_len = #subject_data
	for i = 1, subject_data_len do
		if not subject_data[i].subject then
			subject_data[i] = nil
		end
	end
	subject_data = TableTools.compressSparseArray(subject_data)
	
	if #subject_data > 0 and args.brace then
		tr:tag('td'):wikitext(mw.getCurrentFrame():preprocess(args.brace))
	elseif #subject_data > 0 then
		tr:tag('td')
	end
	
	local subject_text = {}
	for i, data in ipairs(subject_data) do
		local text = {}
		
		local subject = data.subject
		local subpage = data.lnksubject or subject
		local subsubject = data.subsubject
		local cosubject = data.cosubject
		
		if subsubject then
			table.insert(text, mw.html.create('b'):wikitext('[[1911 Encyclopædia Britannica/' .. subpage .. '|' .. subject .. ']]:'))
			table.insert(text, ' ')
			table.insert(text, mw.html.create('i'):wikitext('[[1911 Encyclopædia Britannica/' .. subpage .. '#' .. subsubject .. '|' .. subsubject .. ']]'))
		else
			table.insert(text, mw.html.create('b'):wikitext('[[1911 Encyclopædia Britannica/' .. subpage .. '|' .. subject .. ']]'))
		end
		if cosubject then
			table.insert(text, ' (')
			table.insert(text, mw.html.create('i'):wikitext('in part'))
			table.insert(text, ')')
		end
		table.insert(text, mw.html.create('b'):wikitext((data.pncsubject or ';') .. ' '))
		
		table.insert(subject_text, text)
	end
	
	local subject_td = tr:tag('td')
	for i, text in ipairs(subject_text) do
		for j, t in ipairs(text) do
			if i < #subject_text or j < #text then
				if type(t) == 'string' then
					subject_td:wikitext(t)
				else
					subject_td:node(t)
				end
			end
		end
	end
	
	if yesno(args.endperiod) ~= false then
		subject_td:tag('b'):wikitext('.')
	end
	
	local freeform = args.freeform or args.freeform1
	if freeform then
		subject_td:wikitext(freeform)
	end
	
	return tostring(tr)
end

function p.contributor_table_entry(frame)
	return _contributor_table_entry(getArgs(frame))
end

return p