braillify 2.0.1

Rust 기반 크로스플랫폼 한국어 점역 라이브러리
Documentation
use std::borrow::Cow;

use crate::rules::token::{Token, WordMeta, WordToken};
use crate::rules::token_rule::{TokenAction, TokenPhase, TokenRule};
use crate::word_shortcut;

pub struct WordShortcutRule;

impl TokenRule for WordShortcutRule {
    fn phase(&self) -> TokenPhase {
        TokenPhase::WordShortcut
    }

    fn priority(&self) -> u16 {
        100
    }

    fn apply<'a>(
        &self,
        tokens: &[Token<'a>],
        index: usize,
        _state: &mut crate::rules::context::EncoderState,
    ) -> Result<TokenAction<'a>, String> {
        let Some(Token::Word(word)) = tokens.get(index) else {
            return Ok(TokenAction::Noop);
        };

        let Some((_, code, rest)) = word_shortcut::split_word_shortcut(word.text.as_ref()) else {
            return Ok(TokenAction::Noop);
        };

        if rest.is_empty() {
            return Ok(TokenAction::Replace(Token::PreEncoded(code.to_vec())));
        }

        let rest_chars: Vec<char> = rest.chars().collect();
        Ok(TokenAction::ReplaceMany(vec![
            Token::PreEncoded(code.to_vec()),
            Token::Word(WordToken {
                text: Cow::Owned(rest),
                chars: rest_chars.clone(),
                meta: WordMeta::from_chars(&rest_chars),
            }),
        ]))
    }
}