#![doc = include_str!("../README.md")]
#![forbid(unsafe_code)]
#![cfg_attr(docsrs, feature(doc_cfg))]
use std::sync::Arc;
mod catalogue;
mod collections;
mod pipeline;
mod scan;
mod spec;
mod encoding;
mod incremental;
mod render;
mod syntax;
pub use catalogue::{Catalogue, CatalogueMatch};
pub use encoding::gaiji::GaijiResolution;
pub use encoding::{
DecodeError, decode_auto, decode_auto_into, decode_sjis, decode_sjis_into, has_utf8_bom,
};
pub use render::{AOZORA_CLASSES, DirectiveNormalization, RenderOptions, SerializeOptions};
pub use crate::spec::{
Diagnostic, DiagnosticInfo, DiagnosticSource, InternalCheckCode, PairKind, PairLink, Severity,
Span,
};
pub use crate::spec::{SlugEntry as CatalogueEntry, SlugFamily as CatalogueFamily};
pub use crate::syntax::{NodeKind, RubySide};
mod diagnostics_text;
mod document;
mod splice;
#[cfg(feature = "json")]
#[cfg_attr(docsrs, doc(cfg(feature = "json")))]
pub mod json;
pub use diagnostics_text::diagnostics_text;
pub use document::{
ContainerKind, ContainerPair, DirectiveClass, DirectiveView, Document, EditError,
LiteralMarkupKind, LiteralMarkupView, NodeView, ParseError, Parser, RubyView, Snapshot,
TextEdit,
};
pub fn parse(source: impl Into<Arc<str>>) -> Result<Document, ParseError> {
Parser::new().parse(source)
}
#[must_use]
pub fn resolve_gaiji(mencode: Option<&str>, description: &str) -> Option<String> {
encoding::gaiji::lookup(None, mencode, description).map(|resolved| {
let mut value = String::new();
_ = resolved.write_to(&mut value);
value
})
}
pub fn prewarm() {
pipeline::prewarm();
}
#[cfg(feature = "fmt")]
#[cfg_attr(docsrs, doc(cfg(feature = "fmt")))]
pub mod fmt;
#[cfg(feature = "pandoc")]
#[cfg_attr(docsrs, doc(cfg(feature = "pandoc")))]
pub mod pandoc;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn document_parse_returns_a_tree() {
let doc = Document::new("hello, world");
let tree = doc.snapshot();
assert_eq!(tree.to_source(), "hello, world");
}
#[test]
fn public_gaiji_resolution_returns_exact_glyphs() {
assert_eq!(resolve_gaiji(None, "々").as_deref(), Some("々"));
assert_eq!(
resolve_gaiji(Some("第3水準1-85-54"), "木+吶のつくり").as_deref(),
Some("枘")
);
assert_eq!(resolve_gaiji(None, "未知の字形"), None);
}
#[test]
fn document_parse_handles_ruby() {
let doc = Document::new("|青梅《おうめ》");
let tree = doc.snapshot();
assert_eq!(tree.to_source(), "青梅《おうめ》");
assert_eq!(tree.to_source_verbatim(), "|青梅《おうめ》");
}
#[test]
fn document_to_html_renders_plain_text() {
let doc = Document::new("hello");
let tree = doc.snapshot();
let html = tree.to_html();
assert!(html.contains("hello"), "html: {html}");
}
}