Modul:Senarai runut

Pendokumenan untuk modul ini boleh diciptakan di Modul:Senarai runut/doc

-- -------------------------------------------------------------------------- --
-- Senarai runut
--
-- Templat :      {{Senarai runut}}
-- Versi   :      1.0.3
-- Penulis :      Jose Buelvas (Usuario:Iho jose)
-- Catatan :      Pengekodan asal daripada Módulo:Lista de canciones di Wikipedia bahasa Sepanyol
-- -------------------------------------------------------------------------- --

-- Pemboleh ubah
local HtmlBuilder   = require('Modul:HtmlBuilder')
local p	            = {}
local marco         = {}
local raiz
local objeto
local infodisco
local args

-- Penyatuan
function union(t1, t2)
	local vals = {}
	for k, v in pairs(t1) do
		vals[v] = true
	end
	
	for k, v in pairs(t2) do
		vals[v] = true
	end
	
	local ret = {}
	for k, v in pairs(vals) do
		table.insert(ret, k)
	end
	
	return ret
end

-- Menyahpepijatan teg kosong
local function depuracion(contenido)
	if contenido and contenido ~= '' then
		return contenido
	end
end

-- Dapatkan nombor dalam parameter {{{1}}}
local function obtenerNumero(prefijo)
	local nums = {}
	for k, v in pairs(args) do
		local num = tostring(k):match('^' .. prefijo .. '([1-9]%d*)$')
		
		if num then
			table.insert(nums, tonumber(num))
		end
	end
	
	table.sort(nums)
	return nums
end

-- Maklumat terdahulu
function informacion()
	infodisco = raiz.wikitext()

  
   
	if (args['semua_penulisan'] or args['all_writing']) then -- {{{semua_penulisan}}}
		if args['semua_penulisan'] then infodisco.wikitext('Kesemua runut ditulis dan digubah oleh ' .. args.semua_penulisan .. '. ') end
        if args['all_writing'] then infodisco.wikitext('Kesemua runut ditulis dan digubah oleh ' .. args.all_writing .. '. ') end
	else
		if (args['semua_lirik'] or args ['semua_seni_kata'] or args['all_lyrics']) then -- {{{semua_seni_kata}}}
			if args['semua_lirik'] then infodisco.wikitext('Kesemua seni kata ditulis oleh ' .. args.semua_lirik) end
			if args['semua_seni_kata'] then infodisco.wikitext('Kesemua seni kata ditulis oleh ' .. args.semua_seni_kata) end
            if args['all_lyrics'] then infodisco.wikitext('Kesemua seni kata ditulis oleh ' .. args.all_lyrics) end
			if not args['all_music'] and not args['semua_muzik'] then
				infodisco.wikitext('.')
			end
		end
		
		local compositor = ''
		if args['all_music'] then
			compositor = args['all_music']
		elseif args['semua_muzik'] then
			compositor = args['semua_muzik']
		end
		
		if args['all_music'] or args['semua_muzik'] then -- {{{semua_muzik}}}
			if (args['semua_lirik'] or args ['semua_seni_kata'] or args['all_lyrics']) then -- Mengabungkan dua ayat dengan koma (,)
				infodisco.wikitext(', kesemua muzik digubah oleh ' .. compositor .. '. ')
			else
				infodisco.wikitext('Kesemua muzik digubah oleh ' .. compositor .. '. ')
			end
		end
	end
end

