モジュール:Main/sandbox

require('strict')
local getArgs
local coreformats = {
	main = '詳細は%sを参照',
	see = '%sを参照',
	seealso = '%sも参照'
}
local p = {}
------------------------------------------------------------------------------
	エラーメッセージ（文字列）を生成する。
------------------------------------------------------------------------------
local function _error(message)
	return  .. message .. 
end
------------------------------------------------------------------------------
	モジュール:ArgumentsのgetArgs()をラップした関数。
------------------------------------------------------------------------------
local function _getArgs(arg, wrapper)
	getArgs = getArgs or require('Module:Arguments').getArgs
	return getArgs(arg, { wrappers = wrapper })
end
------------------------------------------------------------------------------
	モジュール:TableToolsのnumKeys()を簡略化した関数。
------------------------------------------------------------------------------
local function _numKeys(t)
	local nums = {}
	for k, v in pairs(t) do
		if type(k) == 'number' then
			nums#nums + 1 = k
		end
	end
	table.sort(nums)
	return nums
end
------------------------------------------------------------------------------
	rellinkクラス付きのdiv要素を生成する。
------------------------------------------------------------------------------
local function _rellink(message, extraclasses)
	return tostring(mw.html.create('div')
		:attr('role', 'note')
		:addClass('rellink navigation-not-searchable')
		:addClass(extraclasses)
		:cssText('margin-bottom: 0.5em; padding-left: 2em; font-style: italic;')
		:wikitext(message)
	)
end
------------------------------------------------------------------------------
	targetとlabelから可能であればウィキリンクを生成する。
------------------------------------------------------------------------------
local function _link(target, label)
	local titleobj = mw.title.new(target)
	if not titleobj then
		return target
	end
	if label then
		return mw.ustring.format(
			'%s',
			titleobj.fullText,
			mw.text.nowiki(label)
			)
	elseif titleobj.fragment ~=   then
		if titleobj.prefixedText ==  or
		mw.title.equals(titleobj , mw.title.getCurrentTitle()) then
			return string.format(
				'§ %s',
				titleobj.fullText,
				titleobj.fragment
				)
		end
		return string.format(
			'%s § %s',
			titleobj.fullText,
			titleobj.prefixedText,
			titleobj.fragment
			)
	end
	return string.format(':%s', titleobj.fullText)
end
------------------------------------------------------------------------------
	などにおける主要な処理を行う関数。
------------------------------------------------------------------------------
function p.core(args, coreformat)
	if not args1 then
		return _rellink(_error('参照先が入力されていません。'))
	end
	local targets = {}
	local label, titleobj
	for i, n in ipairs(_numKeys(args)) do
		targetsi = string.format('「%s」', _link(argsn, args'l' .. n))
	end
	return _rellink(
		string.format(
			coreformatscoreformat or coreformat,
			mw.text.listToText(targets, '、', 'および')
		),
		args.extraclasses
	)
end
------------------------------------------------------------------------------
	による呼び出し用の関数群。
------------------------------------------------------------------------------
function p.main(frame)
	return p.core(_getArgs(frame, 'Template:Main'), 'main')
end
function p.see(frame)
	return p.core(_getArgs(frame, 'Template:See'), 'see')
end
function p.seealso(frame)
	return p.core(_getArgs(frame, 'Template:See also'), 'seealso')
end
function p.main2(frame)
	local args = _getArgs(frame, 'Template:Main2')
	if not args1 then
		return _rellink(_error('最初の案内文は必須です。'))
	end
	if not args2 then
		return _rellink(args1 .. '参照', args.extraclasses)
	end
	local targets = {}
	local titleobj
	for _, n in ipairs(_numKeys(args)) do
		if n % 2 == 0 then
			table.insert(
				targets,
				string.format(
					'%sについては「%s」を',
					argsn - 1 or _error('案内文の指定が不足しています。'),
					_link(argsn)
					)
				)
		end
	end
	return _rellink(table.concat(targets, '、') .. '参照', args.extraclasses)
end
return p