+
-
${highlighted}
+
${highlighted}
`;
};
const props = defineProps(["visible", "details", "knowledgeType", "sourceInfo"]);
const emit = defineEmits(["closeDoc", "getDoc", "questionDeleted"]);
+
+// 监听 chunks 变化,自动更新合并内容
+watch(() => props.details?.md, (newChunks) => {
+ if (newChunks && newChunks.length > 0) {
+ mergedContent.value = mergeChunks(newChunks);
+ } else {
+ mergedContent.value = '';
+ }
+}, { immediate: true, deep: true });
+
const isTextFile = (fileType?: string): boolean => {
if (!fileType) return false;
const textTypes = ['txt', 'md', 'markdown', 'json', 'xml', 'html', 'css', 'js', 'ts', 'py', 'java', 'go', 'cpp', 'c', 'h', 'sh', 'yaml', 'yml', 'ini', 'conf', 'log'];
@@ -137,16 +194,6 @@ const loadOriginalContent = async () => {
loadingOriginal.value = false;
}
};
-const toggleViewMode = () => {
- if (viewMode.value === 'chunks') {
- viewMode.value = 'original';
- if (!originalContent.value && props.details.type === 'file') {
- loadOriginalContent();
- }
- } else {
- viewMode.value = 'chunks';
- }
-};
watch(() => props.details.md, (newVal) => {
nextTick(async () => {
const images = mdContentWrap.value.querySelectorAll('img.markdown-image');
@@ -165,8 +212,20 @@ watch(() => props.details.md, (newVal) => {
const processMarkdown = (markdownText) => {
if (!markdownText || typeof markdownText !== 'string') return '';
+ // 先还原原始文本中的 HTML 实体,让它们作为普通字符参与渲染
+ let processedText = markdownText
+ .replace(/'/g, "'")
+ .replace(/'/gi, "'")
+ .replace(/'/g, "'")
+ .replace(/"/g, '"')
+ .replace(/"/gi, '"')
+ .replace(/"/g, '"')
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&');
+
// 处理被
包裹的表格行,转换为正常的表格行,并在前后补空行
- let processedText = markdownText.replace(/
\s*(\|[\s\S]*?\|)\s*<\/p>/gi, '\n$1\n');
+ processedText = processedText.replace(/
\s*(\|[\s\S]*?\|)\s*<\/p>/gi, '\n$1\n');
// 保留表格单元格中的
,不转成换行,避免打散表格;其他区域原样交给 marked 处理
@@ -181,12 +240,14 @@ const processMarkdown = (markdownText) => {
html = html.replace(/<br\s*\/?>/gi, '
');
// 最终安全清理
- return sanitizeHTML(html);
+ let result = sanitizeHTML(html);
+
+ return result;
};
const handleClose = () => {
emit("closeDoc", false);
doc.scrollTop = 0;
- viewMode.value = 'chunks';
+ viewMode.value = 'merged';
originalContent.value = '';
};
@@ -455,37 +516,45 @@ const handleDetailsScroll = () => {
-
-