Page source: |
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4: #set ($locale = "en_us")
5: #set ($locale = $options.get("locale"))
6:
7: #set ($showconf = true)
8: #if ($options.get("stats_hide_conference") and $options.get("stats_hide_conference").equalsIgnoreCase("hide"))
9: #set ($showconf = false)
10: #end
11:
12: #set ($showCareer = $wiki.valid() && $seasons)
13: #if ("yes" == $options.get("stats_show_career") && $seasons)
14: #set ($showCareer = "yes")
15: #end
16:
17: #if ($locale == "en_us")
18: #set ($defLabel = "Defense")
19: #elseif ($locale == "en_gb")
20: #set ($defLabel = "Defence")
21: #end
22:
23: #set ($pos = "")
24: #if($attributes.get("position_stat"))
25: #set ($pos = $attributes.get("position_stat"))
26: #else
27: #set ($pos = $attributes.get("position"))
28: #set ($pos = $statPosition)
29: #set ($posVec = $pos.split("/"))
30: #set ($pos = $posVec[0])
31: #end
32: #set ($pos = $pos.toLowerCase())
33: #set ($statPos = $positions.get($pos))
34: #set ($paramPos = $request.getParameter("pos"))
35:
36: #set ($highlights = $highlights.get($statPos))
37:
38: #set ($url = ${page.url})
39: #set ($playerId = $attributes.get("playerId"))
40: #set ($stats = $splits.overall)
41:
42: #set ($hasEvents = $events.size() > 0)
43: #set ($hasSynopsis = $synopsis.length() > 1 && $synopsis.indexOf("<center>") == -1)
44: #set ($htmlStatsURL = "${page.url}-stats")
45: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
46: #set ($bioBriefURL = "${page.url}-brief")
47: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
48:
49: $request.setAttribute("careerTotals", $career)
50: ## We track a map of the careers to see if we are missing any seasons
51: #if(!$rosterTransactions)
52: #set ($careerMap = {})
53: $request.setAttribute("careerMap", $careerMap)
54: #foreach ($season in $seasons)
55: ## We need to include this season stats
56: #set ($pagePathFolders = $page.url.split("/"))
57: #set ($sportPath = ${pagePathFolders[2]})
58: #set ($path = "")
59: #set ($fixedSportPath = "/sports/${sportPath}/${season.seasonPath}")
60: #if ($pagePathFolders.size() > 6) ## Default path for players page /sports/sportPath/seasonPath/players/playerPageName
61: #set ($midPath = "/")
62: ## Use custom path and custom players page name
63: #foreach ($folder in $pagePathFolders)
64: #if ($foreach.index > 3 && $foreach.index < $pagePathFolders.size() - 1)
65: #set ($midPath = "${midPath}${folder}/")
66: #end
67: #end
68: #set ($path = "${fixedSportPath}${midPath}${season.bioPageName}?tmpl=bio-career-template&name=${season.seasonName}&pos=${statPos}&print=no")
69: #end
70: #if (!$website.exists($path))
71: ## Use default path
72: #set ($path = "${fixedSportPath}/players/${season.bioPageName}?tmpl=bio-career-template&name=${season.seasonName}&pos=${statPos}&print=no")
73: #end
74: $website.includeAgain($path)
75: #end
76: #end
77: #set ($view = "profile")
78: #if ($request.getParameter("view"))
79: #set ($view = $request.getParameter("view"))
80: #end
81:
82: #################################### MACROS ####################################################
83: #macro (printTableHeader $label $class)
84: <th class="text-uppercase $class">$label</th>
85: #end
86:
87: #macro (printCellClass)
88: class="text-nowrap text-center"
89: #end
90:
91: #macro (printTab $viewParam $label)
92: #set ($classAttr = "nav-link text-nowrap")
93: #if ($viewParam == $view)
94: #set ($classAttr = "${classAttr} active")
95: #end
96: <li class="nav-item">
97: <a href="${page.url}?view=${viewParam}" class="$classAttr" role="tab" data-toggle="tab" data-target="#${viewParam}" aria-selected="true" aria-controls="$viewParam">$label</a>
98: </li>
99: #end
100:
101: #macro (printPaneAttrs $viewParam)
102: #set ($classAttr = "tab-pane")
103: #if ($viewParam == $view)
104: #set ($classAttr = "tab-pane active")
105: #else
106: #set ($classAttr = "${classAttr} fade")
107: #end
108:
109: class="$classAttr" role="tabpanel" id="$viewParam"
110: #end
111:
112: #macro (printResultAriaLabel $event)
113: #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
114: #if ($event.neutralSite.length() > 0 || $event.home)
115: #set ($ariaLabel = "${ariaLabel} vs.")
116: #else
117: #set ($ariaLabel = "${ariaLabel} at")
118: #end
119: #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
120: #if ($event.neutralSite.length() > 0)
121: #set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
122: #end
123: #set ($ariaLabel = "${ariaLabel} Box Score")
124: aria-label="$ariaLabel"
125: #end
126:
127: #macro (printHighlights)
128: #if ($highlights)
129: <div class="d-flex flex-wrap mb-3 bg-light">
130: #foreach ($highlight in $highlights.keySet())
131: #set ($value = "-")
132: #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
133: #set ($classAttr = "flex-fill border p-2 text-center")
134: #if ($velocityCount > 1)
135: ## #set ($classAttr = "nav-item border-left")
136: #end
137: <div class="$classAttr" style="min-width:100px">
138: <div class="text-uppercase">$!highlights.get($highlight)</div>
139: <div class="h5 m-0">$!value</div>
140: </div>
141: #end
142: </div>
143: #end
144: #end ## macro printHighlights
145:
146: #macro (splitBioNetwork $statPosBriefs $label $stats)
147: <tr>
148: <th class="text-nowrap text-end text-right font-weight-bold">${label}</th>
149: #if($rosterTransactions && $stats.class.simpleName == "JSONObject")
150: #set($keys = $stats.names())
151: #set($array = $keys.toString().replace('"','').split(","))
152: #foreach ($brief in $statPosBriefs.keySet())
153: #set ($value = "-")
154: #if($array.contains($brief))
155: #set ($value = $!formatter.formatNumber($tool.math.toDouble($stats.get($brief)), $formats.get($brief)))
156: #end
157: <td>#if ($value.length() > 0) $value #else - #end</td>
158: #end
159: #else
160: #foreach ($brief in $statPosBriefs.keySet())
161: #set ($value = "-")
162: #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
163: <td #printCellClass>#if ($value.length() > 0) $value #else - #end</td>
164: #end
165: #end
166: </tr>
167: #end ## marco split
168:
169: #macro (printCategories $briefCategoryLabels $viewParam)
170: #printSubTabs($briefCategoryLabels.entrySet(), $viewParam)
171:
172: <div class="tab-content">
173: #foreach ($briefCat in $briefCategoryLabels.entrySet())
174: #set ($briefCatLabel = $briefCat.value)
175: #set ($class = "tab-pane")
176: #if ($briefCat.key == $activePos)
177: #set ($class = "tab-pane active")
178: #end
179: <div id="${viewParam}-${briefCat.key}" class="$class" role="tabpanel">
180: <div class="stats-wrap clearfix">
181: #if ($viewParam == "splits")
182: #splitsBioNetworkData($briefCat.key)
183: #elseif ($viewParam == "career")
184: #careerData($briefCat.key)
185: #end
186: </div>
187: </div>
188: #end
189: </div>
190: #end ## macro printCategories
191:
192: #macro (splitsBioNetworkData $p)
193: #set ($p = $positions.get($p))
194: #set ($statPosBriefs = $briefs.get($p))
195: #set ($colspan = $statPosBriefs.size() + 1)
196:
197: <div class="stats-container table-responsive">
198: <table class="table table-hover table-sm">
199: <thead class="thead-dark">
200: <tr>
201: <td> </td>
202: #foreach ($brief in $statPosBriefs)
203: #printTableHeader($brief, "text-center")
204: #end
205: </tr>
206: </thead>
207: #splitBioNetwork($statPosBriefs, "Total", $splits.overall)
208: #if ($showconf)
209: #splitBioNetwork($statPosBriefs, "Conference", $splits.conference)
210: #end
211: #splitBioNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
212:
213: <tr>
214: <td colspan="$colspan" class="text-center">-</td>
215: </tr>
216:
217: #splitBioNetwork($statPosBriefs, "Home", $splits.home)
218: #splitBioNetwork($statPosBriefs, "Away", $splits.away)
219: #splitBioNetwork($statPosBriefs, "Neutral", $splits.neutral)
220:
221: <tr>
222: <td colspan="$colspan" class="text-center">-</td>
223: </tr>
224:
225: #foreach($gameResult in $gamesResults.entrySet())
226: #if ($gameResult.key == "wins")
227: #set ($splitGameResult = $splits.inWins)
228: #elseif ($gameResult.key == "losses")
229: #set ($splitGameResult = $splits.inLosses)
230: #elseif ($gameResult.key == "ties")
231: #set ($splitGameResult = $splits.inTies)
232: #end
233:
234: #splitBioNetwork($statPosBriefs, $gameResult.value, $splitGameResult)
235: #end
236:
237: <tr>
238: <td colspan="$colspan" class="text-center">-</td>
239: </tr>
240:
241: #if ($monthsPlayed and $monthsPlayed.size() > 0)
242: #foreach($month in $monthsPlayed)
243: #if ($month == 'January')
244: #set ($splitMonth = $splits.january)
245: #elseif ($month == 'February')
246: #set ($splitMonth = $splits.february)
247: #elseif ($month == 'March')
248: #set($splitMonth = $splits.march)
249: #elseif ($month == 'April')
250: #set($splitMonth = $splits.april)
251: #elseif ($month == 'May')
252: #set ($splitMonth = $splits.may)
253: #elseif ($month == 'June')
254: #set ($splitMonth = $splits.june)
255: #elseif ($month == 'July')
256: #set($splitMonth = $splits.july)
257: #elseif ($month == 'August')
258: #set ($splitMonth = $splits.august)
259: #elseif ($month == 'September')
260: #set($splitMonth = $splits.september)
261: #elseif ($month == 'October')
262: #set($splitMonth = $splits.october)
263: #elseif ($month == 'November')
264: #set ($splitMonth = $splits.november)
265: #elseif ($month == 'December')
266: #set($splitMonth = $splits.december)
267: #end
268: #splitBioNetwork($statPosBriefs, $month, $splitMonth)
269: #end
270: #end
271: </table>
272: </div>
273: #end ## macro splitsBioNetworkData
274:
275: #macro (printRecentGames)
276: <div class="stats-container table-responsive">
277: <table class="table table-hover">
278: <thead class="thead-dark">
279: <tr>
280: <th class="text-uppercase w-1">Date</th>
281: <th class="text-uppercase text-start text-left">Opponent/Event</th>
282: <th scope="col" class="text-center text-uppercase">Result</th>
283: </tr>
284: </thead>
285:
286: #set ($eventEnd = -1)
287: #foreach ($event in $events)
288: #if ($event.event.result.resolved)
289: #set ($eventEnd = $velocityCount)
290: #end
291: #end
292:
293: #set ($eventStart = $eventEnd - 5)
294: #if ($eventStart < 0) #set ($eventStart = 0) #end
295:
296: #foreach ($event in $events)
297: #if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
298: <tr>
299: <td class="text-nowrap text-start text-left">$formatter.formatDate($event.event.date, "MMM d")</td>
300: <td class="text-nowrap text-start text-left">
301: #if ($event.event.neutralSite.length() > 0) vs.
302: #elseif (!$event.event.home) at
303: #end
304: $event.event.opponent.name
305: </td>
306: <td class="text-nowrap text-center">
307: #if ($event.event.statusCode >= 0)
308: #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
309: <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
310: #else
311: ${event.event.APResult}
312: #end
313: #end
314: </td>
315: </tr>
316: #end
317: #end
318: </table>
319: </div>
320: #end ## macro printRecentGames
321:
322: #macro (gamelogData $p)
323: #set ($p = $positions.get($p))
324: #set ($gamelogs = $gamelogs.get($p))
325: #set ($atLeastOneNotOverall = false)
326:
327: <div class="stats-container table-responsive">
328: <table class="table table-hover">
329: <thead class="thead-dark">
330: <tr>
331: #printTableHeader("Date", "w-1")
332: #printTableHeader("Opponent", "")
333: #printTableHeader("Score", "text-center")
334:
335: #set ($colspan = 3)
336: #if ($p == 'goalie' && ($sport.enumCode == 9 || $sport.enumCode == 3)) ## field hockey: 9 soccer:3
337: #printTableHeader("Dec", "text-center")
338: #end
339: #foreach ($gamelog in $gamelogs)
340: #printTableHeader($gamelog, "text-center")
341: #end
342: </tr>
343: </thead>
344: #foreach ($event in $events)
345: <tr>
346: <td class="text-nowrap">$formatter.formatDate($event.event.date, "MMM d") #if (!$event.event.overall) #set ($atLeastOneNotOverall = true) # #end</</td>
347: <td class="text-nowrap">
348: #if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
349: $event.event.opponent.name
350: </td>
351: <td #printCellClass>
352: #if ($event.event.statusCode >= 0)
353: #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
354: <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
355: #else
356: ${event.event.APResult}
357: #end
358: #else #end
359: </td>
360: #if ($p == 'goalie' && ($sport.enumCode == 9 || $sport.enumCode == 3)) ## field hockey: 9 soccer:3
361: <td #printCellClass>
362: #if ($event.stats.get('gow') == 1)
363: W
364: #elseif ($event.stats.get('gol') == 1)
365: L
366: #elseif ($event.stats.get('got') == 1)
367: T<
368: #else
369: -
370: #end
371: </td>
372: #end
373: #foreach ($gamelog in $gamelogs.keySet())
374: #set ($value = "-")
375: #set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
376: <td #printCellClass>$value</td>
377: #end
378: </tr>
379: #end
380: </table>
381:
382: #if ($atLeastOneNotOverall)
383: <p class="my-3"># Stats don't count towards season totals</p>
384: #end
385: </div>
386: #end ## macro gamelogData
387:
388: #macro (careerData $p)
389: #set ($p = $positions.get($p))
390: #set ($statPosBriefs = $briefs.get($p))
391:
392: <div class="stats-container table-responsive">
393: <table class="table table-hover table-sm">
394: <thead class="thead-dark">
395: <tr>
396: <th class=""> </th>
397: #foreach ($brief in $statPosBriefs)
398: #printTableHeader($brief, "text-center")
399: #end
400: </tr>
401: </thead>
402: #if($rosterTransactions)
403: #set ($seasonLength = $career.seasons.length())
404: #foreach ($index in [0..$tool.math.sub($seasonLength, 1)])
405: #set($season = $career.seasons[$index])
406: #if($season.seasonStatsURL != "null")
407: #set ($label = "<a href='${season.seasonStatsURL}?view=profile'>$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName</a>")
408: #else
409: #set ($label = "$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName")
410: #end
411: #splitBioNetwork($statPosBriefs, $label, $season.player.stats)
412: #end
413: #splitBioNetwork($statPosBriefs, "Total", $career.totals)
414:
415: #else
416: #foreach ($season in $seasons)
417: #if ($careerMap.get($season.seasonName))
418: #set ($label = "<a href='${season.path}?view=profile'>$season.seasonName</a>")
419: #splitBioNetwork($statPosBriefs, $label, $careerMap[$season.seasonName])
420: #elseif ($wiki.valid())
421: <tr>
422: <td class="text-nowrap text-end text-right text-muted fst-italic italic ">${season.seasonName}</td>
423: <td class="text-nowrap text-center text-muted fst-italic italic" colspan="${statPosBriefs.size()}">We could not find the "players" page in the ${season.seasonName} section.</td>
424: </tr>
425: #end
426: #end
427: #splitBioNetwork($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall)
428: #end
429:
430:
431: </table>
432: </div>
433: #end ## macro careerData
434:
435: #macro (printTabs)
436: <div class="tab-nav">
437: <ul class="nav nav-tabs nav-tabs-responsive flex-nowrap" role="tablist">
438: #printTab("profile", "Player Profile")
439: #printTab("gamelog", "Game Log")
440: #if ($showCareer)
441: #printTab("career", "Career Stats")
442: #end
443: #printTab("splits", "Split Stats")
444: </ul>
445: </div>
446: #end ## printTabs
447:
448: #macro (printLabel $label)
449: #if ($locale == "en_gb" && $label == "Defense")
450: Defence
451: #else
452: $label
453: #end
454: #end
455:
456: #macro (printSubTabs $entries $viewParam)
457: #set ($activeLabel = "")
458: #foreach ($entry in $entries)
459: #if ($entry.key == $activePos)
460: #set ($activeLabel = $entry.value)
461: #end
462: #end
463:
464: <ul class="nav nav-tabs nav-tabs-responsive mb-3" role="tablist" id="${viewParam}-subtabs">
465: #foreach($entry in $entries)
466: #set ($class = "nav-link")
467: #if ($entry.value == $activeLabel)
468: #set ($class = "${class} active")
469: #end
470: <li class="nav-item">
471: <a href="#${viewParam}-${entry.key}" class="${class}" id="${viewParam}-${entry.key}-tab" role="tab" data-toggle="tab">#printLabel($entry.value)</a>
472: </li>
473: #end
474: </ul>
475: #end
476: ################################################## END MACROS #############################################################
477:
478: <head>
479: <title>
480: $!attributes.get("first_name") $!attributes.get("last_name") | #if ($attributes.get("number"))#$!attributes.get("number") | #end #if($attributes.get("position_abbr") && !$attributes.get("position_abbr").empty)$!attributes.get("position_abbr") | #elseif ($attributes.get("position"))$!attributes.get("position") | #end $attributes.get("team")
481: </title>
482: </head>
483:
484: $request.setAttribute("icl-responsive-tabs-script", true)
485:
486: <div class="page-content player-stats">
487:
488:
489: <div class="d-flex justify-content-between">
490: <h1>
491: #if (!$attributes.get("number").empty)<span class="small text-muted">#$!attributes.get("number")</span>#end
492: $!attributes.get("first_name") $!attributes.get("last_name")
493:
494: #if($attributes.get("position_abbr") && !$attributes.get("position_abbr").empty)
495: <span class="small">($!attributes.get("position_abbr"))</span>
496: #elseif ($attributes.get("position"))
497: <span class="small">($!attributes.get("position"))</span>
498: #end
499: -
500: <small class="text-muted">
501: <a href="../teams?id=$!{attributes.get("teamId")}" aria-label="Team Stats - ${attributes.get("team")}">$attributes.get("team")</a>
502: </small>
503: </h1>
504:
505: #set ($teamId = $attributes.get("teamId"))
506: #if ($teamId.length() > 0)
507: <span class="pl-2">
508: <img class="img-mw-4" src="${website.teamLogo($teamId)}" alt="" />
509: </span>
510: #end
511: </div>
512:
513: #printHighlights
514:
515: <div class="tabs-container my-3">
516:
517: #printTabs
518:
519: <div class="tab-content p-3 border border-top-0">
520:
521: ## PROFILE
522: <div #printPaneAttrs("profile")>
523: <div class="row">
524: <div class="col-lg">
525: <h5>Player Stats</h5>
526: $website.include("${page.sectionPage.url}/players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
527: </div>
528: <div class="mt-3 col-lg mt-lg-0">
529: <h5>Recent Results</h5>
530: #printRecentGames
531:
532: #if($website.ads.isMediaInternalSectionsAdsEnabled())
533: <!-- Individual Player Page, ad unit is placed below recent results on Desktop and Mobile -->
534: <div id="waldo-tag-25894" class="p-3 text-center"></div>
535: #end
536: </div>
537: </div>
538:
539: #if ($hasSynopsis)
540: <div class="my-3">$!synopsis</div>
541: #end
542:
543: #if ($hasBioBrief)
544: <div class="my-3">$website.include($bioBriefURL)</div>
545: #end
546:
547: #if ($htmlStatsURL)
548: <div class="my-3">$website.include($htmlStatsURL)</div>
549: #end
550: </div> ## PROFILE
551:
552: ## GAMELOG
553: #set ($activePos = $statPos)
554: #if ($view == "gamelog" && $paramPos.length() > 0)
555: #if ($positions.get($paramPos).length() > 0)
556: #set ($activePos = $positions.get($paramPos))
557: #end
558: #end
559:
560: <div #printPaneAttrs("gamelog")>
561: #if ($gamelogsCategoriesLabels.size() > 0)
562: #printSubTabs($gamelogsCategoriesLabels.entrySet(), "gamelog")
563:
564: <div class="tab-content">
565: #foreach($entry in $gamelogsCategoriesLabels.entrySet())
566: #set ($class = "tab-pane")
567: #if ($entry.key == $activePos)
568: #set ($class = "tab-pane active")
569: #end
570: <div class="${class}" role="tabpanel" id="gamelog-${entry.key}">
571: #gamelogData($entry.key)
572: </div>
573: #end
574: </div>
575: #else
576: #gamelogData($pos)
577: #end
578: </div> ## tab-pane
579: ## GAMELOG
580:
581: ## CAREER
582: #if ($showCareer)
583: #set ($activePos = $statPos)
584: #if ($view == "career" && $paramPos.length() > 0)
585: #if ($positions.get($paramPos).length() > 0)
586: #set ($activePos = $positions.get($paramPos))
587: #end
588: #end
589: <div #printPaneAttrs("career")>
590: #if ($briefsCategoriesLabels)
591: #printCategories($briefsCategoriesLabels "career")
592: #else
593: #careerData($activePos)
594: #end
595: </div>
596: #end
597: ## CAREER
598:
599: ## SPLITS
600: #set ($activePos = $statPos)
601: #if ($view == "splits" && $paramPos.length() > 0)
602: #if ($positions.get($paramPos).length() > 0)
603: #set ($activePos = $positions.get($paramPos))
604: #end
605: #end
606:
607: <div #printPaneAttrs("splits")>
608: #if ($briefsCategoriesLabels)
609: #printCategories($briefsCategoriesLabels "splits")
610: #else
611: #splitsBioNetworkData($pos)
612: #end
613: </div>
614: ## SPLITS
615:
616: </div> ## tab-content
617: </div> ## tabs-container
618: </div> ## bio-wrapper
619: $wiki.su
|