ennet's picture
Duplicate from sp12138sp/ChatDev
594c559
function scrollToBottom() {
var scrollContainer = document.getElementById('chat-box');
scrollContainer.scrollTop = scrollContainer.scrollHeight;
}
function append_message(role, text, avatarUrl) {
var message_container = $("<div></div>").addClass("message-container");
var avatar_element = $("<span></span>").addClass("avatar");
var role_element = $("<p></p>").addClass("role").text(role);
if (avatarUrl) {
avatar_element.css("background-image", `url(${avatarUrl})`);
} else {
avatar_element.css("background-color", "green");
}
message_container.append(role_element);
message_container.append(avatar_element);
var parsedText = role === 'System' ? parseSystemMessage(text) : parseCodeBlocks(text, role);
message_container.append(parsedText);
$("#chat-box").append(message_container);
scrollToBottom();
}
function parseCodeBlocks(text, role) {
var parts = text.split(/(```[\s\S]*?```)/g);
var parsedText = $("<div></div>").addClass("message-text");
parts.forEach(part => {
if (part.startsWith("```") && role != "System") {
var trimmedBlock = part.trim();
var language = trimmedBlock.match(/^```(\w+)/);
if (language) {
language = language[1];
var codeContent = trimmedBlock.replace(/^```(\w+)/, '').replace(/```$/, '');
var codeBlockHTML = `
<div class="code-block">
<div class="code-block-header">${role} - ${language}</div>
<pre class="language-${language} dark line-numbers" data-line><code>${hljs.highlightAuto(codeContent, [language]).value}</code></pre>
</div>
`;
parsedText.append(codeBlockHTML);
}
} else {
parsedText.append(marked(_.escape(part), {breaks: true}));
}
});
return parsedText;
}
function get_new_messages() {
$.getJSON("/get_messages", function (data) {
var lastDisplayedMessageIndex = $("#chat-box .message-container").length;
for (var i = lastDisplayedMessageIndex; i < data.length; i++) {
var role = data[i].role;
var text = data[i].text;
var avatarUrl = data[i].avatarUrl;
append_message(role, text, avatarUrl);
}
});
}
function parseSystemMessage(text) {
var message = $("<div></div>").addClass("message-text").addClass("system-message");
var firstLine = text.split('\n')[0];
var collapsed = true;
var messageContent = $("<div></div>").html(marked(firstLine, { breaks: true })).addClass("original-markdown");
var originalMarkdown = $("<div></div>").html(marked(text, { breaks: true })).addClass("original-markdown");
var expandButton = $("<button></button>")
.addClass("expand-button")
.text("Expand")
.click(function () {
if (collapsed) {
messageContent.hide();
originalMarkdown.show();
expandButton.text("Collapse");
} else {
messageContent.show();
originalMarkdown.hide();
expandButton.text("Expand");
}
collapsed = !collapsed;
});
message.append(messageContent);
message.append(originalMarkdown);
message.append(expandButton);
originalMarkdown.hide();
return message;
}
$(document).ready(function () {
get_new_messages();
setInterval(function () {
get_new_messages();
}, 1000);
});