<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ar">
	<id>https://3rabica.org/index.php?action=history&amp;feed=atom&amp;title=%D9%88%D8%AD%D8%AF%D8%A9%3AGoalscorers</id>
	<title>وحدة:Goalscorers - تاريخ المراجعة</title>
	<link rel="self" type="application/atom+xml" href="https://3rabica.org/index.php?action=history&amp;feed=atom&amp;title=%D9%88%D8%AD%D8%AF%D8%A9%3AGoalscorers"/>
	<link rel="alternate" type="text/html" href="https://3rabica.org/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:Goalscorers&amp;action=history"/>
	<updated>2026-06-05T18:52:44Z</updated>
	<subtitle>تاريخ التعديل لهذه الصفحة في الويكي</subtitle>
	<generator>MediaWiki 1.43.7</generator>
	<entry>
		<id>https://3rabica.org/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:Goalscorers&amp;diff=1805&amp;oldid=prev</id>
		<title>عبد العزيز: تحديث</title>
		<link rel="alternate" type="text/html" href="https://3rabica.org/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:Goalscorers&amp;diff=1805&amp;oldid=prev"/>
		<updated>2022-01-25T23:33:54Z</updated>

		<summary type="html">&lt;p&gt;تحديث&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحة جديدة&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;Module:No globals&amp;#039;);&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {} &lt;br /&gt;
local g = {}         -- for parameters with global scope in this module&lt;br /&gt;
g.goalscorers = {}   -- table where selected and sorted players will be place&lt;br /&gt;
g.args = {}&lt;br /&gt;
g.totalGoals = 0&lt;br /&gt;
local data = {}      -- module subpage data -- require(&amp;#039;Module:Goalscorers/data/UEFA Euro 2016 qualifying&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
p.errorString = &amp;quot;&amp;quot;&lt;br /&gt;
function p.error_msg()&lt;br /&gt;
	if p.errorString ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	         -- &amp;#039;&amp;lt;code style=&amp;quot;color:inherit;border:inherit;padding:inherit;&amp;quot;&amp;gt;&amp;amp;#124;_template=&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
	         .. p.errorString .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
-- data for goals scored held in module subpages, e.g. &amp;quot;Module:Goalscorers/data/UEFA Euro 2016 qualifying&amp;quot;&lt;br /&gt;
      --[[ parameters containing data help in three tables&lt;br /&gt;
						data.rounds = {}   -- group, play-off&lt;br /&gt;
						data.goalscorers = {}    -- player, country, goals in each round)&lt;br /&gt;
						data.owngoalscorers = {} -- player, country, goals in each round)&lt;br /&gt;
						data.updated = {}        -- date of latest update (month, day, year)&lt;br /&gt;
					--]]&lt;br /&gt;
