Lompat ke isi

Modul:template parser/templates

Ḍâri Wikikamus

Dokumentasi untuk modul ini dapat dibuat di Modul:template parser/templates/doc

-- Mencegah substitusi.
if mw.isSubsting() then
	return require("Module:unsubst")
end

local export = {}

local m_template_parser = require("Module:template parser")

local display_parameter = m_template_parser.displayParameter
local process_params = require("Module:parameters").process
local template_link = m_template_parser.templateLink
local wikitag_link = m_template_parser.wikitagLink

local function get_offset_template_args(frame)
	-- Memproses parameter dengan opsi `return_unknown` diaktifkan. `title` berisi
	-- judul pada kunci 1; semua yang lain masuk ke `args`.
	local title, args = process_params(frame:getParent().args, {
		[1] = {required = true, allow_empty = true, no_trim = true}
	}, true)
	title = title[1]
	-- Menggeser semua argumen implisit ke bawah sebanyak 1. Parameter bernomor
	-- yang tidak berurutan tidak akan digeser. Namun, pergeseran ini berarti
	-- jika input berisi (misalnya) {{tl|l|en|3=alt}}, yang mewakili {{l|en|3=alt}},
	-- parameter di 3= justru akan dianggap sebagai parameter berurutan oleh modul ini,
	-- karena tidak dapat dibedakan dari {{tl|l|en|alt}}, yang mewakili {{l|en|alt}}.
	-- Di sisi lain, {{tl|l|en|4=tr}} akan ditangani dengan benar, karena masih ada 
	-- celah sebelum 4=.
	-- Sayangnya, tidak ada cara untuk mengetahui input asli, sehingga tidak ada cara
	-- pasti untuk memperbaikinya. Satu-satunya perbedaan adalah bahwa parameter eksplisit
	-- memiliki spasi yang dipangkas dari nilainya, sementara parameter implisit tidak,
	-- tetapi kita tidak dapat mengasumsikan bahwa setiap input tanpa spasi diberikan 
	-- dengan penomoran eksplisit.
	-- Masalah yang lebih besar juga muncul untuk fungsi parser yang memperlakukan
	-- input sebagai array atau dengan cara non-standar lainnya (misalnya,
	-- {{#IF:foo|bar=baz|qux}} memperlakukan "bar=baz" sebagai parameter 1).
	-- Tanpa mengetahui input asli, ini tidak dapat direkonstruksi dengan akurat.
	-- Cara mengatasinya adalah dengan menggunakan tag <nowiki> dalam input, karena 
	-- modul ini tidak akan menghapus tag tersebut secara otomatis.
	local i = 2
	repeat
		local arg = args[i]
		args[i - 1] = arg
		i = i + 1
	until arg == nil
	return title, args
end

function export.template_link_t(frame)
	local iargs = process_params(frame.args, {
		["annotate"] = true,
		["nolink"] = {type = "boolean"},
	})
	-- iargs.annotate memungkinkan templat untuk menentukan judulnya sendiri,
	-- sehingga argumen input akan sesuai dengan outputnya.
	local title = iargs.annotate
	if title then
		return template_link(title, frame:getParent().args, iargs.nolink)
	end
	-- Jika tidak, ambil argumen templat yang digeser sebanyak 1.
	local args
	title, args = get_offset_template_args(frame)
	return template_link(title, args, iargs.nolink)
end

function export.template_demo_t(frame)
	local title, args = get_offset_template_args(frame)
	return template_link(title, args) .. " ⇒<br style=\"line-height: 200%;\" />" .. frame:expandTemplate{title = title, args = args}
end

function export.parameter_t(frame)
	return display_parameter(unpack(process_params(frame:getParent().args, {
		[1] = {required = true, allow_empty = true, no_trim = true},
		[2] = {allow_empty = true, no_trim = true},
	})))
end

function export.wikitag_link_t(frame)
	return wikitag_link(process_params(frame:getParent().args, {
		[1] = {required = true, allow_empty = true, no_trim = true}
	})[1])
end

return export