モジュール:Tracklist

local p = {}
--共通変数
local track = {}	--トラックテーブル格納用テーブル
local all = {}	--全○○格納用テーブル
local desc = {nil, nil}	--コメント格納用テーブル
local credits = {}	--クレジット表示可否格納用テーブル
local args = {}	--その他引数格納用テーブル
local col = 0	--列数
local width = {}	--列幅格納用テーブル
local collapsed = false	--折りたたみ可否
local writer, lyrics, music, arranger, extra, length = function() return  end, function() return  end, function() return  end, function() return  end, function() return  end, function() return  end	--基本セル関数
local md = true	--microdata on/off
--
引数取得
local function getArgs(frame)
	local t_info, t_num = , 0
	local func_credits = function(v)
		if v == 'yes' then return true end
		local alias = {'+arrangements', '+a', '+編曲', '・編曲'}
		for _k, _v in ipairs(alias) do
			if v == _v then return _v end
		end
		return false
	end
	
	for k, v in pairs(require('Module:Arguments').getArgs(frame, {parentOnly = true})) do
		if string.match(k, '^%D+%d+$') then
			--各トラック格納
			t_info, t_num = string.match(k, '(%D+)(%d+)')
			if not trackt_num then trackt_num = {} end
			trackt_num1 = tonumber(t_num)		-- トラック番号はkey=1で記録
			trackt_numt_info = v	-- トラック情報はkey=引数で記録
		elseif string.match(k, 'all_') then
			--全○○格納
			local pattern = string.gsub(k, 'all_', )
			if not allpattern then allpattern = {nil, v} end
		elseif string.match(k, '^%d$') then
			--コメント格納
			desck = string.gsub(v, '^(*#;:)', '\n%1')
		elseif string.match(k, '_credits') then
			--クレジット表示可否格納
			creditsstring.gsub(k, '_credits', ) = func_credits(v)
		else
			-- その他格納
			argsk = v
		end
	end
	
	--allの整理
	if all then
		local function isSame(a, b)	--リンクを考慮して文字列を比較する
			if a and b then
				return (string.match(a2, '%%(.-)') or string.match(a2, '%%(.-)') or a2) == (string.match(b2, '%%(.-)') or string.match(b2, '%%(.-)') or b2)
			else
				return false
			end
		end
		
		if not all.writing and isSame(all.lyrics, all.music) then
			all.writing = {nil, all.lyrics2}
		end
		if all.writing then
			all.lyrics, all.music = nil, nil
			all.writing1 = '全作詞・作曲: '
		else
			if all.lyrics then all.lyrics1 = '全作詞: ' end
			if all.music then all.music1 = '全作曲: ' end
		end
		if isSame(all.writing, all.arrangements) then
			all.all = {'全作詞・作曲・編曲: ', all.writing2}
			all.writing, all.arrangements = nil, nil
		else
			if all.arrangements then all.arrangements1 = '全編曲: ' end
		end
		if isSame(all.music, all.arrangements) then
			all.producing = {'全作曲・編曲: ', all.music2}
			all.music, all.arrangements = nil, nil
		end
	end
	
	credits.extra = args.extra_column
	if credits.writing then
		credits.lyrics, credits.music = false, false
		if credits.writing ~= true then credits.arrangements = false end
	end
	if credits.music and credits.music ~= true then credits.arrangements = false end
	collapsed = (args.collapsed == 'yes')
	md = (args.microdata == 'no') and false or args.id
end
--
列数計算
local function calc_columns()
	local col = 2	--#,タイトル
	for k, v in pairs(track) do
		if not v.length then
			credits.length = false
		else
			credits.length = true
			break
		end
	end
	for k, v in pairs(credits) do
		if v then col = col + 1 end
	end
	return col
