#![forbid(unsafe_code)]
#![allow(dead_code, unreachable_pub, unused_imports)]
#![allow(
clippy::box_collection,
clippy::collapsible_if,
clippy::implicit_saturating_sub,
clippy::manual_is_multiple_of,
clippy::manual_pattern_char_comparison,
clippy::manual_repeat_n,
clippy::uninlined_format_args,
clippy::unnecessary_map_or
)]
mod configuration;
mod construct;
mod event;
pub mod mdast;
pub mod message;
mod parser;
mod resolve;
mod state;
mod subtokenize;
mod to_mdast;
mod tokenizer;
pub mod unist;
mod util;
pub use configuration::{Constructs, ParseOptions};
pub(crate) use util::character_reference::{decode_named, decode_numeric};
pub use util::mdx::{
EsmParse as MdxEsmParse, ExpressionKind as MdxExpressionKind, ExpressionParse as MdxExpressionParse,
Signal as MdxSignal,
};
pub fn to_mdast(value: &str, options: &ParseOptions) -> Result<mdast::Node, message::Message> {
let (events, parse_state) = parser::parse(value, options)?;
to_mdast::compile(&events, parse_state.bytes)
}
#[cfg(test)]
mod tests;
#[cfg(test)]
mod to_html;
#[cfg(test)]
pub use configuration::{CompileOptions, Options};
#[cfg(test)]
pub use util::line_ending::LineEnding;
#[cfg(test)]
pub fn to_html(value: &str) -> alloc::string::String {
to_html_with_options(value, &Options::default()).unwrap()
}
#[cfg(test)]
pub fn to_html_with_options(value: &str, options: &Options) -> Result<alloc::string::String, message::Message> {
let (events, parse_state) = parser::parse(value, &options.parse)?;
Ok(to_html::compile(&events, parse_state.bytes, &options.compile))
}
#[cfg(test)]
mod mdx_collect_tests;
#[cfg(test)]
mod mdx_parse_budget_tests;
#[cfg(test)]
mod pending_regressions;
pub fn to_mdast_with_attribute_ranges(
value: &str,
options: &ParseOptions,
) -> Result<(mdast::Node, alloc::vec::Vec<(usize, usize)>), message::Message> {
use event::{Kind, Name};
let (events, parse_state) = parser::parse(value, options)?;
let root = to_mdast::compile(&events, parse_state.bytes)?;
let mut ranges = alloc::vec::Vec::new();
let mut start = 0;
for event in &events {
if matches!(
event.name,
Name::MdxJsxTagAttributeExpression | Name::MdxJsxTagAttributeValueExpression
) {
match event.kind {
Kind::Enter => start = event.point.index,
Kind::Exit => ranges.push((start, event.point.index)),
}
}
}
Ok((root, ranges))
}