@@ -18,7 +18,7 @@ func NewHTMLGraphRenderer() domain.GraphRenderer {
1818
1919var htmlColors = []string {
2020 "#FF0000" , "#0000FF" , "#00AA00" , "#FF8800" , "#FF00FF" ,
21- "#00FFFF" , "#FFFF00" , "#AA0000" , "# 0000AA" , "#00AA99" ,
21+ "#00FFFF" , "#FFFF00" , "#0000AA" , "#00AA99" ,
2222 "#FF00AA" , "#AAFF00" , "#FF6600" , "#0066FF" , "#00FF66" ,
2323 "#FF0066" , "#6600FF" , "#66FF00" , "#0066AA" , "#AA6600" ,
2424}
@@ -115,8 +115,6 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
115115
116116 segX := fmt .Sprintf ("%d, %d" , prevIndex , raceIndex )
117117 segY := fmt .Sprintf ("%d, %d" , elos [prevIndex ], elos [raceIndex ])
118- // Compute delta for this segment
119- delta := elos [raceIndex ] - elos [prevIndex ]
120118
121119 // Build trace; show hover only for decay segments
122120 var trace string
@@ -130,25 +128,24 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
130128 type: 'scatter',
131129 mode: 'lines',
132130 line: { color: %q, width: 2, dash: %q },
133- hoverinfo: 'skip',
134131 opacity: %.2f,
135- hovertemplate : '<b>%s</b><br>Rating: %%{y}<extra></extra> ',
132+ hoverinfo : 'skip ',
136133 visible: true
137- }` , fmt .Sprintf ("%s (%d)" , player .Name , player .ELO ), player .Name , showLegend , segX , segY , color , dash , opacity , player . Name )
134+ }` , fmt .Sprintf ("%s (%d)" , player .Name , player .ELO ), player .Name , showLegend , segX , segY , color , dash , opacity )
138135 } else {
139136 trace = fmt .Sprintf (`{
140- name: %q,
141- legendgroup: %q,
142- showlegend: %t,
143- x: [%s],
144- y: [%s],
145- type: 'scatter',
146- mode: 'lines',
147- line: { color: %q , width: 2, dash: %q },
148- opacity: %.2f,
149- hovertemplate : '<b>%s</b><br>Rating: %%{y}<br>Decay: %+d<extra></extra> ',
150- visible: true
151- }` , fmt .Sprintf ("%s (%d)" , player .Name , player .ELO ), player .Name , showLegend , segX , segY , color , dash , opacity , player . Name , delta )
137+ name: %q,
138+ legendgroup: %q,
139+ showlegend: %t,
140+ x: [%s],
141+ y: [%s],
142+ type: 'scatter',
143+ mode: 'lines',
144+ line: { color: '#AA0000' , width: 2, dash: %q },
145+ opacity: %.2f,
146+ hoverinfo : 'skip ',
147+ visible: true
148+ }` , fmt .Sprintf ("%s (%d)" , player .Name , player .ELO ), player .Name , showLegend , segX , segY , dash , opacity )
152149 }
153150 traces = append (traces , trace )
154151
@@ -160,25 +157,29 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
160157 }
161158
162159 // Add circle markers only at attended races (no markers for missed)
163- var attendedX []string
164- var attendedY []string
165- var attendedText []string
160+ var raceX []string
161+ var raceY []string
162+ var markerText []string
163+ missed := 0
166164 for raceIndex := 1 ; raceIndex < len (elos ); raceIndex ++ {
165+ raceX = append (raceX , fmt .Sprintf ("%d" , raceIndex ))
166+ raceY = append (raceY , fmt .Sprintf ("%d" , elos [raceIndex ]))
167+ delta := elos [raceIndex ] - elos [raceIndex - 1 ]
168+ pos := positions [player .Name ][raceIndex - 1 ]
169+
167170 if playerRaces [raceIndex - 1 ] {
168- attendedX = append (attendedX , fmt .Sprintf ("%d" , raceIndex ))
169- attendedY = append (attendedY , fmt .Sprintf ("%d" , elos [raceIndex ]))
170- delta := elos [raceIndex ] - elos [raceIndex - 1 ]
171- pos := positions [player .Name ][raceIndex - 1 ]
172- attendedText = append (attendedText , fmt .Sprintf ("Position: %d | Δ %+d" , pos , delta ))
171+ markerText = append (markerText , fmt .Sprintf ("Position: %d | Δ %+d" , pos , delta ))
172+ } else {
173+ missed += 1
174+ markerText = append (markerText , fmt .Sprintf ("Missed: %d | Δ %+d" , missed , delta ))
173175 }
174176 }
175- if len (attendedX ) > 0 {
176- // Quote text entries to produce a valid JS array of strings
177- quoted := make ([]string , len (attendedText ))
178- for i , t := range attendedText {
179- quoted [i ] = fmt .Sprintf ("%q" , t )
180- }
181- markerTrace := fmt .Sprintf (`{
177+ // Quote text entries to produce a valid JS array of strings
178+ quoted := make ([]string , len (markerText ))
179+ for i , t := range markerText {
180+ quoted [i ] = fmt .Sprintf ("%q" , t )
181+ }
182+ markerTrace := fmt .Sprintf (`{
182183 name: %q,
183184 legendgroup: %q,
184185 showlegend: false,
@@ -188,11 +189,10 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
188189 mode: 'markers',
189190 marker: { color: %q, size: 6, symbol: 'circle' },
190191 text: [%s],
191- hovertemplate: '<b>%s</b><br>Rating: %%{y}<br>%s<extra></extra>',
192+ hovertemplate: '<b>%s</b><br>Rating: %%{y}<br>%s<extra></extra>',
192193 visible: true
193- }` , fmt .Sprintf ("%s markers" , player .Name ), player .Name , strings .Join (attendedX , ", " ), strings .Join (attendedY , ", " ), color , strings .Join (quoted , ", " ), player .Name , "%{text}" )
194- traces = append (traces , markerTrace )
195- }
194+ }` , fmt .Sprintf ("%s markers" , player .Name ), player .Name , strings .Join (raceX , ", " ), strings .Join (raceY , ", " ), color , strings .Join (quoted , ", " ), player .Name , "%{text}" )
195+ traces = append (traces , markerTrace )
196196 }
197197
198198 html := fmt .Sprintf (`<!DOCTYPE html>
0 commit comments