Modul:Goalscorers: Perbedaan antara revisi
Konten dihapus Konten ditambahkan
Tidak ada ringkasan suntingan Tag: Pengembalian manual |
kTidak ada ringkasan suntingan |
||
(17 revisi perantara oleh 2 pengguna tidak ditampilkan) | |||
Baris 1: | Baris 1: | ||
require('strict'); |
|||
local data = {} |
|||
local yesno = require('Module:Yesno') |
|||
local p = {} |
|||
-- flag template |
|||
local g = {} -- for parameters with global scope in this module |
|||
data.templates = { flag_icon_linked = "fbicon" } |
|||
g.goalscorers = {} -- table where selected and sorted players will be place |
|||
g.args = {} |
|||
g.totalGoals = 0 |
|||
local data = {} -- module subpage data -- require('Module:Goalscorers/data/UEFA Euro 2016 qualifying'); |
|||
p.errorString = "" |
|||
-- date and matches played of latest update |
|||
function p.error_msg() |
|||
data.updated = { -- round, matches, update date |
|||
if p.errorString ~= "" then |
|||
group = { A = { 11, "complete" } }, -- First round |
|||
return '<span style="font-size:100%" class="error">' |
|||
secondround = { 157, "complete" }, |
|||
-- '<code style="color:inherit;border:inherit;padding:inherit;">|_template=</code>' |
|||
thirdround = { 0, "2021-06-15" }, |
|||
.. p.errorString .. '</span>'; |
|||
fourthround = { 0, "" } |
|||
end |
|||
} |
|||
end |
|||
-- data for goals scored held in module subpages, e.g. "Module:Goalscorers/data/UEFA Euro 2016 qualifying" |
|||
--[[ parameters containing data help in three tables |
|||
data.rounds = {} -- group, play-off |
|||
data.goalscorers = {} -- player, country, goals in each round) |
|||
data.owngoalscorers = {} -- player, country, goals in each round) |
|||
data.updated = {} -- date of latest update (month, day, year) |
|||
--]] |
|||
--[[ ############################ Parameter handing ############################### |
|||
data.groups = { -- DO NOT CHANGE THIS SECTION |
|||
this section is currently unused |
|||
A = { "IRN", "JPN", "KOR", "AUS", "QAT", "UAE", "KSA", "CHN", |
|||
will be used to take check parameters set in template |
|||
"IRQ", "SYR", "UZB", "LBN", "OMA", "KGZ", "JOR", "VIE", |
|||
]] |
|||
"PLE", "IND", "BHR", "THA", "TJK", "PRK", "PHI", "TPE", |
|||
"TKM", "MYA", "HKG", "YEM", "AFG", "MDV", "KUW", "IDN", |
|||
"SIN", "NEP", "MAS", "CAM", "MAC", "LAO", "BHU", "MNG", |
|||
"BAN", "GUM", "BRU", "TLS", "PAK", "SRI" } |
|||
} |
|||
local function getArgs(frame) |
|||
-- controls which teams are still active in qualifying, and therefore have their players bolded |
|||
local parents = mw.getCurrentFrame():getParent() |
|||
data.active_countries = { "IRN", "JPN", "KOR", "AUS", "UAE", "KSA", "CHN", "VIE", |
|||
"IRQ", "SYR", "OMA", "LBN" } |
|||
for k,v in pairs(parents.args) do |
|||
--check content |
|||
if v and v ~= "" then |
|||
g.args[k]=mw.text.trim(v) --parents.args[k] |
|||
end |
|||
end |
|||
for k,v in pairs(frame.args) do |
|||
--check content |
|||
if v and v ~= "" then |
|||
g.args[k]= mw.text.trim(v) --parents.args[k] |
|||
end |
|||
end |
|||
-- allow empty caption to blank default |
|||
--if parents.args['caption'] then templateArgs['caption'] = parents.args['caption'] end |
|||
end |
|||
--[[ ############################## Main function and other functions ###################### |
|||
-- rounds of competition |
|||
data.rounds = { group = 3, secondround = 4, thirdround = 5, fourthround = 6 } -- DO NOT CHANGE |
|||
p.main() - simple output of the data in the module in list form |
|||
-- all competition goalscorers |
|||
p.addIntroductorySentence() - menambah kalimat/paragraf pembuka jumlah gol dan rata-rata gol per pertandingan |
|||
data.goalscorers = { |
|||
p.addFooterSentence() - menambah catatan kaki |
|||
-- player name, country, goals in R1, goals in R2, goals in R3, goals in R4 |
|||
p.getNumberMatches() |
|||
-- Afghanistan |
|||
p.owngoals() - get own goals (no longer used?) |
|||
{"[[Zelfy Nazary]]", "AFG", 0, 1, 0, 0 }, |
|||
p._owngoals() - core functionality for p.owngoals() |
|||
{"[[Farshad Noor]]", "AFG", 0, 1, 0, 0 }, |
|||
]] |
|||
{"[[Omid Popalzay]]", "AFG", 0, 1, 0, 0 }, |
|||
function p.main(frame) |
|||
{"[[Amredin Sharifi]]", "AFG", 0, 1, 0, 0 }, |
|||
getArgs(frame) |
|||
{"[[Hossein Zamani]]", "AFG", 0, 1, 0, 0 }, |
|||
local dataTarget = g.args[1] or g.args['data'] |
|||
if dataTarget then |
|||
data = require('Module:Goalscorers/data/'.. dataTarget) --or 'UEFA Euro 2016 qualifying' |
|||
return p.useModuleData(frame) -- data on goals taken from module subpage |
|||
else |
|||
return p.useTemplateData(frame) -- data on goals/assists taken from template |
|||
end |
|||
end |
|||
function p.useModuleData(frame) |
|||
--p.goalscorers = {} -- table where selected and sorted players will be place |
|||
-- Australia |
|||
g.totalGoals = 0 |
|||
{"[[Martin Boyle]]", "AUS", 0, 1, 0, 0 }, |
|||
local ok = p.selectGoalscorers() -- selected goalscorers meeting round and group criteris |
|||
{"[[Mitchell Duke]]", "AUS", 0, 2, 0, 0 }, |
|||
{"[[Ajdin Hrustic]]", "AUS", 0, 1, 0, 0 }, |
|||
-- CHANGE: append own goals to list (data will now include goals and own goals (negative)) |
|||
{"[[Jackson Irvine]]", "AUS", 0, 3, 0, 0 }, |
|||
p.selectGoalscorers("OG") |
|||
{"[[Fran Karacic]]", "AUS", 0, 1, 0, 0 }, |
|||
{"[[Mathew Leckie]]", "AUS", 0, 4, 0, 0 }, |
|||
{"[[Jamie Maclaren]]", "AUS", 0, 5, 0, 0 }, |
|||
p.sortGoalscorers() -- sort selected goalscorers by number of goal, then country |
|||
{"[[Aaron Mooy]]", "AUS", 0, 1, 0, 0 }, |
|||
{"[[Trent Sainsbury]]", "AUS", 0, 1, 0, 0 }, |
|||
{"[[Harry Souttar]]", "AUS", 0, 6, 0, 0 }, |
|||
local outputString = p.addIntroductorySentence() .. p.outputGoalscorers(frame) .. p.addFooterSentence() |
|||
{"[[Adam Taggart]]", "AUS", 0, 3, 0, 0 }, |
|||
-- .. "" --TODO add intermediate heading? |
|||
-- .. p._owngoals(frame) -- output list of goalscorers |
|||
return p.error_msg() or outputString |
|||
end |
|||
function p.addIntroductorySentence() -- menambahkan teks/paragraf awal |
|||
local totalGoalString = "Sebanyak" .. g.totalGoals .. " telah dicetak." |
|||
local matches, dateUpdated = p.getNumberMatches() |
|||
local mdyFormat = yesno(g.args['mdy']) |
|||
local Date = require('Module:Date')._Date |
|||
local text = string.format("Sebanyak %s gol telah dicetak", mw.getLanguage('id'):formatNum(g.totalGoals)) |
|||
if matches then |
|||
local average = g.totalGoals/tonumber(matches) -- menghitung rata-rata gol |
|||
local precision = 3 -- presisi dua angka dibelakang koma |
|||
if average < 1 then precision = 2 end -- presisi satu angka dibelakang koma |
|||
average = string.format(" dengan rata-rata %."..precision.."g gol per pertandingan", average) |
|||
text = text .. string.format(" pada %d pertandingan, %s", matches, average) |
|||
end |
|||
if dateUpdated == 'complete' or dateUpdated == "" then |
|||
text = text .. "." |
|||
else |
|||
local dateFormat = 'dmy' -- default |
|||
if data.params and data.params['date_format'] then dateFormat = data.params['date_format'] end -- from data module |
|||
if mdyFormat == true then dateFormat = "mdy" else |
|||
if mdyFormat == false then dateFormat = "dmy" end -- template param overrides |
|||
end |
|||
text = text .. " (per " .. Date(dateUpdated):text(dateFormat) .. ")." |
|||
end |
|||
text = p.addAdditionHeaderText(text, dateUpdated) -- handles template parameters bold, further, extra |
|||
return text --totalGoalString |
|||
-- Bahrain |
|||
end |
|||
{"[[Ismail Abdullatif]]", "BHR", 0, 3, 0, 0 }, |
|||
function p.addFooterSentence() -- menambahkan teks akhir/catatan kaki |
|||
{"[[Kamil Al Aswad]]", "BHR", 0, 4, 0, 0 }, |
|||
{"[[Mohammed Al-Hardan]]", "BHR", 0, 1, 0, 0 }, |
|||
local footerSentence = g.args['footer'] or "" |
|||
{"[[Mohamed Al-Romaihi]]", "BHR", 0, 1, 0, 0 }, |
|||
--footerSentence = "This is a footer sentence." -- test footer |
|||
{"[[Jasim Al-Shaikh]]", "BHR", 0, 1, 0, 0 }, |
|||
if data.params then |
|||
{"[[Hashim Sayed Isa]]", "BHR", 0, 2, 0, 0 }, |
|||
local footer = data.params['footer'] or nil |
|||
{"[[Ali Madan]]", "BHR", 0, 2, 0, 0 }, |
|||
if footer then |
|||
{"[[Sayed Dhiya Saeed]]", "BHR", 0, 1, 0, 0 }, |
|||
local frame = mw.getCurrentFrame() |
|||
local processed = frame:preprocess(footer) |
|||
if g.notes then |
|||
footerSentence = footerSentence .. processed |
|||
end |
|||
end |
|||
end |
|||
if footerSentence ~= "" then |
|||
footerSentence = '<div style = "" >' .. footerSentence .. '</div>' |
|||
end |
|||
return footerSentence |
|||
end |
|||
function p.getNumberMatches() |
|||
local matches = g.args['matches'] |
|||
local dateUpdated = data.updated['date'] or "1700-01-01" --'complete' -- assume completed if missing |
|||
--local round = g.args['round'] or "all" -- round = all(empty)|group|playoffs |
|||
--local group = g.args['group'] or "all" -- group = all(empty), A,B,C etc |
|||
local round, group = p.getRoundAndGroup() |
|||
local allGroupGames = 0 |
|||
local latestGroupDate = "1800-01-01" |
|||
if group and (round == "all" or group == "all") then -- count all the group games |
|||
for k,v in pairs(data.updated.group) do |
|||
allGroupGames = allGroupGames + v[1] |
|||
if v[2] ~= "complete" and v[2] > latestGroupDate then latestGroupDate = v[2] end -- update if later date |
|||
end |
|||
if latestGroupDate == "1800-01-01" then latestGroupDate = "complete" end -- no dates so must be complete |
|||
end |
|||
if group and (round == "all" and group ~= "all") then -- for totals of all rounds with only one group |
|||
allGroupGames = data.updated.group[group][1] -- number matches |
|||
latestGroupDate = data.updated.group[group][2] -- update date or completed |
|||
end |
|||
if round == "all" then -- all rounds and goals |
|||
matches=0 |
|||
for k,v in pairs(data.updated) do |
|||
if k == "group" then |
|||
matches = matches + allGroupGames |
|||
if latestGroupDate ~= "complete" and latestGroupDate > dateUpdated then |
|||
dateUpdated = latestGroupDate -- update if later date |
|||
end |
|||
elseif p.validateRound(k) then |
|||
matches = matches + v[1] |
|||
if v[2] ~= "complete" and v[2] > dateUpdated then dateUpdated = v[2] end -- update if later date |
|||
end |
|||
end |
|||
elseif round == "group" then -- group round only |
|||
if group == "all" then |
|||
matches = allGroupGames |
|||
dateUpdated = latestGroupDate |
|||
else -- single group only |
|||
matches = data.updated.group[group][1] -- number matches |
|||
dateUpdated = data.updated.group[group][2] -- update date or completed |
|||
end |
|||
else -- any other round |
|||
matches = data.updated[round][1] -- number matches |
|||
dateUpdated = data.updated[round][2] -- update date or completed |
|||
end |
|||
if dateUpdated == "1700-01-01" then dateUpdated = "complete" end -- no dates so must be complete |
|||
return matches, dateUpdated |
|||
-- Bangladesh |
|||
end |
|||
{"[[Biplu Ahmed]]", "BAN", 0, 1, 0, 0 }, |
|||
{"[[Topu Barman]]", "BAN", 0, 1, 0, 0 }, |
|||
{"[[Robiul Hasan]]", "BAN", 1, 0, 0, 0 }, |
|||
{"[[Saad Uddin]]", "BAN", 0, 1, 0, 0 }, |
|||
function p.owngoals(frame) -- need to check parameters if external call |
|||
-- Bhutan |
|||
getArgs(frame) |
|||
{"[[Tshering Dorji]]", "BHU", 1, 0, 0, 0 }, |
|||
data = require('Module:Goalscorers/data/'.. g.args[1]) --or 'UEFA Euro 2016 qualifying' |
|||
local outputString = p._owngoals(frame) |
|||
-- Brunei |
|||
return p.error_msg() or outputString |
|||
{"[[Razimie Ramlli]]", "BRU", 2, 0, 0, 0 }, |
|||
end |
|||
function p._owngoals(frame) -- internal call for own goals |
|||
--p.goalscorers = {} -- table where selected and sorted players will be place |
|||
-- Cambodia |
|||
{"[[Keo Sokpheng]]", "CAM", 0, 1, 0, 0 }, |
|||
p.selectGoalscorers("OG") -- selected goalscorers meeting round and group criteris |
|||
{"[[Kouch Sokumpheak]]", "CAM", 1, 0, 0, 0 }, |
|||
{"[[Reung Bunheing]]", "CAM", 1, 0, 0, 0 }, |
|||
p.sortGoalscorers() -- sort selected goalscorers by number of goal, then country |
|||
{"[[Sath Rosib]]", "CAM", 1, 0, 0, 0 }, |
|||
{"[[Sieng Chanthea]]", "CAM", 1, 0, 0, 0 }, |
|||
{"[[Soeuy Visal]]", "CAM", 0, 1, 0, 0 }, |
|||
-- China PR |
|||
{"[[Alan Carvalho|Alan]]", "CHN", 0, 3, 0, 0 }, |
|||
{"[[Elkeson]]", "CHN", 0, 4, 0, 0 }, |
|||
{"[[Jin Jingdao]]", "CHN", 0, 1, 0, 0 }, |
|||
{"[[Liu Binbin]]", "CHN", 0, 1, 0, 0 }, |
|||
{"[[Tan Long]]", "CHN", 0, 1, 0, 0 }, |
|||
{"[[Wu Lei]]", "CHN", 0, 8, 0, 0 }, |
|||
{"[[Wu Xi (footballer)|Wu Xi]]","CHN", 0, 3, 0, 0 }, |
|||
{"[[Wu Xinghan]]", "CHN", 0, 1, 0, 0 }, |
|||
{"[[Yang Xu]]", "CHN", 0, 5, 0, 0 }, |
|||
{"[[Zhang Xizhe]]", "CHN", 0, 1, 0, 0 }, |
|||
{"[[Zhang Yuning (footballer, born 1997)|Zhang Yuning]]", "CHN", 0, 2, 0, 0 }, |
|||
return p.outputGoalscorers(frame, "OG") -- output list of goalscorers |
|||
-- Chinese Taipei |
|||
{"[[Chen Yi-wei]]", "TPE", 0, 1, 0, 0 }, |
|||
{"[[Gao Wei-jie]]", "TPE", 0, 1, 0, 0 }, |
|||
{"[[Wen Chih-hao]]", "TPE", 0, 1, 0, 0 }, |
|||
{"[[Wu Chun-ching]]", "TPE", 0, 1, 0, 0 }, |
|||
end |
|||
-- Guam |
|||
{"[[Jason Cunliffe]]", "GUM", 3, 0, 0, 0 }, |
|||
{"[[Isiah Lagutang]]", "GUM", 1, 0, 0, 0 }, |
|||
{"[[Marcus Lopez]]", "GUM", 0, 1, 0, 0 }, |
|||
{"[[Shane Malcolm]]", "GUM", 1, 0, 0, 0 }, |
|||
{"[[John Matkin]]", "GUM", 0, 1, 0, 0 }, |
|||
function p.validateRound(round) |
|||
-- Hong Kong |
|||
{"[[James Ha]]", "HKG", 0, 1, 0, 0 }, |
|||
local validateRound = false |
|||
{"[[Matt Orr]]", "HKG", 0, 1, 0, 0 }, |
|||
{"[[Roberto Orlando Affonso Júnior|Roberto]]", "HKG", 0, 1, 0, 0 }, |
|||
for k,v in pairs(data.rounds) do |
|||
{"[[Tan Chun Lok]]", "HKG", 0, 1, 0, 0 }, |
|||
if k == round then validateRound = true end -- data for this round exists |
|||
end |
|||
return validateRound |
|||
end |
|||
--[[ ############################## functions to select goalscorers ###################### |
|||
-- India |
|||
{"[[Sunil Chhetri]]", "IND", 0, 3, 0, 0 }, |
|||
p.selectGoalscorers() - select goals scoreers required for list (rounds, groups) |
|||
{"[[Seiminlen Doungel]]", "IND", 0, 1, 0, 0 }, |
|||
{"[[Adil Khan (footballer)|Adil Khan]]", "IND", 0, 1, 0, 0 }, |
|||
p.getRoundAndGroup() |
|||
p.getGoalsCol(round) - get column containing round data or first data column if round = all |
|||
(country, possibleGroup) |
|||
p.getGoals (u, player) |
|||
p.parseComment(comment) |
|||
p.getPlayer(u) |
|||
]] |
|||
--[[ p.selectGoalscorers() |
|||
- select players meeting round and group criteria from goalscoreres list |
|||
- gets goals and comments |
|||
]] |
|||
function p.selectGoalscorers(og) |
|||
local round, group = p.getRoundAndGroup() |
|||
-- Indonesia |
|||
{"[[Irfan Bachdim]]", "IDN", 0, 1, 0, 0 }, |
|||
if not round then return false end -- exit if no valid round |
|||
{"[[Evan Dimas]]", "IDN", 0, 1, 0, 0 }, |
|||
{"[[Beto Gonçalves]]", "IDN", 0, 2, 0, 0 }, |
|||
local goalMinimum = tonumber(g.args['minimum']) or -5 -- assume 5 own goals is maximum |
|||
{"[[I Kadek Agung Widnyana]]", "IDN", 0, 1, 0, 0 }, |
|||
local goalsCol = p.getGoalsCol(round) -- first column for goals |
|||
-- select players who have scored in rounds/groups requested |
|||
local goalscorerData = data.goalscorers |
|||
if og == "OG" then goalscorerData = data.owngoalscorers end |
|||
for k,v in pairs(goalscorerData) do |
|||
local goals, comment = 0, "" -- goals > 0 is the flag to include the player |
|||
local playerName, playerAlias = p.getPlayer(v[1]) -- player name |
|||
local goalsByRound, commentByRound = 0, "" |
|||
if round == "all" then -- goals in all rounds and all groups |
|||
for i = goalsCol, #v, 1 do |
|||
if group and group ~= "all" and i == p.getGoalsCol("group") and group ~= p.getGroup(v[2], v[3]) then |
|||
goalsByRound = 0 |
|||
commentByRound = "" |
|||
else |
|||
goalsByRound, commentByRound = p.getGoals( v[i] , playerName) |
|||
end |
|||
goals = goals + goalsByRound --TODO use getGoals on round options |
|||
if commentByRound ~= "" then |
|||
if comment == "" then |
|||
comment = commentByRound |
|||
else |
|||
comment = comment .. "," .. commentByRound --TODO decide on comma or semi-colon |
|||
end |
|||
end |
|||
i = i+1 |
|||
end |
|||
elseif round == "all2" and group ~= "all" then -- goals in all rounds but only from one group |
|||
--TODO code to go through all rounds but only include goals in specified group [TODO merge with above option] |
|||
--mw.addWarning( g.args[1] .. ":Mix:round=all and group=" .. group .. "/" .. p.getGroup(v[2], v[3] ) ) |
|||
for i = goalsCol, #v, 1 do |
|||
if i == p.getGoalsCol("group") and group ~= p.getGroup(v[2], v[3]) then |
|||
goalsByRound = 0 |
|||
commentByRound = "" |
|||
else |
|||
goalsByRound, commentByRound = p.getGoals( v[i] , playerName) |
|||
end |
|||
goals = goals + goalsByRound |
|||
if commentByRound ~= "" then |
|||
if comment == "" then |
|||
comment = commentByRound |
|||
else |
|||
comment = comment .. "," .. commentByRound --TODO decide on comma or semi-colon |
|||
end |
|||
end |
|||
i = i+1 |
|||
end |
|||
elseif round == "group" then -- group round only |
|||
if group == p.getGroup(v[2], v[3]) then -- single group only |
|||
goals, comment = p.getGoals( v[goalsCol] , playerName) |
|||
elseif group == "all" then -- any group |
|||
goals, comment = p.getGoals( v[goalsCol] , playerName) |
|||
else |
|||
-- do nothing for other groups |
|||
end |
|||
--elseif round == "playoffs" then -- playoff round (redunant?) |
|||
-- goals = v[goalsCol] |
|||
else -- any other round |
|||
goals, comment = p.getGoals( v[goalsCol] , playerName) -- should also handle playoffs |
|||
end |
|||
if goals >= goalMinimum and goals ~= 0 then |
|||
if comment ~= "" then |
|||
if og == "OG" then |
|||
comment = '<span> (' .. p.sortComment(comment) .. ')</span>' |
|||
else |
|||
comment = '<span>' .. comment .. '</span>' -- no parenthesis when using notes |
|||
end |
|||
end |
|||
if og == "OG" then goals = -goals end -- make owngoals negative numbers |
|||
g.goalscorers[#g.goalscorers+1] = { player=playerName, alias=playerAlias, |
|||
country=v[2], |
|||
goals=goals, |
|||
comment=p.parseComment(comment)} |
|||
--g.totalGoals = g.totalGoals + math.abs(goals) -- increment total goal counter |
|||
end |
|||
g.totalGoals = g.totalGoals + math.abs(goals) -- increment total goal counter |
|||
end |
|||
return true -- data collected for selected goalscorers |
|||
end |
|||
--[[ p.getRoundAndGroup() |
|||
]] |
|||
function p.getRoundAndGroup() |
|||
local round = g.args['round'] or "all" -- round = all(empty)|group|playoffs |
|||
local group = g.args['group'] or "all" -- group = all(empty), A,B,C etc |
|||
local validateRound = false |
|||
-- Iran |
|||
local validateGroupRound = false |
|||
{"[[Vahid Amiri]]", "IRN", 0, 1, 0, 0 }, |
|||
for k,v in pairs(data.rounds) do |
|||
{"[[Karim Ansarifard]]", "IRN", 0, 7, 0, 0 }, |
|||
if k == round then validateRound = true end -- data for this round exists |
|||
{"[[Sardar Azmoun]]", "IRN", 0, 7, 0, 0 }, |
|||
if k == "group" then validateGroupRound = true end -- there is a group round |
|||
{"[[Mehdi Ghayedi]]", "IRN", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Ali Gholizadeh]]", "IRN", 0, 1, 0, 0 }, |
|||
if validateRound == false and round ~= "all" then |
|||
{"[[Alireza Jahanbakhsh]]", "IRN", 0, 1, 0, 0 }, |
|||
local message = 'Invalid round "' .. round .. '" specified. No data found for that round. ' |
|||
{"[[Hossein Kanaanizadegan]]", "IRN", 0, 1, 0, 0 }, |
|||
mw.addWarning( message ) |
|||
{"[[Shojae Khalilzadeh]]", "IRN", 0, 1, 0, 0 }, |
|||
p.errorString = p.errorString .. message |
|||
{"[[Mehrdad Mohammadi]]", "IRN", 0, 1, 0, 0 }, |
|||
round = nil |
|||
{"[[Milad Mohammadi]]", "IRN", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Mohammad Mohebi]]", "IRN", 0, 2, 0, 0 }, |
|||
if validateGroupRound == false then group = false end -- there is no group round |
|||
{"[[Ahmad Nourollahi]]", "IRN", 0, 2, 0, 0 }, |
|||
-- TODO add group error checking |
|||
{"[[Morteza Pouraliganji]]", "IRN", 0, 1, 0, 0 }, |
|||
-- Could merge with getGoalsCol() and also return goalsCol |
|||
{"[[Kaveh Rezaei]]", "IRN", 0, 2, 0, 0 }, |
|||
return round, group |
|||
{"[[Mehdi Taremi]]", "IRN", 0, 3, 0, 0 }, |
|||
end |
|||
--[[ p.getGoalsCol(round) |
|||
-- Iraq |
|||
- get column containing round data or first data column if round = "all" |
|||
{"[[Alaa Abbas]]", "IRQ", 0, 1, 0, 0 }, |
|||
- allows group column to be omitted from player table when group table provided |
|||
{"[[Mohanad Ali]]", "IRQ", 0, 5, 0, 0 }, |
|||
]] |
|||
{"[[Amjad Attwan]]", "IRQ", 0, 1, 0, 0 }, |
|||
function p.getGoalsCol(round) |
|||
{"[[Ibrahim Bayesh]]", "IRQ", 0, 1, 0, 0 }, |
|||
{"[[Safaa Hadi]]", "IRQ", 0, 1, 0, 0 }, |
|||
{"[[Ahmad Ibrahim Khalaf]]","IRQ", 0, 1, 0, 0 }, |
|||
{"[[Ali Adnan Kadhim]]", "IRQ", 0, 2, 0, 0 }, |
|||
{"[[Bashar Resan]]", "IRQ", 0, 1, 0, 0 }, |
|||
local minimum = 1000 |
|||
if round == "all" then -- if all need column of first round |
|||
{"[[Takuma Asano]]", "JPN", 0, 3, 0, 0 }, |
|||
for k,v in pairs(data.rounds) do |
|||
{"[[Wataru Endo]]", "JPN", 0, 1, 0, 0 }, |
|||
if v < minimum then minimum = v end |
|||
{"[[Kyogo Furuhashi]]", "JPN", 0, 3, 0, 0 }, |
|||
--return v -- return the first one [this seemed to work reliably, but sometimes table order is not as listed] |
|||
{"[[Sho Inagaki]]", "JPN", 0, 2, 0, 0 }, |
|||
end |
|||
{"[[Ko Itakura]]", "JPN", 0, 1, 0, 0 }, |
|||
return minimum |
|||
{"[[Junya Ito (footballer, born 1993)|Junya Ito]]", "JPN", 0, 2, 0, 0 }, |
|||
end |
|||
{"[[Genki Haraguchi]]", "JPN", 0, 1, 0, 0 }, |
|||
if data.rounds and data.rounds[round] then |
|||
{"[[Kento Hashimoto]]", "JPN", 0, 1, 0, 0 }, |
|||
return data.rounds[round] -- get column containing goals for that round |
|||
{"[[Daichi Kamada]]", "JPN", 0, 3, 0, 0 }, |
|||
else |
|||
{"[[Hayao Kawabe]]", "JPN", 0, 1, 0, 0 }, |
|||
return 4 -- an old default when no data.round (may not be necessary) |
|||
{"[[Takumi Minamino]]", "JPN", 0, 9, 0, 0 }, |
|||
end |
|||
{"[[Hidemasa Morita]]", "JPN", 0, 2, 0, 0 }, |
|||
end |
|||
{"[[Kensuke Nagai]]", "JPN", 0, 1, 0, 0 }, |
|||
--[[ p.getGroup(country, possibleGroup) |
|||
{"[[Yuto Nagatomo]]", "JPN", 0, 1, 0, 0 }, |
|||
- get group from group table or from player table |
|||
{"[[Shoya Nakajima]]", "JPN", 0, 1, 0, 0 }, |
|||
- possibleGroup is the column containing the Group (when no group table) or the first data column |
|||
{"[[Ado Onaiwu]]", "JPN", 0, 3, 0, 0 }, |
|||
]] |
|||
{"[[Yuya Osako]]", "JPN", 0, 8, 0, 0 }, |
|||
function p.getGroup(country, possibleGroup) -- row contain player name, country code, group if given, goals |
|||
{"[[Sho Sasaki (footballer)|Sho Sasaki]]", "JPN", 0, 1, 0, 0 }, |
|||
if data.groups then |
|||
{"[[Maya Yoshida]]", "JPN", 0, 1, 0, 0 }, |
|||
for k,v in pairs(data.groups) do -- iterate through the groups |
|||
--local = gotGroup = false |
|||
for j,u in pairs(v) do -- for each group |
|||
if u == country then |
|||
return k |
|||
end |
|||
end |
|||
end |
|||
return "no group found" |
|||
else |
|||
return possibleGroup -- no group table, so assume column three contains the group |
|||
end |
|||
end |
|||
--[[ get number of goals and any associated comment |
|||
the goals can be a single number (the usual case) |
|||
or as an option table (e.g. for own goals): { number of own goals, comma-delimited list of opponents } |
|||
- if the entry is a table, we want the first entry (a number) and the second (comment string) |
|||
- otherwise, if a number, we just want the number and an empty string |
|||
]] |
|||
function p.getGoals (u, player) |
|||
if type(u) == 'table' and type(u[1]) == 'number' then |
|||
return u[1], u[2] -- return number of goals, comment |
|||
elseif type(u) == 'number' then |
|||
return u, "" -- return number of goals, empty string |
|||
else |
|||
p.errorString = p.errorString .. " Invalid goals entry for player " .. player |
|||
return 0, "" |
|||
end |
|||
end |
|||
function p.parseComment(comment) |
|||
local frame = mw.getCurrentFrame() |
|||
-- we have something like "{{efn-ua|name=goals}}" |
|||
-- Jordan |
|||
if string.find(comment, "efn" , 1 , true ) then -- if we have a comment with a note |
|||
{"[[Salem Al-Ajalin]]", "JOR", 0, 1, 0, 0 }, |
|||
g.notes = true -- set flag |
|||
{"[[Yazan Al-Arab]]", "JOR", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Hamza Al-Dardour]]", "JOR", 0, 1, 0, 0 }, |
|||
{"[[Ahmad Ersan]]", "JOR", 0, 2, 0, 0 }, |
|||
{"[[Baha' Faisal]]", "JOR", 0, 6, 0, 0 }, |
|||
return frame:preprocess(comment) |
|||
{"[[Ahmed Samir (footballer, born 1991)|Ahmed Samir]]", "JOR", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Feras Shelbaieh]]", "JOR", 0, 1, 0, 0 }, |
|||
function p.getPlayer(u) |
|||
-- Kuwait |
|||
if type(u) == 'table' then |
|||
{"[[Redha Abujabarah]]", "KUW", 0, 1, 0, 0 }, |
|||
if type(u[1]) == 'string' and type(u[2]) == 'string' then |
|||
{"[[Faisal Ajab Al-Azemi|Faisal Ajab]]", "KUW", 0, 1, 0, 0 }, |
|||
--[[if #u[2] >1 then |
|||
{"[[Fahad Al Ansari]]", "KUW", 0, 1, 0, 0 }, |
|||
p.errorString = p.errorString .. "\n\nWe have u[1]=" .. u[1] .. " and u[2]=" .. u[2] |
|||
{"[[Mobarak Al-Faneeni]]", "KUW", 0, 1, 0, 0 }, |
|||
end]] |
|||
{"[[Fahad Al Hajeri]]", "KUW", 0, 1, 0, 0 }, |
|||
return u[1], u[2] -- return player name, player sorting alias |
|||
{"[[Shabib Al-Khaldi]]", "KUW", 0, 1, 0, 0 }, |
|||
else |
|||
{"[[Hussain Al-Musawi]]", "KUW", 0, 1, 0, 0 }, |
|||
p.errorString = p.errorString .. " Invalid name entry for player " .. u[1] .. ", " .. u[2] |
|||
{"[[Bader Al-Mutawa]]", "KUW", 0, 3, 0, 0 }, |
|||
return "", "" --TODO errroer |
|||
{"[[Abdullah Mawei]]", "KUW", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Yousef Nasser]]", "KUW", 0, 6, 0, 0 }, |
|||
elseif type(u) == 'string' then |
|||
{"[[Faisal Zayid]]", "KUW", 0, 1, 0, 0 }, |
|||
return u, "" -- return player name |
|||
else |
|||
p.errorString = p.errorString .. " Invalid name entry for player " .. u or u[1] or "unknown" |
|||
return "", "" |
|||
end |
|||
end |
|||
--[[ ############################## functions to sort goalscorers ###################### |
|||
-- Kyrgyzstan |
|||
p.preprocessSortName (name) |
|||
{"[[Gulzhigit Alykulov]]", "KGZ", 0, 3, 0, 0 }, |
|||
p.getPlayerSortName (playerName, sortName, countryName) |
|||
{"[[Edgar Bernhardt]]", "KGZ", 0, 3, 0, 0 }, |
|||
p.sortComment(comment) |
|||
{"[[Abay Bokoleyev]]", "KGZ", 0, 1, 0, 0 }, |
|||
p.getCountryName(country) |
|||
{"[[Tamirlan Kozubaev]]", "KGZ", 0, 1, 0, 0 }, |
|||
p.sortGoalscorers() -- the main sort funtion |
|||
{"[[Valery Kichin]]", "KGZ", 0, 1, 0, 0 }, |
|||
]] |
|||
{"[[Mirlan Murzaev]]", "KGZ", 0, 5, 0, 0 }, |
|||
--[=[ function p.preprocessSortName() |
|||
{"[[Farhat Musabekov]]", "KGZ", 0, 1, 0, 0 }, |
|||
stripp off wikitext [[ and ]] |
|||
{"[[Tursunali Rustamov]]", "KGZ", 0, 1, 0, 0 }, |
|||
force to lowercase |
|||
{"[[Alimardon Shukurov]]", "KGZ", 0, 3, 0, 0 }, |
|||
change special characters to standard letters |
|||
]=] |
|||
function p.preprocessSortName (name) |
|||
name = string.gsub(name, "%[%[", "") -- strip off [[ and ]] |
|||
name = string.gsub(name, "%]%]", "") |
|||
--name =string.lower(name) -- force lower case and return |
|||
name = mw.ustring.lower(name) -- use unicode function |
|||
local specialChars = { -- list of special characters and replacement pairs |
|||
-- Laos |
|||
{ "ı", "i" } , { "İ", "i" } , { "ß", "ss" }, |
|||
{ "ý", "y" } , { "ř", "r" } , { "ő", "o" }, |
|||
{ "é", "e" } , { "è", "e" } , { "þ", "th" }, |
|||
{ "ē", "e" } , { "ņ", "n" } , { "č", "c" }, |
|||
{ "ū", "u" } , { "ž", "z" } , { "æ", "ae" }, |
|||
{ "å", "a" } , { "ø", "o" } , { "ą", "a" }, |
|||
{ "ń", "n" } , { "ł", "l" } , { "ã", "a" }, |
|||
{ "ș", "s" } , { "š", "s" } , { "í", "i" }, |
|||
{ "á", "a" } , { "ä", "a" } , { "ć", "c" }, |
|||
{ "ç", "c" } , { "ğ", "g" } , { "ö", "o" }, |
|||
{ "ë", "e" } , { "ú", "u" } , { "ó", "o" }, |
|||
{ "ð", "d" } , { "ü", "u" } , { "ű", "u" }, |
|||
{ "ā", "a" } , { "ī", "i" } , { "đ", "d" }, |
|||
{ "ă", "a" } , { "â", "a" } , { "ż", "z" }, |
|||
{ "ț", "t" } , { "ş", "s" } , { "ś", "s" }, |
|||
{ "ǎ", "a" } , { "ě", "e" } , { "ů", "u" }, |
|||
{ "ĕ", "e" } , { "ñ", "n" } , { "ď", "d" }, |
|||
{ "ï", "i" } , { "ź", "z" } , { "ô", "o" }, |
|||
{ "ė", "e" } , { "ľ", "l" } , { "ģ", "g" }, |
|||
{ "ļ", "l" } , { "ę", "e" } , { "ň", "n" }, |
|||
{ "ò", "o" } |
|||
} |
|||
for k,v in pairs(specialChars) do -- replace special characters from supplied list |
|||
name = string.gsub(name, v[1], v[2]) |
|||
end |
|||
return name |
|||
-- Lebanon |
|||
end |
|||
{"[[Rabih Ataya]]", "LBN", 0, 1, 0, 0 }, |
|||
--[[ return the name for sorting |
|||
{"[[Hilal El-Helwe]]", "LBN", 0, 3, 0, 0 }, |
|||
return supplied alias name for sorting |
|||
{"[[Mohamad Kdouh (footballer, born 1997)|Mohamad Kdouh]]", "LBN", 0, 1, 0, 0 }, |
|||
otherwise |
|||
{"[[Hassan Maatouk]]", "LBN", 0, 1, 0, 0 }, |
|||
checks for pipe (redirect) and uses name after pipe |
|||
{"[[Nader Matar]]", "LBN", 0, 1, 0, 0 }, |
|||
splits name into words |
|||
{"[[Joan Oumari]]", "LBN", 0, 2, 0, 0 }, |
|||
returns first name if only name (e.g. Nani) |
|||
{"[[Soony Saad]]", "LBN", 0, 2, 0, 0 }, |
|||
otherwise returns name in format second_name [.. last name], firstname |
|||
]] |
|||
function p.getPlayerSortName (playerName, sortName, countryName) |
|||
--dewikify all names before sorting, also forces lowercase |
|||
playerName = p.preprocessSortName(playerName) |
|||
sortName = p.preprocessSortName(sortName) |
|||
if sortName ~= "" then -- if we have a sort name supplied |
|||
return sortName -- then return it |
|||
end |
|||
-- players from certain countries will use name in order supplied |
|||
local noSort = { "CAM", "CHN", "TPE", "MYA", "PRK", "KOR", "VIE" } |
|||
for k,v in pairs(noSort) do |
|||
if v == countryName then |
|||
return playerName |
|||
end |
|||
end |
|||
-- else work it out from the supplied player name |
|||
-- we don't want to test the name in a redirect, so get name after pipe if there is one |
|||
if string.find (playerName, "|") then -- test for redirect |
|||
local names = mw.text.split( playerName, "|") |
|||
playerName = names[2] -- get name after pipe |
|||
end |
|||
local names = mw.text.split( playerName, " ") -- we don't want to sort on first name |
|||
-- Macau |
|||
{"[[Filipe Duarte (footballer)|Filipe Duarte]]", "MAC", 1, 0, 0, 0 }, |
|||
if #names == 1 then |
|||
return names[1] -- return name of single name player |
|||
else |
|||
-- we will assume the second name is the sort name e.g, Joe Bloggs, Jan van Bloggen |
|||
local name = names[2] -- set name to second name e.g. Bloggs or van |
|||
local i=3 |
|||
while i <= #names do -- any addition names e.g. Bloggen |
|||
name= name .. names[i] |
|||
i=i+1 |
|||
end |
|||
name = name .. ", " .. names[1] -- add first name e.g. Joe or Jan |
|||
return name -- sort on second name third name etc, first name |
|||
end |
|||
end |
|||
-- sort the list of countries alphabetically |
|||
-- Malaysia |
|||
function p.sortComment(comment) |
|||
{"[[Akhyar Rashid]]", "MAS", 2, 0, 0, 0 }, |
|||
{"[[La'Vere Corbin-Ong]]", "MAS", 1, 0, 0, 0 }, |
|||
{"[[Brendan Gan]]", "MAS", 0, 1, 0, 0 }, |
|||
{"[[Guilherme de Paula Lucrécio|Guilherme]]", "MAS", 0, 1, 0, 0 }, |
|||
{"[[Faiz Nasir]]", "MAS", 1, 0, 0, 0 }, |
|||
{"[[Shahrel Fikri]]", "MAS", 4, 0, 0, 0 }, |
|||
{"[[Norshahrul Idlan]]", "MAS", 1, 0, 0, 0 }, |
|||
{"[[Safawi Rasid]]", "MAS", 2, 3, 0, 0 }, |
|||
{"[[Mohamadou Sumareh]]", "MAS", 1, 3, 0, 0 }, |
|||
{"[[Syafiq Ahmad]]", "MAS", 0, 2, 0, 0 }, |
|||
local items = mw.text.split( comment, ",") -- split comma-delimited list |
|||
-- Maldives |
|||
{"[[Ali Ashfaq]]", "MDV", 0, 2, 0, 0 }, |
|||
{"[[Ali Fasir]]", "MDV", 0, 1, 0, 0 }, |
|||
{"[[Naiz Hassan]]", "MDV", 0, 1, 0, 0 }, |
|||
{"[[Ibrahim Mahudhee]]", "MDV", 0, 1, 0, 0 }, |
|||
{"[[Ali Samooh]]", "MDV", 0, 1, 0, 0 }, |
|||
for k,v in pairs(items) do |
|||
-- Mongolia |
|||
items[k] = mw.text.trim(v) -- trim spaces and coe |
|||
{"[[Dölgöön Amaraa]]", "MNG", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Oyunbaataryn Mijiddorj]]", "MNG", 0, 1, 0, 0 }, |
|||
{"[[Nyam-Osor Naranbold]]", "MNG", 1, 0, 0, 0 }, |
|||
table.sort(items, function(a,b) return a<b end) -- sort the table alphbetically |
|||
{"[[Norjmoogiin Tsedenbal]]", "MNG", 2, 1, 0, 0 }, |
|||
local list = "lawan " -- construct the alphabetical list string |
|||
-- Myanmar |
|||
for i=1, #items do |
|||
{"[[Aung Thu (footballer)|Aung Thu]]", "MYA", 0, 1, 0, 0 }, |
|||
local sep = ", " -- separator for comma-delimited list |
|||
{"[[Hlaing Bo Bo]]", "MYA", 0, 2, 0, 0 }, |
|||
if i==1 then sep = "" -- first word doesn't need comma |
|||
{"[[Maung Maung Lwin]]", "MYA", 0, 1, 0, 0 }, |
|||
elseif i==#items then sep = " & " -- use "and" before last word |
|||
{"[[Suan Lam Mang]]", "MYA", 0, 2, 0, 0 }, |
|||
end |
|||
list = list .. sep .. items[i] |
|||
end |
|||
return list |
|||
end |
|||
function p.getCountryName(country) |
|||
if string.len(country) == 3 then -- if the country given as a three-letter code |
|||
local codes = require('Module:Goalscorers/data/Country codes') |
|||
for k,v in pairs(codes.alias) do |
|||
if v[1] == country then |
|||
return v[2] |
|||
end |
|||
end |
|||
else |
|||
return country -- return the country name as is |
|||
end |
|||
end |
|||
--[[ sort goalscorers by goals, country and name |
|||
the sort first sorts by number of goals |
|||
when these are equal, it sorts by country |
|||
when these are equal, it sorts by name |
|||
Note: the name sort is on the first name |
|||
- a split of the name and sort on the last name is possible |
|||
- however, this would be complicated by Dutch (e.g. Stefan de Vrij) and Spanish names |
|||
- would sort on second name be better |
|||
]] |
|||
function p.sortGoalscorers() |
|||
local sort_function = function( a,b ) |
|||
if (a.goals > b.goals) then -- primary sort on 'goals' -> a before b |
|||
return true |
|||
elseif (a.goals < b.goals) then -- primary sort on 'goals' -> b before a |
|||
return false |
|||
else -- a.goals == b.goals -- primary sort tied, |
|||
--return a.country < b.country -- resolve with secondary sort on 'country' |
|||
local country_a = p.getCountryName(a.country) -- sort on name of country, not the code |
|||
local country_b = p.getCountryName(b.country) |
|||
if (country_a < country_b) then -- secondary sort on 'country' |
|||
return true |
|||
elseif (country_a > country_b) then -- secondary sort on 'country' |
|||
return false |
|||
else -- a.country == b.country -- secondary sort tied, |
|||
--return a.player < b.player --resolve with tertiary sort on 'player' name |
|||
-- Nepal |
|||
{"[[Anjan Bista]]", "NEP", 0, 3, 0, 0 }, |
|||
local player_a = p.getPlayerSortName(a.player, a.alias, a.country) -- get player name for sorting |
|||
{"[[Nawayug Shrestha]]", "NEP", 0, 1, 0, 0 }, |
|||
local player_b = p.getPlayerSortName(b.player, b.alias, b.country) |
|||
return player_a < player_b -- |
|||
--[[] |
|||
--local test_a, test_b = a.player, b.player |
|||
-- we don't want to test the name in a redirect, so get name after pipe if there is one |
|||
-- North Korea |
|||
if string.find (a.player, "|") then -- test for redirect |
|||
{"[[Han Kwang-song]]", "PRK", 0, 1, 0, 0 }, |
|||
local names = mw.text.split( a.player, "|") |
|||
{"[[Jang Kuk-chol]]", "PRK", 0, 1, 0, 0 }, |
|||
test_a = names[2] -- get name after pipe |
|||
{"[[Jong Il-gwan]]", "PRK", 0, 2, 0, 0 }, |
|||
end |
|||
if string.find (b.player, "|") then |
|||
local names = mw.text.split( b.player, "|") |
|||
test_b = names[2] |
|||
end |
|||
local names_a = mw.text.split( test_a, " ") -- we don't want to sort on first name |
|||
local names_b = mw.text.split( test_b, " ") -- so split names |
|||
if not names_a[2] then names_a[2] = test_a end -- for players with one name |
|||
if not names_b[2] then names_b[2] = test_b end |
|||
return names_a[2] < names_b[2] -- sort on second name |
|||
]] |
|||
end |
|||
end |
|||
end |
|||
table.sort(g.goalscorers, sort_function) |
|||
-- Oman |
|||
{"[[Arshad Al-Alawi]]", "OMA", 0, 1, 0, 0 }, |
|||
{"[[Rabia Al-Alawi]]", "OMA", 0, 4, 0, 0 }, |
|||
{"[[Mohammed Al-Ghafri]]", "OMA", 0, 1, 0, 0 }, |
|||
{"[[Muhsen Al-Ghassani]]", "OMA", 0, 2, 0, 0 }, |
|||
{"[[Khalid Al-Hajri]]", "OMA", 0, 2, 0, 0 }, |
|||
{"[[Amran Al-Hidi]]", "OMA", 0, 1, 0, 0 }, |
|||
{"[[Mohsin Al-Khaldi]]", "OMA", 0, 1, 0, 0 }, |
|||
{"[[Abdul Aziz Al-Muqbali]]", "OMA", 0, 2, 0, 0 }, |
|||
{"[[Abdullah Fawaz]]", "OMA", 0, 2, 0, 0 }, |
|||
end |
|||
-- Pakistan |
|||
function p.tabulateGoalscorers(frame, og) |
|||
{"[[Hassan Bashir]]", "PAK", 1, 0, 0, 0 }, |
|||
-- ==============output the lists of goalscorers by goal====================== |
|||
local goalNumber = 1000 |
|||
local maxRank = tonumber(g.args['maxrank'] or 10) -- limit list top ten or value in parameter maxrank |
|||
local rank = 1 |
|||
local playerCount = 0 |
|||
local rankCount = 0 |
|||
local playerCells = "" |
|||
local firstplayerCell = "" |
|||
local tableString = '\n{| class="wikitable"' -- start table |
|||
-- Palestine |
|||
..'\n|-' .. '\n!Peringkat !! Pemain !! Gol' -- add table headers |
|||
{"[[Islam Batran]]", "PLE", 0, 1, 0, 0 }, |
|||
if g.args['header'] then tableString = tableString .. '\n|+ ' .. g.args['header'] end -- add header |
|||
{"[[Oday Dabbagh]]", "PLE", 0, 4, 0, 0 }, |
|||
for j,u in pairs(g.goalscorers) do -- run through sorted list of selected goalscorers |
|||
{"[[Yaser Hamed]]", "PLE", 0, 3, 0, 0 }, |
|||
{"[[Tamer Seyam]]", "PLE", 0, 2, 0, 0 }, |
|||
-- is the player active still? |
|||
local playerActive = false |
|||
if data.active_countries then |
|||
for k,v in pairs(data.active_countries) do |
|||
if v == u['country'] then |
|||
playerActive = true |
|||
break; |
|||
end |
|||
end |
|||
end |
|||
local _,roundStatus = p.getNumberMatches() |
|||
if roundStatus == "complete" then playerActive = false end -- overrides active_countries |
|||
-- wikitext for tablulated list |
|||
local goalscorerString = p.addLinkedIcon(frame, u['country']) -- linked flag icon |
|||
if playerActive and g.args['bold']~='no' then |
|||
goalscorerString = goalscorerString .. " '''" .. u['player'] .. "'''>" -- bolded name |
|||
else |
|||
goalscorerString = goalscorerString .. " " .. u['player'] -- name |
|||
end |
|||
goalscorerString = goalscorerString .. u['comment'] -- comment for o.g. |
|||
-- |
-- we have a goalscorer |
||
playerCount = playerCount + 1 |
|||
{"[[Ángel Guirado]]", "PHI", 0, 3, 0, 0 }, |
|||
rankCount = rankCount + 1 |
|||
{"[[Mark Hartmann]]", "PHI", 0, 1, 0, 0 }, |
|||
{"[[Mike Ott]]", "PHI", 0, 1, 0, 0 }, |
|||
if u['goals'] < goalNumber then -- player belongs to rowspan for new number of goals |
|||
{"[[Javier Patiño]]", "PHI", 0, 1, 0, 0 }, |
|||
-- need to generate code for the previous rowspan (if there is one) |
|||
{"[[Iain Ramsay]]", "PHI", 0, 1, 0, 0 }, |
|||
-- then start the counts and player list for the new one |
|||
{"[[Patrick Reichelt]]", "PHI", 0, 1, 0, 0 }, |
|||
{"[[Stephan Schröck]]", "PHI", 0, 1, 0, 0 }, |
|||
if playerCount == 1 then |
|||
{"[[John-Patrick Strauß]]", "PHI", 0, 2, 0, 0 }, |
|||
firstplayerCell = '\n|' .. goalscorerString -- if first player in list just create cell and set goals |
|||
goalNumber = u['goals'] |
|||
--rank = 1 |
|||
rankCount = 0 |
|||
else -- else generate previous rowspan |
|||
local rowSpan = rankCount |
|||
if playerCount > maxRank * 1.5 then |
|||
firstplayerCell = '\n| style="font-style:italic;text-align:center;"|' .. rankCount .. " pemain" |
|||
playerCells = "" |
|||
rowSpan = 1 |
|||
end |
|||
tableString = tableString .. '\n|-\n| style="text-align:center;" rowspan="' .. rowSpan .. '"|' .. rank |
|||
--if rankCount > 1 then tableString = tableString .. "=" end -- adds equals when rank shared |
|||
tableString = tableString .. firstplayerCell |
|||
tableString = tableString .. '\n| style="text-align:center;" rowspan="' .. rowSpan .. '"|' .. goalNumber |
|||
tableString = tableString .. playerCells |
|||
rank = rank + rankCount |
|||
-- Qatar |
|||
if rank > maxRank then break end -- limit list top ten or value in parameter |
|||
{"[[Yusuf Abdurisag]]", "QAT", 0, 1, 0, 0 }, |
|||
rankCount = 0 |
|||
{"[[Akram Afif]]", "QAT", 0, 4, 0, 0 }, |
|||
goalNumber = u['goals'] |
|||
{"[[Almoez Ali]]", "QAT", 0, 6, 0, 0 }, |
|||
firstplayerCell = '\n|' .. goalscorerString -- set first player cell for next rowspan |
|||
{"[[Hassan Al-Haydos]]", "QAT", 0, 2, 0, 0 }, |
|||
playerCells = "" |
|||
{"[[Karim Boudiaf]]", "QAT", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Abdelkarim Hassan]]", "QAT", 0, 1, 0, 0 }, |
|||
else -- else another player with same number of goals |
|||
{"[[Abdulaziz Hatem]]", "QAT", 0, 2, 0, 0 }, |
|||
playerCells = playerCells .. '\n|-' .. '\n|' .. goalscorerString -- add to player cell list |
|||
{"[[Boualem Khoukhi]]", "QAT", 0, 1, 0, 0 }, |
|||
end |
|||
end -- reached end of list of goalscorers |
|||
if tableString ~= "" then |
|||
-- Saudi Arabia |
|||
tableString = tableString .. "\n|}" |
|||
{"[[Salem Al-Dawsari]]", "KSA", 0, 5, 0, 0 }, |
|||
return tableString |
|||
{"[[Salman Al-Faraj]]", "KSA", 0, 4, 0, 0 }, |
|||
else |
|||
{"[[Abdullah Al-Hamdan]]", "KSA", 0, 1, 0, 0 }, |
|||
return (" Tidak ada gol yang sesuai dengan kriteria yang diminta.") |
|||
{"[[Ali Al-Hassan]]", "KSA", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Fahad Al-Muwallad]]", "KSA", 0, 4, 0, 0 }, |
|||
{"[[Yasser Al-Shahrani]]", "KSA", 0, 1, 0, 0 }, |
|||
{"[[Saleh Al-Shehri]]", "KSA", 0, 3, 0, 0 }, |
|||
end |
|||
{"[[Abdulfattah Asiri]]", "KSA", 0, 2, 0, 0 }, |
|||
function p.outputGoalscorers(frame, og) -- output list of goalscorers |
|||
{"[[Hattan Bahebri]]", "KSA", 0, 1, 0, 0 }, |
|||
if g.args['table'] then return p.tabulateGoalscorers(frame, og) end -- optional table output |
|||
local outputString = "" |
|||
if og == "OG" then end |
|||
-- ==============output the lists of goalscorers by goal====================== |
|||
-- Singapore |
|||
local goalNumber = 1000 |
|||
{"[[Faris Ramli]]", "SIN", 0, 1, 0, 0 }, |
|||
--local goalMinimum = tonumber(templateArgs['minimum']) or 0 |
|||
{"[[Hafiz Nor]]", "SIN", 0, 1, 0, 0 }, |
|||
{"[[Ikhsan Fandi]]", "SIN", 0, 3, 0, 0 }, |
|||
local listOpen = false -- flag for list started by template {{Div Col}} |
|||
{"[[Safuwan Baharudin]]", "SIN", 0, 1, 0, 0 }, |
|||
{"[[Shakir Hamzah]]", "SIN", 0, 1, 0, 0 }, |
|||
for j,u in pairs(g.goalscorers) do -- run through sorted list of selected goalscorers |
|||
--if u['goals'] < goalMinimum then break end -- limit list to goals over a threshold (now handled in select goalscorers) |
|||
if u['goals'] < goalNumber then -- start new list of new number of goals |
|||
if listOpen then -- if an open list, close last list |
|||
outputString = outputString .. p.closeList(frame) |
|||
listOpen = false -- redundant as will be set true again |
|||
end |
|||
goalNumber = u['goals'] |
|||
local goalString = " gol" |
|||
--if og == "OG" then |
|||
if goalNumber < 0 then |
|||
goalString = string.format ("%s bunuh diri", goalString ) |
|||
end |
|||
if math.abs(u['goals']) ~= 1 then goalString = goalString end |
|||
outputString = outputString .. "\n'''" .. math.abs(u['goals']) .. goalString .. "'''" -- list caption |
|||
-- South Korea |
|||
{"[[Hwang Hee-chan]]", "KOR", 0, 2, 0, 0 }, |
|||
outputString = outputString .. p.openList(frame,og) --start new list |
|||
{"[[Hwang Ui-jo]]", "KOR", 0, 2, 0, 0 }, |
|||
listOpen = true |
|||
{"[[Jung Sang-bin]]", "KOR", 0, 1, 0, 0 }, |
|||
--goalNumber = u['goals'] |
|||
{"[[Jung Woo-young]]", "KOR", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Kim Shin-wook]]", "KOR", 0, 6, 0, 0 }, |
|||
-- is the player active still? |
|||
{"[[Kim Young-gwon]]", "KOR", 0, 1, 0, 0 }, |
|||
local playerActive = false |
|||
{"[[Kwon Chang-hoon]]", "KOR", 0, 2, 0, 0 }, |
|||
if data.active_countries then |
|||
{"[[Lee Dong-gyeong]]", "KOR", 0, 1, 0, 0 }, |
|||
for k,v in pairs(data.active_countries) do |
|||
{"[[Na Sang-ho]]", "KOR", 0, 1, 0, 0 }, |
|||
if v == u['country'] then |
|||
{"[[Nam Tae-hee]]", "KOR", 0, 1, 0, 0 }, |
|||
playerActive = true |
|||
{"[[Son Heung-min]]", "KOR", 0, 3, 0, 0 }, |
|||
break; |
|||
{"[[Song Min-kyu (footballer)|Song Min-kyu]]", "KOR", 0, 1, 0, 0 }, |
|||
end |
|||
end |
|||
end |
|||
local _,roundStatus = p.getNumberMatches() |
|||
if roundStatus == "complete" then playerActive = false end -- overrides active_countries |
|||
-- wikitext for bullet list |
|||
local goalscorerString = '\n*<span>' .. p.addLinkedIcon(frame, u['country']) -- linked flag icon |
|||
if playerActive and g.args['bold']~='no' then |
|||
goalscorerString = goalscorerString .. " <b>" .. u['player'] .. "</b>" -- bolded name |
|||
else |
|||
goalscorerString = goalscorerString .. " " .. u['player'] -- name |
|||
end |
|||
goalscorerString = goalscorerString .. u['comment'] .. '</span>' -- comment for o.g. |
|||
outputString = outputString .. goalscorerString -- .. " " .. tostring(u['goals']) |
|||
end -- reached end of list of goalscorers |
|||
-- Sri Lanka |
|||
{"[[Ahmed Waseem Razeek]]", "SRI", 0, 2, 0, 0 }, |
|||
if outputString ~= "" then |
|||
-- Syria |
|||
outputString = outputString .. p.closeList(frame) |
|||
{"[[Firas Al-Khatib]]", "SYR", 0, 1, 0, 0 }, |
|||
{"[[Mahmoud Al-Mawas]]", "SYR", 0, 6, 0, 0 }, |
|||
{"[[Ward Al Salama]]", "SYR", 0, 1, 0, 0 }, |
|||
{"[[Omar Al Somah]]", "SYR", 0, 7, 0, 0 }, |
|||
{"[[Aias Aosman]]", "SYR", 0, 2, 0, 0 }, |
|||
{"[[Mardik Mardikian]]", "SYR", 0, 2, 0, 0 }, |
|||
{"[[Khaled Mobayed]]", "SYR", 0, 1, 0, 0 }, |
|||
{"[[Osama Omari]]", "SYR", 0, 1, 0, 0 }, |
|||
return outputString |
|||
-- Tajikistan |
|||
else |
|||
{"[[Sheriddin Boboev]]", "TJK", 0, 1, 0, 0 }, |
|||
return (" Tidak ada gol yang sesuai dengan kriteria yang diminta.") |
|||
{"[[Alisher Dzhalilov]]", "TJK", 0, 2, 0, 0 }, |
|||
end |
|||
{"[[Manuchekhr Dzhalilov]]", "TJK", 0, 4, 0, 0 }, |
|||
end |
|||
{"[[Davron Ergashev]]", "TJK", 0, 1, 0, 0 }, |
|||
{"[[Jahongir Ergashev]]", "TJK", 0, 1, 0, 0 }, |
|||
{"[[Ehson Panjshanbe]]", "TJK", 0, 1, 0, 0 }, |
|||
{"[[Shahrom Samiev]]", "TJK", 0, 2, 0, 0 }, |
|||
{"[[Komron Tursunov]]", "TJK", 0, 1, 0, 0 }, |
|||
{"[[Farkhod Vosiyev]]", "TJK", 0, 1, 0, 0 }, |
|||
-- output icon linked to national team page |
|||
-- Thailand |
|||
function p.addLinkedIcon(frame, country) |
|||
{"[[Theerathon Bunmathan]]", "THA", 0, 1, 0, 0 }, |
|||
local icon = data.templates['flag_icon_linked'] -- fbicon etc set in data module |
|||
{"[[Teerasil Dangda]]", "THA", 0, 1, 0, 0 }, |
|||
local level = data.templates['youth_level'] or "" -- parameter for youth level, ie under-21 |
|||
{"[[Adisak Kraisorn]]", "THA", 0, 1, 0, 0 }, |
|||
-- equivalent to {{fbicon|country}} |
|||
{"[[Suphanat Mueanta]]", "THA", 0, 1, 0, 0 }, |
|||
local flagVariant = "" |
|||
{"[[Ekanit Panya]]", "THA", 0, 1, 0, 0 }, |
|||
if data.templates.flagvar and data.templates.flagvar[country] then |
|||
{"[[Supachok Sarachat]]", "THA", 0, 2, 0, 0 }, |
|||
flagVariant = data.templates.flagvar[country] |
|||
{"[[Chanathip Songkrasin]]", "THA", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Narubadin Weerawatnodom]]", "THA", 0, 1, 0, 0 }, |
|||
if level ~= "" then |
|||
return frame:expandTemplate{ title = icon , args = { level, country, flagVariant } } |
|||
else |
|||
return frame:expandTemplate{ title = icon , args = { country, flagVariant } } -- flag icon |
|||
end |
|||
end |
|||
-- formatting of list under each number of goals |
|||
function p.openList(frame,og) |
|||
return mw.getCurrentFrame():extensionTag{ |
|||
-- Timor-Leste |
|||
name = 'templatestyles', args = { src = 'Div col/styles.css' } |
|||
{"[[Rufino Gama]]", "TLS", 1, 0, 0, 0 }, |
|||
} .. '<div class="div-col" style="column-width:25em;">' -- perhaps add "column-count:3;"" to limit max number of columns? |
|||
{"[[João Pedro (footballer, born 2000)|João Pedro]]", "TLS", 1, 0, 0, 0 }, |
|||
end |
|||
function p.closeList(frame) |
|||
return '</div>' |
|||
end |
|||
function p.firstToUpper(str) |
|||
return (str:gsub("^%l", string.upper)) |
|||
end |
|||
-- handles parameters bold, further, extra |
|||
-- Turkmenistan |
|||
function p.addAdditionHeaderText(text, dateUpdated) |
|||
{"[[Arslanmyrat Amanow]]", "TKM", 0, 2, 0, 0 }, |
|||
if g.args['inlineref'] then |
|||
{"[[Altymyrat Annadurdyýew]]", "TKM", 0, 3, 0, 0 }, |
|||
text = text .. g.args['inlineref'] |
|||
{"[[Güýçmyrat Annagulyýew]]", "TKM", 0, 1, 0, 0 }, |
|||
end |
|||
{"[[Zafar Babajanow]]", "TKM", 0, 1, 0, 0 }, |
|||
if g.args['bold'] and g.args['bold']~='no' then |
|||
{"[[Abdy Bäşimow]]", "TKM", 0, 1, 0, 0 }, |
|||
text = text .. " Pemain dengan '''cetak tebal''' masih bermain pada turnamen ini." |
|||
{"[[Wahyt Orazsähedow]]", "TKM", 0, 2, 0, 0 }, |
|||
end |
|||
{"[[Mihail Titow]]", "TKM", 0, 1, 0, 0 }, |
|||
if g.args['further'] then |
|||
if text ~= "" then text = text .. " " end |
|||
text = text .. g.args['further'] |
|||
end |
|||
if g.args['extra'] then |
|||
text = text .. "\n\n" .. g.args['extra'] |
|||
end |
|||
return text |
|||
end |
|||
-- count number of goals for data in template |
|||
function p.countGoals(list, number, totalGoals) |
|||
local split = mw.text.split( list, "\n", true ) -- split the list for number of goals scorers with N goals |
|||
-- United Arab Emirates |
|||
local count = #split * math.abs(number) -- calculate number of goals (including own goals) |
|||
{"[[Tareq Ahmed]]", "UAE", 0, 1, 0, 0 }, |
|||
totalGoals = totalGoals + count |
|||
{"[[Caio Canedo Corrêa]]", "UAE", 0, 1, 0, 0 }, |
|||
{"[[Mohammed Jumaa]]", "UAE", 0, 1, 0, 0 }, |
|||
--mw.addWarning( "Entry: " .. list .. "[" .. count .. "]") |
|||
{"[[Khalil Ibrahim (footballer)|Khalil Ibrahim]]", "UAE", 0, 1, 0, 0 }, |
|||
{"[[Mahmoud Khamees]]", "UAE", 0, 1, 0, 0 }, |
|||
{"[[Fábio Virginio de Lima]]", "UAE", 0, 5, 0, 0 }, |
|||
{"[[Ali Mabkhout]]", "UAE", 0, 11, 0, 0 }, |
|||
{"[[Ali Salmeen]]", "UAE", 0, 1, 0, 0 }, |
|||
{"[[Sebastián Tagliabúe]]", "UAE", 0, 1, 0, 0 }, |
|||
return totalGoals |
|||
-- Uzbekistan |
|||
end |
|||
{"[[Odil Ahmedov]]", "UZB", 0, 2, 0, 0 }, |
|||
{"[[Jamshid Iskanderov]]", "UZB", 0, 1, 0, 0 }, |
|||
{"[[Sanjar Kodirkulov]]", "UZB", 0, 1, 0, 0 }, |
|||
{"[[Jaloliddin Masharipov]]", "UZB", 0, 3, 0, 0 }, |
|||
{"[[Igor Sergeyev (Uzbekistani footballer)|Igor Sergeev]]", "UZB", 0, 1, 0, 0 }, |
|||
{"[[Eldor Shomurodov]]", "UZB", 0, 7, 0, 0 }, |
|||
{"[[Otabek Shukurov]]", "UZB", 0, 1, 0, 0 }, |
|||
{"[[Islom Tukhtakhujaev]]", "UZB", 0, 1, 0, 0 }, |
|||
--[[ use data supplied by template |
|||
-- Vietnam |
|||
]] |
|||
{"[[Đỗ Duy Mạnh]]", "VIE", 0, 1, 0, 0 }, |
|||
{"[[Nguyễn Quang Hải (footballer, born 1997)|Nguyễn Quang Hải]]", "VIE", 0, 2, 0, 0 }, |
|||
{"[[Nguyễn Tiến Linh]]", "VIE", 0, 5, 0, 0 }, |
|||
{"[[Nguyễn Công Phượng]]", "VIE", 0, 1, 0, 0 }, |
|||
{"[[Quế Ngọc Hải]]", "VIE", 0, 2, 0, 0 }, |
|||
{"[[Trần Minh Vương]]", "VIE", 0, 1, 0, 0 }, |
|||
{"[[Vũ Văn Thanh]]", "VIE", 0, 1, 0, 0 }, |
|||
--function p.list(frame) |
|||
-- Yemen |
|||
function p.useTemplateData(frame) |
|||
{"[[Omar Al-Dahi]]", "YEM", 0, 2, 0, 0 }, |
|||
--getArgs(frame) |
|||
{"[[Nasser Al-Gahwashi]]", "YEM", 0, 1, 0, 0 }, |
|||
{"[[Abdulwasea Al-Matari]]", "YEM", 0, 1, 0, 0 }, |
|||
--[[ {{#if:{{{assists|}}}||Sebanyak {{{goals}}} |
|||
{"[[Mohsen Qarawi]]", "YEM", 0, 2, 0, 0 }, |
|||
{{#ifexpr:{{{goals}}}=1|gol|gol}} telah dicetak |
|||
} |
|||
{{#if:{{{players|}}}| oleh {{{players}}} |
|||
{{#ifexpr:{{{players}}}=1|pemain|pemain yang berbeda}} |
|||
{{#if:{{{own_goals|}}}| (dengan {{{own_goals}}} gol di antaranya termasuk ke dalam |
|||
{{#ifexpr:{{{own_goals}}}=1|gol bunuh diri|gol bunuh diri}})|}}|}} pada {{{matches}}} |
|||
{{#ifexpr:{{{matches}}}=1|pertandingan|pertandingan}}, dengan rata-rata |
|||
{{formatnum: {{#expr:{{{goals}}}/{{{matches}}} round 2}}}} {{formatnum:{{#ifexpr:({{{goals}}}/{{{matches}}} round 2)=1|gol|gol}}}} per pertandingan.}} |
|||
{{#if:{{{bold|}}}|{{#if:{{{assists|}}}|| }}Pemain dengan '''cetak tebal''' masih bermain pada turnamen ini.|}} |
|||
{{#if:{{{further|}}}|{{#if:{{{assists|}}}|| }}{{{further}}}|}} |
|||
{{#if:{{{extra|}}}|{{{extra}}}{{clear}}|}} |
|||
--]] |
|||
local statNumber = g.args['goals'] or g.args['assists'] or 0 |
|||
local matches = g.args['matches'] |
|||
local statType = "gol" |
|||
if g.args['assists'] then statType = "umpan gol" end |
|||
if g.args['clean sheets'] then statType = "nirbobol" end |
|||
local ongoing = g.args['ongoing'] |
|||
local text1 = "Sebanyak" |
|||
if g.args['lc'] then text1 = "there" end |
|||
local updateString = "" |
|||
local averageString = "" |
|||
if g.args['goals'] and g.args['matches'] then |
|||
local averageGoals = g.args['goals']/g.args['matches'] |
|||
averageString = string.format(" pada %d pertandingan, dengan rata-rata %.3g gol per pertandingan", g.args['matches'], averageGoals) |
|||
end |
|||
if g.args['updated'] and g.args['updated'] ~= "complete" then |
|||
updateString = " (per " ..g.args['updated'].. ")" |
|||
end |
|||
local titik = "." |
|||
if g.args['sep'] then sep = g.args['sep'] end |
|||
local text = "" |
|||
if g.args['goals'] then |
|||
text = string.format("%s %d %s dicetak %s", |
|||
text1, statNumber, statType, averageString..updateString..titik) |
|||
end |
|||
text = p.addAdditionHeaderText(text) -- handles template parameters bold, further, extra |
|||
--[[ {{#if:{{{30 goals|{{{30 assists|}}}}}}|'''30 {{#if:{{{assists|}}}|assists|goals}}''' |
|||
<div class="div-col columns column-count column-count-3" style="column-count:3;"> |
|||
{{#if:{{{assists|}}}|{{{30 assists}}}|{{{30 goals}}}}}</div>|}}]] |
|||
local output = "\n" |
|||
local number = 30 |
|||
local totalGoals = 0 |
|||
while number > -4 do -- for the each goals/assists |
|||
local entry = g.args[number .. ' goals'] or g.args[number .. ' goal'] |
|||
or g.args[number .. ' assists'] or g.args[number .. ' assist'] |
|||
or g.args[number .. ' clean sheets'] or g.args[number .. ' clean sheet'] |
|||
if number < 0 then |
|||
entry = g.args[math.abs(number) .. ' own goals'] or g.args[math.abs(number) .. ' own goal'] |
|||
statType = "gol bunuh diri" |
|||
end |
|||
if entry then -- do we have goals/assists for this number |
|||
output = output .. "\n'''" .. tostring(math.abs(number)) .. " " .. statType .. "'''\n" |
|||
-- all competition own goal scorers |
|||
.. p.openList(frame) .. "\n" .. entry .. p.closeList(frame) |
|||
data.owngoalscorers = { |
|||
totalGoals = p.countGoals(entry, number, totalGoals) |
|||
-- player name, country, { OG in R1, "R1 OG opponents" }, { OG in R2, "R2 OG opponents" }, { OG in R3, "R3 OG opponents" }, { OG in R4, "R4 OG opponents" } |
|||
end |
|||
{"[[Ovays Azizi]]", "AFG", 0, { 1, "India" }, 0, 0 }, |
|||
{"[[Sor Rotana]]", "CAM", 0, { 1, "Iran" }, 0, 0 }, |
|||
number = number -1 |
|||
{"[[Soeuy Visal]]", "CAM", 0, { 1, "Iran" }, 0, 0 }, |
|||
end |
|||
{"[[Zhang Linpeng]]", "CHN", 0, { 1, "Syria" }, 0, 0 }, |
|||
{"[[Chen Wei-chuan]]", "TPE", 0, { 1, "Kuwait" }, 0, 0 }, |
|||
if statType == "gol" or statType == "gol bunuh diri" then |
|||
{"[[Marcus Lopez]]", "GUM", 0, { 1, "Philippines" }, 0, 0 }, |
|||
if g.args['goals'] and totalGoals ~= tonumber(g.args['goals']) then |
|||
{"[[Travis Nicklaw]]", "GUM", 0, { 1, "Maldives" }, 0, 0 }, |
|||
mw.addWarning("PERINGATAN. Jumlah gol pada terdaftar (" .. totalGoals .. ") dan parameter gol (" .. g.args['goals'] .. ") tidak cocok.") |
|||
{"[[Fung Hing Wa]]", "HKG", 0, { 1, "Iraq" }, 0, 0 }, |
|||
end |
|||
{"[[Khash-Erdene Tuya]]", "MNG", 0, { 1, "Japan" }, 0, 0 }, |
|||
end |
|||
{"[[Irfan Fandi]]", "SIN", 0, { 1, "Uzbekistan" }, 0, 0 }, |
|||
} |
|||
--{{#if:{{{bottom|}}}|{{small|{{{bottom_text}}}}} <div class="div-col columns column-count column-count-3" style="column-count:3;"> {{{bottom}}}</div>|}}{{#if:{{{source|}}}|{{smaller|Source: {{{source}}}}}|}} |
|||
local footerText = g.args['footer-text'] or g.args['bottom'] or "" |
|||
return data |
|||
local footerHeading = g.args['footer-heading'] or g.args['bottom-text'] or "" |
|||
local footer = "" |
|||
if footerText ~= "" then |
|||
local heading = "" |
|||
if footerHeading ~= "" then |
|||
heading = '<p>' .. footerHeading .. '</p>' |
|||
end |
|||
footer = '\n' .. heading .. p.openList(frame) .. '\n' .. footerText .. p.closeList(frame) |
|||
end |
|||
--{{#if:{{{source|}}}|{{small|Source: {{{source}}}}}|}} |
|||
local source = g.args['source'] or "" |
|||
if source ~= "" then source = "<small>Sumber: " .. source .. "</small>" end |
|||
return text .. output .. footer .. source |
|||
end |
|||
return p |
Revisi terkini sejak 2 April 2024 22.45
Modul ini untuk menampilkan daftar pencetak gol sepak bola; digunakan pada banyak artikel kompetisi sepak bola.
Modul ini dinilai sebagai modul beta, dan siap digunakan secara luas. Modul ini masih baru dan harus digunakan dengan hati-hati untuk memastikan bahwa hasilnya sesuai dengan yang diharapkan. |
Sub-halaman Data
- Goalscorers/data/Country codes
- Goalscorers/data/Kualifikasi Piala Dunia FIFA 2022 (AFC)
- Goalscorers/data/Kualifikasi Piala Dunia FIFA 2022 (AFC)/doc
- Goalscorers/data/Kualifikasi Piala Dunia FIFA 2026 (AFC)
- Goalscorers/data/Kualifikasi UEFA Euro 2020
- Goalscorers/data/Kualifikasi UEFA Euro 2024
- Goalscorers/data/Liga Negara UEFA 2020–2021
- Goalscorers/data/Liga Negara UEFA 2022–2023
Penggunaan[sunting sumber]
{{#invoke:Goalscorers|main}}
Modul ini digunakan templat {{goalscorers}}.
require('strict');
local yesno = require('Module:Yesno')
local p = {}
local g = {} -- for parameters with global scope in this module
g.goalscorers = {} -- table where selected and sorted players will be place
g.args = {}
g.totalGoals = 0
local data = {} -- module subpage data -- require('Module:Goalscorers/data/UEFA Euro 2016 qualifying');
p.errorString = ""
function p.error_msg()
if p.errorString ~= "" then
return '<span style="font-size:100%" class="error">'
-- '<code style="color:inherit;border:inherit;padding:inherit;">|_template=</code>'
.. p.errorString .. '</span>';
end
end
-- data for goals scored held in module subpages, e.g. "Module:Goalscorers/data/UEFA Euro 2016 qualifying"
--[[ parameters containing data help in three tables
data.rounds = {} -- group, play-off
data.goalscorers = {} -- player, country, goals in each round)
data.owngoalscorers = {} -- player, country, goals in each round)
data.updated = {} -- date of latest update (month, day, year)
--]]
--[[ ############################ Parameter handing ###############################
this section is currently unused
will be used to take check parameters set in template
]]
local function getArgs(frame)
local parents = mw.getCurrentFrame():getParent()
for k,v in pairs(parents.args) do
--check content
if v and v ~= "" then
g.args[k]=mw.text.trim(v) --parents.args[k]
end
end
for k,v in pairs(frame.args) do
--check content
if v and v ~= "" then
g.args[k]= mw.text.trim(v) --parents.args[k]
end
end
-- allow empty caption to blank default
--if parents.args['caption'] then templateArgs['caption'] = parents.args['caption'] end
end
--[[ ############################## Main function and other functions ######################
p.main() - simple output of the data in the module in list form
p.addIntroductorySentence() - menambah kalimat/paragraf pembuka jumlah gol dan rata-rata gol per pertandingan
p.addFooterSentence() - menambah catatan kaki
p.getNumberMatches()
p.owngoals() - get own goals (no longer used?)
p._owngoals() - core functionality for p.owngoals()
]]
function p.main(frame)
getArgs(frame)
local dataTarget = g.args[1] or g.args['data']
if dataTarget then
data = require('Module:Goalscorers/data/'.. dataTarget) --or 'UEFA Euro 2016 qualifying'
return p.useModuleData(frame) -- data on goals taken from module subpage
else
return p.useTemplateData(frame) -- data on goals/assists taken from template
end
end
function p.useModuleData(frame)
--p.goalscorers = {} -- table where selected and sorted players will be place
g.totalGoals = 0
local ok = p.selectGoalscorers() -- selected goalscorers meeting round and group criteris
-- CHANGE: append own goals to list (data will now include goals and own goals (negative))
p.selectGoalscorers("OG")
p.sortGoalscorers() -- sort selected goalscorers by number of goal, then country
local outputString = p.addIntroductorySentence() .. p.outputGoalscorers(frame) .. p.addFooterSentence()
-- .. "" --TODO add intermediate heading?
-- .. p._owngoals(frame) -- output list of goalscorers
return p.error_msg() or outputString
end
function p.addIntroductorySentence() -- menambahkan teks/paragraf awal
local totalGoalString = "Sebanyak" .. g.totalGoals .. " telah dicetak."
local matches, dateUpdated = p.getNumberMatches()
local mdyFormat = yesno(g.args['mdy'])
local Date = require('Module:Date')._Date
local text = string.format("Sebanyak %s gol telah dicetak", mw.getLanguage('id'):formatNum(g.totalGoals))
if matches then
local average = g.totalGoals/tonumber(matches) -- menghitung rata-rata gol
local precision = 3 -- presisi dua angka dibelakang koma
if average < 1 then precision = 2 end -- presisi satu angka dibelakang koma
average = string.format(" dengan rata-rata %."..precision.."g gol per pertandingan", average)
text = text .. string.format(" pada %d pertandingan, %s", matches, average)
end
if dateUpdated == 'complete' or dateUpdated == "" then
text = text .. "."
else
local dateFormat = 'dmy' -- default
if data.params and data.params['date_format'] then dateFormat = data.params['date_format'] end -- from data module
if mdyFormat == true then dateFormat = "mdy" else
if mdyFormat == false then dateFormat = "dmy" end -- template param overrides
end
text = text .. " (per " .. Date(dateUpdated):text(dateFormat) .. ")."
end
text = p.addAdditionHeaderText(text, dateUpdated) -- handles template parameters bold, further, extra
return text --totalGoalString
end
function p.addFooterSentence() -- menambahkan teks akhir/catatan kaki
local footerSentence = g.args['footer'] or ""
--footerSentence = "This is a footer sentence." -- test footer
if data.params then
local footer = data.params['footer'] or nil
if footer then
local frame = mw.getCurrentFrame()
local processed = frame:preprocess(footer)
if g.notes then
footerSentence = footerSentence .. processed
end
end
end
if footerSentence ~= "" then
footerSentence = '<div style = "" >' .. footerSentence .. '</div>'
end
return footerSentence
end
function p.getNumberMatches()
local matches = g.args['matches']
local dateUpdated = data.updated['date'] or "1700-01-01" --'complete' -- assume completed if missing
--local round = g.args['round'] or "all" -- round = all(empty)|group|playoffs
--local group = g.args['group'] or "all" -- group = all(empty), A,B,C etc
local round, group = p.getRoundAndGroup()
local allGroupGames = 0
local latestGroupDate = "1800-01-01"
if group and (round == "all" or group == "all") then -- count all the group games
for k,v in pairs(data.updated.group) do
allGroupGames = allGroupGames + v[1]
if v[2] ~= "complete" and v[2] > latestGroupDate then latestGroupDate = v[2] end -- update if later date
end
if latestGroupDate == "1800-01-01" then latestGroupDate = "complete" end -- no dates so must be complete
end
if group and (round == "all" and group ~= "all") then -- for totals of all rounds with only one group
allGroupGames = data.updated.group[group][1] -- number matches
latestGroupDate = data.updated.group[group][2] -- update date or completed
end
if round == "all" then -- all rounds and goals
matches=0
for k,v in pairs(data.updated) do
if k == "group" then
matches = matches + allGroupGames
if latestGroupDate ~= "complete" and latestGroupDate > dateUpdated then
dateUpdated = latestGroupDate -- update if later date
end
elseif p.validateRound(k) then
matches = matches + v[1]
if v[2] ~= "complete" and v[2] > dateUpdated then dateUpdated = v[2] end -- update if later date
end
end
elseif round == "group" then -- group round only
if group == "all" then
matches = allGroupGames
dateUpdated = latestGroupDate
else -- single group only
matches = data.updated.group[group][1] -- number matches
dateUpdated = data.updated.group[group][2] -- update date or completed
end
else -- any other round
matches = data.updated[round][1] -- number matches
dateUpdated = data.updated[round][2] -- update date or completed
end
if dateUpdated == "1700-01-01" then dateUpdated = "complete" end -- no dates so must be complete
return matches, dateUpdated
end
function p.owngoals(frame) -- need to check parameters if external call
getArgs(frame)
data = require('Module:Goalscorers/data/'.. g.args[1]) --or 'UEFA Euro 2016 qualifying'
local outputString = p._owngoals(frame)
return p.error_msg() or outputString
end
function p._owngoals(frame) -- internal call for own goals
--p.goalscorers = {} -- table where selected and sorted players will be place
p.selectGoalscorers("OG") -- selected goalscorers meeting round and group criteris
p.sortGoalscorers() -- sort selected goalscorers by number of goal, then country
return p.outputGoalscorers(frame, "OG") -- output list of goalscorers
end
function p.validateRound(round)
local validateRound = false
for k,v in pairs(data.rounds) do
if k == round then validateRound = true end -- data for this round exists
end
return validateRound
end
--[[ ############################## functions to select goalscorers ######################
p.selectGoalscorers() - select goals scoreers required for list (rounds, groups)
p.getRoundAndGroup()
p.getGoalsCol(round) - get column containing round data or first data column if round = all
(country, possibleGroup)
p.getGoals (u, player)
p.parseComment(comment)
p.getPlayer(u)
]]
--[[ p.selectGoalscorers()
- select players meeting round and group criteria from goalscoreres list
- gets goals and comments
]]
function p.selectGoalscorers(og)
local round, group = p.getRoundAndGroup()
if not round then return false end -- exit if no valid round
local goalMinimum = tonumber(g.args['minimum']) or -5 -- assume 5 own goals is maximum
local goalsCol = p.getGoalsCol(round) -- first column for goals
-- select players who have scored in rounds/groups requested
local goalscorerData = data.goalscorers
if og == "OG" then goalscorerData = data.owngoalscorers end
for k,v in pairs(goalscorerData) do
local goals, comment = 0, "" -- goals > 0 is the flag to include the player
local playerName, playerAlias = p.getPlayer(v[1]) -- player name
local goalsByRound, commentByRound = 0, ""
if round == "all" then -- goals in all rounds and all groups
for i = goalsCol, #v, 1 do
if group and group ~= "all" and i == p.getGoalsCol("group") and group ~= p.getGroup(v[2], v[3]) then
goalsByRound = 0
commentByRound = ""
else
goalsByRound, commentByRound = p.getGoals( v[i] , playerName)
end
goals = goals + goalsByRound --TODO use getGoals on round options
if commentByRound ~= "" then
if comment == "" then
comment = commentByRound
else
comment = comment .. "," .. commentByRound --TODO decide on comma or semi-colon
end
end
i = i+1
end
elseif round == "all2" and group ~= "all" then -- goals in all rounds but only from one group
--TODO code to go through all rounds but only include goals in specified group [TODO merge with above option]
--mw.addWarning( g.args[1] .. ":Mix:round=all and group=" .. group .. "/" .. p.getGroup(v[2], v[3] ) )
for i = goalsCol, #v, 1 do
if i == p.getGoalsCol("group") and group ~= p.getGroup(v[2], v[3]) then
goalsByRound = 0
commentByRound = ""
else
goalsByRound, commentByRound = p.getGoals( v[i] , playerName)
end
goals = goals + goalsByRound
if commentByRound ~= "" then
if comment == "" then
comment = commentByRound
else
comment = comment .. "," .. commentByRound --TODO decide on comma or semi-colon
end
end
i = i+1
end
elseif round == "group" then -- group round only
if group == p.getGroup(v[2], v[3]) then -- single group only
goals, comment = p.getGoals( v[goalsCol] , playerName)
elseif group == "all" then -- any group
goals, comment = p.getGoals( v[goalsCol] , playerName)
else
-- do nothing for other groups
end
--elseif round == "playoffs" then -- playoff round (redunant?)
-- goals = v[goalsCol]
else -- any other round
goals, comment = p.getGoals( v[goalsCol] , playerName) -- should also handle playoffs
end
if goals >= goalMinimum and goals ~= 0 then
if comment ~= "" then
if og == "OG" then
comment = '<span> (' .. p.sortComment(comment) .. ')</span>'
else
comment = '<span>' .. comment .. '</span>' -- no parenthesis when using notes
end
end
if og == "OG" then goals = -goals end -- make owngoals negative numbers
g.goalscorers[#g.goalscorers+1] = { player=playerName, alias=playerAlias,
country=v[2],
goals=goals,
comment=p.parseComment(comment)}
--g.totalGoals = g.totalGoals + math.abs(goals) -- increment total goal counter
end
g.totalGoals = g.totalGoals + math.abs(goals) -- increment total goal counter
end
return true -- data collected for selected goalscorers
end
--[[ p.getRoundAndGroup()
]]
function p.getRoundAndGroup()
local round = g.args['round'] or "all" -- round = all(empty)|group|playoffs
local group = g.args['group'] or "all" -- group = all(empty), A,B,C etc
local validateRound = false
local validateGroupRound = false
for k,v in pairs(data.rounds) do
if k == round then validateRound = true end -- data for this round exists
if k == "group" then validateGroupRound = true end -- there is a group round
end
if validateRound == false and round ~= "all" then
local message = 'Invalid round "' .. round .. '" specified. No data found for that round. '
mw.addWarning( message )
p.errorString = p.errorString .. message
round = nil
end
if validateGroupRound == false then group = false end -- there is no group round
-- TODO add group error checking
-- Could merge with getGoalsCol() and also return goalsCol
return round, group
end
--[[ p.getGoalsCol(round)
- get column containing round data or first data column if round = "all"
- allows group column to be omitted from player table when group table provided
]]
function p.getGoalsCol(round)
local minimum = 1000
if round == "all" then -- if all need column of first round
for k,v in pairs(data.rounds) do
if v < minimum then minimum = v end
--return v -- return the first one [this seemed to work reliably, but sometimes table order is not as listed]
end
return minimum
end
if data.rounds and data.rounds[round] then
return data.rounds[round] -- get column containing goals for that round
else
return 4 -- an old default when no data.round (may not be necessary)
end
end
--[[ p.getGroup(country, possibleGroup)
- get group from group table or from player table
- possibleGroup is the column containing the Group (when no group table) or the first data column
]]
function p.getGroup(country, possibleGroup) -- row contain player name, country code, group if given, goals
if data.groups then
for k,v in pairs(data.groups) do -- iterate through the groups
--local = gotGroup = false
for j,u in pairs(v) do -- for each group
if u == country then
return k
end
end
end
return "no group found"
else
return possibleGroup -- no group table, so assume column three contains the group
end
end
--[[ get number of goals and any associated comment
the goals can be a single number (the usual case)
or as an option table (e.g. for own goals): { number of own goals, comma-delimited list of opponents }
- if the entry is a table, we want the first entry (a number) and the second (comment string)
- otherwise, if a number, we just want the number and an empty string
]]
function p.getGoals (u, player)
if type(u) == 'table' and type(u[1]) == 'number' then
return u[1], u[2] -- return number of goals, comment
elseif type(u) == 'number' then
return u, "" -- return number of goals, empty string
else
p.errorString = p.errorString .. " Invalid goals entry for player " .. player
return 0, ""
end
end
function p.parseComment(comment)
local frame = mw.getCurrentFrame()
-- we have something like "{{efn-ua|name=goals}}"
if string.find(comment, "efn" , 1 , true ) then -- if we have a comment with a note
g.notes = true -- set flag
end
return frame:preprocess(comment)
end
function p.getPlayer(u)
if type(u) == 'table' then
if type(u[1]) == 'string' and type(u[2]) == 'string' then
--[[if #u[2] >1 then
p.errorString = p.errorString .. "\n\nWe have u[1]=" .. u[1] .. " and u[2]=" .. u[2]
end]]
return u[1], u[2] -- return player name, player sorting alias
else
p.errorString = p.errorString .. " Invalid name entry for player " .. u[1] .. ", " .. u[2]
return "", "" --TODO errroer
end
elseif type(u) == 'string' then
return u, "" -- return player name
else
p.errorString = p.errorString .. " Invalid name entry for player " .. u or u[1] or "unknown"
return "", ""
end
end
--[[ ############################## functions to sort goalscorers ######################
p.preprocessSortName (name)
p.getPlayerSortName (playerName, sortName, countryName)
p.sortComment(comment)
p.getCountryName(country)
p.sortGoalscorers() -- the main sort funtion
]]
--[=[ function p.preprocessSortName()
stripp off wikitext [[ and ]]
force to lowercase
change special characters to standard letters
]=]
function p.preprocessSortName (name)
name = string.gsub(name, "%[%[", "") -- strip off [[ and ]]
name = string.gsub(name, "%]%]", "")
--name =string.lower(name) -- force lower case and return
name = mw.ustring.lower(name) -- use unicode function
local specialChars = { -- list of special characters and replacement pairs
{ "ı", "i" } , { "İ", "i" } , { "ß", "ss" },
{ "ý", "y" } , { "ř", "r" } , { "ő", "o" },
{ "é", "e" } , { "è", "e" } , { "þ", "th" },
{ "ē", "e" } , { "ņ", "n" } , { "č", "c" },
{ "ū", "u" } , { "ž", "z" } , { "æ", "ae" },
{ "å", "a" } , { "ø", "o" } , { "ą", "a" },
{ "ń", "n" } , { "ł", "l" } , { "ã", "a" },
{ "ș", "s" } , { "š", "s" } , { "í", "i" },
{ "á", "a" } , { "ä", "a" } , { "ć", "c" },
{ "ç", "c" } , { "ğ", "g" } , { "ö", "o" },
{ "ë", "e" } , { "ú", "u" } , { "ó", "o" },
{ "ð", "d" } , { "ü", "u" } , { "ű", "u" },
{ "ā", "a" } , { "ī", "i" } , { "đ", "d" },
{ "ă", "a" } , { "â", "a" } , { "ż", "z" },
{ "ț", "t" } , { "ş", "s" } , { "ś", "s" },
{ "ǎ", "a" } , { "ě", "e" } , { "ů", "u" },
{ "ĕ", "e" } , { "ñ", "n" } , { "ď", "d" },
{ "ï", "i" } , { "ź", "z" } , { "ô", "o" },
{ "ė", "e" } , { "ľ", "l" } , { "ģ", "g" },
{ "ļ", "l" } , { "ę", "e" } , { "ň", "n" },
{ "ò", "o" }
}
for k,v in pairs(specialChars) do -- replace special characters from supplied list
name = string.gsub(name, v[1], v[2])
end
return name
end
--[[ return the name for sorting
return supplied alias name for sorting
otherwise
checks for pipe (redirect) and uses name after pipe
splits name into words
returns first name if only name (e.g. Nani)
otherwise returns name in format second_name [.. last name], firstname
]]
function p.getPlayerSortName (playerName, sortName, countryName)
--dewikify all names before sorting, also forces lowercase
playerName = p.preprocessSortName(playerName)
sortName = p.preprocessSortName(sortName)
if sortName ~= "" then -- if we have a sort name supplied
return sortName -- then return it
end
-- players from certain countries will use name in order supplied
local noSort = { "CAM", "CHN", "TPE", "MYA", "PRK", "KOR", "VIE" }
for k,v in pairs(noSort) do
if v == countryName then
return playerName
end
end
-- else work it out from the supplied player name
-- we don't want to test the name in a redirect, so get name after pipe if there is one
if string.find (playerName, "|") then -- test for redirect
local names = mw.text.split( playerName, "|")
playerName = names[2] -- get name after pipe
end
local names = mw.text.split( playerName, " ") -- we don't want to sort on first name
if #names == 1 then
return names[1] -- return name of single name player
else
-- we will assume the second name is the sort name e.g, Joe Bloggs, Jan van Bloggen
local name = names[2] -- set name to second name e.g. Bloggs or van
local i=3
while i <= #names do -- any addition names e.g. Bloggen
name= name .. names[i]
i=i+1
end
name = name .. ", " .. names[1] -- add first name e.g. Joe or Jan
return name -- sort on second name third name etc, first name
end
end
-- sort the list of countries alphabetically
function p.sortComment(comment)
local items = mw.text.split( comment, ",") -- split comma-delimited list
for k,v in pairs(items) do
items[k] = mw.text.trim(v) -- trim spaces and coe
end
table.sort(items, function(a,b) return a<b end) -- sort the table alphbetically
local list = "lawan " -- construct the alphabetical list string
for i=1, #items do
local sep = ", " -- separator for comma-delimited list
if i==1 then sep = "" -- first word doesn't need comma
elseif i==#items then sep = " & " -- use "and" before last word
end
list = list .. sep .. items[i]
end
return list
end
function p.getCountryName(country)
if string.len(country) == 3 then -- if the country given as a three-letter code
local codes = require('Module:Goalscorers/data/Country codes')
for k,v in pairs(codes.alias) do
if v[1] == country then
return v[2]
end
end
else
return country -- return the country name as is
end
end
--[[ sort goalscorers by goals, country and name
the sort first sorts by number of goals
when these are equal, it sorts by country
when these are equal, it sorts by name
Note: the name sort is on the first name
- a split of the name and sort on the last name is possible
- however, this would be complicated by Dutch (e.g. Stefan de Vrij) and Spanish names
- would sort on second name be better
]]
function p.sortGoalscorers()
local sort_function = function( a,b )
if (a.goals > b.goals) then -- primary sort on 'goals' -> a before b
return true
elseif (a.goals < b.goals) then -- primary sort on 'goals' -> b before a
return false
else -- a.goals == b.goals -- primary sort tied,
--return a.country < b.country -- resolve with secondary sort on 'country'
local country_a = p.getCountryName(a.country) -- sort on name of country, not the code
local country_b = p.getCountryName(b.country)
if (country_a < country_b) then -- secondary sort on 'country'
return true
elseif (country_a > country_b) then -- secondary sort on 'country'
return false
else -- a.country == b.country -- secondary sort tied,
--return a.player < b.player --resolve with tertiary sort on 'player' name
local player_a = p.getPlayerSortName(a.player, a.alias, a.country) -- get player name for sorting
local player_b = p.getPlayerSortName(b.player, b.alias, b.country)
return player_a < player_b --
--[[]
--local test_a, test_b = a.player, b.player
-- we don't want to test the name in a redirect, so get name after pipe if there is one
if string.find (a.player, "|") then -- test for redirect
local names = mw.text.split( a.player, "|")
test_a = names[2] -- get name after pipe
end
if string.find (b.player, "|") then
local names = mw.text.split( b.player, "|")
test_b = names[2]
end
local names_a = mw.text.split( test_a, " ") -- we don't want to sort on first name
local names_b = mw.text.split( test_b, " ") -- so split names
if not names_a[2] then names_a[2] = test_a end -- for players with one name
if not names_b[2] then names_b[2] = test_b end
return names_a[2] < names_b[2] -- sort on second name
]]
end
end
end
table.sort(g.goalscorers, sort_function)
end
function p.tabulateGoalscorers(frame, og)
-- ==============output the lists of goalscorers by goal======================
local goalNumber = 1000
local maxRank = tonumber(g.args['maxrank'] or 10) -- limit list top ten or value in parameter maxrank
local rank = 1
local playerCount = 0
local rankCount = 0
local playerCells = ""
local firstplayerCell = ""
local tableString = '\n{| class="wikitable"' -- start table
..'\n|-' .. '\n!Peringkat !! Pemain !! Gol' -- add table headers
if g.args['header'] then tableString = tableString .. '\n|+ ' .. g.args['header'] end -- add header
for j,u in pairs(g.goalscorers) do -- run through sorted list of selected goalscorers
-- is the player active still?
local playerActive = false
if data.active_countries then
for k,v in pairs(data.active_countries) do
if v == u['country'] then
playerActive = true
break;
end
end
end
local _,roundStatus = p.getNumberMatches()
if roundStatus == "complete" then playerActive = false end -- overrides active_countries
-- wikitext for tablulated list
local goalscorerString = p.addLinkedIcon(frame, u['country']) -- linked flag icon
if playerActive and g.args['bold']~='no' then
goalscorerString = goalscorerString .. " '''" .. u['player'] .. "'''>" -- bolded name
else
goalscorerString = goalscorerString .. " " .. u['player'] -- name
end
goalscorerString = goalscorerString .. u['comment'] -- comment for o.g.
-- we have a goalscorer
playerCount = playerCount + 1
rankCount = rankCount + 1
if u['goals'] < goalNumber then -- player belongs to rowspan for new number of goals
-- need to generate code for the previous rowspan (if there is one)
-- then start the counts and player list for the new one
if playerCount == 1 then
firstplayerCell = '\n|' .. goalscorerString -- if first player in list just create cell and set goals
goalNumber = u['goals']
--rank = 1
rankCount = 0
else -- else generate previous rowspan
local rowSpan = rankCount
if playerCount > maxRank * 1.5 then
firstplayerCell = '\n| style="font-style:italic;text-align:center;"|' .. rankCount .. " pemain"
playerCells = ""
rowSpan = 1
end
tableString = tableString .. '\n|-\n| style="text-align:center;" rowspan="' .. rowSpan .. '"|' .. rank
--if rankCount > 1 then tableString = tableString .. "=" end -- adds equals when rank shared
tableString = tableString .. firstplayerCell
tableString = tableString .. '\n| style="text-align:center;" rowspan="' .. rowSpan .. '"|' .. goalNumber
tableString = tableString .. playerCells
rank = rank + rankCount
if rank > maxRank then break end -- limit list top ten or value in parameter
rankCount = 0
goalNumber = u['goals']
firstplayerCell = '\n|' .. goalscorerString -- set first player cell for next rowspan
playerCells = ""
end
else -- else another player with same number of goals
playerCells = playerCells .. '\n|-' .. '\n|' .. goalscorerString -- add to player cell list
end
end -- reached end of list of goalscorers
if tableString ~= "" then
tableString = tableString .. "\n|}"
return tableString
else
return (" Tidak ada gol yang sesuai dengan kriteria yang diminta.")
end
end
function p.outputGoalscorers(frame, og) -- output list of goalscorers
if g.args['table'] then return p.tabulateGoalscorers(frame, og) end -- optional table output
local outputString = ""
if og == "OG" then end
-- ==============output the lists of goalscorers by goal======================
local goalNumber = 1000
--local goalMinimum = tonumber(templateArgs['minimum']) or 0
local listOpen = false -- flag for list started by template {{Div Col}}
for j,u in pairs(g.goalscorers) do -- run through sorted list of selected goalscorers
--if u['goals'] < goalMinimum then break end -- limit list to goals over a threshold (now handled in select goalscorers)
if u['goals'] < goalNumber then -- start new list of new number of goals
if listOpen then -- if an open list, close last list
outputString = outputString .. p.closeList(frame)
listOpen = false -- redundant as will be set true again
end
goalNumber = u['goals']
local goalString = " gol"
--if og == "OG" then
if goalNumber < 0 then
goalString = string.format ("%s bunuh diri", goalString )
end
if math.abs(u['goals']) ~= 1 then goalString = goalString end
outputString = outputString .. "\n'''" .. math.abs(u['goals']) .. goalString .. "'''" -- list caption
outputString = outputString .. p.openList(frame,og) --start new list
listOpen = true
--goalNumber = u['goals']
end
-- is the player active still?
local playerActive = false
if data.active_countries then
for k,v in pairs(data.active_countries) do
if v == u['country'] then
playerActive = true
break;
end
end
end
local _,roundStatus = p.getNumberMatches()
if roundStatus == "complete" then playerActive = false end -- overrides active_countries
-- wikitext for bullet list
local goalscorerString = '\n*<span>' .. p.addLinkedIcon(frame, u['country']) -- linked flag icon
if playerActive and g.args['bold']~='no' then
goalscorerString = goalscorerString .. " <b>" .. u['player'] .. "</b>" -- bolded name
else
goalscorerString = goalscorerString .. " " .. u['player'] -- name
end
goalscorerString = goalscorerString .. u['comment'] .. '</span>' -- comment for o.g.
outputString = outputString .. goalscorerString -- .. " " .. tostring(u['goals'])
end -- reached end of list of goalscorers
if outputString ~= "" then
outputString = outputString .. p.closeList(frame)
return outputString
else
return (" Tidak ada gol yang sesuai dengan kriteria yang diminta.")
end
end
-- output icon linked to national team page
function p.addLinkedIcon(frame, country)
local icon = data.templates['flag_icon_linked'] -- fbicon etc set in data module
local level = data.templates['youth_level'] or "" -- parameter for youth level, ie under-21
-- equivalent to {{fbicon|country}}
local flagVariant = ""
if data.templates.flagvar and data.templates.flagvar[country] then
flagVariant = data.templates.flagvar[country]
end
if level ~= "" then
return frame:expandTemplate{ title = icon , args = { level, country, flagVariant } }
else
return frame:expandTemplate{ title = icon , args = { country, flagVariant } } -- flag icon
end
end
-- formatting of list under each number of goals
function p.openList(frame,og)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Div col/styles.css' }
} .. '<div class="div-col" style="column-width:25em;">' -- perhaps add "column-count:3;"" to limit max number of columns?
end
function p.closeList(frame)
return '</div>'
end
function p.firstToUpper(str)
return (str:gsub("^%l", string.upper))
end
-- handles parameters bold, further, extra
function p.addAdditionHeaderText(text, dateUpdated)
if g.args['inlineref'] then
text = text .. g.args['inlineref']
end
if g.args['bold'] and g.args['bold']~='no' then
text = text .. " Pemain dengan '''cetak tebal''' masih bermain pada turnamen ini."
end
if g.args['further'] then
if text ~= "" then text = text .. " " end
text = text .. g.args['further']
end
if g.args['extra'] then
text = text .. "\n\n" .. g.args['extra']
end
return text
end
-- count number of goals for data in template
function p.countGoals(list, number, totalGoals)
local split = mw.text.split( list, "\n", true ) -- split the list for number of goals scorers with N goals
local count = #split * math.abs(number) -- calculate number of goals (including own goals)
totalGoals = totalGoals + count
--mw.addWarning( "Entry: " .. list .. "[" .. count .. "]")
return totalGoals
end
--[[ use data supplied by template
]]
--function p.list(frame)
function p.useTemplateData(frame)
--getArgs(frame)
--[[ {{#if:{{{assists|}}}||Sebanyak {{{goals}}}
{{#ifexpr:{{{goals}}}=1|gol|gol}} telah dicetak
{{#if:{{{players|}}}| oleh {{{players}}}
{{#ifexpr:{{{players}}}=1|pemain|pemain yang berbeda}}
{{#if:{{{own_goals|}}}| (dengan {{{own_goals}}} gol di antaranya termasuk ke dalam
{{#ifexpr:{{{own_goals}}}=1|gol bunuh diri|gol bunuh diri}})|}}|}} pada {{{matches}}}
{{#ifexpr:{{{matches}}}=1|pertandingan|pertandingan}}, dengan rata-rata
{{formatnum: {{#expr:{{{goals}}}/{{{matches}}} round 2}}}} {{formatnum:{{#ifexpr:({{{goals}}}/{{{matches}}} round 2)=1|gol|gol}}}} per pertandingan.}}
{{#if:{{{bold|}}}|{{#if:{{{assists|}}}|| }}Pemain dengan '''cetak tebal''' masih bermain pada turnamen ini.|}}
{{#if:{{{further|}}}|{{#if:{{{assists|}}}|| }}{{{further}}}|}}
{{#if:{{{extra|}}}|{{{extra}}}{{clear}}|}}
--]]
local statNumber = g.args['goals'] or g.args['assists'] or 0
local matches = g.args['matches']
local statType = "gol"
if g.args['assists'] then statType = "umpan gol" end
if g.args['clean sheets'] then statType = "nirbobol" end
local ongoing = g.args['ongoing']
local text1 = "Sebanyak"
if g.args['lc'] then text1 = "there" end
local updateString = ""
local averageString = ""
if g.args['goals'] and g.args['matches'] then
local averageGoals = g.args['goals']/g.args['matches']
averageString = string.format(" pada %d pertandingan, dengan rata-rata %.3g gol per pertandingan", g.args['matches'], averageGoals)
end
if g.args['updated'] and g.args['updated'] ~= "complete" then
updateString = " (per " ..g.args['updated'].. ")"
end
local titik = "."
if g.args['sep'] then sep = g.args['sep'] end
local text = ""
if g.args['goals'] then
text = string.format("%s %d %s dicetak %s",
text1, statNumber, statType, averageString..updateString..titik)
end
text = p.addAdditionHeaderText(text) -- handles template parameters bold, further, extra
--[[ {{#if:{{{30 goals|{{{30 assists|}}}}}}|'''30 {{#if:{{{assists|}}}|assists|goals}}'''
<div class="div-col columns column-count column-count-3" style="column-count:3;">
{{#if:{{{assists|}}}|{{{30 assists}}}|{{{30 goals}}}}}</div>|}}]]
local output = "\n"
local number = 30
local totalGoals = 0
while number > -4 do -- for the each goals/assists
local entry = g.args[number .. ' goals'] or g.args[number .. ' goal']
or g.args[number .. ' assists'] or g.args[number .. ' assist']
or g.args[number .. ' clean sheets'] or g.args[number .. ' clean sheet']
if number < 0 then
entry = g.args[math.abs(number) .. ' own goals'] or g.args[math.abs(number) .. ' own goal']
statType = "gol bunuh diri"
end
if entry then -- do we have goals/assists for this number
output = output .. "\n'''" .. tostring(math.abs(number)) .. " " .. statType .. "'''\n"
.. p.openList(frame) .. "\n" .. entry .. p.closeList(frame)
totalGoals = p.countGoals(entry, number, totalGoals)
end
number = number -1
end
if statType == "gol" or statType == "gol bunuh diri" then
if g.args['goals'] and totalGoals ~= tonumber(g.args['goals']) then
mw.addWarning("PERINGATAN. Jumlah gol pada terdaftar (" .. totalGoals .. ") dan parameter gol (" .. g.args['goals'] .. ") tidak cocok.")
end
end
--{{#if:{{{bottom|}}}|{{small|{{{bottom_text}}}}} <div class="div-col columns column-count column-count-3" style="column-count:3;"> {{{bottom}}}</div>|}}{{#if:{{{source|}}}|{{smaller|Source: {{{source}}}}}|}}
local footerText = g.args['footer-text'] or g.args['bottom'] or ""
local footerHeading = g.args['footer-heading'] or g.args['bottom-text'] or ""
local footer = ""
if footerText ~= "" then
local heading = ""
if footerHeading ~= "" then
heading = '<p>' .. footerHeading .. '</p>'
end
footer = '\n' .. heading .. p.openList(frame) .. '\n' .. footerText .. p.closeList(frame)
end
--{{#if:{{{source|}}}|{{small|Source: {{{source}}}}}|}}
local source = g.args['source'] or ""
if source ~= "" then source = "<small>Sumber: " .. source .. "</small>" end
return text .. output .. footer .. source
end
return p