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

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

שימוש

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

  • כל פרמטר חוזר חייב להסתיים ב-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