snapper_fmt/parser/
mod.rs1pub mod latex;
2pub mod markdown;
3pub mod org;
4pub mod plaintext;
5pub mod rst;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub enum Region {
10 Prose(String),
12 Structure(String),
14 BlankLines(String),
16}
17
18pub trait FormatParser {
20 fn parse(&self, input: &str) -> Vec<Region>;
21}
22
23pub fn check_pragma(line: &str) -> Option<bool> {
26 let trimmed = line.trim();
27 let content = trimmed
29 .strip_prefix("# ") .or_else(|| trimmed.strip_prefix("% ")) .or_else(|| {
32 trimmed
34 .strip_prefix("<!-- ")
35 .and_then(|s| s.strip_suffix(" -->"))
36 })
37 .unwrap_or(trimmed); let content = content.trim();
39 if content == "snapper:off" {
40 Some(false)
41 } else if content == "snapper:on" {
42 Some(true)
43 } else {
44 None
45 }
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn pragma_org_comment() {
54 assert_eq!(check_pragma("# snapper:off"), Some(false));
55 assert_eq!(check_pragma("# snapper:on"), Some(true));
56 }
57
58 #[test]
59 fn pragma_latex_comment() {
60 assert_eq!(check_pragma("% snapper:off"), Some(false));
61 assert_eq!(check_pragma("% snapper:on"), Some(true));
62 }
63
64 #[test]
65 fn pragma_html_comment() {
66 assert_eq!(check_pragma("<!-- snapper:off -->"), Some(false));
67 assert_eq!(check_pragma("<!-- snapper:on -->"), Some(true));
68 }
69
70 #[test]
71 fn pragma_bare() {
72 assert_eq!(check_pragma("snapper:off"), Some(false));
73 assert_eq!(check_pragma("snapper:on"), Some(true));
74 }
75
76 #[test]
77 fn pragma_none() {
78 assert_eq!(check_pragma("regular text"), None);
79 assert_eq!(check_pragma("# a comment"), None);
80 assert_eq!(check_pragma(""), None);
81 }
82}