&lt;br /&gt;
--[[ ############################ Parameter handing  ###############################&lt;br /&gt;
      this section is currently unused&lt;br /&gt;
      will be used to take check parameters set in template&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
	local parents = mw.getCurrentFrame():getParent()&lt;br /&gt;
		&lt;br /&gt;
	for k,v in pairs(parents.args) do&lt;br /&gt;
		--check content&lt;br /&gt;
		if v and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			g.args[k]=mw.text.trim(v) --parents.args[k]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k,v in pairs(frame.args) do&lt;br /&gt;
		--check content&lt;br /&gt;
		if v and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			g.args[k]= mw.text.trim(v)  --parents.args[k]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- allow empty caption to blank default&lt;br /&gt;
	--if parents.args[&amp;#039;caption&amp;#039;] then templateArgs[&amp;#039;caption&amp;#039;] = parents.args[&amp;#039;caption&amp;#039;] end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ ############################## Main function and other functions ######################&lt;br /&gt;
&lt;br /&gt;
     main() - simple output of the data in the module in list form&lt;br /&gt;
]]&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    getArgs(frame)&lt;br /&gt;
    local dataTarget =  g.args[1] or  g.args[&amp;#039;data&amp;#039;]&lt;br /&gt;
    if dataTarget then&lt;br /&gt;
        data = require(&amp;#039;Module:Goalscorers/data/&amp;#039;.. dataTarget) --or &amp;#039;UEFA Euro 2016 qualifying&amp;#039; &lt;br /&gt;
    	return p.useModuleData(frame)  -- data on goals taken from module subpage&lt;br /&gt;
    else&lt;br /&gt;
    	return p.useTemplateData(frame)  -- data on goals/assists taken from template&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
function p.useModuleData(frame)&lt;br /&gt;
&lt;br /&gt;
    --p.goalscorers = {} -- table where selected and sorted players will be place&lt;br /&gt;
    g.totalGoals = 0&lt;br /&gt;
    p.selectGoalscorers() -- selected goalscorers meeting round and group criteris&lt;br /&gt;
    &lt;br /&gt;
-- CHANGEe: append own goals to list  (data will now include goals and own goals (negative))  &lt;br /&gt;
    p.selectGoalscorers(&amp;quot;OG&amp;quot;)    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    p.sortGoalscorers() -- sort selected goalscorers by number of goal, then country&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    local outputString = p.addIntroductorySentence() .. p.outputGoalscorers(frame) .. p.addFooterSentence()&lt;br /&gt;
--                      .. &amp;quot;&amp;quot;              --TODO add intermediate heading?&lt;br /&gt;
--                      .. p._owngoals(frame)  -- output list of goalscorers&lt;br /&gt;
    &lt;br /&gt;
    return p.error_msg() or outputString&lt;br /&gt;
end&lt;br /&gt;
function p.addIntroductorySentence()          -- add introductory text&lt;br /&gt;
	&lt;br /&gt;
	local totalGoalString = &amp;quot;A total of &amp;quot; .. g.totalGoals .. &amp;quot; goals were scored.&amp;quot;&lt;br /&gt;
	--There were [has been|have been|was|were] #GOALS goal(s) scored in #MATCHES match(s), for an average of #GOALS/#MATCHES per match.&lt;br /&gt;
	&lt;br /&gt;
	local matches, dateUpdated = p.getNumberMatches()&lt;br /&gt;
	local mdyFormat = yesno(g.args[&amp;#039;mdy&amp;#039;])&lt;br /&gt;
	&lt;br /&gt;
	local Date = require(&amp;#039;Module:Date2&amp;#039;)._Date&lt;br /&gt;
	&lt;br /&gt;
	local pluralGoals = &amp;quot;s&amp;quot;&lt;br /&gt;
	local text1 = &amp;quot;&amp;quot;&lt;br /&gt;
	if g.totalGoals == 1 then&lt;br /&gt;
		pluralGoals = &amp;quot;&amp;quot;&lt;br /&gt;
		if dateUpdated == &amp;#039;complete&amp;#039; then text1 = &amp;quot;was&amp;quot; else text1 = &amp;quot;has been&amp;quot; end&lt;br /&gt;
	else&lt;br /&gt;
		if dateUpdated == &amp;#039;complete&amp;#039; then text1 = &amp;quot;were&amp;quot; else text1 = &amp;quot;have been&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
	local text = string.format(&amp;quot;تم تسجيل %s هدف&amp;quot;&lt;br /&gt;
		, mw.getLanguage(&amp;#039;en&amp;#039;):formatNum(g.totalGoals))&lt;br /&gt;
	&lt;br /&gt;
	local pluralMatches = &amp;quot;es&amp;quot;&lt;br /&gt;
	if matches==1 then pluralMatches = &amp;quot;&amp;quot; end&lt;br /&gt;
	if matches then&lt;br /&gt;
		local average = g.totalGoals/tonumber(matches)&lt;br /&gt;
		local precision = 3                        -- display d.dd (three significant disgits)&lt;br /&gt;
		if average &amp;lt; 1 then precision = 2 end      -- display 0.dd (thwo significant disgits)&lt;br /&gt;
		average = tostring (average)&lt;br /&gt;
&lt;br /&gt;
		local pluralAverage = &amp;quot;s&amp;quot;&lt;br /&gt;
		if  tonumber(string.format(&amp;quot;%.2f&amp;quot;,average))==1 then pluralAverage = &amp;quot;&amp;quot; end&lt;br /&gt;
	    text = text .. string.format(	    	&amp;quot; في %d مباراة، بمتوسط %.&amp;quot;..precision..&amp;quot;g هدف لكل مباراة&amp;quot;&lt;br /&gt;
	    	, matches, average)&lt;br /&gt;
	end&lt;br /&gt;
    &lt;br /&gt;
	if dateUpdated == &amp;#039;complete&amp;#039; or dateUpdated == &amp;quot;&amp;quot; then&lt;br /&gt;
	    text = text .. &amp;quot;.&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		local dateFormat =  &amp;#039;dmy&amp;#039;                                                       -- default&lt;br /&gt;
		if data.params and data.params[&amp;#039;date_format&amp;#039;] then dateFormat = data.params[&amp;#039;date_format&amp;#039;] end  -- from data module&lt;br /&gt;
		if mdyFormat == true then dateFormat = &amp;quot;mdy&amp;quot; else&lt;br /&gt;
			if mdyFormat == false then dateFormat = &amp;quot;dmy&amp;quot; end   -- template param overrides&lt;br /&gt;
		end&lt;br /&gt;
	    text = text .. &amp;quot; (في &amp;quot; .. Date(dateUpdated):text(dateFormat) .. &amp;quot;).&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	text = p.addAdditionHeaderText(text, dateUpdated)  -- handles template parameters bold, further, extra&lt;br /&gt;
&lt;br /&gt;
	return text --totalGoalString &lt;br /&gt;
end&lt;br /&gt;
function p.addFooterSentence()                 -- add notes at bottom&lt;br /&gt;
    &lt;br /&gt;
    local footerSentence = g.args[&amp;#039;footer&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
    --footerSentence = &amp;quot;This is a footer sentence.&amp;quot;               -- test footer&lt;br /&gt;
    if data.params then&lt;br /&gt;
    	local footer = data.params[&amp;#039;footer&amp;#039;] or nil&lt;br /&gt;
	    if footer then&lt;br /&gt;
	    	local frame = mw.getCurrentFrame()&lt;br /&gt;
	    	local processed = frame:preprocess(footer)&lt;br /&gt;
	    	if g.notes then&lt;br /&gt;
	    		footerSentence  = footerSentence  .. processed&lt;br /&gt;
	    	end&lt;br /&gt;
	    end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if footerSentence ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    	footerSentence = &amp;#039;&amp;lt;div style = &amp;quot;&amp;quot; &amp;gt;&amp;#039; .. footerSentence .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return footerSentence&lt;br /&gt;
end&lt;br /&gt;
function p.getNumberMatches()&lt;br /&gt;
   	local matches = g.args[&amp;#039;matches&amp;#039;]&lt;br /&gt;
   	local dateUpdated = data.updated[&amp;#039;date&amp;#039;] or &amp;quot;1700-01-01&amp;quot; --&amp;#039;complete&amp;#039; -- assume completed if missing&lt;br /&gt;
  &lt;br /&gt;
    local round = g.args[&amp;#039;round&amp;#039;] or &amp;quot;all&amp;quot;    -- round =  all(empty)|group|playoffs&lt;br /&gt;
    local group = g.args[&amp;#039;group&amp;#039;] or &amp;quot;all&amp;quot;     -- group =  all(empty), A,B,C etc  &lt;br /&gt;
    &lt;br /&gt;
    local allGroupGames = 0&lt;br /&gt;
    local latestGroupDate = &amp;quot;1800-01-01&amp;quot; &lt;br /&gt;
    if round == &amp;quot;all&amp;quot; or group == &amp;quot;all&amp;quot; then           -- count all the group games&lt;br /&gt;
    	for k,v in pairs(data.updated.group) do&lt;br /&gt;
    		allGroupGames = allGroupGames + v[1]&lt;br /&gt;
    		if v[2] ~= &amp;quot;complete&amp;quot; and v[2] &amp;gt; latestGroupDate then latestGroupDate = v[2] end -- update if later date&lt;br /&gt;
    	end&lt;br /&gt;
    	if latestGroupDate == &amp;quot;1800-01-01&amp;quot; then latestGroupDate = &amp;quot;complete&amp;quot;  end -- no dates so must be complete&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if round == &amp;quot;all&amp;quot; then                                       -- all rounds and goals&lt;br /&gt;
        matches=0&lt;br /&gt;
        for k,v in pairs(data.updated) do &lt;br /&gt;
            if k == &amp;quot;group&amp;quot; then&lt;br /&gt;
        		matches = matches + allGroupGames&lt;br /&gt;
    	     	if latestGroupDate ~= &amp;quot;complete&amp;quot; and latestGroupDate &amp;gt; dateUpdated then &lt;br /&gt;
    	     		dateUpdated = latestGroupDate                -- update if later date&lt;br /&gt;
    	        end &lt;br /&gt;
        	else&lt;br /&gt;
        		matches = matches + v[1]&lt;br /&gt;
    		    if v[2] ~= &amp;quot;complete&amp;quot; and v[2] &amp;gt; dateUpdated then dateUpdated = v[2] end -- update if later date&lt;br /&gt;
        	end&lt;br /&gt;
        	&lt;br /&gt;
        end &lt;br /&gt;
	elseif round == &amp;quot;group&amp;quot; then                                  -- group round only&lt;br /&gt;
	    if group == &amp;quot;all&amp;quot; then                            &lt;br /&gt;
		   matches = allGroupGames&lt;br /&gt;
		   dateUpdated = latestGroupDate  &lt;br /&gt;
		else                                                      -- single group only&lt;br /&gt;
           matches     = data.updated.group[group][1]                 -- number matches&lt;br /&gt;
           dateUpdated = data.updated.group[group][2]                 -- update date or completed&lt;br /&gt;
		end&lt;br /&gt;
	else                                                          -- any other round&lt;br /&gt;
       matches     = data.updated[round][1]                           -- number matches&lt;br /&gt;
       dateUpdated = data.updated[round][2]                           -- update date or completed&lt;br /&gt;
    end &lt;br /&gt;
    &lt;br /&gt;
    if dateUpdated == &amp;quot;1700-01-01&amp;quot; then dateUpdated = &amp;quot;complete&amp;quot;  end -- no dates so must be complete&lt;br /&gt;
&lt;br /&gt;
   	return matches, dateUpdated&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.owngoals(frame) -- need to check parameters if external call&lt;br /&gt;
    getArgs(frame)&lt;br /&gt;
    data = require(&amp;#039;Module:Goalscorers/data/&amp;#039;.. g.args[1]) --or &amp;#039;UEFA Euro 2016 qualifying&amp;#039; &lt;br /&gt;
&lt;br /&gt;
    local outputString = p._owngoals(frame)&lt;br /&gt;
    return  p.error_msg() or outputString&lt;br /&gt;
end&lt;br /&gt;
function p._owngoals(frame) -- internal call for own goals&lt;br /&gt;
&lt;br /&gt;
    --p.goalscorers = {} -- table where selected and sorted players will be place&lt;br /&gt;
    &lt;br /&gt;
    p.selectGoalscorers(&amp;quot;OG&amp;quot;) -- selected goalscorers meeting round and group criteris&lt;br /&gt;
    &lt;br /&gt;
    p.sortGoalscorers() -- sort selected goalscorers by number of goal, then country&lt;br /&gt;
&lt;br /&gt;
    return p.outputGoalscorers(frame, &amp;quot;OG&amp;quot;) -- output list of goalscorers&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- select players meeting round and goal criteria&lt;br /&gt;
function p.selectGoalscorers(og)&lt;br /&gt;
&lt;br /&gt;
    --data = require(&amp;#039;Module:Goalscorers/data/&amp;#039;.. g.args[1]) --or &amp;#039;UEFA Euro 2016 qualifying&amp;#039; &lt;br /&gt;
   &lt;br /&gt;
    local goalMinimum = tonumber(g.args[&amp;#039;minimum&amp;#039;]) or -5  -- assume 5 own goals is maximum&lt;br /&gt;
    &lt;br /&gt;
    -- select all players with goals totals for appropriate rounds&lt;br /&gt;
    local round = g.args[&amp;#039;round&amp;#039;] or &amp;quot;all&amp;quot;    -- round =  all(empty)|group|playoffs&lt;br /&gt;
    local group = g.args[&amp;#039;group&amp;#039;] or &amp;quot;all&amp;quot;     -- group =  all(empty), A,B,C etc  &lt;br /&gt;
&lt;br /&gt;
    local goalsCol = p.getGoalsCol(round) -- 4          -- first column for goals&lt;br /&gt;
    --local groupCol =  3         -- default column for group&lt;br /&gt;
    if round then&lt;br /&gt;
    --	goalsCol = data.rounds[round] or data.rounds[1] or 4  -- get column containing goals for that round or first round listed if all&lt;br /&gt;
    end&lt;br /&gt;
    --groupCol = data.group[round] or 3    -- get column containing goals for that round&lt;br /&gt;
    &lt;br /&gt;
    -- select players who have scored in rounds/groups requested&lt;br /&gt;
    local goalscorerData = data.goalscorers&lt;br /&gt;
    if og == &amp;quot;OG&amp;quot; then goalscorerData = data.owngoalscorers end&lt;br /&gt;
    &lt;br /&gt;
    for k,v in pairs(goalscorerData) do&lt;br /&gt;
        local goals, comment = 0, &amp;quot;&amp;quot;                         -- goals &amp;gt; 0 is the flag to include the player&lt;br /&gt;
        local playerName, playerAlias = p.getPlayer(v[1])                -- player name&lt;br /&gt;
        local goalsByRound, commentByRound = 0, &amp;quot;&amp;quot;&lt;br /&gt;
		if round == &amp;quot;all&amp;quot; then                                                   -- all rounds and goals&lt;br /&gt;
		    --local i = 4&lt;br /&gt;
		    for i = goalsCol, #v, 1 do        --or while i &amp;lt;= #v do&lt;br /&gt;
		    	goalsByRound, commentByRound = p.getGoals( v[i] , playerName)&lt;br /&gt;
		    	goals = goals +   goalsByRound              --TODO use getGoals on round options&lt;br /&gt;
		    	if commentByRound ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			    	if comment == &amp;quot;&amp;quot; then&lt;br /&gt;
			    		comment = commentByRound &lt;br /&gt;
			    	else&lt;br /&gt;
			    		comment = comment .. &amp;quot;,&amp;quot; .. commentByRound  --TODO decide on comma or semi-colon&lt;br /&gt;
		    		end&lt;br /&gt;
	       		end&lt;br /&gt;
		    	i = i+1&lt;br /&gt;
		    end&lt;br /&gt;
		elseif round == &amp;quot;group&amp;quot; then                                          -- group round only&lt;br /&gt;
		    --if group == v[groupCol] then                             -- single group only &lt;br /&gt;
		    if group == p.getGroup(v[2], v[3]) then                         -- single group only &lt;br /&gt;
				goals, comment = p.getGoals( v[goalsCol] , playerName)&lt;br /&gt;
			elseif group == &amp;quot;all&amp;quot; then                                 -- any group&lt;br /&gt;
				goals, comment = p.getGoals( v[goalsCol] , playerName)&lt;br /&gt;
			else   -- do nothing for other groups&lt;br /&gt;
			end&lt;br /&gt;
		--elseif round == &amp;quot;playoffs&amp;quot; then                                   -- playoff round (redunant?)&lt;br /&gt;
		--	   goals = v[goalsCol]&lt;br /&gt;
		else                                                              -- any other round&lt;br /&gt;
			   goals, comment = p.getGoals( v[goalsCol] , playerName)        -- should also handle playoffs&lt;br /&gt;
	    end &lt;br /&gt;
	    if goals &amp;gt;= goalMinimum and goals ~= 0 then&lt;br /&gt;
	    	   if comment ~= &amp;quot;&amp;quot; then &lt;br /&gt;
	    	   	  if og == &amp;quot;OG&amp;quot; then &lt;br /&gt;
	    	   	  	comment = &amp;#039;&amp;lt;span&amp;gt; (&amp;#039; .. p.sortComment(comment) .. &amp;#039;)&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
	    	   	  else&lt;br /&gt;
	    	   	  	comment = &amp;#039;&amp;lt;span&amp;gt;&amp;#039; .. comment .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;   -- no parenthesis when using notes&lt;br /&gt;
	    	      end&lt;br /&gt;
	    	   end&lt;br /&gt;
	    	   &lt;br /&gt;
	    	   if og == &amp;quot;OG&amp;quot; then goals = -goals end  -- make owngoals negative numbers&lt;br /&gt;
	    	   &lt;br /&gt;
			   g.goalscorers[#g.goalscorers+1] = { player=playerName, alias=playerAlias,&lt;br /&gt;
			   	                                   country=v[2], &lt;br /&gt;
			   	                                   goals=goals, &lt;br /&gt;
			   	                                   comment=p.parseComment(comment)}&lt;br /&gt;
			   g.totalGoals = g.totalGoals + math.abs(goals)    -- increment total goal counter	                                  &lt;br /&gt;
	    end&lt;br /&gt;
    end&lt;br /&gt;
    --return p.goalscorers -- it is available anyway&lt;br /&gt;
end&lt;br /&gt;
--[[ get column for round or first round listed if &amp;quot;all&amp;quot; &lt;br /&gt;
      -allows group column to be omitted from player table when group table provided ]]&lt;br /&gt;
function p.getGoalsCol(round)&lt;br /&gt;
    &lt;br /&gt;
    if round == &amp;quot;all&amp;quot; then  -- if all need column of first round&lt;br /&gt;
       for k,v in pairs(data.rounds) do&lt;br /&gt;
       	  return v; -- return the first one&lt;br /&gt;
       end&lt;br /&gt;
    end&lt;br /&gt;
    return  data.rounds[round] or 4  -- get column containing goals for that round or first round listed if all&lt;br /&gt;
end&lt;br /&gt;
--[[ get group from group table or from player table     ]]&lt;br /&gt;
function p.getGroup(country, possibleGroup)             -- row contain player name, country code, group if given, goals&lt;br /&gt;
	if data.groups then&lt;br /&gt;
       for k,v in pairs(data.groups)  do  -- iterate through the groups&lt;br /&gt;
            --local = gotGroup = false&lt;br /&gt;
    		for j,u in pairs(v) do       -- for each group&lt;br /&gt;
    		   if u == country then&lt;br /&gt;
    		   	  return k&lt;br /&gt;
    		   end&lt;br /&gt;
    		end&lt;br /&gt;
    	end&lt;br /&gt;
        return &amp;quot;no group found&amp;quot;&lt;br /&gt;
    else &lt;br /&gt;
    	return possibleGroup -- no group table, so assume column three contains the group&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
--[[ get number of goals and any associated comment&lt;br /&gt;
      the goals can be a single number (the usual case)&lt;br /&gt;
        or as an option table (e.g. for own goals): { number of own goals, comma-delimited list of opponents }&lt;br /&gt;
    - if the entry is a table, we want the first entry (a number) and the second (comment string)&lt;br /&gt;
    - otherwise, if a number, we just want the number and an empty string&lt;br /&gt;
]]&lt;br /&gt;
function p.getGoals (u, player)&lt;br /&gt;
	if type(u) == &amp;#039;table&amp;#039; and type(u[1]) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return u[1], u[2]            -- return number of goals, comment&lt;br /&gt;
	elseif type(u) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return u, &amp;quot;&amp;quot;                 -- return number of goals, empty string&lt;br /&gt;
	else&lt;br /&gt;
		p.errorString = p.errorString .. &amp;quot; Invalid goals entry for player &amp;quot; .. player&lt;br /&gt;
		return 0, &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
function p.parseComment(comment)&lt;br /&gt;
	&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
&lt;br /&gt;
	-- we have something like &amp;quot;{{efn-ua|name=goals}}&amp;quot;&lt;br /&gt;
	if string.find(comment, &amp;quot;efn&amp;quot; , 1 , true ) then       -- if we have a comment with a note&lt;br /&gt;
		g.notes = true                                    -- set flag&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return frame:preprocess(comment)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getPlayer(u)&lt;br /&gt;
	if type(u) == &amp;#039;table&amp;#039;  then&lt;br /&gt;
		if type(u[1]) == &amp;#039;string&amp;#039; and type(u[2]) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			--[[if #u[2] &amp;gt;1 then &lt;br /&gt;
				p.errorString = p.errorString  .. &amp;quot;\n\nWe have u[1]=&amp;quot; .. u[1] .. &amp;quot; and u[2]=&amp;quot; .. u[2]&lt;br /&gt;
			end]]&lt;br /&gt;
			return u[1], u[2]            -- return player name, player sorting alias&lt;br /&gt;
		else&lt;br /&gt;
			p.errorString = p.errorString .. &amp;quot; Invalid name entry for player &amp;quot; .. u[1] .. &amp;quot;, &amp;quot; .. u[2] &lt;br /&gt;
			return &amp;quot;&amp;quot;, &amp;quot;&amp;quot;     --TODO errroer&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(u) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return u, &amp;quot;&amp;quot;                 -- return player name&lt;br /&gt;
	else&lt;br /&gt;
		p.errorString = p.errorString .. &amp;quot; Invalid name entry for player &amp;quot; .. u or u[1] or &amp;quot;unknown&amp;quot;&lt;br /&gt;
		return &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
--[=[ function p.preprocessSortName()&lt;br /&gt;
      stripp off wikitext [[ and ]]&lt;br /&gt;
      force to lowercase&lt;br /&gt;
      change special characters to standard letters&lt;br /&gt;
]=]&lt;br /&gt;
function p.preprocessSortName (name)&lt;br /&gt;
	name = string.gsub(name, &amp;quot;%[%[&amp;quot;, &amp;quot;&amp;quot;)              -- strip off [[ and ]]&lt;br /&gt;
	name = string.gsub(name, &amp;quot;%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    --name =string.lower(name)                          -- force lower case and return&lt;br /&gt;
    name = mw.ustring.lower(name)                       -- use unicode function&lt;br /&gt;
&lt;br /&gt;
	local specialChars = {                            -- list of special characters and replacement pairs&lt;br /&gt;
		                   { &amp;quot;ı&amp;quot;, &amp;quot;i&amp;quot; } , { &amp;quot;İ&amp;quot;, &amp;quot;i&amp;quot; } , { &amp;quot;ß&amp;quot;, &amp;quot;ss&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ý&amp;quot;, &amp;quot;y&amp;quot; } , { &amp;quot;ř&amp;quot;, &amp;quot;r&amp;quot; } , { &amp;quot;ő&amp;quot;, &amp;quot;o&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;é&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;è&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;þ&amp;quot;, &amp;quot;th&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ē&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;ņ&amp;quot;, &amp;quot;n&amp;quot; } , { &amp;quot;č&amp;quot;, &amp;quot;c&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ū&amp;quot;, &amp;quot;u&amp;quot; } , { &amp;quot;ž&amp;quot;, &amp;quot;z&amp;quot; } , { &amp;quot;æ&amp;quot;, &amp;quot;ae&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;å&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;ø&amp;quot;, &amp;quot;o&amp;quot; } , { &amp;quot;ą&amp;quot;, &amp;quot;a&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ń&amp;quot;, &amp;quot;n&amp;quot; } , { &amp;quot;ł&amp;quot;, &amp;quot;l&amp;quot; } , { &amp;quot;ã&amp;quot;, &amp;quot;a&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ș&amp;quot;, &amp;quot;s&amp;quot; } , { &amp;quot;š&amp;quot;, &amp;quot;s&amp;quot; } , { &amp;quot;í&amp;quot;, &amp;quot;i&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;á&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;ä&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;ć&amp;quot;, &amp;quot;c&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ç&amp;quot;, &amp;quot;c&amp;quot; } , { &amp;quot;ğ&amp;quot;, &amp;quot;g&amp;quot; } , { &amp;quot;ö&amp;quot;, &amp;quot;o&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ë&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;ú&amp;quot;, &amp;quot;u&amp;quot; } , { &amp;quot;ó&amp;quot;, &amp;quot;o&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ð&amp;quot;, &amp;quot;d&amp;quot; } , { &amp;quot;ü&amp;quot;, &amp;quot;u&amp;quot; } , { &amp;quot;ű&amp;quot;, &amp;quot;u&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ā&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;ī&amp;quot;, &amp;quot;i&amp;quot; } , { &amp;quot;đ&amp;quot;, &amp;quot;d&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ă&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;â&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;ż&amp;quot;, &amp;quot;z&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ț&amp;quot;, &amp;quot;t&amp;quot; } , { &amp;quot;ş&amp;quot;, &amp;quot;s&amp;quot; } , { &amp;quot;ś&amp;quot;, &amp;quot;s&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ǎ&amp;quot;, &amp;quot;a&amp;quot; } , { &amp;quot;ě&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;ů&amp;quot;, &amp;quot;u&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ĕ&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;ñ&amp;quot;, &amp;quot;n&amp;quot; } , { &amp;quot;ď&amp;quot;, &amp;quot;d&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ï&amp;quot;, &amp;quot;i&amp;quot; } , { &amp;quot;ź&amp;quot;, &amp;quot;z&amp;quot; } , { &amp;quot;ô&amp;quot;, &amp;quot;o&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ė&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;ľ&amp;quot;, &amp;quot;l&amp;quot; } , { &amp;quot;ģ&amp;quot;, &amp;quot;g&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ļ&amp;quot;, &amp;quot;l&amp;quot; } , { &amp;quot;ę&amp;quot;, &amp;quot;e&amp;quot; } , { &amp;quot;ň&amp;quot;, &amp;quot;n&amp;quot; },&lt;br /&gt;
		                   { &amp;quot;ò&amp;quot;, &amp;quot;o&amp;quot; }&lt;br /&gt;
                         }&lt;br /&gt;
    for k,v in pairs(specialChars) do                 -- replace special characters from supplied list&lt;br /&gt;
    	name = string.gsub(name, v[1], v[2])&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	return name                     &lt;br /&gt;
end&lt;br /&gt;
--[[ return the name for sorting &lt;br /&gt;
       return supplied alias name for sorting&lt;br /&gt;
       otherwise&lt;br /&gt;
          checks for pipe (redirect) and uses name after pipe&lt;br /&gt;
          splits name into words&lt;br /&gt;
             returns first name if only name (e.g. Nani)&lt;br /&gt;
             otherwise returns name in format second_name [.. last name], firstname&lt;br /&gt;
]]&lt;br /&gt;
function p.getPlayerSortName (playerName, sortName, countryName)&lt;br /&gt;
	&lt;br /&gt;
			--dewikify all names before sorting, also forces lowercase&lt;br /&gt;
	playerName = p.preprocessSortName(playerName)&lt;br /&gt;
	sortName = p.preprocessSortName(sortName)&lt;br /&gt;
	&lt;br /&gt;
	if sortName ~= &amp;quot;&amp;quot; then                           -- if we have a sort name supplied&lt;br /&gt;
		return sortName                              --            then return it&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- players from certain countries will use name in order supplied&lt;br /&gt;
	local noSort = { &amp;quot;CHN&amp;quot;, &amp;quot;TPE&amp;quot;, &amp;quot;MYA&amp;quot;, &amp;quot;PRK&amp;quot;, &amp;quot;KOR&amp;quot;, &amp;quot;VIE&amp;quot; }&lt;br /&gt;
	for k,v in pairs(noSort) do &lt;br /&gt;
		if v == countryName then&lt;br /&gt;
			return playerName&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	-- else work it out from the supplied player name&lt;br /&gt;
		&lt;br /&gt;
    -- we don&amp;#039;t want to test the name in a redirect, so get name after pipe if there is one&lt;br /&gt;
    if string.find (playerName, &amp;quot;|&amp;quot;) then                 -- test for redirect&lt;br /&gt;
      	local names = mw.text.split( playerName, &amp;quot;|&amp;quot;)    &lt;br /&gt;
       	playerName = names[2]                               -- get name after pipe&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local names = mw.text.split( playerName, &amp;quot; &amp;quot;) -- we don&amp;#039;t want to sort on first name&lt;br /&gt;
	&lt;br /&gt;
	if #names == 1 then&lt;br /&gt;
		return names[1]                             -- return name of single name player&lt;br /&gt;
	else&lt;br /&gt;
		-- we will assume the second name is the sort name e.g, Joe Bloggs, Jan van Bloggen&lt;br /&gt;
		local name = names[2]                   -- set name to second name e.g. Bloggs or van&lt;br /&gt;
		local i=3&lt;br /&gt;
		while i &amp;lt;= #names do                       -- any addition names e.g. Bloggen&lt;br /&gt;
			name= name .. names[i]&lt;br /&gt;
			i=i+1&lt;br /&gt;
		end&lt;br /&gt;
		name = name .. &amp;quot;, &amp;quot; .. names[1]           -- add first name e.g. Joe or Jan&lt;br /&gt;
		        &lt;br /&gt;
		return name                                -- sort on second name third name etc, first name	&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- sort the list of countries alphabetically&lt;br /&gt;
function p.sortComment(comment)&lt;br /&gt;
&lt;br /&gt;
	local items = mw.text.split( comment, &amp;quot;,&amp;quot;)         -- split comma-delimited list&lt;br /&gt;
&lt;br /&gt;
    for k,v in pairs(items) do &lt;br /&gt;
    	items[k] = mw.text.trim(v)                          -- trim spaces and coe&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	table.sort(items, function(a,b) return a&amp;lt;b end)         -- sort the table alphbetically&lt;br /&gt;
&lt;br /&gt;
	local list = &amp;quot;ضد &amp;quot;                    -- construct the alphabetical list string&lt;br /&gt;
	for i=1, #items do&lt;br /&gt;
		local sep =  &amp;quot;, &amp;quot;                              -- separator for comma-delimited list&lt;br /&gt;
		if i==1 then sep = &amp;quot;&amp;quot;                          -- first word doesn&amp;#039;t need comma&lt;br /&gt;
		elseif i==#items then sep = &amp;quot; &amp;amp; &amp;quot;            -- use &amp;quot;and&amp;quot; before last word&lt;br /&gt;
		end&lt;br /&gt;
		list = list .. sep .. items[i]&lt;br /&gt;
	end	&lt;br /&gt;
	return list&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
function p.getCountryName(country)&lt;br /&gt;
	&lt;br /&gt;
	if string.len(country) == 3 then      -- if the country given as a three-letter code&lt;br /&gt;
		local codes = require(&amp;#039;Module:Goalscorers/data/Country codes&amp;#039;)&lt;br /&gt;
	    &lt;br /&gt;
	    for k,v in pairs(codes.alias) do &lt;br /&gt;
    	   if v[1] == country then&lt;br /&gt;
    	   	   return v[2]&lt;br /&gt;
    	   end&lt;br /&gt;
        end&lt;br /&gt;
	else&lt;br /&gt;
	    return country                    -- return the country name as is&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
--[[ sort goalscorers by goals, country and name&lt;br /&gt;
        the sort first sorts by number of goals&lt;br /&gt;
        when these are equal, it sorts by country&lt;br /&gt;
        when these are equal, it sorts by name&lt;br /&gt;
        Note: the name sort is on the first name&lt;br /&gt;
               - a split of the name and sort on the last name is possible&lt;br /&gt;
               - however, this would be complicated by Dutch (e.g. Stefan de Vrij) and Spanish names&lt;br /&gt;
               - would sort on second name be better&lt;br /&gt;
]]&lt;br /&gt;
function p.sortGoalscorers()&lt;br /&gt;
    &lt;br /&gt;
    local sort_function = function( a,b )&lt;br /&gt;
		    if (a.goals &amp;gt; b.goals) then                -- primary sort on &amp;#039;goals&amp;#039; -&amp;gt; a before b&lt;br /&gt;
		        return true&lt;br /&gt;
		    elseif (a.goals &amp;lt; b.goals) then            -- primary sort on &amp;#039;goals&amp;#039; -&amp;gt; b before a&lt;br /&gt;
		        return false&lt;br /&gt;
		    else -- a.goals == b.goals 		           -- primary sort tied, &lt;br /&gt;
		        &lt;br /&gt;
		        --return a.country &amp;lt; b.country         -- resolve with secondary sort on &amp;#039;country&amp;#039;&lt;br /&gt;
			    local country_a = p.getCountryName(a.country)  -- sort on name of country, not the code&lt;br /&gt;
			    local country_b = p.getCountryName(b.country)&lt;br /&gt;
			    &lt;br /&gt;
			    if (country_a &amp;lt; country_b) then        -- secondary sort on &amp;#039;country&amp;#039;&lt;br /&gt;
			        return true&lt;br /&gt;
			    elseif (country_a &amp;gt; country_b) then    -- secondary sort on &amp;#039;country&amp;#039;&lt;br /&gt;
			        return false&lt;br /&gt;
			    else -- a.country == b.country 		   -- secondary sort tied, &lt;br /&gt;
&lt;br /&gt;
			        --return a.player &amp;lt; b.player         --resolve with tertiary sort on &amp;#039;player&amp;#039; name&lt;br /&gt;
                    &lt;br /&gt;
                    local player_a = p.getPlayerSortName(a.player, a.alias, a.country) -- get player name for sorting&lt;br /&gt;
                    local player_b = p.getPlayerSortName(b.player, b.alias, b.country)&lt;br /&gt;
                    &lt;br /&gt;
                    return player_a &amp;lt; player_b      -- &lt;br /&gt;
--[[]&lt;br /&gt;
                     --local test_a, test_b = a.player, b.player&lt;br /&gt;
&lt;br /&gt;
                   -- we don&amp;#039;t want to test the name in a redirect, so get name after pipe if there is one&lt;br /&gt;
                    if string.find (a.player, &amp;quot;|&amp;quot;) then                 -- test for redirect&lt;br /&gt;
                    	local names = mw.text.split( a.player, &amp;quot;|&amp;quot;)    &lt;br /&gt;
                    	test_a = names[2]                               -- get name after pipe&lt;br /&gt;
                    end&lt;br /&gt;
                    if string.find (b.player, &amp;quot;|&amp;quot;) then&lt;br /&gt;
                    	local names = mw.text.split( b.player, &amp;quot;|&amp;quot;)&lt;br /&gt;
                    	test_b = names[2]&lt;br /&gt;
                    end&lt;br /&gt;
                    &lt;br /&gt;
			        local names_a = mw.text.split( test_a, &amp;quot; &amp;quot;) -- we don&amp;#039;t want to sort on first name&lt;br /&gt;
			        local names_b = mw.text.split( test_b, &amp;quot; &amp;quot;) --     so split names &lt;br /&gt;
			        &lt;br /&gt;
			        if not names_a[2] then names_a[2] = test_a end -- for players with one name&lt;br /&gt;
			        if not names_b[2] then names_b[2] = test_b end&lt;br /&gt;
			        &lt;br /&gt;
			        return names_a[2] &amp;lt; names_b[2]      -- sort on second name&lt;br /&gt;
]]			        &lt;br /&gt;
			    end		        &lt;br /&gt;
		    end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
    table.sort(g.goalscorers, sort_function)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function   p.outputGoalscorers(frame, og) -- output list of goalscorers&lt;br /&gt;
    local outputString = &amp;quot;&amp;quot;	&lt;br /&gt;
    if og == &amp;quot;OG&amp;quot; then   end&lt;br /&gt;
&lt;br /&gt;
    -- ==============output the lists of goalscorers by goal======================&lt;br /&gt;
    local goalNumber = 1000&lt;br /&gt;
    --local goalMinimum = tonumber(templateArgs[&amp;#039;minimum&amp;#039;]) or 0&lt;br /&gt;
    &lt;br /&gt;
    local listOpen = false -- flag for list started by template {{Div Col}} &lt;br /&gt;
    &lt;br /&gt;
    for j,u in pairs(g.goalscorers) do    -- run through sorted list of selected goalscorers&lt;br /&gt;
    	&lt;br /&gt;
    	--if u[&amp;#039;goals&amp;#039;] &amp;lt; goalMinimum then break end -- limit list to goals over a threshold (now handled in select goalscorers)&lt;br /&gt;
    		&lt;br /&gt;
    	if u[&amp;#039;goals&amp;#039;] &amp;lt; goalNumber then         -- start new list of new number of goals&lt;br /&gt;
    		if listOpen then                    -- if an open list, close last list&lt;br /&gt;
    			outputString = outputString .. p.closeList(frame) &lt;br /&gt;
    			listOpen = false -- redundant as will be set true again&lt;br /&gt;
    		end&lt;br /&gt;
    		goalNumber = u[&amp;#039;goals&amp;#039;]&lt;br /&gt;
    		&lt;br /&gt;
    		local goalString = &amp;quot; هدف&amp;quot;&lt;br /&gt;
    		--if og == &amp;quot;OG&amp;quot; then 	&lt;br /&gt;
    		if goalNumber &amp;lt; 0 then&lt;br /&gt;
    			goalString = goalString .. &amp;quot; في مرماه&amp;quot; &lt;br /&gt;
    		end&lt;br /&gt;
    		if  math.abs(u[&amp;#039;goals&amp;#039;]) ~= 1 then goalString =  &amp;quot; أهداف&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    		outputString = outputString .. &amp;quot;\n&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. math.abs(u[&amp;#039;goals&amp;#039;]) .. goalString .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;   -- list caption&lt;br /&gt;
    		&lt;br /&gt;
    		outputString = outputString .. p.openList(frame,og) --start new list&lt;br /&gt;
    		listOpen = true&lt;br /&gt;
    		--goalNumber = u[&amp;#039;goals&amp;#039;]&lt;br /&gt;
    	end&lt;br /&gt;
    	-- is the player active still?&lt;br /&gt;
    	local playerActive = false&lt;br /&gt;
    	if data.active_countries then&lt;br /&gt;
    		for k,v in pairs(data.active_countries) do&lt;br /&gt;
    		  if v == u[&amp;#039;country&amp;#039;] then&lt;br /&gt;
    		  	playerActive = true&lt;br /&gt;
    		  	break;&lt;br /&gt;
    		  end&lt;br /&gt;
    		end&lt;br /&gt;
    	end&lt;br /&gt;
    	local _,roundStatus = p.getNumberMatches()&lt;br /&gt;
    	if roundStatus == &amp;quot;complete&amp;quot; then playerActive = false end  -- overrides active_countries&lt;br /&gt;
    	&lt;br /&gt;
    	-- wikitext for bullet list    &lt;br /&gt;
       	local goalscorerString = &amp;#039;\n*&amp;lt;span&amp;gt;&amp;#039; .. p.addLinkedIcon(frame, u[&amp;#039;country&amp;#039;])    -- linked flag icon    &lt;br /&gt;
    	if playerActive then&lt;br /&gt;
    		goalscorerString = goalscorerString  .. &amp;quot; &amp;lt;b&amp;gt;&amp;quot; .. u[&amp;#039;player&amp;#039;] .. &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;    -- bolded name&lt;br /&gt;
    	else&lt;br /&gt;
   		    goalscorerString = goalscorerString  .. &amp;quot; &amp;quot; .. u[&amp;#039;player&amp;#039;]                  -- name&lt;br /&gt;
    	end&lt;br /&gt;
    	goalscorerString = goalscorerString  .. u[&amp;#039;comment&amp;#039;]   .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;             -- comment for o.g.&lt;br /&gt;
    	                              &lt;br /&gt;
    	outputString = outputString .. goalscorerString   --  .. &amp;quot; &amp;quot; .. tostring(u[&amp;#039;goals&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
    end -- reached end of list of goalscorers&lt;br /&gt;
&lt;br /&gt;
	if outputString ~= &amp;quot;&amp;quot; then&lt;br /&gt;
	    outputString = outputString .. p.closeList(frame)&lt;br /&gt;
&lt;br /&gt;
		return outputString&lt;br /&gt;
	else&lt;br /&gt;
		return (&amp;quot;No goals matching requested criteria.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- output icon linked to national team page&lt;br /&gt;
function p.addLinkedIcon(frame, country)&lt;br /&gt;
	local icon = data.templates[&amp;#039;flag_icon_linked&amp;#039;]         -- fbicon etc set in data module&lt;br /&gt;
	local level = data.templates[&amp;#039;youth_level&amp;#039;]  or &amp;quot;&amp;quot;           -- parameter for youth level, ie under-21&lt;br /&gt;
    -- equivalent to  {{fbicon|country}}     &lt;br /&gt;
    local flagVariant = &amp;quot;&amp;quot;&lt;br /&gt;
    if data.templates.flagvar and data.templates.flagvar[country] then&lt;br /&gt;
    	flagVariant = data.templates.flagvar[country] &lt;br /&gt;
    end&lt;br /&gt;
    if level ~= &amp;quot;&amp;quot; then &lt;br /&gt;
    	return frame:expandTemplate{ title = icon , args = { level, country, flagVariant } }   &lt;br /&gt;
    else&lt;br /&gt;
    	return frame:expandTemplate{ title = icon , args = { country, flagVariant } }     -- flag icon&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
-- formatting of list under each number of goals&lt;br /&gt;
function p.openList(frame,og)&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;&amp;lt;div class=&amp;quot;div-col columns column-count column-count-3&amp;quot; style=&amp;quot;&amp;#039; &lt;br /&gt;
	         .. frame:expandTemplate{ title = &amp;#039;column-count&amp;#039;, args = {3} }  .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
function p.closeList(frame)&lt;br /&gt;
   return &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
function p.firstToUpper(str)&lt;br /&gt;
    return (str:gsub(&amp;quot;^%l&amp;quot;, string.upper))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- handles parameters bold, further, extra&lt;br /&gt;
function p.addAdditionHeaderText(text, dateUpdated)&lt;br /&gt;
    if g.args[&amp;#039;inlineref&amp;#039;] then&lt;br /&gt;
    	text = text .. g.args[&amp;#039;inlineref&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
    if g.args[&amp;#039;bold&amp;#039;] then&lt;br /&gt;
    	text = text .. &amp;quot; اللاعبون &amp;#039;&amp;#039;&amp;#039;بالخط العريض&amp;#039;&amp;#039;&amp;#039; لا يزالون نشطون في المنافسة.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if g.args[&amp;#039;further&amp;#039;] then&lt;br /&gt;
    	if text ~= &amp;quot;&amp;quot; then text = text .. &amp;quot; &amp;quot; end&lt;br /&gt;
    	text = text .. g.args[&amp;#039;further&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
    if g.args[&amp;#039;extra&amp;#039;] then&lt;br /&gt;
    	text = text .. &amp;quot;\n\n&amp;quot; .. g.args[&amp;#039;extra&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
--[[ use data supplied by template &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
--function p.list(frame)&lt;br /&gt;
function p.useTemplateData(frame)&lt;br /&gt;
    --getArgs(frame)&lt;br /&gt;
    &lt;br /&gt;
    --[[ {{{#if:{{{assists|}}}||There &lt;br /&gt;
                  {{#if:{{{ongoing|}}}|{{#ifexpr:{{{goals}}}=1|has|have}} been&lt;br /&gt;
                  |{{#ifexpr:{{{goals}}}=1|was|were}}}} {{{goals}}} &lt;br /&gt;
                  {{#ifexpr:{{{goals}}}=1|goal|goals}} scored{{#if:{{{players|}}}|&amp;amp;nbsp;by {{{players}}} &lt;br /&gt;
                  {{#ifexpr:{{{players}}}=1|player|different players}}&lt;br /&gt;
                  {{#if:{{{own goals|}}}|&amp;amp;nbsp;(with {{{own goals}}} of them credited as {{#ifexpr:{{{own goals}}}=1|an own goal|own goals}})|}}|}} in {{{matches}}} &lt;br /&gt;
                  {{#ifexpr:{{{matches}}}=1|match|matches}}, for an average of {{#expr:{{{goals}}}/{{{matches}}} round 2}} &lt;br /&gt;
                  {{#ifexpr:({{{goals}}}/{{{matches}}} round 2)=1|goal|goals}} per match&lt;br /&gt;
                  {{#if:{{{updated|}}}|&amp;amp;nbsp;(as of {{{updated}}})}}.}}{{#if:{{{bold|}}}|{{#if:{{{assists|}}}||&amp;amp;nbsp;}}&lt;br /&gt;
                  Players highlighted in &amp;#039;&amp;#039;&amp;#039;bold&amp;#039;&amp;#039;&amp;#039; are still active in the competition.&lt;br /&gt;
                  |}}{{#if:{{{further|}}}|{{#if:{{{assists|}}}||&amp;amp;nbsp;}}{{{further}}}|}}&lt;br /&gt;
                  {{#if:{{{extra|}}}|{{{extra}}}{{clear}}|}}&lt;br /&gt;
    --]]&lt;br /&gt;
    local statNumber = g.args[&amp;#039;goals&amp;#039;] or g.args[&amp;#039;assists&amp;#039;] or 0&lt;br /&gt;
    local matches = g.args[&amp;#039;matches&amp;#039;]&lt;br /&gt;
    local statType = &amp;quot;هدف&amp;quot;&lt;br /&gt;
    if g.args[&amp;#039;assists&amp;#039;] then statType = &amp;quot;مساعدة&amp;quot; end&lt;br /&gt;
    if g.args[&amp;#039;clean sheets&amp;#039;] then statType = &amp;quot;clean sheet&amp;quot; end&lt;br /&gt;
    local ongoing = g.args[&amp;#039;ongoing&amp;#039;]&lt;br /&gt;
    local text1 = &amp;quot;تسجيل&amp;quot;&lt;br /&gt;
    --if ongoing then text1 = &amp;quot;have been&amp;quot; end  &lt;br /&gt;
    local updateString = &amp;quot;&amp;quot;&lt;br /&gt;
    local averageString = &amp;quot;&amp;quot;&lt;br /&gt;
    if g.args[&amp;#039;goals&amp;#039;] and g.args[&amp;#039;matches&amp;#039;] then&lt;br /&gt;
    	averageString = string.format(&amp;quot;، بمتوسط %.3g هدف لكل مباراة&amp;quot;&lt;br /&gt;
    		, g.args[&amp;#039;goals&amp;#039;]/g.args[&amp;#039;matches&amp;#039;])&lt;br /&gt;
    end    &lt;br /&gt;
    if g.args[&amp;#039;update&amp;#039;] then&lt;br /&gt;
    	updateString = &amp;quot;&amp;amp;nbsp;(في &amp;quot; ..g.args[&amp;#039;updated&amp;#039;] .. &amp;quot;)&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local text = &amp;quot;&amp;quot;&lt;br /&gt;
    if g.args[&amp;#039;goals&amp;#039;] then&lt;br /&gt;
    	text = string.format(&amp;quot;تم تسجيل %s %d %ss scored%s.&amp;quot;, &lt;br /&gt;
    	                     statNumber, statType, averageString..updateString)&lt;br /&gt;
    end&lt;br /&gt;
    text = p.addAdditionHeaderText(text)  -- handles template parameters bold, further, extra&lt;br /&gt;
    &lt;br /&gt;
    --[[   {{#if:{{{30 goals|{{{30 assists|}}}}}}|&amp;#039;&amp;#039;&amp;#039;30 {{#if:{{{assists|}}}|assists|goals}}&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
                 &amp;lt;div class=&amp;quot;div-col columns column-count column-count-3&amp;quot; style=&amp;quot;{{column-count|3}}&amp;quot;&amp;gt;&lt;br /&gt;
                 {{#if:{{{assists|}}}|{{{30 assists}}}|{{{30 goals}}}}}&amp;lt;/div&amp;gt;|}}]]&lt;br /&gt;
    local output = &amp;quot;\n&amp;quot;&lt;br /&gt;
    local number = 30&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    while number &amp;gt; -4 do                   -- for the each goals/assists&lt;br /&gt;
    	&lt;br /&gt;
       local entry = g.args[number .. &amp;#039; goals&amp;#039;] or g.args[number .. &amp;#039; goal&amp;#039;]&lt;br /&gt;
                       or g.args[number .. &amp;#039; assists&amp;#039;] or g.args[number .. &amp;#039; assist&amp;#039;]&lt;br /&gt;
                       or g.args[number .. &amp;#039; clean sheets&amp;#039;] or g.args[number .. &amp;#039; clean sheet&amp;#039;]&lt;br /&gt;
                     &lt;br /&gt;
       if number &amp;lt; 0 then  &lt;br /&gt;
       	  entry = g.args[math.abs(number) .. &amp;#039; own goals&amp;#039;] or g.args[math.abs(number) .. &amp;#039; own goal&amp;#039;]&lt;br /&gt;
       	  statType = &amp;quot;هدف ذاتي&amp;quot;&lt;br /&gt;
       end&lt;br /&gt;
       local plural = &amp;quot;s&amp;quot;&lt;br /&gt;
       if number == 1 or number == -1 then plural = &amp;quot;&amp;quot;&lt;br /&gt;
       end&lt;br /&gt;
       &lt;br /&gt;
       if entry then                                    -- do we have goals/assists for this number&lt;br /&gt;
&lt;br /&gt;
    	 output = output .. &amp;quot;\n&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. tostring(math.abs(number)) .. &amp;quot; &amp;quot; .. statType .. plural .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;\n&amp;quot; &lt;br /&gt;
    	                 .. &amp;#039;&amp;lt;div class=&amp;quot;div-col columns column-count column-count-3&amp;quot; style=&amp;quot;&amp;#039; .. frame:expandTemplate{ title = &amp;quot;column-count&amp;quot;, args = {3} }  .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
    	                 .. &amp;quot;\n&amp;quot; .. entry .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
       &lt;br /&gt;
       number = number -1&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    --{{#if:{{{source|}}}|{{small|Source: {{{source}}}}}|}}&lt;br /&gt;
    local source = g.args[&amp;#039;source&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
    if source ~= &amp;quot;&amp;quot; then source = &amp;quot;&amp;lt;small&amp;gt;مرجع: &amp;quot; .. source .. &amp;quot;&amp;lt;/small&amp;gt;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    return text .. output .. source&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>عبد العزيز</name></author>
	</entry>
</feed>