「モジュール:Infobox/former」の版間の差分

提供:関南・東山地方Wiki
ナビゲーションに移動 検索に移動
template>Waiesu
(本体列をソート)
template>Waiesu
(コメント追加)
7行目: 7行目:


function p.main(frame)
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {parentOnly = true})
local args = require('Module:Arguments').getArgs(frame, {parentOnly = true}) --引数取得
local child = (args.child == 'yes')
local child = (args.child == 'yes')
local h = {subheader = {}, image = {{}}}
local h = {subheader = {}, image = {{}}} --ヘッダー部(subheader, image)テーブル
local body, sbody = {}, {}
local body, sbody = {}, {} --本体部テーブル, ソート済み本体部テーブル
local link = args.tnavbar or args.name
local link = args.tnavbar or args.name --(フッター部)テンプレート名
local result = ''
local result = '' --結果格納用
--[[
subheader, image用引数振り分け
]]
local function args2tbl(str, k, v)
local function args2tbl(str, k, v)
local num = string.match(k, '%d*$')
local num = string.match(k, '%d*$')
39行目: 42行目:
end
end
--[[
引数振り分け
]]
for k, v in pairs(args) do
for k, v in pairs(args) do
--subheader
--subheader
54行目: 60行目:
h['image'][num]['caption'] = '<div style="' .. (args.captionstyle or '') .. '">' .. v .. '</div>'
h['image'][num]['caption'] = '<div style="' .. (args.captionstyle or '') .. '">' .. v .. '</div>'
end
end
--その他
--その他(本体部)
elseif string.match(k, '^%D+%d+$') then
elseif string.match(k, '^%D+%d+$') then
local str, num = string.match(k, '^(%D+)(%d+)$')
local str, num = string.match(k, '^(%D+)(%d+)$')
63行目: 69行目:
end
end
--[[
Template:Infobox/row
]]
local function row(header, headerstyle, label, labelstyle, data, datastyle, class, rowclass, id, itemprop, rowitemprop, itemtype, rowitemtype, itemref, rowitemref)
local function row(header, headerstyle, label, labelstyle, data, datastyle, class, rowclass, id, itemprop, rowitemprop, itemtype, rowitemtype, itemref, rowitemref)
local result =''
local result =''
79行目: 88行目:
end
end
--[[
Template:Infobox
]]
--ヘッダー部
if not child then
if not child then
--tableタグ
result = '<table class="infobox ' .. (args.bodyclass or '') .. '" style="width:22em; ' .. (args.bodystyle or '') .. '"' .. (args.bodyitemtype and (' itemscope itemtype="' .. args.bodyitemtype .. '"') or '') .. ' itemref="' .. (args.bodyitemref or '') .. '">'
result = '<table class="infobox ' .. (args.bodyclass or '') .. '" style="width:22em; ' .. (args.bodystyle or '') .. '"' .. (args.bodyitemtype and (' itemscope itemtype="' .. args.bodyitemtype .. '"') or '') .. ' itemref="' .. (args.bodyitemref or '') .. '">'
if args.title then
if args.title then
--captionタグ
result = result .. '<caption itemprop="name" class="' .. (args.titleclass or '') .. ' style="' .. (args.titlestyle  or '') .. '">' .. args.title .. '</caption>'
result = result .. '<caption itemprop="name" class="' .. (args.titleclass or '') .. ' style="' .. (args.titlestyle  or '') .. '">' .. args.title .. '</caption>'
end
end
104行目: 119行目:
end
end
--ソート
--本体部ソート
for k, v in pairs(body) do
for k, v in pairs(body) do
sbody[#sbody + 1] = v
sbody[#sbody + 1] = v
111行目: 126行目:
function (a, b) return a[1] < b[1] end
function (a, b) return a[1] < b[1] end
)
)
--本体部
for k, v in ipairs(sbody) do
for k, v in ipairs(sbody) do
result = result .. row(v.header, args.headerstyle, v.label, args.labelstyle, v.data, args.datastyle, v.class, v.rowclass, v.id, v.itemprop, v.rowitemprop, v.itemtype, v.rowitemtype, v.itemref, v.rowitemref)
result = result .. row(v.header, args.headerstyle, v.label, args.labelstyle, v.data, args.datastyle, v.class, v.rowclass, v.id, v.itemprop, v.rowitemprop, v.itemtype, v.rowitemtype, v.itemref, v.rowitemref)
end
end
--フッター部
if args.below then
if args.below then
result = result .. '<tr><td colspan="2" class="' .. (args.belowclass or '') .. '" style="text-align:center; ' .. (args.belowstyle or '') .. '">' .. args.below .. '</td></tr>'
result = result .. '<tr><td colspan="2" class="' .. (args.belowclass or '') .. '" style="text-align:center; ' .. (args.belowstyle or '') .. '">' .. args.below .. '</td></tr>'
120行目: 137行目:
if link then
if link then
--Template:Transclude
link = string.gsub(link, ':?[Tt]emplate:', '')
link = string.gsub(link, ':?[Tt]emplate:', '')
if not string.find(link, ':') then
if not string.find(link, ':') then
127行目: 145行目:
end
end
--tableタグ閉じ
if not child then
if not child then
result = result .. '</table>'
result = result .. '</table>'
end
end
--出力
return result
return result
end
end


