Modul:template parser/templates
Robâ
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