モジュール:Main/sandbox

モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

使用法[編集]

  • {{#invoke:Main|main}}
require('strict')

local getArgs
local coreformats = {
	main = '詳細は%sを参照',
	see = '%sを参照',
	seealso = '%sも参照'
}
local p = {}

--[[----------------------------------------------------------------------------
	エラーメッセージ(文字列)を生成する。
----------------------------------------------------------------------------]]--
local function _error(message)
	return '<strong class="error">' .. message .. '</strong>'
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|%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|§&nbsp;%s]]',
				titleobj.fullText,
				titleobj.fragment
				)
		end
		return string.format(
			'[[:%s|%s §&nbsp;%s]]',
			titleobj.fullText,
			titleobj.prefixedText,
			titleobj.fragment
			)
	end
	return string.format('[[:%s]]', titleobj.fullText)
end

--[[----------------------------------------------------------------------------
	{{Main}}などにおける主要な処理を行う関数。
----------------------------------------------------------------------------]]--
function p.core(args, coreformat)
	if not args[1] then
		return _rellink(_error('参照先が入力されていません。'))
	end
	local targets = {}
	local label, titleobj
	for i, n in ipairs(_numKeys(args)) do
		targets[i] = string.format('「%s」', _link(args[n], args['l' .. n]))
	end
	return _rellink(
		string.format(
			coreformats[coreformat] or coreformat,
			mw.text.listToText(targets, '、', 'および')
		),
		args.extraclasses
	)
end

--[[----------------------------------------------------------------------------
	{{#invoke:}}による呼び出し用の関数群。
----------------------------------------------------------------------------]]--
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 args[1] then
		return _rellink(_error('最初の案内文は必須です。'))
	end
	if not args[2] then
		return _rellink(args[1] .. '参照', 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」を',
					args[n - 1] or _error('案内文の指定が不足しています。'),
					_link(args[n])
					)
				)
		end
	end
	return _rellink(table.concat(targets, '、') .. '参照', args.extraclasses)
end

return p