diff options
-rw-r--r-- | src/construct/partial_label.rs | 59 | ||||
-rw-r--r-- | src/state.rs | 6 |
2 files changed, 15 insertions, 50 deletions
diff --git a/src/construct/partial_label.rs b/src/construct/partial_label.rs index f56a591..ffea0da 100644 --- a/src/construct/partial_label.rs +++ b/src/construct/partial_label.rs @@ -75,41 +75,13 @@ use crate::util::constant::LINK_REFERENCE_SIZE_MAX; /// ^ /// ``` pub fn start(tokenizer: &mut Tokenizer) -> State { - match tokenizer.current { - Some(b'[') => { - tokenizer.enter(tokenizer.tokenize_state.token_1.clone()); - tokenizer.enter(tokenizer.tokenize_state.token_2.clone()); - tokenizer.consume(); - tokenizer.exit(tokenizer.tokenize_state.token_2.clone()); - State::Next(StateName::LabelAtMarker) - } - _ => State::Nok, - } -} - -/// At an optional extra marker. -/// -/// Used for footnotes. -/// -/// ```markdown -/// > | [^a] -/// ^ -/// ``` -pub fn at_marker(tokenizer: &mut Tokenizer) -> State { - // For footnotes (and potentially other custom things in the future), - // We need to make sure there is a certain marker after `[`. - if tokenizer.tokenize_state.marker == 0 { - tokenizer.enter(tokenizer.tokenize_state.token_3.clone()); - State::Retry(StateName::LabelAtBreak) - } else if tokenizer.current == Some(tokenizer.tokenize_state.marker) { - tokenizer.enter(tokenizer.tokenize_state.token_4.clone()); - tokenizer.consume(); - tokenizer.exit(tokenizer.tokenize_state.token_4.clone()); - tokenizer.enter(tokenizer.tokenize_state.token_3.clone()); - State::Next(StateName::LabelAtBreak) - } else { - State::Nok - } + debug_assert_eq!(tokenizer.current, Some(b'['), "expected `[`"); + tokenizer.enter(tokenizer.tokenize_state.token_1.clone()); + tokenizer.enter(tokenizer.tokenize_state.token_2.clone()); + tokenizer.consume(); + tokenizer.exit(tokenizer.tokenize_state.token_2.clone()); + tokenizer.enter(tokenizer.tokenize_state.token_3.clone()); + State::Next(StateName::LabelAtBreak) } /// In label, at something, before something else. @@ -123,16 +95,13 @@ pub fn at_break(tokenizer: &mut Tokenizer) -> State { || matches!(tokenizer.current, None | Some(b'[')) || (matches!(tokenizer.current, Some(b']')) && !tokenizer.tokenize_state.seen) { - tokenizer.tokenize_state.connect = false; - tokenizer.tokenize_state.seen = false; - tokenizer.tokenize_state.size = 0; - State::Nok + State::Retry(StateName::LabelNok) } else { match tokenizer.current { Some(b'\n') => { tokenizer.attempt( State::Next(StateName::LabelEolAfter), - State::Next(StateName::LabelAtBlankLine), + State::Next(StateName::LabelNok), ); State::Retry(space_or_tab_eol_with_options( tokenizer, @@ -188,15 +157,13 @@ pub fn eol_after(tokenizer: &mut Tokenizer) -> State { State::Retry(StateName::LabelAtBreak) } -/// In label, at blank line. +/// In label, on something disallowed. /// /// ```markdown -/// | [a␊ -/// > | ␊ -/// ^ -/// | b] +/// > | [] +/// ^ /// ``` -pub fn at_blank_line(tokenizer: &mut Tokenizer) -> State { +pub fn nok(tokenizer: &mut Tokenizer) -> State { tokenizer.tokenize_state.connect = false; tokenizer.tokenize_state.seen = false; tokenizer.tokenize_state.size = 0; diff --git a/src/state.rs b/src/state.rs index cbe19a7..615188e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -297,12 +297,11 @@ pub enum Name { HtmlTextLineEndingAfterPrefix, LabelStart, - LabelAtMarker, LabelAtBreak, LabelEolAfter, - LabelAtBlankLine, LabelEscape, LabelInside, + LabelNok, LabelEndStart, LabelEndAfter, @@ -782,12 +781,11 @@ pub fn call(tokenizer: &mut Tokenizer, name: Name) -> State { Name::HtmlTextLineEndingAfterPrefix => construct::html_text::line_ending_after_prefix, Name::LabelStart => construct::partial_label::start, - Name::LabelAtMarker => construct::partial_label::at_marker, Name::LabelAtBreak => construct::partial_label::at_break, Name::LabelEolAfter => construct::partial_label::eol_after, - Name::LabelAtBlankLine => construct::partial_label::at_blank_line, Name::LabelEscape => construct::partial_label::escape, Name::LabelInside => construct::partial_label::inside, + Name::LabelNok => construct::partial_label::nok, Name::LabelEndStart => construct::label_end::start, Name::LabelEndAfter => construct::label_end::after, |