پودمان:Unsubst: تفاوت میان نسخه‌ها

    از دزفول ویکی
    dezfulwiki>Dalba
    (به‌روز)
     
    جز (۱ نسخه واردشده)
     
    (بدون تفاوت)

    نسخهٔ کنونی تا ‏۱۹ اکتبر ۲۰۲۱، ساعت ۰۰:۰۹

    پودمان کمکی برای آسان‌سازی تبدیل یک الگوی جایگزین‌شده به یک انتقال الگو.

    الگوهای نگهداری، مانند {{مدرک}} یا {{بهبود منبع}} هرگز نباید جایگزین شوند. راه دورزدن این کار، استفاده از شکل منتقل‌شده یک الگوی جایگزین است.

    مانند هر الگوی دیگر با پارامترهای فهرست‌شده در گروه قالب پیشفرض، جعبه اطلاعات باید از پودمان: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