پودمان:Unsubst
این پودمان حفاظتشده ارزیابی شدهاست. این پودمان یکی از الگوهای حساس است و در صفحات بسیار زیادی استفاده میشود. محافظت این پودمان در برابر ویرایش، بهدلیل بار قابل توجهی است که خرابکاریها، خطاها یا ویرایشهای جزئی میتوانند به دوش سرورها بگذارند. |
پودمان کمکی برای آسانسازی تبدیل یک الگوی جایگزینشده به یک انتقال الگو.
الگوهای نگهداری، مانند {{مدرک}} یا {{بهبود منبع}} هرگز نباید جایگزین شوند. راه دورزدن این کار، استفاده از شکل منتقلشده یک الگوی جایگزین است.
مانند هر الگوی دیگر با پارامترهای فهرستشده در گروه قالب پیشفرض، جعبه اطلاعات باید از پودمان:Unsubst-infobox استفاده کند.
استفاده
برای تبدیل یک الگو به الگوی خودجایگزین، کد الگو را در دستور زیر بکار ببرید:
{{SAFESUBST:<noinclude />#invoke:Unsubst||$B= [ ... کد الگو در اینجا ... ] }}
هنگامیکه wikitext to display وجود ندارد باید به صورت "$B" نشان داده شود. همه دیگر پارامترها که به #invoke فرستاده میشوند به عنوان مقادیر پیشفرض در فراخوان الگوی ساختهشده، کپی میشوند. اگر مقدار هریک از این پیشفرضها __DATE__
باشد آن مقدار، در فراخوان الگوی ساختهشده، برابر ماه و سال جاری خواهد بود.
برخی الگوها یک <noinclude>
دارند اما در انتهای الگو با </noinclude>
سازگار نیستند. در این موارد، </noinclude>
از دست رفته باید پیش از }}
آورده شوند.
پیشرفته
{{SAFESUBST:<noinclude />#invoke:Unsubst||$params=[ parameters ]|$aliases=[ aliases ]|$flags=[ flags ]|$B= [ ... کد الگو در اینجا ... ] }}
به خاطر محدودیتهای لوآ، هنگامی که الگو جایگزین شد پارامترها معمولا به صورت تصادفی، مرتب میشوند. از |$params=
میتوان در #invoke:Unsubst استفاده کرد تا پارامترهای الگو را به صورت منظم و جداشده با ویرگول "،" فهرست کرد (نمونه egg,bacon,sausage,cheese,spam
). در این فهرست، پارامترهای عددی باید پیش از دیگر پارامترها آورده شوند. هر پارامتر باقیماندهای به انتهای فراخوان ایجادشده فرستاده میشود.
نامهای فرضی یا مستعار پارامترها میتوانند در |$aliases=
فهرست شده (نباید در |$params=
فهرست شوند) و به صورت خودکار، جایگزین شوند. هر نام فرضی یا مستعار و جایگزین آن باید به صورت alias>replacement
نوشته شود و هریک از جفتها باید با ویرگول "،" از یکدیگر جدا شوند (مانند œuf>egg,melt>cheese
). توجه کنید که این پارامترها میتوانند با یا بدون |$params=
نیز کار کنند.
میتوان از |$flags=
برای دستکاری دیگر بخشهای رفتار پودمان استفاده کرد. مقادیر ورودی با ویرگول "،" از یکدیگر جدا شدهاند. flagsهای درست override
(به پارامترهای #invoke: اجازه میدهد که بر پارامترهای اصلی فراخوان الگو، اولویت پیدا کنند); keep-whitespace
(از حذف فضای سفید از پارامترهای بینام، جلوگیری میکند); and remove-empty
(همه پارامترها را حذف میکند).
از این پارامترها میتوان در دستورهای تجزیهکننده استفاده کرد تا گزینههای پیشرفتهتری بدست آورد. توجه کنید که در پارامترها در هر دستور تجزیهکننده با الگو، یا پودمان فراخوان، باید از SAFESUBST:<noinclude />
استفاده کنید.
نمونه
{{SAFESUBST:<noinclude />#invoke:Unsubst||foo=bar |date=__DATE__ |$B= [ ... کد الگو در اینجا ... ] }}
Original | Result |
---|---|
{{جا:نمونه}} |
{{نمونه|date=دسامبر ۲۰۲۴}}
|
{{جا:نمونه|foo=X}} |
{{Example|foo=X|date=دسامبر ۲۰۲۴}}
|
{{جا:نمونه|baz=X}} |
{{Example|baz=X|date=دسامبر ۲۰۲۴}}
|
{{جا:نمونه|تاریخ=ژانویه ۲۰۰۱}} |
{{نمونه|foo=bar|تاریخ=ژانویه ۲۰۰۱}}
|
local checkType = require('libraryUtil').checkType
local p = {}
local BODY_PARAM = '$B'
local specialParams = {
['$params'] = 'parameter list',
['$aliases'] = 'parameter aliases',
['$flags'] = 'flags',
['$B'] = 'template content',
['$template-name'] = 'template invocation name override',
}
function p.main(frame, body)
-- If we are substing, this function returns a template invocation, and if
-- not, it returns the template body. The template body can be specified in
-- the body parameter, or in the template parameter defined in the
-- BODY_PARAM variable. This function can be called from Lua or from
-- #invoke.
-- Return the template body if we aren't substing.
if not mw.isSubsting() then
if body ~= nil then
return body
elseif frame.args[BODY_PARAM] ~= nil then
return frame.args[BODY_PARAM]
else
error(string.format(
"no template content specified (use parameter '%s' from #invoke)",
BODY_PARAM
), 2)
end
end
-- Sanity check for the frame object.
if type(frame) ~= 'table'
or type(frame.getParent) ~= 'function'
or not frame:getParent()
then
error(
"argument #1 to 'main' must be a frame object with a parent " ..
"frame available",
2
)
end
-- Find the invocation name.
local mTemplateInvocation = require('Module:Template invocation')
local name
if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then
name = frame.args['$template-name'] -- override whatever the template name is with this name
else
name = mTemplateInvocation.name(frame:getParent():getTitle())
end
-- Combine passed args with passed defaults
local args = {}
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then
for k, v in pairs( frame:getParent().args ) do
args[k] = v
end
for k, v in pairs( frame.args ) do
if not specialParams[k] then
if v == '__DATE__' then
v = mw.getContentLanguage():formatDate( 'F Y' )
end
args[k] = v
end
end
else
for k, v in pairs( frame.args ) do
if not specialParams[k] then
if v == '__DATE__' then
v = mw.getContentLanguage():formatDate( 'F Y' )
end
args[k] = v
end
end
for k, v in pairs( frame:getParent().args ) do
args[k] = v
end
end
-- Trim parameters, if not specified otherwise
if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then
for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end
end
-- Pull information from parameter aliases
local aliases = {}
if frame.args['$aliases'] then
local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )
for k, v in ipairs( list ) do
local tmp = mw.text.split( v, '%s*>%s*' )
aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2])
end
end
for k, v in pairs( aliases ) do
if args[k] and ( not args[v] or args[v] == '' ) then
args[v] = args[k]
end
args[k] = nil
end
-- Remove empty parameters, if specified
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then
local tmp = 0
for k, v in ipairs( args ) do
if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then
tmp = k
else
break
end
end
for k, v in pairs( args ) do
if v == '' then
if not (type(k) == 'number' and k < tmp) then args[k] = nil end
end
end
end
-- Order parameters
if frame.args['$params'] then
local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {}
for k, v in ipairs(params) do
v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v
if args[v] then tmp[v], args[v] = args[v], nil end
end
for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end
args = tmp
end
return mTemplateInvocation.invocation(name, args)
end
p[''] = p.main -- For backwards compatibility
return p