モジュールの解説[作成]
local p = {}

--[[
Template:Main, See, See also 用
]]
-- Template:IsValidPageName
local function isValidPageName(pageName)
	local success, res = pcall(mw.title.new, pageName)
	return (success and res) and '「[[' .. pageName .. ']]」' or '「' .. pageName .. '」'
end
-- Template:Rellink
local function rellink(content)
	local div = mw.html.create('div')
	div	:addClass('rellink')
		:css({
			margin = '0 0 .5em 2em'
		})
		:wikitext(content)
	return tostring(div)
end

local msgNoArticle = '<strong class=error>エラー: 記事名が入力されていません</strong>'

function p.main(frame)
	local prefix, suffix = frame.args.prefix, frame.args.suffix
	local args = frame:getParent().args
	local links = {}
	local errorMsg = not args[1] and msgNoArticle or ''
	for i in ipairs(args) do
		links[i] = isValidPageName(args[i])
	end
	return rellink(prefix .. mw.text.listToText(links, '、', '、および') .. errorMsg .. suffix .. '参照')
end

--[[
Template:Main2 用
]]
function p.main2(frame)
	local args = frame:getParent().args
	
	if not args[1] then
		-- {{{1}}}がないときはエラーを返す
		return msgNoArticle
	elseif not args[2] then
		-- {{{2}}}がないときは{{{1}}}をそのまま返す
		return args[1] .. '参照'
	else
		-- {{{2}}}があるときは「${奇数}については${偶数}を」を返す
		local res = {}
		for i in ipairs(args) do
			if i % 2 == 0 then
				-- 偶数はスキップ(奇数とまとめて処理)
			elseif args[i] then
				table.insert(res, args[i] .. 'については' .. isValidPageName(args[i + 1]) .. 'を')
			else
				break
			end
		end
		return rellink(table.concat(res, '、') .. '参照')
	end
end

--[[
Template:Main3(提案)
]]
function p.main3(frame)
	local args = frame:getParent().args
	local res = {}
	for k, v in pairs(args) do
		table.insert(res, k .. 'については' .. isValidPageName(v) .. 'を')
	end
	return rellink(table.concat(res, '、') .. '参照')
end

return p