モジュール:PageStepper

-- プロジェクト:軍事史にてテスト中
local p = {}
-- テンプレートの引数確認とデフォルト値の設定
function p.checkArgs(args)
local checked = {}

-- 必須引数（total）が指定されていない場合、エラーを返す
if not args.total then
error('total（タブの総数）は必須です。')
end
local total = tonumber(args.total)
if not total then
error('total（タブの総数）は半角数字にしてください。')
elseif total > 51 then
error('total（タブの総数）が上限設定を超えています。')
end
-- index（現在のタブ）が指定されていない場合、link-n または n をFULLPAGENAMEで判定
local index
local pageName = mw.title.getCurrentTitle().fullText
for i = 1, tonumber(args.total) do
local link = args'link-' .. i or tostring(i)
if link == pageName then
index = i
break
end
end
-- indexが判定する要素がない場合はエラー
if not index then
if args'link-1' or args'1' then
index = 1
elseif args'index' then
index = tonumber(args'index')
else
error('完全なページ名、またはindexを指定してください。')
end
end
-- freeform-n が指定されている場合は link-n が指定されていないとエラー
for i = 1, tonumber(args.total) do
if args'freeform-' .. i and not args'link-' .. i then
error('freeform-' .. i .. ' が指定されていますが、対応する link-' .. i .. ' がありません。')
end
end
-- index, totalを確定
checked.index = index
checked.total = total
return checked
end
-- タブ（リスト形式）のHTMLを生成
function p.Tabs(frame)
local args = frame:getParent().args
local checked = p.checkArgs(args)
local html = {}
-- スタイル  
local allColor = args'color' or 
local fontSize = args'font-size' or '100%'
local Border = allColor and ('1px solid ' .. allColor) or args'border' or '1px solid #4dc4ff'
local BorderTop = allColor and ('7px solid ' .. allColor) or args'border top' or '7px solid #4dc4ff'
local BackgroundColor = allColor or args'background-color' or '#4dc4ff'
local onTabColor = allColor or args'On tab color'
local Rounding = args'rounding' or '6px'
local frameBorder = allColor and ('1px solid ' .. allColor) or args'frame color' or '1px solid #4dc4ff'
-- タブのスタイル生成
local ulStyle = string.format(
'font-size: %s; border-bottom: %s;',
fontSize, allColor
)
table.insert(html, string.format(, ulStyle))
-- li要素を順番に生成
for i = 1, checked.total do
local tabLabel = args'tab-' .. i or ('Tab ' .. i)
local tabLink = args'link-' .. i or '#'
local liSelected = string.format('background-color: %s;', BackgroundColor)
local liStyle = string.format(
'border: %s; border-top: %s; border-radius: %s %s 0 0;',
Border, BorderTop, Rounding, Rounding
)
-- indexに基づいてタブ生成
local isSelected = (i == checked.index)
if isSelected then
local wikilink = string.format('%s', tabLink, tabLabel)
table.insert(html, string.format(
'%s',
liSelected, wikilink
))
else
local wikilink = string.format('%s', tabLink, tabLabel)
table.insert(html, string.format(
'%s',
liStyle, wikilink
))
end
end
table.insert(html, )
-- frame が yes や y なら ページ枠の生成
local yesno = require('Module:Yesno')
local frameFlag = yesno(args'frame', false)
if frameFlag then
table.insert(html, string.format(
,
frameBorder
))
end
return table.concat(html, '\n')
end
-- ページ送りをdiv要素で生成
function p.Paginator(frame)
local args = frame:getParent().args
local checked = p.checkArgs(args)
local html = {}
local frameFlag = frame.frameFlag or 
local allColor = frame.allColor or 
local borderStyle = args'border' or '1px solid #4dc4ff' -- ページ送り枠：デフォルト値
if frameFlag then
	table.insert(html, )  -- frame があれば終了
end
-- border スタイル
local Style = allColor or borderStyle or 
-- indexとtotalの取得
local index = tonumber(checked.index)
local total = tonumber(checked.total)
-- 最初のページ（index == 1 のみ表示）
if index == 1 then
local beginLink = args'begin-link' or args'link-1' or '1'
local beginLabel = args'begin-label' or '最初のページ'
local beginLabelPrefix = args'begin-label-prefix' or  -- 最初のページ の前に付ける任意の文字列
local wikilink = string.format('%s', beginLink, beginLabel)
table.insert(html, string.format(
'%s',
Style, beginLabelPrefix .. wikilink
))
end
-- 前へ戻る（index > 1 のみ表示）
if index > 1 then
local prevIndex = index - 1
local prevLink = args'prev-link' or args'link-' .. prevIndex or tostring(prevIndex)
local prevLabel = args'prev-label' or '前へ戻る'
local prevLabelPrefix = args'prev-label-prefix' or  -- 前へ戻る の前に付ける任意の文字列
local wikilink = string.format('%s', prevLink, prevLabel)
table.insert(html, string.format(
'%s',
Style, prevLabelPrefix .. wikilink
))
end
-- 次へ進む（index %s',
Style, wikilink .. nextLabelSuffix
))
end
-- 最後のページ（index == total のみ表示）
if index == total then
local lastLink = args'last-link' or args'link-' .. total or tostring(total)
local lastLabel = args'last-label' or '最後のページ'
local lastLabelSuffix = args'last-label-suffix' or  -- 最後のページ の後ろに付ける任意の文字列
local wikilink = string.format('%s', lastLink, lastLabel)
table.insert(html, string.format(
'%s',
Style, wikilink .. lastLabelSuffix
))
end
table.insert(html, )
return table.concat(html, '\n')
end
return p