@@ -107,6 +107,11 @@ impl<'a, 'r, 'o, 'd, 'c, 'p> Subject<'a, 'r, 'o, 'd, 'c, 'p> {
107107 s. skip_char_bytes [ b'~' as usize ] = true ;
108108 s. emph_delim_bytes [ b'~' as usize ] = true ;
109109 }
110+ if options. extension . highlight {
111+ s. special_char_bytes [ b'=' as usize ] = true ;
112+ s. skip_char_bytes [ b'=' as usize ] = true ;
113+ s. emph_delim_bytes [ b'=' as usize ] = true ;
114+ }
110115 if options. extension . superscript || options. extension . inline_footnotes {
111116 s. special_char_bytes [ b'^' as usize ] = true ;
112117 }
@@ -198,6 +203,7 @@ impl<'a, 'r, 'o, 'd, 'c, 'p> Subject<'a, 'r, 'o, 'd, 'c, 'p> {
198203 let new_inl: Option < Node < ' a > > = match b {
199204 b'\r' | b'\n' => Some ( self . handle_newline ( ) ) ,
200205 b'`' => Some ( self . handle_backticks ( & ast. line_offsets ) ) ,
206+ b'=' if self . options . extension . highlight => Some ( self . handle_delim ( b'=' ) ) ,
201207 b'\\' => Some ( self . handle_backslash ( ) ) ,
202208 b'&' => Some ( self . handle_entity ( ) ) ,
203209 b'<' => Some ( self . handle_pointy_brace ( & ast. line_offsets ) ) ,
@@ -684,15 +690,18 @@ impl<'a, 'r, 'o, 'd, 'c, 'p> Subject<'a, 'r, 'o, 'd, 'c, 'p> {
684690 self . scanner . pos - 1 ,
685691 ) ;
686692
687- let is_valid_strikethrough_delim = if b == b'~' && self . options . extension . strikethrough {
693+ let is_valid_double_delim_if_required = if b == b'~' && self . options . extension . strikethrough
694+ {
688695 numdelims <= 2
696+ } else if b == b'=' && self . options . extension . highlight {
697+ numdelims == 2
689698 } else {
690699 true
691700 } ;
692701
693702 if ( can_open || can_close)
694703 && ( !( b == b'\'' || b == b'"' ) || self . options . parse . smart )
695- && is_valid_strikethrough_delim
704+ && is_valid_double_delim_if_required
696705 {
697706 self . push_delimiter ( b, can_open, can_close, inl) ;
698707 }
@@ -1202,7 +1211,7 @@ impl<'a, 'r, 'o, 'd, 'c, 'p> Subject<'a, 'r, 'o, 'd, 'c, 'p> {
12021211 // This array is an important optimization that prevents searching down
12031212 // the stack for openers we've previously searched for and know don't
12041213 // exist, preventing exponential blowup on pathological cases.
1205- let mut openers_bottom: [ usize ; 12 ] = [ stack_bottom; 12 ] ;
1214+ let mut openers_bottom: [ usize ; 13 ] = [ stack_bottom; 13 ] ;
12061215
12071216 // This is traversing the stack from the top to the bottom, setting `closer` to
12081217 // the delimiter directly above `stack_bottom`. In the case where we are processing
@@ -1233,6 +1242,7 @@ impl<'a, 'r, 'o, 'd, 'c, 'p> Subject<'a, 'r, 'o, 'd, 'c, 'p> {
12331242 b'\'' => 4 ,
12341243 b'_' => 5 ,
12351244 b'*' => 6 + ( if c. can_open { 3 } else { 0 } ) + ( c. length % 3 ) ,
1245+ b'=' => 12 ,
12361246 _ => unreachable ! ( ) ,
12371247 } ;
12381248
@@ -1459,6 +1469,12 @@ impl<'a, 'r, 'o, 'd, 'c, 'p> Subject<'a, 'r, 'o, 'd, 'c, 'p> {
14591469 }
14601470 } else if self . options . extension . superscript && opener_byte == b'^' {
14611471 NodeValue :: Superscript
1472+ } else if opener_byte == b'=' {
1473+ if self . options . extension . highlight {
1474+ NodeValue :: Highlight
1475+ } else {
1476+ NodeValue :: EscapedTag ( "==" . to_owned ( ) )
1477+ }
14621478 } else if self . options . extension . spoiler && opener_byte == b'|' {
14631479 if use_delims == 2 {
14641480 NodeValue :: SpoileredText
0 commit comments