Pergi ke kandungan

Modul:Senarai padat

Daripada Wikipedia, ensiklopedia bebas.
local getArgs = require('Module:Arguments').getArgs
local clist = require('Module:Collapsible list').main
local hlist = require('Module:List').horizontal
local compressSparseArray = require('Module:TableTools').compressSparseArray
local p = {}

--[[
Menggabungkan argumen-argumen nama dan nombor kepada suatu senarai.
"Nama dan nombor" bermaksud foo, foo0, foo_1, foo234: apa-apa yang sepadan dengan foo_?%d+

Argumen-argumen:
  args[1] = nama untuk mencari argumen
  args selebihnya = argumen untuk dicari
Mengembalikan:
  Senarai, dalam turutan bilangan argumen.
  "foo" datang dahulu, kemudian "foo0", "foo1", ... "fooN"
  Bilangan argumen tidak perlu berturutan
  
  Jika bilangan args yang sepadan <= args[_limit] (lalainya 4),
     kembalikan senarai teks bagi bentuk "A, B, C and D"
  sebaliknya mengembalikan senarai yang boleh dilipat ({{clist}})
--]]
function p._main(args)
	local pattern = "^"..args[1].."_?(%d+)$"  -- corak untuk dipadankan
	local values = {}
	for k, v in pairs(args) do  --- menggelung melalui semua argumen
		if k == args[1] then    --- jika argumen cuma "foo", letakkanya dahulu
			values[1] = v
		else
			ord = tonumber(mw.ustring.match(k,pattern)) --- jika "foo_?%d+", sarikan nombor
			if ord then
				values[ord+2] = v  --- letakkan nilai ke dalam senarai pada nombor+2 (untuk mengekalkan "foo" dahulu, walaupun untuk foo0)
			end
		end
	end
	values = compressSparseArray(values)  --- himpitkan celahan/kosong pada nilai, kekalkan turutan
	local limit = tonumber(args._limit) or 4
	if #values == 0 then
		return ''
	end
	if #values == 1 then
		return values[1]
	end
	if #values > limit then
		return clist(values)   --- jika nilainya lebih banyak daripada had, panggil Modul:Collapsible list
	end
	return hlist(values) --- sebaliknya buat senarai mendatar
end

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

return p