54
54
* @typedef {Partial<NormalizedExtension> } Extension
55
55
* An mdast extension changes how markdown tokens are turned into mdast.
56
56
*
57
- * @typedef {(this: Omit<CompileContext, 'sliceSerialize'>, left: Token|undefined, right: Token) => void } OnError
57
+ * @typedef {(this: Omit<CompileContext, 'sliceSerialize'>, left: Token|undefined, right: Token) => void } OnEnterError
58
+ * @typedef {(this: Omit<CompileContext, 'sliceSerialize'>, left: Token, right: Token) => void } OnExitError
58
59
*
59
60
* @typedef CompileContext
60
61
* mdast compiler context
61
62
* @property {Array<Node | Fragment> } stack
62
- * @property {Array<[Token, OnError |undefined]> } tokenStack
63
+ * @property {Array<[Token, OnEnterError |undefined]> } tokenStack
63
64
* @property {(key: string, value?: unknown) => void } setData
64
65
* Set data into the key-value store.
65
66
* @property {<K extends string>(key: K) => CompileData[K] } getData
68
69
* Capture some of the output data.
69
70
* @property {(this: CompileContext) => string } resume
70
71
* Stop capturing and access the output data.
71
- * @property {<N extends Node>(this: CompileContext, node: N, token: Token, onError?: OnError ) => N } enter
72
+ * @property {<N extends Node>(this: CompileContext, node: N, token: Token, onError?: OnEnterError ) => N } enter
72
73
* Enter a token.
73
- * @property {(this: CompileContext, token: Token) => Node } exit
74
+ * @property {(this: CompileContext, token: Token, onError?: OnExitError ) => Node } exit
74
75
* Exit a token.
75
76
* @property {TokenizeContext['sliceSerialize'] } sliceSerialize
76
77
* Get the string value of a token.
@@ -535,7 +536,7 @@ function compiler(options = {}) {
535
536
* @this {CompileContext}
536
537
* @param {N } node
537
538
* @param {Token } token
538
- * @param {OnError } [errorHandler]
539
+ * @param {OnEnterError } [errorHandler]
539
540
* @returns {N }
540
541
*/
541
542
function enter ( node , token , errorHandler ) {
@@ -569,8 +570,14 @@ function compiler(options = {}) {
569
570
}
570
571
}
571
572
572
- /** @type {CompileContext['exit'] } */
573
- function exit ( token ) {
573
+ /**
574
+ * @type {CompileContext['exit'] }
575
+ * @this {CompileContext}
576
+ * @param {Token } token
577
+ * @param {OnExitError } [onExitError]
578
+ * @returns {Node }
579
+ */
580
+ function exit ( token , onExitError ) {
574
581
const node = this . stack . pop ( )
575
582
assert ( node , 'expected `node`' )
576
583
const open = this . tokenStack . pop ( )
@@ -584,8 +591,12 @@ function compiler(options = {}) {
584
591
'): it’s not open'
585
592
)
586
593
} else if ( open [ 0 ] . type !== token . type ) {
587
- const handler = open [ 1 ] || defaultOnError
588
- handler . call ( this , token , open [ 0 ] )
594
+ if ( onExitError ) {
595
+ onExitError . call ( this , token , open [ 0 ] )
596
+ } else {
597
+ const handler = open [ 1 ] || defaultOnError
598
+ handler . call ( this , token , open [ 0 ] )
599
+ }
589
600
}
590
601
591
602
assert ( node . type !== 'fragment' , 'unexpected fragment `exit`ed' )
@@ -1130,7 +1141,7 @@ function extension(combined, extension) {
1130
1141
}
1131
1142
}
1132
1143
1133
- /** @type {OnError } */
1144
+ /** @type {OnEnterError } */
1134
1145
function defaultOnError ( left , right ) {
1135
1146
if ( left ) {
1136
1147
throw new Error (
0 commit comments