end
--
幅計算
local function calc_width()
	local width = {}
	if not credits.length then col = col + 1 end
	if col ' .. (args.headline or 'トラックリスト') ..  or 
	
	if collapsed then
		--折りたたみ表示において表示ボタン行追加
		result = result .. 
	end
	
	local newall = {}	--全○○表示用テーブル
	if all then	--全○○/コメント表示のとき
		if all.lyrics and not credits.lyrics then newall1 = all.lyrics1 .. all.lyrics2 end
		if all.music and not credits.music then newall#newall + 1 = all.music1 .. all.music2 end
		if all.all and not credits.writing and not credits.lyrics and not credits.music and not credits.arrangements then
			newall1 = all.all1 .. all.all2
		elseif all.writing and not credits.writing and not credits.lyrics and not credits.music then
			newall1 = all.writing1 .. all.writing2
		elseif all.producing and not credits.music and not credits.arrangements then
			newall#newall + 1 = all.producing1 .. all.producing2
		end
		if all.arrangements and not credits.arrangements then newall#newall + 1 = all.arrangements1 .. all.arrangements2 end
	end
	
	if newall1 or #desc > 0 then
		--全○○/コメント行追加
		result = result ..  .. (desc1 or ) .. (newall1 and (table.concat(newall, '、') .. '。') or ) .. (desc2 or ) .. 
	end
	
	--見出し行追加（#列・タイトル列追加）
	result = result .. '#タイトル'
	
	if credits.writing then
		--作詞・作曲列追加
		result = result .. '作詞・作曲' .. (credits.writing == true and  or '・編曲') .. 
		--作詞・作曲セル関数再定義
		if md then
			writer = function(x) return  .. (x.writer or all.writer and all.writer2 or all.all and all.all2 or ' ') ..  end
		else
			writer = function(x) return  .. (x.writer or all.writer and all.writer2 or all.all and all.all2 or ' ') ..  end
		end
	else
		local disp = function(y) if y then return  else return 'display:none;' end end
		--作詞列追加
		result = result .. '作詞'
		--作詞セル関数再定義
		if md then
			lyrics = function(x) return  .. (x.lyrics or all.lyrics and all.lyrics2 or x.writer or all.writing and all.writing2 or all.all and all.all2 or ' ') ..  end
		else
			lyrics = function(x) return  .. (x.lyrics or all.lyrics and all.lyrics2 or x.writer or all.writing and all.writing2 or all.all and all.all2  or ' ') ..  end
		end
		--作曲列追加
		result = result .. '作曲' .. (credits.music == true and  or '・編曲') .. 
		--作曲セル関数再定義
		if md then
			music = function(x) return  .. (x.music or all.music and all.music2 or x.writer or all.writing and all.writing2 or all.producing and all.producing2  or all.all and all.all2 or ' ') ..  end
		else
			music = function(x) return  .. (x.music or all.music and all.music2 or x.writer or all.writing and all.writing2 or all.producing and all.producing2  or all.all and all.all2 or ' ') ..  end
		end
	end
	if credits.arrangements then
		--編曲列追加
		result = result .. '編曲'
		--編曲セル関数再定義
		arranger = function(x) return  .. (x.arranger or all.arrangements and all.arrangements2 or all.producing and all.producing2  or all.all and all.all2 or ' ') ..  end
	end
	if credits.extra then
		--extra列追加
		result = result ..  .. credits.extra .. 
		--extraセル関数再定義
		extra = function(x) return  .. (x.extra or ' ') ..  end
	end
	if credits.length then
		--時間列追加
		result = result .. '時間'
		--時間セル再定義
		if md then
			length = function(x) return  .. (x.length and ( .. x.length .. ) or ' ') ..  end
		else
			length = function(x) return  .. (x.length and ( .. x.length .. ) or ' ') ..  end
		end
	end
	
	result = result .. 
	
	return result
end
--
本体部
local function body()
	local result = 
	local trackA = {}	--ソート用テーブル
	for k, v in pairs(track) do
		trackA#trackA + 1 = v
	end
	table.sort(trackA,
		function (a, b) return a1 ' .. (v'#' or v1) .. '.' .. (v.title and ('「' .. v.title .. '」') or 'タイトルなし') .. (v.note and ('(' .. v.note .. ')') or ) ..  .. writer(v) .. lyrics(v) .. music(v) .. arranger(v) ..  extra(v) .. length(v) .. 
		end
	else
		for k, v in ipairs(trackA) do
			local color = (v1 % 2 == 0) and 'var(--background-color-neutral-subtle,#f7f7f7)' or 'var(--background-color-base,#fff)'
			result = result ..  .. (v'#' or v1) .. '.' .. (v.title and ('「' .. v.title .. '」') or 'タイトルなし') .. (v.note and ('(' .. v.note .. ')') or ) ..  .. writer(v) .. lyrics(v) .. music(v) .. arranger(v) ..  extra(v) .. length(v) .. 
		end
	end
	return result
end
--
フッタ部（合計時間）
local function footer()
	local total = args.total_length
	local hour, min, sec = 0, 0, 0
	if total == 'auto' then
		--合計時間計算
		for k, v in pairs(track) do
			if not v.length then v.length = '0:00' end
			local _min, _sec = string.match(v.length, '(%d+):(%d+)')
			min, sec = min + _min, sec + _sec
		end
		while sec > 59 do
			min = min + 1
			sec = sec - 60
		end
		if sec タグ
		hour, min, sec = string.match(total, '(%d-):?(%d+):(%d+)')
		hour = (hour ~= ) and tonumber(hour) or 0
		min = hour * 60 + tonumber(min)
		total = .. min .. ':' .. sec .. 
		--合計時間行追加
		return '合計時間:'.. total .. 
	else
		return 
	end
end
function p.main(frame)
	getArgs(frame)
	col = calc_columns()	--number
	width = calc_width()	--table
	
	--tableタグで囲んで出力
	local table = mw.html.create('table')
	table
		:wikitext(header() .. body() .. footer())	--tableタグ内
		:attr({class = 'tracklist', id = args.id or })
		:cssText('display:block; max-width:100%; width:auto; border-spacing:0px; border-collapse:collapse; padding:0.2em; font-size:90%; text-align:left;')
	if collapsed then
		--折りたたみ表示追加指定
		table
			:addClass('mw-collapsible mw-collapsed')
			:cssText('position:relative; overflow:hidden; outline:1px solid #aaa;')
	end
	if md then
		table:attr({itemtype = 'http://schema.org/MusicAlbum'})
	end
	return tostring(table)
end
return p