وحدة:Unsubst

مراجعة ١٩:٢٨، ٢٦ سبتمبر ٢٠١٨ بواسطة ar>Meno25 (حمى "وحدة:Unsubst": صفحة كثيرة الاستخدام ([تعديل=السماح للمستخدمين المحررين فقط] (غير محدد) [النقل=السماح للمستخدمين المحررين فقط] (غير محدد)))
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

هذه الوحدة مساعدة لتسهيل استبدال القوالب، أو منع نسخها.

قوالب الصيانة، مثل {{بحاجة لمصدر}} أو {{مصادر أكثر}}، وغيرها من قوالب المعلومات، التي لا ينبغي أبدا أن تكون منسوخة. ولتجنب نسخها، نستخدم هذه الوحدة.

الاستخدام

لعرض نصوص ويكي WikiText عندما لا يجب نسخها، يجب أن تعطى باسم "$B".

جميع المعلمات الأخرى سيتم نسخها بقيمها كما هي عبر تمريرها في استدعاء الوحدة، ويمكن تحديد قيم إفتراضية لبعض الوسائط، حيث يمكن استخدام "__DATE__" كقيمة افتراضية في أحد الوسائط، وفي هذه الحالة عند نسخ القالب، سيتم وضع قيمة الوسيط "الشهر السنة" مثل "أكتوبر 2016".

بعض القوالب تحتوي على <noinclude> ولكن لا يوجد </noinclude> في نهاية القالب، وفي مثل هذه الحالة </noinclude> يجب أن تضاف الوسوم المفقودة قبل نهاية }} وإلا فهي ستظهر مع نتيجة نسخ القالب.

لتحويل قالب إلى نفس القالب، يستخدم نفس الوسائط، بمعنى آخر لمنع نسخ النص البرمجي له، استخدم: <syntaxhighlight lang="text"> النص البرمجي للقالب </syntaxhighlight>

متى لا تعمل هذه الوحدة؟

من الممكن أن يؤدي إضافة الوحدة إلى تعطيل بعض القوالب أو إخفاء ظهورها أو إخفاء ظهور جزء من القالب، وذلك في حالة كون القالب جدول ويكي أو يحتوي على نصوص الويكي الخاصة بالجداول، مثل:

{|
|-
|}

أو بعض منها منفردة:

  • {|
  • |}
  • |-

مثال

التاريخ: __DATE__

على سبيل المثال، لنفترض أن قالب:مثال يحتوي على التعليمات البرمجية التالية: <syntaxhighlight lang="text"> [ ... Template code goes here ... ] </syntaxhighlight>

النص البرمجي النتيجة
{{subst:مثال}} {{مثال|foo=bar|تاريخ=نوفمبر ٢٠٢٤}}
{{subst:مثال|تج=X}} {{مثال|تج=X|تاريخ=نوفمبر ٢٠٢٤}}
{{subst:مثال|baz=X}} {{مثال|foo=bar|baz=X|تاريخ=نوفمبر ٢٠٢٤}}
{{subst:مثال|تاريخ=يناير 2001}} {{مثال|foo=bar|تاريخ=يناير 2001}}

local p = {}

local specialParams = {
	['$N'] = 'template name', -- Deprecated, but keeping until it is removed from transcluding templates
	['$B'] = 'template content',
}
p[''] = function ( frame )
	if not frame:getParent() then
		error( '{{#invoke:Unsubst|}} makes no sense without a parent frame' )
	end
	if not frame.args['$B'] then
		error( '{{#invoke:Unsubst|}} requires parameter $B (template content)' )
	end
	
	if mw.isSubsting() then
		---- substing
		-- Combine passed args with passed defaults
		local args = {}
		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

		-- Build an equivalent template invocation
		-- First, find the title to use
		local titleobj = mw.title.new(frame:getParent():getTitle())
		local title
		if titleobj.namespace == 10 then -- NS_TEMPLATE
			title = titleobj.text
		elseif titleobj.namespace == 0 then -- NS_MAIN
			title = ':' .. titleobj.text
		else
			title = titleobj.prefixedText
		end

		-- Build the invocation body with numbered args first, then named
		local ret = '{{' .. title .. '\n'
		for k, v in ipairs( args ) do
			if string.find( v, '=', 1, true ) then
				-- likely something like 1=foo=bar, we need to do it as a named arg
				break
			end
			ret = ret .. '|' .. v .. '\n'
			args[k] = nil
		end
		for k, v in pairs( args ) do
			ret = ret .. '|' .. k .. '=' .. v.. '\n'
		end
		
		return ret .. '}}'
	else
		---- Not substing
		-- Just return the "body"
		return frame.args['$B']
	end
end

p['get'] = function ( frame )
	if not frame:getParent() then
		error( '{{#invoke:Unsubst|}} makes no sense without a parent frame' )
	end
	if not frame.args['$B'] then
		error( '{{#invoke:Unsubst|}} requires parameter $B (template content)' )
	end
	
	if mw.isSubsting() then
		---- substing
		-- Combine passed args with passed defaults
		local args = {}
		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

		-- Build an equivalent template invocation
		-- First, find the title to use
		local titleobj = mw.title.new(frame:getParent():getTitle())
		local title
		if titleobj.namespace == 10 then -- NS_TEMPLATE
			title = titleobj.text
		elseif titleobj.namespace == 0 then -- NS_MAIN
			title = ':' .. titleobj.text
		else
			title = titleobj.prefixedText
		end
		if frame.args['$N'] and frame.args['$N'] ~= '' 
			then title =  frame.args['$N'] 
		end
		-- Build the invocation body with numbered args first, then named
		local ret = '{{' .. title
		for k, v in ipairs( args ) do
			if string.find( v, '=', 1, true ) then
				-- likely something like 1=foo=bar, we need to do it as a named arg
				break
			end
			ret = ret .. '|' .. v
			args[k] = nil
		end
		for k, v in pairs( args ) do
			ret = ret .. '|' .. k .. '=' .. v
		end
		
		return ret .. '}}'
	else
		---- Not substing
		-- Just return the "body"
		return frame.args['$B']
	end
end

return p