Skip to content

Commit 503f4c0

Browse files
authored
fix(syntax): nested codeblock inside slots (#213)
1 parent 47e6330 commit 503f4c0

3 files changed

Lines changed: 163 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## Input
2+
3+
```md
4+
::component
5+
```mdc
6+
::alert
7+
hello
8+
::
9+
```
10+
::
11+
```
12+
13+
## AST
14+
15+
```json
16+
{
17+
"frontmatter": {},
18+
"meta": {},
19+
"nodes": [
20+
[
21+
"component",
22+
{},
23+
[
24+
"pre",
25+
{
26+
"language": "mdc"
27+
},
28+
[
29+
"code",
30+
{
31+
"class": "language-mdc"
32+
},
33+
"::alert\nhello\n::"
34+
]
35+
]
36+
]
37+
]
38+
}
39+
```
40+
41+
## HTML
42+
43+
```html
44+
<component>
45+
<pre language="mdc"><code class="language-mdc">::alert
46+
hello
47+
::</code></pre>
48+
</component>
49+
```
50+
51+
## Markdown
52+
53+
```md
54+
::component
55+
```mdc
56+
::alert
57+
hello
58+
::
59+
```
60+
::
61+
```
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
## Input
2+
3+
```md
4+
::component
5+
#code
6+
```mdc
7+
::alert
8+
hello
9+
::
10+
```
11+
::
12+
```
13+
14+
## AST
15+
16+
```json
17+
{
18+
"frontmatter": {},
19+
"meta": {},
20+
"nodes": [
21+
[
22+
"component",
23+
{},
24+
[
25+
"template",
26+
{
27+
"name": "code"
28+
},
29+
[
30+
"pre",
31+
{
32+
"language": "mdc"
33+
},
34+
[
35+
"code",
36+
{
37+
"class": "language-mdc"
38+
},
39+
"::alert\nhello\n::"
40+
]
41+
]
42+
]
43+
]
44+
]
45+
}
46+
```
47+
48+
## HTML
49+
50+
```html
51+
<component>
52+
<template name="code">
53+
<pre language="mdc"><code class="language-mdc">::alert
54+
hello
55+
::</code></pre>
56+
</template>
57+
</component>
58+
```
59+
60+
## Markdown
61+
62+
```md
63+
::component
64+
#code
65+
```mdc
66+
::alert
67+
hello
68+
::
69+
```
70+
::
71+
```

packages/comark/src/plugins/syntax.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,39 @@ const markdownItComarkBlock: PluginSimple = (md) => {
329329
const { name, props } = parseBlockParams(line.slice(1))
330330

331331
let lineEnd = startLine + 1
332+
let inCodeFence = false
333+
let codeFenceChar = ''
334+
let codeFenceCount = 0
332335
while (lineEnd < endLine) {
333336
const inner = state.src.slice(state.bMarks[lineEnd] + state.tShift[startLine], state.eMarks[lineEnd])
337+
338+
if (inCodeFence) {
339+
// Look for matching closing fence (same char, >= opening count, nothing but spaces after)
340+
if (inner[0] === codeFenceChar) {
341+
let fencePos = 1
342+
while (fencePos < inner.length && inner[fencePos] === codeFenceChar) fencePos++
343+
if (fencePos >= codeFenceCount && inner.slice(fencePos).trim() === '') {
344+
inCodeFence = false
345+
}
346+
}
347+
lineEnd += 1
348+
continue
349+
}
350+
351+
// Detect opening code fence (``` or ~~~, length >= 3)
352+
if (inner[0] === '`' || inner[0] === '~') {
353+
const ch = inner[0]
354+
let fencePos = 1
355+
while (fencePos < inner.length && inner[fencePos] === ch) fencePos++
356+
if (fencePos >= 3) {
357+
inCodeFence = true
358+
codeFenceChar = ch
359+
codeFenceCount = fencePos
360+
lineEnd += 1
361+
continue
362+
}
363+
}
364+
334365
if (/^#\w+/.test(inner) || inner.startsWith('::')) break
335366
lineEnd += 1
336367
}

0 commit comments

Comments
 (0)