return p
return p

2016年7月10日 (日) 13:16時点における版

このモジュールについての説明文ページを モジュール:Infobox/former/doc に作成できます

--[[
Infobox モジュール案
{{#invoke:サンドボックス:Waiesu/infobox|main}}
]]

local p = {}

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {parentOnly = true})	--引数取得
	local child = (args.child == 'yes')
	local h = {subheader = {}, image = {{}}}	--ヘッダー部(subheader, image)テーブル
	local body, sbody = {}, {}	--本体部テーブル, ソート済み本体部テーブル
	local link = args.tnavbar or args.name	--(フッター部)テンプレート名
	local result = ''	--結果格納用
	
	--[[
	subheader, image用引数振り分け
	]]
	local function args2tbl(str, k, v)
		local num = string.match(k, '%d*$')
		num = (num == '') and 1 or tonumber(num)
		h[str][num] = h[str][num] or {}
		if k == str then
			h[str][1][1] = v
		elseif string.match(k, str .. '%d+') then
			h[str][num][1] = v
		elseif string.find(k, 'style') then
			if string.match(k, 'style$') then
				h[str]['style'] = v
			else
				h[str][num]['style'] = v
			end
		elseif string.find(k, 'rowclass') then
			if string.match(k, 'rowclass$') then
				h[str]['rowclass'] = v
			else
				h[str][num]['rowclass'] = v
			end
		elseif string.match(k, 'class$') then
			h[str]['class'] = v
		end
	end
	
	--[[
	引数振り分け
	]]
	for k, v in pairs(args) do
		--subheader
		if string.find(k, 'subheader') then
			args2tbl('subheader', k, v)
		--image
		elseif string.find(k, 'image') then
			args2tbl('image', k, v)
		elseif string.find(k, 'caption') then
			if string.match(k, 'caption$') then
				h['image'][1]['caption'] = '<div style="' .. (args.captionstyle or '') .. '">' .. v .. '</div>'
			elseif string.match(k, 'caption%d+') then
				local num = tonumber(string.match(k, '%d*$'))
				h['image'][num] = h['image'][num] or {}
				h['image'][num]['caption'] = '<div style="' .. (args.captionstyle or '') .. '">' .. v .. '</div>'
			end
		--その他(本体部)
		elseif string.match(k, '^%D+%d+$') then
			local str, num = string.match(k, '^(%D+)(%d+)$')
			num = tonumber(num)
			body[num] = body[num] or {num}
			body[num][str] = v
		end
	end
	
	--[[
	Template:Infobox/row
	]]
	local function row(header, headerstyle, label, labelstyle, data, datastyle, class, rowclass, id, itemprop, rowitemprop, itemtype, rowitemtype, itemref, rowitemref)
		local result =''
		if header then
			result = '<tr><th scope="col" colspan="2" class="' .. (class or '') .. '" style="text-align:center; ' .. (headerstyle or '') .. '"' .. (rowitemtype and (' itemscope itemtype="' .. rowitemtype .. '"') or '') .. ' itemref="' .. (rowitemref or '') .. '">' .. header .. '</th></tr>'
		elseif data then
			result = '<tr class="' .. (rowclass or '') .. '" itemprop="' .. (rowitemprop or '') .. '"' .. (rowitemtype and (' itemscope itemtype="' .. rowitemtype .. '"') or '') .. ' itemref="' .. (rowitemref or '') .. '">'
			if label then
				result = result .. '<th scope="row" style="text-align:left; white-space:nowrap; ' .. (labelstyle or '') .. '">' .. label .. '</th><td class="' .. (class or '') .. '" style="' .. (datastyle or '') .. '" itemprop="' .. (itemprop or '') .. '"' .. (itemtype and (' itemscope itemtype="' .. itemtype .. '"') or '') .. ' itemref="' .. (itemref or '') .. '">'
			else
					result = result .. '<td colspan="2" class="' .. (class or '') .. '" style="text-align:center; ' .. (datastyle or '') .. '" itemprop="' .. (itemprop or '') .. '"' .. (itemtype and (' itemscope itemtype="' .. rowitemtype .. '"') or '') .. ' itemref="' .. (itemref or '') .. '">'
			end
			result = result .. '\n' .. data .. '</td></tr>'
		end
		return result
	end
	
	--[[
	Template:Infobox
	]]
	--ヘッダー部
	if not child then
		--tableタグ
		result = '<table class="infobox ' .. (args.bodyclass or '') .. '" style="width:22em; ' .. (args.bodystyle or '') .. '"' .. (args.bodyitemtype and (' itemscope itemtype="' .. args.bodyitemtype .. '"') or '') .. ' itemref="' .. (args.bodyitemref or '') .. '">'
		if args.title then
			--captionタグ
			result = result .. '<caption itemprop="name" class="' .. (args.titleclass or '') .. ' style="' .. (args.titlestyle  or '') .. '">' .. args.title .. '</caption>'
		end
		if args.above then
			result = result .. '<tr><th colspan="2" class="' .. (args.aboveclass or '') .. '" style="text-align:center; font-size:125%; font-weight:bold; ' .. (args.abovestyle or '') .. '" itemprop="' .. (args.aboveitemprop or '') .. '"' .. (args.aboveitemtype and (' itemscope itemtype="' .. args.aboveitemtype .. '"') or '') .. ' itemref="' .. (args.aboveitemref or '') .. '">' .. args.above ..'</th></tr>'
		end
	else
		if args.title then
			result = '<b itemprop="name' .. '"' .. (args.bodyitemtype and (' itemscope itemtype="' .. args.bodyitemtype .. '"') or '') .. ' itemref="' .. (args.bodyitemref or '') .. '">' .. args.title .. '</b>'
		end
	end

	if h.subheader[1] then
		for k, v in ipairs(h.subheader) do
			result = result .. row(nil, nil, nil, nil, v[1], v.style or h.subheader.style, h.subheader.class, v.rowclass, nil, nil, nil, nil, nil, nil, nil)
		end
	end
	if h.image[1] then
		for k, v in ipairs(h.image) do
			result = result .. row(nil, nil, nil, nil, v[1] and (v[1] .. (v.caption or '')), v.style or h.image.style, h.image.class, v.rowclass, nil, nil, nil, nil, nil, nil, nil)
		end
	end
	
	--本体部ソート
	for k, v in pairs(body) do
		sbody[#sbody + 1] = v
	end
	table.sort(sbody,
		function (a, b) return a[1] < b[1] end
	)
	--本体部
	for k, v in ipairs(sbody) do
		result = result .. row(v.header, args.headerstyle, v.label, args.labelstyle, v.data, args.datastyle, v.class, v.rowclass, v.id, v.itemprop, v.rowitemprop, v.itemtype, v.rowitemtype, v.itemref, v.rowitemref)
	end
	
	--フッター部
	if args.below then
		result = result .. '<tr><td colspan="2" class="' .. (args.belowclass or '') .. '" style="text-align:center; ' .. (args.belowstyle or '') .. '">' .. args.below .. '</td></tr>'
	end
	
	if link then
		--Template:Transclude
		link = string.gsub(link, ':?[Tt]emplate:', '')
		if not string.find(link, ':') then
			link = 'Template:' .. link
		end
		result = result .. '<tr class="noprint"><td colspan=2 style="text-align:right; font-size:85%;">[[' .. link .. '|テンプレートを表示]]</td></tr>'
	end
	
	--tableタグ閉じ
	if not child then
		result = result .. '</table>'
	end
	
	--出力
	return result
end

return p