diff options
author | Titus Wormer <tituswormer@gmail.com> | 2022-07-05 14:52:49 +0200 |
---|---|---|
committer | Titus Wormer <tituswormer@gmail.com> | 2022-07-05 14:52:49 +0200 |
commit | fec46e918e5bdf4a9137041298ab1475d2f43202 (patch) | |
tree | fb733a356b234bfeaf18fee911c6af72cfebe615 /src/construct/attention.rs | |
parent | 195e25958cfaa42d91b36f3fc51e8315586c6378 (diff) | |
download | markdown-rs-fec46e918e5bdf4a9137041298ab1475d2f43202.tar.gz markdown-rs-fec46e918e5bdf4a9137041298ab1475d2f43202.tar.bz2 markdown-rs-fec46e918e5bdf4a9137041298ab1475d2f43202.zip |
Fix interleaving of attention/label
Diffstat (limited to 'src/construct/attention.rs')
-rw-r--r-- | src/construct/attention.rs | 98 |
1 files changed, 54 insertions, 44 deletions
diff --git a/src/construct/attention.rs b/src/construct/attention.rs index d445938..d460afb 100644 --- a/src/construct/attention.rs +++ b/src/construct/attention.rs @@ -146,6 +146,8 @@ impl MarkerKind { struct Sequence { /// Marker used in this sequence. marker: MarkerKind, + /// The depth in events where this sequence resides. + balance: usize, /// The index into events where this sequence’s `Enter` currently resides. event_index: usize, /// The (shifted) point where this sequence starts. @@ -220,57 +222,62 @@ fn resolve(tokenizer: &mut Tokenizer) -> Vec<Event> { let codes = &tokenizer.parse_state.codes; let mut edit_map = EditMap::new(); let mut start = 0; + let mut balance = 0; let mut sequences: Vec<Sequence> = vec![]; // Find sequences of sequences and information about them. while start < tokenizer.events.len() { let enter = &tokenizer.events[start]; - if enter.event_type == EventType::Enter && enter.token_type == TokenType::AttentionSequence - { - let end = start + 1; - let exit = &tokenizer.events[end]; - let marker = MarkerKind::from_code(codes[enter.index]); - let before = classify_character(if enter.index > 0 { - codes[enter.index - 1] - } else { - Code::None - }); - let after = classify_character(if exit.index < codes.len() { - codes[exit.index] - } else { - Code::None - }); - let open = after == GroupKind::Other - || (after == GroupKind::Punctuation && before != GroupKind::Other); - // To do: GFM strikethrough? - // || attentionMarkers.includes(code) - let close = before == GroupKind::Other - || (before == GroupKind::Punctuation && after != GroupKind::Other); - // To do: GFM strikethrough? - // || attentionMarkers.includes(previous) - - sequences.push(Sequence { - event_index: start, - start_point: enter.point.clone(), - start_index: enter.index, - end_point: exit.point.clone(), - end_index: exit.index, - size: exit.index - enter.index, - open: if marker == MarkerKind::Asterisk { - open + if enter.event_type == EventType::Enter { + balance += 1; + + if enter.token_type == TokenType::AttentionSequence { + let end = start + 1; + let exit = &tokenizer.events[end]; + let marker = MarkerKind::from_code(codes[enter.index]); + let before = classify_character(if enter.index > 0 { + codes[enter.index - 1] } else { - open && (before != GroupKind::Other || !close) - }, - close: if marker == MarkerKind::Asterisk { - close + Code::None + }); + let after = classify_character(if exit.index < codes.len() { + codes[exit.index] } else { - close && (after != GroupKind::Other || !open) - }, - marker, - }); - - start += 1; + Code::None + }); + let open = after == GroupKind::Other + || (after == GroupKind::Punctuation && before != GroupKind::Other); + // To do: GFM strikethrough? + // || attentionMarkers.includes(code) + let close = before == GroupKind::Other + || (before == GroupKind::Punctuation && after != GroupKind::Other); + // To do: GFM strikethrough? + // || attentionMarkers.includes(previous) + + sequences.push(Sequence { + event_index: start, + balance, + start_point: enter.point.clone(), + start_index: enter.index, + end_point: exit.point.clone(), + end_index: exit.index, + size: exit.index - enter.index, + open: if marker == MarkerKind::Asterisk { + open + } else { + open && (before != GroupKind::Other || !close) + }, + close: if marker == MarkerKind::Asterisk { + close + } else { + close && (after != GroupKind::Other || !open) + }, + marker, + }); + } + } else { + balance -= 1; } start += 1; @@ -296,7 +303,10 @@ fn resolve(tokenizer: &mut Tokenizer) -> Vec<Event> { let sequence_open = &sequences[open]; // We found a sequence that can open the closer we found. - if sequence_open.open && sequence_close.marker == sequence_open.marker { + if sequence_open.open + && sequence_close.marker == sequence_open.marker + && sequence_close.balance == sequence_open.balance + { println!("open! {:?} {:?}", open, sequence_open); // If the opening can close or the closing can open, // and the close size *is not* a multiple of three, |