Skip to content

Commit 98d0f88

Browse files
authored
feat: #1549 流式渲染场景,优化代码块自动闭合的时机并优化行内公式在表格里也可以自动闭合 (#1640)
* feat: #1549 流式渲染场景,优化代码块自动闭合的时机并优化行内公式在表格里也可以自动闭合 * fix: 更新测试用例
1 parent 253d68f commit 98d0f88

File tree

4 files changed

+37
-35
lines changed

4 files changed

+37
-35
lines changed

.changeset/cool-rooms-drum.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'cherry-markdown': patch
3+
---
4+
5+
feat: #1549 流式渲染场景,优化代码块自动闭合的时机并优化行内公式在表格里也可以自动闭合

packages/cherry-markdown/src/core/hooks/CodeBlock.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,13 @@ export default class CodeBlock extends ParagraphBase {
390390
if ($codes.length % 2 === 1) {
391391
const lastCode = $codes[$codes.length - 1].replace(/(`)[^`]+$/, '$1').replace(/\n+/, '');
392392
const $str = str.replace(/\n+$/, '').replace(/\n`{1,2}$/, '');
393-
return `${$str}\n${lastCode}\n`;
393+
return (
394+
`${$str}\n${lastCode}\n`
395+
// 如果自动闭合后代码块为空,则删除代码块
396+
.replace(/\n`{3,}[^`\n]*\n\s*`{3,}\n$/g, '\n')
397+
// 如果自动闭合的是mermaid图,则再判断第二行以后的内容是否为空,如果为空,则删除代码块
398+
.replace(/\n`{3,}\s*mermaid\s*\n[^\n]+\n\s*`{3,}\n$/g, '\n')
399+
);
394400
}
395401
return str;
396402
}

packages/cherry-markdown/src/core/hooks/InlineMath.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ export default class InlineMath extends ParagraphBase {
3636
// 非浏览器环境下配置为 node
3737
this.engine = isBrowser() ? (config.engine ?? 'MathJax') : 'node';
3838
this.$cherry = cherry;
39+
/**
40+
* 这里本意是用来存储「上一轮」成功渲染里的最后一个公式
41+
* 但因为偷懒,存的是「上一次」成功渲染里的公式,所以这里有个大大的「TODO」
42+
* 同时,mermaid渲染那里也有同样的问题,也有个大大的「TODO」
43+
*/
3944
this.lastCode = '';
4045
}
4146

@@ -105,17 +110,27 @@ export default class InlineMath extends ParagraphBase {
105110
let $str = str;
106111
// 格里处理行内公式,让一个td里的行内公式语法生效,让跨td的行内公式语法失效
107112
$str = $str.replace(getTableRule(true), (whole, ...args) => {
108-
return whole
109-
.split('|')
110-
.map((oneTd) => {
113+
const arr = whole.split('|');
114+
return arr
115+
.map((oneTd, index) => {
111116
// 单元格里的段落公式直接替换成行内公式
112-
return this.makeInlineMath(this.transformBlockMathToInlineMath(oneTd));
117+
const tdContent = this.transformBlockMathToInlineMath(oneTd);
118+
// 判断是否为最后一个td
119+
if (index === arr.length - 1) {
120+
return this.makeInlineMathWithSelfClosing(tdContent);
121+
}
122+
return this.makeInlineMath(tdContent);
113123
})
114124
.join('|')
115125
.replace(/\\~D/g, '~D') // 出现反斜杠的情况(如/$e=m^2$)会导致多一个反斜杠,这里替换掉
116126
.replace(/~D/g, '\\~D');
117127
});
118-
$str = this.makeInlineMath($str);
128+
$str = this.makeInlineMathWithSelfClosing($str);
129+
return $str;
130+
}
131+
132+
makeInlineMathWithSelfClosing(str) {
133+
let $str = this.makeInlineMath(str);
119134
if (this.isSelfClosing()) {
120135
const $oldStr = $str;
121136
$str = this.$dealUnclosingMath($str);

packages/cherry-markdown/test/core/__snapshots__/CommonMark.spec.ts.snap

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -787,21 +787,9 @@ exports[`engine > CommonMark-123 1`] = `
787787
`;
788788

789789
exports[`engine > CommonMark-124 1`] = `
790-
"<div
791-
data-sign="aed8acd0d907b2d4e168f20021dfa9ae1a8574319b7e6048909ee71173b0f5cd"
792-
data-type="codeBlock"
793-
data-lines="4"
794-
data-edit-code="true"
795-
data-copy-code="true"
796-
data-expand-code="false"
797-
data-change-lang="true"
798-
data-lang="javascript"
799-
style="position:relative"
800-
class="cherry-code-expand"
801-
>
802-
<pre class="language-javascript"><code class="language-javascript"><span class="code-line">aaa</span>
803-
<span class="code-line"><span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token template-punctuation string">\`</span></span><span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token string"></span></span></span></code></pre>
804-
</div><p data-sign="341bc3f1b434f6d1f5d0fa7347d3a70f754a52ce92292c4ab0dad22cb0d3c32a1" data-type="p" data-lines="1">\`\`\`\`\`\`</p>
790+
"<p data-sign="5356c3c275167a75447833ddc8dde1b582e561bad07d6c5c8a1e3774cbfa516b1" data-type="p" data-lines="1"><code>\`\`
791+
aaa
792+
\`</code></p>
805793
"
806794
`;
807795

@@ -1100,20 +1088,8 @@ exports[`engine > CommonMark-146 1`] = `
11001088
`;
11011089

11021090
exports[`engine > CommonMark-147 1`] = `
1103-
"<div
1104-
data-sign="f11be2dd92768aa5923aefaa736e14e2231f747463c161ab8fd07e682bb6646a"
1105-
data-type="codeBlock"
1106-
data-lines="3"
1107-
data-edit-code="true"
1108-
data-copy-code="true"
1109-
data-expand-code="false"
1110-
data-change-lang="true"
1111-
data-lang="javascript"
1112-
style="position:relative"
1113-
class="cherry-code-expand"
1114-
>
1115-
<pre class="language-javascript"><code class="language-javascript"><span class="code-line"><span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token template-punctuation string">\`</span></span>\` aaa</span></code></pre>
1116-
</div><p data-sign="f1b901847390b0ed7e374e7c1e464ec17b46a427c487a5ad6cbd2906405083d51" data-type="p" data-lines="1">\`\`\`</p>
1091+
"<p data-sign="8c8ee4db3a5455cfc767d4d904b8c89599b0a497c0951aa221b95327f03346b41" data-type="p" data-lines="1"><code>\`
1092+
\`</code> aaa</p>
11171093
"
11181094
`;
11191095

0 commit comments

Comments
 (0)