Claude’s response was limited as it hit the maximum length allowed at this time.
<!DOCTYPE html>
<html>
<!-- 前面的 head 部分和其他样式保持不变 -->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=5.0, user-scalable=yes">
<title>PaLM</title>
<style>
/* ... 其他样式保持不变 ... */
.user, .bot {
margin-bottom: 5px;
word-wrap: break-word;
padding: 8px;
border-radius: 5px;
white-space: pre-wrap;
max-width: 80%;
font-family: monospace; /* 使用等宽字体以更好地显示代码 */
}
.user {
background-color: #007bff;
color: #fff;
margin-left: auto;
text-align: left; /* 改为左对齐 */
}
.bot {
text-align: left;
background-color: #f2f2f2;
color: #333;
margin-right: auto;
}
/* 添加代码块特殊样式 */
.user pre, .bot pre {
background-color: rgba(0, 0, 0, 0.1);
padding: 8px;
border-radius: 4px;
margin: 4px 0;
white-space: pre;
overflow-x: auto;
}
.user pre {
background-color: rgba(255, 255, 255, 0.1);
}
.user code, .bot code {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 0.9em;
}
/* 调整输入框样式 */
#user-input {
flex-grow: 1;
padding: 8px;
border: 1px solid #ddd;
border-radius: 3px;
min-height: 20px;
max-height: 150px;
resize: vertical;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace; /* 使用等宽字体 */
font-size: inherit;
line-height: 1.4;
white-space: pre-wrap;
margin-right: 10px;
tab-size: 4; /* 设置 Tab 键宽度 */
}
/* ... 其他样式保持不变 ... */
</style>
</head>
<!-- body 部分和 HTML 结构保持不变 -->
<body>
<!-- ... HTML 结构保持不变 ... -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
// ... 其他 JavaScript 代码保持不变 ...
// 修改显示消息的函数,改进代码处理
function displayMessage(message, sender, timestamp) {
const messageElement = document.createElement('div');
messageElement.classList.add(sender);
if (sender === 'bot') {
// 配置 marked 以保持换行
marked.setOptions({
breaks: true,
gfm: true
});
message = marked.parse(message);
} else {
// 对用户消息进行特殊处理,检测并包装代码块
message = formatUserMessage(message);
}
messageElement.innerHTML = message;
chatContainer.appendChild(messageElement);
const timestampElement = document.createElement('div');
timestampElement.classList.add('timestamp');
timestampElement.innerText = timestamp;
chatContainer.appendChild(timestampElement);
const lineElement = document.createElement('hr');
chatContainer.appendChild(lineElement);
chatContainer.scrollTop = chatContainer.scrollHeight;
}
// 添加新函数:格式化用户消息
function formatUserMessage(message) {
// 检测是否包含代码块特征(多行缩进或特定语言结构)
const hasCodeBlock = /\n\s{4}|\n\t|^def\s|^class\s|^import\s|^from\s.*import/.test(message);
if (hasCodeBlock) {
return `<pre><code>${escapeHtml(message)}</code></pre>`;
}
// 保持普通消息的换行和空格
return escapeHtml(message);
}
// 添加新函数:HTML 转义
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// 改进文本区域处理
userInput.addEventListener('keydown', function(event) {
if (event.key === 'Tab') {
event.preventDefault();
const start = this.selectionStart;
const end = this.selectionEnd;
// 插入 4 个空格作为缩进
this.value = this.value.substring(0, start) + ' ' + this.value.substring(end);
// 将光标移动到插入后的位置
this.selectionStart = this.selectionEnd = start + 4;
}
});
// ... 其他 JavaScript 代码保持不变 ...
</script>
</body>
</html>