-- Tambahkan baris pada jadual kandungan sejagat
local function agregarPista(filaArgs)
	-- Pemboleh ubah sejagat dalaman
	local pista = objeto.tag('tr')
	pista
		.tag('td')
			.cssText('padding-right: 10px; text-align: right; cursor: default; -webkit-user-select:none; -moz-user-select:none; background-color: ' .. filaArgs.bgcolor)
			.wikitext(filaArgs.numero .. '.') -- Nombor runut (  1.)
	
	-- Tajuk runut dan catatan
	local titulopista, notaspista
	if filaArgs.titulo and filaArgs.titulo ~= '' then
		titulopista = filaArgs.titulo
	else
		titulopista = "''Tiada tajuk''"
	end
	if filaArgs.notas and filaArgs.notas ~= '' then
		notaspista = ' <span style="font-size: smaller; color: #555">(' .. filaArgs.notas .. ')</span> '
	else
		notaspista = ''
	end
	
	local nombrepista = pista.tag('td')
	nombrepista
		.cssText('text-align: left; background-color: ' .. filaArgs.bgcolor)
		.wikitext('"' .. titulopista .. '"' .. notaspista)
	
	-- Kredit seni kata
	if args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['kredit_lirik'] and args['kredit_lirik'] == 'ya' or args['kredit_seni_kata'] and args['kredit_seni_kata'] == 'ya' then
		local letraspista = pista.tag('td')
		letraspista
			.cssText('background-color: ' .. filaArgs.bgcolor)
			.wikitext(filaArgs.letraspor)
	end
	
	-- Kredit muzik
	if args['music_credits'] and args['music_credits'] == 'yes' or args['kredit_muzik'] and args['kredit_muzik'] == 'ya' then
		local musicapista = pista.tag('td')
		musicapista
			.cssText('background-color: ' .. filaArgs.bgcolor)
			.wikitext(filaArgs.musicapor)
	end
	
	-- Kredit penulis
	if args['writing_credits'] and args['writing_credits'] == 'yes' or args['kredit_penulisan'] and args['kredit_penulisan'] == 'ya' then
		local escritopista = pista.tag('td')
		escritopista
			.cssText('background-color: ' .. filaArgs.bgcolor)
			.wikitext(filaArgs.escritopor)
	end
	
	-- Lajur tambahan
	if args['extra_column'] or args['lajur_tambahan'] then
		local columnapista = pista.tag('td')
		columnapista
			.cssText('background-color: ' .. filaArgs.bgcolor)
			.wikitext(filaArgs.extrapor)
	end
	
	-- Tempoh masa runut
	local duracionpista = pista.tag('td')
	duracionpista
		.cssText('padding-right: 10px; text-align: right; background-color: ' .. filaArgs.bgcolor)
		.wikitext(filaArgs.duracionpor)
end

