#![allow(clippy::tabs_in_doc_comments)]
use prelude::*;
pub mod error;
pub mod expanded;
pub mod lexer;
pub mod parser;
pub fn eval_teacat_string<Rend: Renderer<Out>, Out>(
teacat_string: impl AsRef<str>,
) -> CatResult<Out> {
let tokenstream = TokenStream::lex(teacat_string);
let ast = Ast::parse(tokenstream)?;
let expanded = ExpandedAst::expand(ast)?;
Ok(Rend::render(expanded))
}
pub fn encode_str(str: impl Into<String>) -> String {
#[rustfmt::skip]
const TOKENS: &[&str] = &[
"\\",
"[",
"]",
"{",
"}",
"macr",
":=",
":",
";",
"&",
"@",
];
let mut str = str.into();
for token in TOKENS {
str = str
.split(token)
.collect::<Vec<&str>>()
.join(&("\\".to_owned() + token));
}
str
}
#[macro_export]
macro_rules! vecdeque {
( $( $x:expr ),* $(,)? ) => {
std::collections::VecDeque::from(vec![ $( $x, )* ])
};
}
pub mod prelude {
pub use crate::error::TeaCatError;
pub use crate::expanded::{
ExpandedAst, ExpandedNode, ExpandedTag,
renderer::{Renderer, html::HtmlRenderer, tcat::TeaCatRenderer},
};
pub use crate::lexer::TokenStream;
pub use crate::parser::{Ast, Attributes};
pub use crate::{encode_str, eval_teacat_string};
pub(crate) use anyhow::Result as CatResult;
}