יחידה:תבנית חוזרת

מתוך ויקיפדיה, האנציקלופדיה החופשית

יחידה זו מיועדת לשימוש בתבניות מרובות פרמטרים, שתומכות במספר בלתי מוגבל של פרמטרים.

שימוש

יש להעביר ליחידה פרמטר יחיד בשם תבנית שיכיל את התבנית החוזרת:

  • כל פרמטר חוזר חייב להסתיים ב-X (ה-X מוחלף במספר). למשל כדי לתמוך ב"שם1" ו"שם2" וכו' נגדיר {{{שםX}}}
  • (אופציונלי) הפרמטר {{{?X}}} מחזיר את מספר החזרה. למשל הגדרת: {{{?X}}} {{{שםX}}} תגדיר 1. שם ראשון 2. שם שני

מגבלות

התבנית מניחה שכל הפרמטרים הם פרמטרי חובה. למשל אם התבנית היא {{{שםX}}} {{{גילX}}} חייבים למלא גם שם1 וגם גיל1 כדי שיופיעו (אם לא צוין אחד מהם, שניהם לא יופיעו).

דוגמה

אם תבנית בשם "שם וגיל" נראית כך:

{{#invoke:תבנית חוזרת|חזרה
|תבנית=
* '''{{{שם X}}}''': {{{גיל X}}} [{{{?X}}}]
}}

ובדף כלשהו תוכלל התבנית בצורה כזו:

{{שם וגיל
| שם 1 = אברהם | גיל 1 = 3 | שם 2 = יצחק | גיל 2 = 12 | שם 3 = יעקב | גיל 3 = 99
}}

התצוגה תהיה:

  • אברהם: 3 [1]
  • יצחק: 12 [2]
  • יעקב: 99 [3]

local p = {}

function p.parse( frame )
	local template = frame.args['תבנית']
	local i = 0
	local req_params = {}
	-- extract parameters from templat
	while i~=nil do
		i = mw.ustring.find( template, '\{\{\{', i )
		if i ~= nil then
			start_ind = i+3
			i = mw.ustring.find( template, '\}\}\}', i )
			param_name = mw.ustring.sub( template, start_ind, i+2 )
			req_params[param_name] = 1
		end
	end
	
	-- expand argumetns using the template
	i=1
	local found = true
	local segments = {}
	local pFrame = frame:getParent()
	while found do
		local curr_template = template
		found = true
		for k,v in pairs(req_params) do
			cur_k = mw.ustring.gsub( k, 'X}}}', tostring(i), 1 )
			if pFrame.args[cur_k]  then 
				local val = pFrame.args[cur_k]
				local param_name = '\{\{\{'..k
				local start_ind = mw.ustring.find( curr_template, param_name )
				curr_template = mw.ustring.sub( curr_template, 0, start_ind-1) .. val .. mw.ustring.sub( curr_template, start_ind+mw.ustring.len( param_name ))
			elseif k=='?X}}}' then
					curr_template = mw.ustring.gsub( curr_template, '{{{%?X}}}', tostring(i)  )
			else
				found = false
				break
			end
		end
		if  found then
			segments[i] = curr_template
		end
      	i=i+1
    end
    return table.concat( segments, '\n' )
end

function p.invoker( frame )
	local res = {}
	local template = frame.args['תבנית']
	local templateParams = {}
	for k, v in pairs(frame.args) do
		if k~='תבנית' then
			templateParams[k] = v
		end
	end
	
	local callerParams = frame:getParent().args
	local i=0
	local maxI = 10
	while i<maxI do
		mw.logObject('Extracting params ' .. i)
		local currentArgs = {}
		for k, v in pairs(templateParams) do
			if i==0 then
				if callerParams[v] then
					currentArgs[k] = callerParams[v]
				end
			else
				if callerParams[v..i] then
					currentArgs[k] = callerParams[v..i]
				end
			end
		end
		mw.logObject('current args')
		mw.logObject(currentArgs)
		if #currentArgs == 0 and i>1 then
			i = maxI
		else
			table.insert(res, frame:expandTemplate{ title = template, args = currentArgs })
			if i==0 then
				i=2
			else
				i=i+1
			end
		end
	end
	return table.concat(res, '\n')
end

p['חזרה'] = p.parse
p['קריאה'] = p.invoker
return p