(track: string)
| 938 | |
| 939 | /** Build renderable HTML from strip-only track (no premature </tr>) */ |
| 940 | export function assembleStreamHtml(track: string): string { |
| 941 | const tableStart = findTableStart(track); |
| 942 | if (tableStart === -1) { |
| 943 | return track; |
| 944 | } |
| 945 | |
| 946 | const tableEnd = firstCompleteTableEnd(track, tableStart); |
| 947 | const prefix = track.slice(0, tableStart); |
| 948 | |
| 949 | if (tableEnd === -1) { |
| 950 | return prefix + assembleTableSectionHtml(track.slice(tableStart)); |
| 951 | } |
| 952 | |
| 953 | const firstTable = assembleTableSectionHtml(track.slice(tableStart, tableEnd)); |
| 954 | const postTrack = track.slice(tableEnd); |
| 955 | const postHtml = |
| 956 | findTableStart(postTrack) !== -1 |
| 957 | ? assembleStreamHtml(postTrack) |
| 958 | : closeOpenTags(postTrack); |
| 959 | |
| 960 | return prefix + firstTable + postHtml; |
| 961 | } |
| 962 | |
| 963 | /** Close non-table tags only (table rows need real </tr> in source) */ |
| 964 | function closeOpenTagsForStream(html: string): string { |
no test coverage detected