Skip to content

Inline Rule end delimiter is treated the same as start delimiter when delimiters come in pairs (e.g. '{' and '}') #44

@SleeplessOne1917

Description

@SleeplessOne1917

I have the following code:

struct RubyScanner;

impl InlineRule for RubyScanner {
    const MARKER: char = '{';

    fn run(state: &mut InlineState) -> Option<(Node, usize)> {
        println!("START POS {}", state.pos);
        println!(
            "Relevant slice {}",
            unescape_all(&state.src[state.pos..state.pos_max])
        );

        let end_pos = state.src[state.pos..state.pos_max]
            .char_indices()
            .find_map(|(i, c)| (c == '}').then_some(i))?
            + state.pos;
        let (base_text, ruby_text) = state.src[state.pos + 1..end_pos].split_once('|')?;

        Some((
            Node::new(Ruby {
                base_text: base_text.trim().into(),
                ruby_text: ruby_text.trim().into(),
            }),
            (end_pos - state.pos) + 1,
        ))
    }
}

If I try parsing the following string with this ("\\{foo|bar}{baz|qux}"), the escape is correctly honored, but for some reason '}' is treated as a marker to start at the same as '{' is. The error output shows this:

START POS 9
Relevant slice }{baz|qux}
thread 'test::test::case_2' panicked at crates/markdown-it-ruby/src/lib.rs:66:47:
begin <= end (10 <= 9) when slicing `\{foo|bar}{baz|qux}`
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

I also tested this replacing '{' and '}' with '[' and ']' respectively and ran into the same issue. Interestingly, I didn't have this issue when I replaced the curly braces with parentheses.

Is this an error on my part? Because I expect MARKER - and only MARKER - to trigger the start of the scanner.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions