Skip to main content

panache_parser/parser/inlines/
bookdown.rs

1//! Bookdown cross-reference parsing.
2//!
3//! Supports:
4//! - \@ref(label)
5//! - (\#label)
6//! - (ref:label)
7
8use crate::parser::inlines::citations::has_bookdown_prefix;
9
10fn is_section_label(label: &str) -> bool {
11    !label.contains(':')
12}
13
14fn label_allows_prefix(label: &str) -> bool {
15    is_section_label(label) || has_bookdown_prefix(label)
16}
17
18pub fn try_parse_bookdown_reference(text: &str) -> Option<(usize, &str)> {
19    let bytes = text.as_bytes();
20    if !bytes.starts_with(b"\\@ref(") {
21        return None;
22    }
23    let start = "\\@ref(".len();
24    let rest = &text[start..];
25    let close = rest.find(')')?;
26    if close == 0 {
27        return None;
28    }
29    let label = &rest[..close];
30    if !label_allows_prefix(label) {
31        return None;
32    }
33    Some((start + close + 1, label))
34}
35
36pub fn try_parse_bookdown_definition(text: &str) -> Option<(usize, &str)> {
37    let bytes = text.as_bytes();
38    if !bytes.starts_with(b"(\\#") {
39        return None;
40    }
41    let start = "(\\#".len();
42    let rest = &text[start..];
43    let close = rest.find(')')?;
44    if close == 0 {
45        return None;
46    }
47    let label = &rest[..close];
48    if !label_allows_prefix(label) {
49        return None;
50    }
51    Some((start + close + 1, label))
52}
53
54pub fn try_parse_bookdown_text_reference(text: &str) -> Option<(usize, &str)> {
55    let bytes = text.as_bytes();
56    if !bytes.starts_with(b"(ref:") {
57        return None;
58    }
59    let start = "(ref:".len();
60    let rest = &text[start..];
61    let close = rest.find(')')?;
62    if close == 0 {
63        return None;
64    }
65    let label = &rest[..close];
66    Some((start + close + 1, label))
67}
68
69pub fn try_parse_bookdown_equation_definition(text: &str) -> Option<(usize, &str)> {
70    let (len, label) = try_parse_bookdown_definition(text)?;
71    if !label.starts_with("eq:") {
72        return None;
73    }
74    Some((len, label))
75}