panache_parser/parser/inlines/
bookdown.rs1use 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}