-- Membuat tajuk jadual
local function titulosContenido()
	if args['title'] or args['tajuk'] or args['tajuk_utama'] or args['headline'] then
		local titulopadding = ''
		if args['collapsed'] and args['collapsed'] == 'yes' or args['sorokkan'] and args['sorokkan'] == 'ya' then
			titulopadding = 'padding: 2px 4px'
		end
		local encabezado = objeto.tag('tr')
		encabezado
			.tag('th')
				.addClass('tlheader mbox-text')
				.attr('colspan', 10)
				.cssText('text-align: left; background-color: #fff; width: 100%; ' .. titulopadding)
				.wikitext(args['title'] or args['tajuk'] or args['tajuk_utama'] or args['headline'])
		local cel2 = encabezado.tag('td')
		cel2.addClass('mbox-empty-cell')
	else
		if args['sorokkan'] and args['sorokkan'] == 'ya' or args['collapsed'] and args['collapsed'] == 'yes' then
			local coloculto = objeto.tag('tr')
			coloculto
				.tag('th')
					.addClass('tlheader mbox-text')
					.attr('colspan', 10)
					.cssText('text-align: left; background-color: #fff')
			local cel3 = coloculto.tag('td')
			cel3.addClass('mbox-empty-cell')
		end
	end
	
	local estilopista, num, num2, num3, num4, totalnum, estilomore
	num  = 0
	num2 = 0
	num3 = 0
	num4 = 0
	if
		args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['kredit_lirik'] and args['kredit_lirik'] == 'ya' or args['kredit_seni_kata'] and args['kredit_seni_kata'] == 'ya' or 
		args['music_credits'] and args['music_credits'] == 'yes' or args['kredit_muzik'] and args['kredit_muzik'] == 'ya' or 
		args['writing_credits'] and args['writing_credits'] == 'yes' or args['kredit_penulisan'] and args['kredit_penulisan'] == 'ya' or
		args['extra_column'] or args['lajur_tambahan']
	then
		if args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['kredit_lirik'] and args['kredit_lirik'] == 'ya' or args['kredit_seni_kata'] and args['kredit_seni_kata'] == 'ya' then
			num  = 1
		end
		if args['music_credits'] and args['music_credits'] == 'yes' or args['kredit_muzik'] and args['kredit_muzik'] == 'ya' then
			num2 = 1
		end
		if args['writing_credits'] and args['writing_credits'] == 'yes' or args['kredit_penulisan'] and args['kredit_penulisan'] == 'ya' then
			num3 = 1
		end
		if args['extra_column'] or args['lajur_tambahan'] then
			num4 = 1
		end
		-- Gaya
		totalnum = num+num2+num3+num4
		if totalnum == 1 then
			estilopista = 'width: 60%'
			estilomore = 'width: 40%'
		elseif totalnum == 2 then
			estilopista = 'width: 40%'
			estilomore = 'width: 30%'
		elseif totalnum == 3 then
			estilopista = 'width: 30%'
			estilomore = 'width: 20%'
		elseif totalnum == 4 then
			estilopista = 'width: 20%'
			estilomore = 'width: 20%'
		end
	else
		estilopista = 'width: 100%'
		estilomore = ''
	end
	
	local titulares = objeto.tag('tr')
	titulares
		.tag('th')
		.cssText('width: 20px; padding-left: 10px; padding-right: 10px; text-align: center; background-color: #eee; height: 20px')
		.wikitext('No.') -- Nombor runut
	local nombrepista = titulares.tag('th')
	nombrepista
		.cssText('text-align: left; background-color: #eee; ' .. estilopista)
		.wikitext('Tajuk')
	
	if args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['kredit_lirik'] and args['kredit_lirik'] == 'ya' or args['kredit_seni_kata'] and args['kredit_seni_kata'] == 'ya' then
		local letrista = titulares.tag('th')
		letrista
			.cssText('text-align: left; background-color: #eee; ' .. estilomore)
			.wikitext('Seni kata')
	end
	if args['music_credits'] and args['music_credits'] == 'yes' or args['kredit_muzik'] and args['kredit_muzik'] == 'ya' then
		local musicapista = titulares.tag('th')
		musicapista
			.cssText('text-align: left; background-color: #eee; ' .. estilomore)
			.wikitext('Gubahan')
	end
	if args['writing_credits'] and args['writing_credits'] == 'yes' or args['kredit_penulisan'] and args['kredit_penulisan'] == 'ya' then
		local escritorespista = titulares.tag('th')
		escritorespista
			.cssText('text-align: left; background-color: #eee; ' .. estilomore)
			.wikitext('Penulis')
	end
	if args['extra_column'] or args['lajur_tambahan'] then
		local columnaextra = titulares.tag('th')
		columnaextra
			.cssText('text-align: left; background-color: #eee; ' .. estilomore)
			.wikitext(args['extra_column'] or args['lajur_tambahan'])
	end
	
	local duraciones = titulares.tag('th')
	duraciones
		.cssText('padding-right: 5px; width: 60px; text-align: center; background-color: #eee')
		.wikitext('Masa')
	
	local cel5 = titulares.tag('td')
	cel5.addClass('mbox-empty-cell')
end

