tree_sitter_md/
lib.rs

1//! This crate provides Markdown language support for the [tree-sitter][] parsing library.
2//!
3//! It contains two grammars: [`LANGUAGE`] to parse the block structure of markdown documents and
4//! [`INLINE_LANGUAGE`] to parse inline content.
5//!
6//! It also supplies [`MarkdownParser`] as a convenience wrapper around the two grammars.
7//! [`MarkdownParser::parse`] returns a [`MarkdownTree`] instread of a [`Tree`][Tree]. This struct
8//! contains a block tree and an inline tree for each node in the block tree that has inline
9//! content
10//!
11//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
12//! [Tree]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Tree.html
13//! [tree-sitter]: https://tree-sitter.github.io/
14
15use tree_sitter_language::LanguageFn;
16
17extern "C" {
18    fn tree_sitter_markdown() -> *const ();
19    fn tree_sitter_markdown_inline() -> *const ();
20}
21
22/// The tree-sitter [`LanguageFn`] for the block grammar.
23pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_markdown) };
24
25/// The tree-sitter [`LanguageFn`] for the inline grammar.
26pub const INLINE_LANGUAGE: LanguageFn =
27    unsafe { LanguageFn::from_raw(tree_sitter_markdown_inline) };
28
29/// The syntax highlighting queries for the block grammar.
30pub const HIGHLIGHT_QUERY_BLOCK: &str =
31    include_str!("../../tree-sitter-markdown/queries/highlights.scm");
32
33/// The language injection queries for the block grammar.
34pub const INJECTION_QUERY_BLOCK: &str =
35    include_str!("../../tree-sitter-markdown/queries/injections.scm");
36
37/// The syntax highlighting queries for the inline grammar.
38pub const HIGHLIGHT_QUERY_INLINE: &str =
39    include_str!("../../tree-sitter-markdown-inline/queries/highlights.scm");
40
41/// The language injection queries for the inline grammar.
42pub const INJECTION_QUERY_INLINE: &str =
43    include_str!("../../tree-sitter-markdown-inline/queries/injections.scm");
44
45/// The content of the [`node-types.json`][] file for the block grammar.
46///
47/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
48pub const NODE_TYPES_BLOCK: &str = include_str!("../../tree-sitter-markdown/src/node-types.json");
49
50/// The content of the [`node-types.json`][] file for the inline grammar.
51///
52/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
53pub const NODE_TYPES_INLINE: &str =
54    include_str!("../../tree-sitter-markdown-inline/src/node-types.json");
55
56#[cfg(feature = "parser")]
57mod parser;
58
59#[cfg(feature = "parser")]
60pub use parser::*;
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65
66    #[test]
67    fn can_load_block_grammar() {
68        let mut parser = tree_sitter::Parser::new();
69        parser
70            .set_language(&LANGUAGE.into())
71            .expect("Error loading Markdown block grammar");
72    }
73
74    #[test]
75    fn can_load_inline_grammar() {
76        let mut parser = tree_sitter::Parser::new();
77        parser
78            .set_language(&INLINE_LANGUAGE.into())
79            .expect("Error loading Markdown inline grammar");
80    }
81}