モジュール:Main/sandbox
表示
これはモジュール: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|§ %s]]',
titleobj.fullText,
titleobj.fragment
)
end
return string.format(
'[[:%s|%s § %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