-- Membuat baris berturut-turut seperti yang ditulis
local function hacerLista()
	-- Mengesan bahasa parameter (Melayu/Inggeris)
	local numeroPista = union(obtenerNumero('tajuk'), obtenerNumero('title'))
	table.sort(numeroPista)
	
	for k, num in ipairs(numeroPista) do
		-- Warna latar belakang baris (runut)
		local colorfondo
		if (num % 2) == 0 then
			colorfondo = '#f7f7f7'
		else
			colorfondo = '#fff'
		end
		
		-- Menambahkan data mengikut parameter (dalam bahasa Melayu atau Inggeris)
		agregarPista({
			bgcolor		= colorfondo,
			numero		= num,
			titulo		= depuracion(args['tajuk' .. num] or args['title' .. num]),
			notas		= depuracion(args['catatan' .. num] or args ['nota' .. num] or args['note' .. num]),
			letraspor	= depuracion(args['lirik' .. num] or args ['seni_kata' .. num] or args['lyrics' .. num]),
			musicapor	= depuracion(args['muzik' .. num] or args['music' .. num]),
			escritopor	= depuracion(args['penulis' .. num] or args['writer' .. num]),
			extrapor	= depuracion(args['extra' .. num] or args['tambahan' .. num]),
			duracionpor	= depuracion(args['masa' .. num] or args['length' .. num])
		})
	end
end

-- Jumlah masa
local function duracionTotal()
	local duraciontotal = objeto.tag('tr')
	if args['jumlah_masa'] or args['total_length'] then
		duraciontotal
			.tag('td')
				.attr('colspan', 10)
				.cssText('padding-right: 10px; text-align: right; background-color: #eee; border-width: 0; font-weight: bold')
				.wikitext('Jumlah masa: ', args['jumlah_masa'] or args ['total_length'])
		local cel8 = duraciontotal.tag('td')
		cel8.addClass('mbox-empty-cell')
	end
end

-- Menentusahkan bahasa parameter mempunyai data
function existenciaDatos(pista)
	-- TRUE jika ia mempunyai data, FALSE secara lalai
	if depuracion(pista[1]) or depuracion(pista['tajuk']) then
		return true
	end
	
	return false
end

-- Membuat senarai runut di dalam jadual
function hacerListaTabla(tabla)
	for k, pista in ipairs(tabla) do
		if existenciaDatos(pista) then
			agregarPista({
				titulo		= depuracion(pista['tajuk'] or pista['title']),
				notas		= depuracion(args['catatan'] or args['nota'] or args['note']),
				letraspor	= depuracion(args['lirik'] or args['seni_kata'] or args['lyrics']),
				musicapor	= depuracion(args['muzik'] or args['music']),
				escritopor	= depuracion(args['penulis'] or args['writer']),
				extrapor	= depuracion(args['extra'] or args['tambahan']),
				duracionpor	= depuracion(args['masa'] or args['length'])
			})
		end
	end
end

-- Templat senarai runut
function _canciones()
	--Pemboleh ubah
	local ocultar, estilos
	
	-- Syarat dalam _canciones
	if args['sorokkan'] and args['sorokkan'] == 'ya' or args['collapsed'] and args['collapsed'] == 'yes' then
		ocultar = 'collapsible collapsed'
		estilos = 'border: #aaa 1px solid; padding: 3px; margin-bottom: .4em'
	else
		ocultar = ''
		estilos = 'padding: 2px'
	end
	
	-- Pembina HtmlBuilder sejagat
	raiz = HtmlBuilder.create()
	
	-- Maklumat
	informacion()
	
	-- Mengandungi jadual
	objeto = raiz.tag('table')
	objeto
		.addClass('tracklist ')
		.addClass(ocultar)
		.attr('cellpadding', 0)
		.cssText('border-collapse: collapse; ' .. estilos)
	
	-- Bahagian indeks
	titulosContenido()
	if not args[1] then
		hacerLista()
	else
		hacerListaTabla(args)
	end
	duracionTotal()
	
	-- Mengindeks semua dalam pemboleh ubah sejagat
	return tostring(raiz)
end

-- Indeks
function p.main(frame)
	local origArgs
	marco = frame
	-- Memanggil #invoke untuk penggunaan teg templat
	if frame == mw.getCurrentFrame() then
		origArgs = frame:getParent().args
	else
		origArgs = frame
	end
	-- Untuk pasangan
	args = {}
	for k, v in pairs(origArgs) do
		if v ~= ''  then
			args[k] = v
		end
	end
	
	-- Templat indeks bagi senarai runut
	return _canciones()
end

return p