モジュール:サンドボックス/Ef3/Infobox/former

require('strict')
local yesno = require('Module:Yesno')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local Infobox = {}
function Infobox.split(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={}
for str in string.gmatch(inputstr, "(^"..sep.."+)") do
table.insert(t, str)
end
return t
end
function Infobox.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {parentOnly = true})	--引数取得
	local child = (args.child == 'yes')
	local subbox = (args.subbox == '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 = k:match('%d*$')
		num = (num == ) and 1 or tonumber(num)
		hstrnum = hstrnum or {}
		if k == str then
			hstr11 = v
		elseif k:match(str .. '%d+') then
			hstrnum1 = v
		elseif k:find('style') then
			if k:match('style$') then
				hstr'style' = v
			else
				hstrnum'style' = v
			end
		elseif k:find('rowclass') then
			if k:match('rowclass$') then
				hstr'rowclass' = v
			else
				hstrnum'rowclass' = v
			end
		elseif k:match('class$') then
			hstr'class' = v
		end
	end
	
	--
	引数振り分け
	
	for k, v in pairs(args) do
		--subheader
		if k:find('subheader') then
			args2tbl('subheader', k, v)
		--image
		elseif k:find('image') then
			args2tbl('image', k, v)
		elseif k:find('caption') then
			local caption = mw.html.create("div")
				:node(v)
			if args.captionstyle then caption:cssText(args.captionstyle) end
			caption = tostring(caption)
			if k:match('caption$') then
				h'image'1'caption' = caption
			elseif k:match('caption%d+') then
				local num = tonumber(k:match('%d*$'))
				h'image'num = h'image'num or {}
				h'image'num'caption' = caption
			end
		--その他（本体部）
		elseif k:match('^%D+%d+$') then
			local str, num = k:match('^(%D+)(%d+)$')
			num = tonumber(num)
			if not bodynum then
				local OddOrEven = (num % 2 ~= 0) and 'odd' or 'even'
				bodynum = {
					num,
					headerstyle = (args.headerstyle or ) .. (argsOddOrEven .. 'headerstyle' or ),
					labelstyle = (args.labelstyle or ) .. (argsOddOrEven .. 'labelstyle' or ),
					datastyle = (args.datastyle or ) .. (argsOddOrEven .. 'datastyle' or )
				}
			end
			bodynumstr = (bodynumstr or ) .. v
		end
	end
	
	--
	Template:Infobox/row
	
	local function row(header, headerstyle, label, labelstyle, data, datastyle, rowstyle, class, rowclass, id, itemprop, rowitemprop, itemtype, rowitemtype, itemref, rowitemref)
		local tr = mw.html.create('tr')
		tr:cssText(rowstyle)
		if rowstyle then tr:cssText(rowstyle) end
		if rowitemtype then tr:attr('itemscope itemtype', rowitemtype) end
		if rowitemref then tr:attr('itemref', rowitemref) end
		if header then
			local th = tr:tag('th')
				:attr('scope', "col")
				:attr('colspan', "2")
				:cssText('text-align:center')
				:wikitext(header)
				:addClass(class)
				:cssText(headerstyle)
			th:done()
			return tostring(tr)
		elseif data then
			if label then
				tr:tag('th')
					:attr('scope', "row")
					:cssText('text-align:left;white-space:nowrap')
					:wikitext(label)
					:cssText(labelstyle)
					:done()
				local td = tr:tag('td')
					:wikitext(data)
					:cssText(datastyle)
				if itemtype then td:attr('itemscope itemtype', itemtype) end
				if itemref then td:attr('itemref', itemref) end
				td:done()
			else
				local td = tr:tag('td')
					:wikitext(data)
					:cssText('text-align:center')
					:attr('colspan', "2")
					:cssText(datastyle)
				if itemtype then td:attr('itemscope itemtype', itemtype) end
				if itemref then td:attr('itemref', itemref) end
				td:done()
			end
			return tostring(tr)
		else
		end
		return ""
	end
	
	--
	Template:Infobox
	
	--ヘッダー部
	local infobox = nil
	if child then
		local bag = mw.html.create()
		if args.title then
			bag:tag('b')
				:attr("itemprop", "name")
				:addClass(args.titleclass)
				:cssText(args.titlestyle)
				:wikitext(args.title)
				:done()
		end
		infobox = bag
	else
		local tbl = mw.html.create('table')
			:addClass(subbox and  or 'infobox')
			:addClass(args.bodyclass)
			:cssText(subbox and 'min-width:100%;width:calc(100% + 6px);margin:-3px' or 'width:22em')
			:cssText(args.bodystyle)
		if args.bodyitemtype then tbl:attr('itemscope itemtype', args.bodyitemtype) end
		if args.bodyitemref then tbl:attr('itemref', args.bodyitemref) end
tbl:wikitext()
		if args.title then
			tbl:tag('caption')
				:attr("itemprop", "name")
				:addClass(args.titleclass)
				:cssText(args.titlestyle)
				:wikitext(args.title)
				:done()
		end
		if args.above then
			local above = tbl:tag('tr')
				:tag('th')
					:attr("colspan", "2")
					:addClass(args.aboveclass)
					:cssText("text-align:center;font-size:125%;font-weight:bold")
					:cssText(args.abovestyle)
					:wikitext(args.above)
			if args.aboveitemprop then above:attr('itemprop', args.aboveitemprop) end
			if args.aboveitemtype then above:attr('itemscope itemtype', args.aboveitemtype) end
			if args.aboveitemref then above:attr('itemref', args.aboveitemref) end
			above:done()
		end
		infobox = tbl
	end
	for k, v in pairs(h.subheader) do
		infobox:wikitext(row(nil, nil, nil, nil, v1, v.style or h.subheader.style, v.rowstyle, h.subheader.class, v.rowclass, nil, nil, nil, nil, nil, nil, nil))
	end
	for k, v in pairs(h.image) do
		infobox:wikitext(row(nil, nil, nil, nil, v1 and (v1 .. (v.caption or )), v.style or h.image.style, v.rowstyle, h.image.class, v.rowclass, nil, nil, nil, nil, nil, nil, nil))
	end
	
	--本体部ソート
	for k, v in pairs(body) do
		sbody#sbody + 1 = v
	end
	table.sort(sbody,
		function (a, b) return a1 < b1 end
	)
	--本体部
	for k, v in ipairs(sbody) do
		infobox:wikitext(row(v.header, v.headerstyle, v.label, v.labelstyle, v.data, v.datastyle, v.rowstyle, v.class, v.rowclass, v.id, v.itemprop, v.rowitemprop, v.itemtype, v.rowitemtype, v.itemref, v.rowitemref))
	end
	
	--フッター部
	if args.below then
		infobox:tag('tr')
			:tag('td')
				:attr('colspan', "2")
				:addClass(args.belowclass)
				:cssText("text-align:center")
				:cssText("args.belowstyle")
				:wikitext(args.below)
	end
	
	if link then
		--Template:Transclude
		link = string.gsub(link, ':?Ttemplate:', )
		if not string.find(link, ':') then
			link = 'Template:' .. link
		end
		infobox:tag('tr')
			:addClass("noprint")
			:tag("td")
				:cssText("text-align:right;font-size:85%")
				:wikitext('テンプレートを表示')
	end
	return tostring(infobox)
end
return Infobox