پودمان: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' } 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 = mTemplateInvocation.name(frame:getParent():getTitle()) -- 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