Skip to main content

harper_ink/
lib.rs

1use harper_core::parsers::{self, Parser, PlainEnglish};
2use harper_core::{Token, TokenKind};
3use harper_tree_sitter::TreeSitterMasker;
4use tree_sitter::Node;
5
6pub struct InkParser {
7    inner: parsers::Mask<TreeSitterMasker, PlainEnglish>,
8}
9
10impl InkParser {
11    fn node_condition(n: &Node) -> bool {
12        matches!(n.kind(), "contentText" | "blockComment" | "lineComment")
13    }
14}
15
16impl Default for InkParser {
17    fn default() -> Self {
18        Self {
19            inner: parsers::Mask::new(
20                TreeSitterMasker::new(tree_sitter_ink_lbz::LANGUAGE.into(), Self::node_condition),
21                PlainEnglish,
22            ),
23        }
24    }
25}
26
27impl Parser for InkParser {
28    fn parse(&self, source: &[char]) -> Vec<Token> {
29        let mut tokens = self.inner.parse(source);
30
31        for token in &mut tokens {
32            if let TokenKind::Space(v) = &mut token.kind {
33                *v = (*v).clamp(0, 1);
34            }
35        }
36
37        tokens
38    }
39}