File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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\n hello\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+ ```
Original file line number Diff line number Diff line change 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\n hello\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+ ```
Original file line number Diff line number Diff 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 }
You can’t perform that action at this time.
0 commit comments