mirror of
https://github.com/andrepimenta/claude-code-chat.git
synced 2025-12-17 13:39:37 +00:00
Parse code blocks
This commit is contained in:
@@ -830,6 +830,43 @@ const styles = `
|
|||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Code blocks generated by markdown parser only */
|
||||||
|
.message-content pre.code-block {
|
||||||
|
background-color: var(--vscode-textCodeBlock-background);
|
||||||
|
border: 1px solid var(--vscode-panel-border);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 12px;
|
||||||
|
margin: 8px 0;
|
||||||
|
overflow-x: auto;
|
||||||
|
font-family: var(--vscode-editor-font-family);
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.5;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-content pre.code-block code {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
color: var(--vscode-editor-foreground);
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-line {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inline code */
|
||||||
|
.message-content code {
|
||||||
|
background-color: var(--vscode-textCodeBlock-background);
|
||||||
|
border: 1px solid var(--vscode-panel-border);
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-family: var(--vscode-editor-font-family);
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: var(--vscode-editor-foreground);
|
||||||
|
}
|
||||||
|
|
||||||
.priority-badge {
|
.priority-badge {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 2px 6px;
|
padding: 2px 6px;
|
||||||
|
|||||||
33
src/ui.ts
33
src/ui.ts
@@ -2260,13 +2260,44 @@ const html = `<!DOCTYPE html>
|
|||||||
|
|
||||||
|
|
||||||
function parseSimpleMarkdown(markdown) {
|
function parseSimpleMarkdown(markdown) {
|
||||||
const lines = markdown.split('\\n');
|
// First, handle code blocks before line-by-line processing
|
||||||
|
let processedMarkdown = markdown;
|
||||||
|
|
||||||
|
// Handle multi-line code blocks with triple backticks
|
||||||
|
// Using RegExp constructor to avoid backtick conflicts in template literal
|
||||||
|
const codeBlockRegex = new RegExp('\\\`\\\`\\\`(\\\\w*)\\n([\\\\s\\\\S]*?)\\\`\\\`\\\`', 'g');
|
||||||
|
processedMarkdown = processedMarkdown.replace(codeBlockRegex, function(match, lang, code) {
|
||||||
|
const language = lang || 'plaintext';
|
||||||
|
// Process code line by line to preserve formatting like diff implementation
|
||||||
|
const codeLines = code.split('\\n');
|
||||||
|
let codeHtml = '';
|
||||||
|
|
||||||
|
for (const line of codeLines) {
|
||||||
|
const escapedLine = escapeHtml(line);
|
||||||
|
codeHtml += '<div class="code-line">' + escapedLine + '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '\\n<pre class="code-block"><code class="language-' + language + '">' + codeHtml + '</code></pre>\\n';
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle inline code with single backticks
|
||||||
|
const inlineCodeRegex = new RegExp('\\\`([^\\\`]+)\\\`', 'g');
|
||||||
|
processedMarkdown = processedMarkdown.replace(inlineCodeRegex, '<code>$1</code>');
|
||||||
|
|
||||||
|
const lines = processedMarkdown.split('\\n');
|
||||||
let html = '';
|
let html = '';
|
||||||
let inUnorderedList = false;
|
let inUnorderedList = false;
|
||||||
let inOrderedList = false;
|
let inOrderedList = false;
|
||||||
|
|
||||||
for (let line of lines) {
|
for (let line of lines) {
|
||||||
line = line.trim();
|
line = line.trim();
|
||||||
|
|
||||||
|
// Check if this is a code block
|
||||||
|
if (line.includes('<pre class="code-block"><code')) {
|
||||||
|
// This is a complete code block on potentially multiple lines
|
||||||
|
html += line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Bold
|
// Bold
|
||||||
line = line.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');
|
line = line.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');
|
||||||
|
|||||||
Reference in New Issue
Block a user