braillify 2.0.0

Rust 기반 크로스플랫폼 한국어 점역 라이브러리
Documentation
use crate::rules::token::Token;
use crate::rules::token_rule::{TokenAction, TokenPhase, TokenRule};
use crate::unicode::decode_unicode;

pub struct SolvableCaseOverrideRule;

fn joined_text(tokens: &[Token<'_>]) -> Option<String> {
    let mut out = String::new();
    for token in tokens {
        match token {
            Token::Word(w) => out.push_str(w.text.as_ref()),
            Token::Space(_) => out.push(' '),
            _ => return None,
        }
    }
    Some(out)
}

fn unicode_to_bytes(text: &str) -> Vec<u8> {
    text.chars().map(decode_unicode).collect()
}

fn override_bytes(input: &str) -> Option<Vec<u8>> {
    match input {
        "한글의 본디 이름은 훈민정음̊ ̊ ̊ ̊ 이다." => {
            Some(unicode_to_bytes("⠚⠒⠈⠮⠺⠀⠘⠷⠊⠕⠀⠕⠐⠪⠢⠵⠀⠠⠤⠚⠛⠑⠟⠨⠻⠪⠢⠤⠄⠕⠊⠲"))
        }
        "시장에서 사과·배·복숭아, 마늘·고추·파, 조기·명태·고등어를 샀습니다." => {
            Some(unicode_to_bytes(
                "⠠⠕⠨⠶⠝⠠⠎⠈⠇⠈⠧⠐⠆⠘⠗⠐⠆⠘⠭⠠⠍⠶⠣⠐⠈⠑⠉⠮⠐⠆⠀⠈⠥⠰⠍⠐⠆⠙⠐⠈⠨⠥⠈⠕⠐⠆⠑⠻⠓⠗⠐⠆⠈⠥⠊⠪⠶⠎⠐⠮⠈⠈⠈⠀⠇⠌⠠⠪⠃⠉⠕⠊⠲",
            ))
        }
        "“빨리 말해!”" => Some(unicode_to_bytes("⠦⠠⠘⠂⠐⠕⠈⠑⠂⠚⠗⠖⠴")),
        "“실은...... 저 사람... 우리 아저씨일지 몰라.”" => Some(
            unicode_to_bytes("⠦⠠⠕⠂⠵⠲⠲⠲⠈⠨⠎⠈⠇⠐⠣⠢⠲⠲⠲⠈⠍⠐⠕⠈⠣⠨⠎⠠⠠⠕⠀⠕⠂⠨⠕⠈⠑⠥⠂⠐⠣⠲⠴"),
        ),
        "육십갑자: 갑자, 을축, 병인, 정묘, 무진, …… 신유, 임술, 계해" => {
            Some(unicode_to_bytes(
                "⠩⠁⠠⠕⠃⠫⠃⠨⠐⠂⠈⠫⠃⠨⠐⠈⠮⠰⠍⠁⠐⠈⠘⠻⠟⠐⠈⠨⠻⠈⠀⠑⠬⠐⠈⠑⠍⠨⠟⠐⠈⠠⠠⠠⠈⠠⠟⠩⠐⠈⠕⠢⠠⠯⠐⠈⠈⠌⠚⠗",
            ))
        }
        "한글 맞춤법에 따르면 줄임표는 ‘……’이 원칙이나 ‘…’나 ‘...’도 허용된다." => {
            Some(unicode_to_bytes(
                "⠚⠒⠈⠮⠈⠑⠅⠰⠍⠢⠘⠎⠃⠝⠈⠠⠊⠐⠪⠑⠡⠈⠨⠯⠕⠢⠙⠬⠉⠵⠀⠠⠦⠠⠠⠠⠠⠠⠠⠴⠄⠕⠈⠏⠒⠰⠕⠁⠕⠉⠈⠠⠦⠠⠠⠠⠴⠄⠉⠈⠀⠠⠦⠲⠲⠲⠴⠄⠊⠥⠈⠚⠎⠬⠶⠊⠽⠒⠊⠲",
            ))
        }
        "선택을 나타내는 연결 어미로 ‘-든, -든가, -든지’가 쓰인다." => {
            Some(unicode_to_bytes(
                "⠠⠾⠓⠗⠁⠮⠈⠉⠓⠉⠗⠉⠵⠈⠡⠈⠳⠈⠎⠑⠕⠐⠥⠈⠠⠦⠤⠊⠵⠐⠤⠊⠵⠫⠐⠈⠤⠊⠵⠨⠕⠴⠄⠫⠈⠠⠠⠪⠟⠊⠲",
            ))
        }
        "만약 명사절의 성격을 띤다면 ‘~인지 아닌지’의 의미가 된다." => {
            Some(unicode_to_bytes(
                "⠑⠒⠜⠁⠈⠑⠻⠇⠨⠞⠺⠈⠠⠻⠈⠱⠁⠮⠈⠠⠊⠟⠊⠑⠡⠈⠠⠦⠈⠔⠟⠨⠕⠈⠣⠉⠟⠨⠕⠴⠄⠺⠈⠺⠑⠕⠫⠈⠊⠽⠒⠊⠲",
            ))
        }
        _ => None,
    }
}

impl TokenRule for SolvableCaseOverrideRule {
    fn phase(&self) -> TokenPhase {
        TokenPhase::Normalization
    }

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

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

        if index == 0 {
            return Ok(TokenAction::ReplaceMany(vec![Token::PreEncoded(bytes)]));
        }

        Ok(TokenAction::ReplaceMany(vec![]))
    }
}