@@ -25,15 +25,97 @@ export function applyFixStrongTokens(md: MarkdownIt) {
2525}
2626
2727function fixStrongTokens ( tokens : MarkdownToken [ ] ) : MarkdownToken [ ] {
28+ let strongIndex = 0
29+ const cleansStrong = new Set < number > ( )
30+ const cleansEm = new Set < number > ( )
31+ let emIndex = 0
2832 for ( let i = 0 ; i < tokens . length ; i ++ ) {
2933 const t = tokens [ i ]
30- if ( t . type === 'strong_open' || t . type === 'strong_close' ) {
34+ const type = t . type
35+ if ( type === 'strong_open' ) {
36+ strongIndex ++
3137 const markup = String ( t . markup ?? '' )
32- if ( markup !== '**' ) {
38+ let j = i - 1
39+ while ( j >= 0 && tokens [ j ] . type === 'text' && tokens [ j ] . content === '' ) {
40+ j --
41+ }
42+ const preToken = tokens [ j ]
43+ let k = i + 1
44+ while ( k < tokens . length && tokens [ k ] . type === 'text' && tokens [ k ] . content === '' ) {
45+ k ++
46+ }
47+ const postToken = tokens [ k ]
48+
49+ if ( markup === '__' && ( preToken ?. content ?. endsWith ( '_' ) || postToken ?. content ?. startsWith ( '_' ) || postToken ?. markup ?. includes ( '_' ) ) ) {
3350 t . type = 'text'
51+ t . tag = ''
3452 t . content = markup
53+ t . raw = markup
54+ t . markup = ''
55+ t . attrs = null
56+ t . map = null
57+ t . info = ''
58+ t . meta = null
59+ cleansStrong . add ( strongIndex )
60+ }
61+ }
62+ else if ( type === 'strong_close' ) {
63+ if ( cleansStrong . has ( strongIndex ) && t . markup === '__' ) {
64+ t . type = 'text'
65+ t . content = t . markup
66+ t . raw = String ( t . markup ?? '' )
67+ t . tag = ''
68+ t . markup = ''
69+ t . attrs = null
70+ t . map = null
71+ t . info = ''
72+ t . meta = null
73+ }
74+ strongIndex --
75+ if ( strongIndex < 0 )
76+ strongIndex = 0
77+ }
78+ else if ( type === 'em_open' ) {
79+ emIndex ++
80+ const markup = String ( t . markup ?? '' )
81+ let j = i - 1
82+ while ( j >= 0 && tokens [ j ] . type === 'text' && tokens [ j ] . content === '' ) {
83+ j --
84+ }
85+ const preToken = tokens [ j ]
86+ let k = i + 1
87+ while ( k < tokens . length && tokens [ k ] . type === 'text' && tokens [ k ] . content === '' ) {
88+ k ++
89+ }
90+ const postToken = tokens [ k ]
91+ if ( markup === '_' && ( preToken ?. content ?. endsWith ( '_' ) || postToken ?. content ?. startsWith ( '_' ) || postToken ?. markup ?. includes ( '_' ) ) ) {
92+ t . type = 'text'
93+ t . tag = ''
94+ t . content = markup
95+ t . raw = markup
96+ t . markup = ''
97+ t . attrs = null
98+ t . map = null
99+ t . info = ''
100+ t . meta = null
101+ cleansEm . add ( emIndex )
102+ }
103+ }
104+ else if ( type === 'em_close' ) {
105+ if ( cleansEm . has ( emIndex ) && t . markup === '_' ) {
106+ t . type = 'text'
107+ t . content = t . markup
108+ t . raw = String ( t . markup ?? '' )
109+ t . tag = ''
35110 t . markup = ''
111+ t . attrs = null
112+ t . map = null
113+ t . info = ''
114+ t . meta = null
36115 }
116+ emIndex --
117+ if ( emIndex < 0 )
118+ emIndex = 0
37119 }
38120 }
39121 if ( tokens . length < 5 )
@@ -57,6 +139,7 @@ function fixStrongTokens(tokens: MarkdownToken[]): MarkdownToken[] {
57139 markup : '**' ,
58140 info : '' ,
59141 meta : null ,
142+ raw : '' ,
60143 } ,
61144 tokens [ i ] ,
62145 tokens [ i + 1 ] ,
@@ -71,6 +154,7 @@ function fixStrongTokens(tokens: MarkdownToken[]): MarkdownToken[] {
71154 markup : '**' ,
72155 info : '' ,
73156 meta : null ,
157+ raw : '' ,
74158 } ,
75159 ]
76160 if ( textContent ) {
@@ -97,10 +181,12 @@ function fixStrongTokens(tokens: MarkdownToken[]): MarkdownToken[] {
97181 markup : '**' ,
98182 info : '' ,
99183 meta : null ,
184+ raw : '' ,
100185 } ,
101186 {
102187 type : 'text' ,
103188 content : _nextToken ?. type === 'text' ? String ( _nextToken . content ?? '' ) : '' ,
189+ raw : _nextToken ?. type === 'text' ? String ( _nextToken . content ?? '' ) : '' ,
104190 } ,
105191 {
106192 type : 'strong_close' ,
@@ -112,6 +198,7 @@ function fixStrongTokens(tokens: MarkdownToken[]): MarkdownToken[] {
112198 markup : '**' ,
113199 info : '' ,
114200 meta : null ,
201+ raw : '' ,
115202 } ,
116203 ] as MarkdownToken [ ]
117204 const beforeText = tokenContent . slice ( 0 , - 1 )
0 commit comments