|
158 | 158 | const lines = text.split("\n"); |
159 | 159 | let pass = 0, fail = 0, skip = 0; |
160 | 160 |
|
161 | | - function renderLine(line) { |
| 161 | + function renderLine(line, i) { |
162 | 162 | const cls = classify(line); |
163 | 163 | if (cls === "ln-pass") pass++; |
164 | 164 | else if (cls === "ln-fail") fail++; |
165 | 165 | else if (cls === "ln-skip") skip++; |
166 | 166 | const e = esc(line); |
167 | | - return cls ? `<span class="${cls}">${e}</span>` : e; |
| 167 | + const c = cls ? `class=${cls}` : ``; |
| 168 | + if (this.add) i += this.add; |
| 169 | + return `<span id="L${i}" ${c}>${e}</span>`; |
168 | 170 | } |
169 | 171 |
|
170 | 172 | // Group runs of deeply-nested "# #" diagnostic lines into a foldable |
|
177 | 179 | if (foldable(lines[i])) { |
178 | 180 | let j = i; |
179 | 181 | while (j < lines.length && foldable(lines[j])) j++; |
180 | | - const body = lines.slice(i, j).map(renderLine).join("\n"); |
| 182 | + const body = lines.slice(i, j).map(renderLine, {add: i}).join("\n"); |
181 | 183 | pieces.push( |
182 | 184 | `<span class="fold open"><span class="fold-toggle">${j - i} lines` + |
183 | 185 | `</span><span class="fold-body">\n${body}</span></span>`); |
184 | 186 | i = j; |
185 | 187 | } else { |
186 | | - pieces.push(renderLine(lines[i])); |
| 188 | + pieces.push(renderLine(lines[i], i, {add: 0})); |
187 | 189 | i++; |
188 | 190 | } |
189 | 191 | } |
|
199 | 201 | out.addEventListener("click", e => { |
200 | 202 | const t = e.target.closest(".fold-toggle"); |
201 | 203 | if (t) t.parentElement.classList.toggle("open"); |
| 204 | + |
| 205 | + // Set #Line in url |
| 206 | + var id = e.target.id; |
| 207 | + if (id && id.startsWith("L")) |
| 208 | + history.pushState(null, null, "#" + id); |
202 | 209 | }); |
203 | 210 |
|
204 | 211 | // Fold/unfold all button. |
|
0 commit comments