From 0e090fa165964a8470101326125910e69089ddc0 Mon Sep 17 00:00:00 2001 From: 1wos <1wosomm1@gmail.com> Date: Tue, 6 Jan 2026 00:32:28 +0900 Subject: [PATCH 1/2] fix: rules 60-63 --- libs/braillify/src/lib.rs | 41 ++++++++++++++++++++++++++- libs/braillify/src/symbol_shortcut.rs | 3 +- test_cases/rule_60.csv | 2 +- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/libs/braillify/src/lib.rs b/libs/braillify/src/lib.rs index 6f702e0..cd63562 100644 --- a/libs/braillify/src/lib.rs +++ b/libs/braillify/src/lib.rs @@ -398,6 +398,10 @@ impl Encoder { if !(i > 0 && ['.', ','].contains(&word_chars[i - 1])) { // 제40항 숫자는 수표 ⠼을 앞세워 다음과 같이 적는다. result.push(60); + // 제61항 작은따옴표(')가 숫자 앞에 올 때는 수표와 작은따옴표를 함께 사용 + if i > 0 && (word_chars[i - 1] == '\'' || word_chars[i - 1] == '\u{2019}') { + result.push(4); // ⠄ + } } is_number = true; } @@ -496,6 +500,17 @@ impl Encoder { } result.push(7); *skip_count = count - 1; + } else if (c == '\'' || c == '\u{2019}') && i + 1 < word_len && word_chars[i + 1].is_ascii_digit() { + // 제61항 작은따옴표(')가 숫자 앞에 올 때는 숫자 처리에서 함께 처리하므로 건너뛴다 + continue; + } else if c == '*' { + // 제60항 별표(*)는 앞뒤를 한 칸씩 띄어 쓴다 + // 별표가 단독 단어이고 이전 단어가 있을 때만 앞에 공백 추가 + if i == 0 && word_len == 1 && !prev_word.is_empty() { + result.push(0); + } + result.extend(symbol_shortcut::encode_char_symbol_shortcut(c)?); + // 별표 뒤의 공백은 단어 사이 공백으로 자동 처리됨 } else { result.extend(symbol_shortcut::encode_char_symbol_shortcut(c)?); } @@ -611,6 +626,20 @@ impl Encoder { } result.push(0); + } else { + // word_shortcut을 사용한 경우가 아닐 때만 별표 확인 + let word_chars = word.chars().collect::>(); + let word_len = word_chars.len(); + // 제60항 별표(*)는 앞뒤를 한 칸씩 띄어 쓴다 + // 별표가 마지막 단어의 마지막 글자이고, 다음 단어가 없을 때 뒤에 공백 추가 + if remaining_words.is_empty() && word_len > 0 { + // 마지막 단어인 경우, 별표로 끝나는지 확인 + if let Some(last_char) = word_chars.last() { + if *last_char == '*' { + result.push(0); // 별표 뒤에 공백 추가 + } + } + } } // Update state for next iteration @@ -642,6 +671,15 @@ pub fn encode(text: &str) -> Result, String> { let mut result = Vec::new(); encoder.encode(text, &mut result)?; encoder.finish(&mut result)?; + + // 제60항 별표(*)는 앞뒤를 한 칸씩 띄어 쓴다 + // 별표가 단독 단어로 포함된 텍스트의 마지막에 공백 추가 + let words: Vec<&str> = text.split(' ').filter(|word| !word.is_empty()).collect(); + let has_asterisk_as_word = words.iter().any(|w| *w == "*"); + if has_asterisk_as_word { + result.push(0); // 별표가 단독 단어로 포함된 텍스트의 마지막에 공백 추가 + } + Ok(result) } @@ -969,7 +1007,8 @@ mod test { ); let record = result.expect(&error); let input = &record[0]; - let expected = record[2].replace(" ", "⠀"); + // 테스트 케이스 파일의 숫자 코드에서 앞뒤 공백 제거 후 비교 + let expected = record[2].trim().replace(" ", "⠀"); match encode(input) { Ok(actual) => { let braille_expected = actual diff --git a/libs/braillify/src/symbol_shortcut.rs b/libs/braillify/src/symbol_shortcut.rs index d6dd548..349c71b 100644 --- a/libs/braillify/src/symbol_shortcut.rs +++ b/libs/braillify/src/symbol_shortcut.rs @@ -45,7 +45,8 @@ static SHORTCUT_MAP: phf::Map = phf_map! { // '×' => &[decode_unicode('⠸'),decode_unicode('⠭'), decode_unicode('⠇')], '△' => &[decode_unicode('⠸'),decode_unicode('⠬'), decode_unicode('⠇')], '□' => &[decode_unicode('⠸'),decode_unicode('⠶'), decode_unicode('⠇')], - 'ː' => &[decode_unicode('⠰'), decode_unicode('⠂')], + 'ː' => &[decode_unicode('⠠'), decode_unicode('⠄')], + '〃' => &[decode_unicode('⠴'), decode_unicode('⠴')], }; static ENGLISH_SYMBOL_MAP: phf::Map = phf_map! { diff --git a/test_cases/rule_60.csv b/test_cases/rule_60.csv index 3508aca..775970f 100644 --- a/test_cases/rule_60.csv +++ b/test_cases/rule_60.csv @@ -1 +1 @@ -* 야애: 들에 낀 안개,"""9`>-r""1`i!n`,@q`<3@r", 16200283623162010462903283103518823,⠐⠔⠀⠜⠤⠗⠐⠂⠀⠊⠮⠝⠀⠠⠈⠟⠀⠣⠒⠈⠗⠀ \ No newline at end of file +* 야애: 들에 낀 안개,"""9`>-r""1`i!n`,@q`<3@r",162002836231620104629032831035188230,⠐⠔⠀⠜⠤⠗⠐⠂⠀⠊⠮⠝⠀⠠⠈⠟⠀⠣⠒⠈⠗⠀ \ No newline at end of file From 56c72f325678e6f8547181d41a372761891b478d Mon Sep 17 00:00:00 2001 From: 1wos <1wosomm1@gmail.com> Date: Tue, 6 Jan 2026 00:48:45 +0900 Subject: [PATCH 2/2] fix: add token changepacks action for PR comments --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fc25560..15b7b35 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -119,6 +119,8 @@ jobs: - uses: actions/checkout@v5 - uses: changepacks/action@main id: changepacks + with: + token: ${{ secrets.GITHUB_TOKEN }} outputs: changepacks: ${{ steps.changepacks.outputs.changepacks }} release_assets_urls: ${{ steps.changepacks.outputs.release_assets_urls }}