(content, lines, role)
| 200 | } |
| 201 | |
| 202 | function createPreviewContentHTML(content, lines, role) { |
| 203 | const preview = lines.slice(0, 5).join("\n"); |
| 204 | const moreLines = lines.length - 5; |
| 205 | |
| 206 | let html = ` |
| 207 | <div class="message-preview-short clickable-message" title="Click to expand (${moreLines} more lines)"> |
| 208 | <div class="message-text"><pre>${escapeHtml(preview)}</pre></div> |
| 209 | <div class="expand-indicator">▼ ${moreLines} more lines</div> |
| 210 | </div> |
| 211 | <div class="message-content-full" style="display: none;" title="Content expanded - click collapse button below to hide"> |
| 212 | `; |
| 213 | |
| 214 | if (role === "assistant" && content.includes("```")) { |
| 215 | const parts = content.split("```"); |
| 216 | parts.forEach((part, i) => { |
| 217 | if (i % 2 === 0) { |
| 218 | html += `<div class="message-text"><pre>${escapeHtml( |
| 219 | part, |
| 220 | )}</pre></div>`; |
| 221 | } else { |
| 222 | html += `<div class="code-block"><pre><code>${escapeHtml( |
| 223 | part, |
| 224 | )}</code></pre></div>`; |
| 225 | } |
| 226 | }); |
| 227 | } else { |
| 228 | html += `<div class="message-text"><pre>${escapeHtml(content)}</pre></div>`; |
| 229 | } |
| 230 | |
| 231 | html += ` |
| 232 | <div class="collapse-indicator clickable-message" title="Click to collapse">▲ Click to collapse</div> |
| 233 | </div> |
| 234 | `; |
| 235 | |
| 236 | return html; |
| 237 | } |
| 238 | |
| 239 | function createComplexContentHTML(contentParts) { |
| 240 | let html = '<div class="message-content-full">'; |
no test coverage detected