mod annotate;
mod document;
mod scan;
mod segment;
mod tokenizer;
#[cfg(feature = "pulldown-cmark-tokenizer")]
mod pulldown;
pub use scan::{CLOSE, OPEN, contains_markdoc_tag_in_url, find_tag_end};
pub use tokenizer::{Alignment, Container, ContainerKind, Event, Spanned, Tokenizer};
#[cfg(feature = "pulldown-cmark-tokenizer")]
pub use pulldown::PulldownTokenizer;
use crate::ast::Node;
use crate::transform;
#[derive(Clone, Debug, Default)]
#[non_exhaustive]
pub struct ParseOptions<'s> {
pub file: Option<&'s str>,
pub slots: bool,
pub location: bool,
pub allow_comments: bool,
pub validated_protocols: Option<Vec<String>>,
pub conditional_tags: Option<Vec<String>>,
}
impl<'s> ParseOptions<'s> {
#[must_use]
pub fn new() -> ParseOptions<'s> {
ParseOptions {
file: None,
slots: false,
location: true,
allow_comments: false,
validated_protocols: None,
conditional_tags: None,
}
}
#[must_use]
pub fn file(mut self, file: &'s str) -> ParseOptions<'s> {
self.file = Some(file);
self
}
#[must_use]
pub fn slots(mut self, slots: bool) -> ParseOptions<'s> {
self.slots = slots;
self
}
#[must_use]
pub fn location(mut self, location: bool) -> ParseOptions<'s> {
self.location = location;
self
}
#[must_use]
pub fn allow_comments(mut self, allow: bool) -> ParseOptions<'s> {
self.allow_comments = allow;
self
}
#[must_use]
pub fn validated_protocols(mut self, protocols: Vec<String>) -> ParseOptions<'s> {
self.validated_protocols = Some(protocols);
self
}
#[must_use]
pub fn conditional_tags(mut self, tags: Vec<String>) -> ParseOptions<'s> {
self.conditional_tags = Some(tags);
self
}
}
#[cfg(feature = "pulldown-cmark-tokenizer")]
#[must_use]
pub fn parse(source: &str) -> Node<'_> {
parse_with(source, &PulldownTokenizer::new(), &ParseOptions::new())
}
#[must_use]
pub fn parse_with<'s>(
source: &'s str,
tokenizer: &dyn Tokenizer,
options: &ParseOptions<'s>,
) -> Node<'s> {
let segmentation = segment::segment(source);
let mut document = document::Builder::new(source, options).run(&segmentation, tokenizer);
let conditional: Vec<&str> = match &options.conditional_tags {
Some(tags) => tags.iter().map(String::as_str).collect(),
None => transform::table::DEFAULT_CONDITIONAL_TAGS.to_vec(),
};
transform::table::apply(&mut document, &conditional);
document
}