use regex::Regex;
use std::sync::LazyLock;
#[derive(Debug)]
pub(crate) struct AtomicPattern {
pub(crate) pattern: &'static str,
pub(crate) open_delim: &'static str,
pub(crate) close_delim: &'static str,
pub(crate) open_re: &'static str,
pub(crate) close_re: &'static str,
}
pub(crate) static SINGLE_JINJA_TAG: AtomicPattern = AtomicPattern {
pattern: r"\{%.*?%\}",
open_delim: "{%",
close_delim: "%}",
open_re: r"\{%",
close_re: r"%\}",
};
pub(crate) static SINGLE_JINJA_COMMENT: AtomicPattern = AtomicPattern {
pattern: r"\{#.*?#\}",
open_delim: "{#",
close_delim: "#}",
open_re: r"\{#",
close_re: r"#\}",
};
pub(crate) static SINGLE_JINJA_VAR: AtomicPattern = AtomicPattern {
pattern: r"\{\{.*?\}\}",
open_delim: "{{",
close_delim: "}}",
open_re: r"\{\{",
close_re: r"\}\}",
};
pub(crate) static SINGLE_HTML_COMMENT: AtomicPattern = AtomicPattern {
pattern: r"<!--.*?-->",
open_delim: "<!--",
close_delim: "-->",
open_re: r"<!--",
close_re: r"-->",
};
pub(crate) static HTML_OPEN_TAG: AtomicPattern = AtomicPattern {
pattern: r"<[a-zA-Z][^>]*>",
open_delim: "",
close_delim: "",
open_re: "",
close_re: "",
};
pub(crate) static HTML_CLOSE_TAG: AtomicPattern = AtomicPattern {
pattern: r"</[a-zA-Z][^>]*>",
open_delim: "",
close_delim: "",
open_re: "",
close_re: "",
};
pub(crate) static ATOMIC_CONSTRUCT_PATTERN: LazyLock<Regex> = LazyLock::new(|| {
let patterns = [
r"````[\s\S]*?````",
r"```[\s\S]*?```",
r"``.+?``",
r"`[^`]+`",
r"\[[^\]]*\](?:\([^)]*\)|\[[^\]]*\])?",
r"\{%\s*[^/%\s][^%]*%\}\s*\{%\s*/[^%]*%\}",
r"\{#\s*[^/#\s][^#]*#\}\s*\{#\s*/[^#]*#\}",
r"\{\{\s*[^/}\s][^}]*\}\}\s*\{\{\s*/[^}]*\}\}",
r"<!--\s*[^/\-\s][^-]*(?:-[^-]+)*-->\s*<!--\s*/[^-]*(?:-[^-]+)*-->",
SINGLE_JINJA_TAG.pattern,
SINGLE_JINJA_COMMENT.pattern,
SINGLE_JINJA_VAR.pattern,
SINGLE_HTML_COMMENT.pattern,
HTML_OPEN_TAG.pattern,
HTML_CLOSE_TAG.pattern,
];
Regex::new(&format!("(?s){}", patterns.join("|")))
.expect("valid ATOMIC_CONSTRUCT_PATTERN regex")
});
pub(crate) static MARKDOWN_INLINE_PATTERN: LazyLock<Regex> = LazyLock::new(|| {
let patterns = [
r"````[\s\S]*?````",
r"```[\s\S]*?```",
r"``.+?``",
r"`[^`]+`",
r"\[[^\]]*\](?:\([^)]*\)|\[[^\]]*\])?",
r"<[A-Za-z][A-Za-z0-9+.\-]*:[^\s<>]*>",
r"<[^\s<>@]+@[^\s<>]+>",
r#"(?:https?://|www\.)[^\s<>]*[^\s<>?!.,:;*_~'")\]]"#,
];
Regex::new(&format!("(?s){}", patterns.join("|"))).expect("valid MARKDOWN_INLINE_PATTERN regex")
});