Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions spec/words.md
Original file line number Diff line number Diff line change
Expand Up @@ -11653,3 +11653,38 @@ name.common-predicate에 둔다(高い, 強い, 眩しい). 쌍점이나 【】
| やめろって言っただろ | 그만두라고 했지 | 유지 |

사례: `tests/rules/cases/dam-temi-te-iu.tsv`

## LEX-5800 줄 머리 화자 표시의 히라가나 이름은 소리대로 쓴다

자막과 대본의 줄 머리에서 말을 붙이는 화자 표시에 든 히라가나 두 글자에서 여섯 글자 덩어리는 이름이다. 둥근 괄호와 각괄호(전각,
반각: `(のぼる)`, `(のぼる)`, `[のぼる]`, `[のぼる]`), 콜론 앞(`のぼる:`), 줄을 닫는 「 앞(`のぼる「…」`)이 모두 그렇다. 덩어리가
동사 꼴(まもる 守る, ひかる 光る)이거나 사전에 없는 말(たまお)이어도 낱말로 옮기지 않고, 이름 행이 있으면 그 읽기로, 없으면 문서의
히라가나 이름처럼 장음 한 쌍을 줄여(ゆう `유`) 소리대로 쓴다. 덩어리 뒤 경칭은 이름 뒤에서 그대로 읽는다(かけるくん `카케루 군`).
문서 모드와 줄마다 모드가 같다.

- 사전이 덩어리 전체를 낱말로 가지면 이름 층에 같은 이름이 있어도 낱말이다. 사전의 온전한 일반 낱말과 한자 낱말의 가나 표기(ざわめき,
うた, おとこ, ははおや, てんいん), 사람 명사와 대명사(おばあさん, あなた), 소리 사전의 감탄사와 소리(てか), する 동사의 어간(てき),
기본형이 아닌 동사 꼴(まって, やめて, わらい, こごえ: て형, 연용형)과 형용사 꼴(いい), 낱말과 문장 끝 조사(いいよ, あるぞ)가 그렇다.
동사 기본형은 이름에 흔해서(ひかる, まもる) 이름으로 읽고, 사전의 사람 행은 언제나 이름이다(みのり). 「, 콜론, ≫ 앞에는 화자만
서므로 이름 층의 사람 행이 낱말보다 먼저다(さくら「…」 `사쿠라`). 괄호는 소리나 목소리도 적으므로 괄호 안에서는 낱말이 먼저다((うた) `노래`).
- 두 글자 덩어리는 사람 행이 있거나 어느 사전에도 없을 때만 이름이다(おと는 낱말, もず는 이름).
- 경칭까지 한 낱말인 말(おかあさん, みなさん)과 お나 ご에 경칭이 붙은 말(おきゃくさん), 같은 반을 되풀이한 소리, っ로 끝나는 덩어리,
역할 표시(noun.label-role)는 이름이 아니다. 괄호 뒤에 だ, です, じゃ가 오면 괄호는 문장의 낱말이다((ないしょ)だよ).
- 괄호 뒤에 말이 없거나((笑い)) 조사가 괄호를 받으면((まもる)は) 화자 표시가 아니고, 줄 가운데 괄호(昨日は(たぶん))도 아니다.
- 콜론 뒤에 다른 콜론이 또 오거나 가나도 문장 부호도 없는 값만 오는 줄은 항목이다(けもみみ:兎, けもみみ:兎 美徳:純潔).
- 각괄호 화자 표시는 줄을 연다. 다른 괄호 묶음 뒤의 각괄호는 목록의 낱말이다([ガンガンいこうぜ] [いのちだいじ]). 일곱 글자 이상의
덩어리와 낱말에 조사가 붙은 덩어리는 말이다(でもいつのまにか「).
- 크레딧에서 줄 머리 이름 바로 뒤에 feat. 이나 ft. 가 오면(ぽんた(Feat.IA)), 줄 머리 이름 뒤 괄호에서 /로 라틴 문자 이름과 묶인 첫
이름이면(山田太郎(たろー/T-BOX)) 사전 낱말이어도 이름이다.

| 원문 | 출력 | 구분 |
|---|---|---|
| (ひかる)待って! | (히카루) 기다려! | 고침 |
| [のぼる]行くぞ! | [노보루]가겠어! | 고침 |
| かける「早く来て」 | 카케루 「빨리 와」 | 고침 |
| ぽんた(Feat.IA) | 폰타(Feat.IA) | 고침 |
| (ざわめき)皆さん 静かに。 | (웅성거림) 여러분 조용하게. | 유지 |
| (おかあさん)ごはんよ。 | (어머니) 밥이야. | 유지 |
| 昨日は(たぶん)晴れだった。 | 어제는(아마) 맑음이었다. | 유지 |

사례: `tests/rules/cases/names-kana-speaker-labels-5800.tsv`, `tests/rules/documents/names-kana-speaker-labels-5800.tsv`
243 changes: 237 additions & 6 deletions src/core/names/cues.cpp

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/core/names/document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,7 @@ LineFacts ReadLine(DocumentContext& doc, std::string_view line) {
std::string cueText;
const std::string kin = pipeline::internal::WriteKinTerms(line, doc.female, KanjiWordHolds, doc.snap);
facts.text = r.DropReadings(names::StripRuby(kin), &cueText, &facts.cued);
facts.text = r.ReadKanaLabels(facts.text);
const std::string_view cues = cueText.empty() ? std::string_view(facts.text) : std::string_view(cueText);
dict::KeySet plain, guarded;
for (const names::Occurrence& o : r.Occurrences(facts.text)) {
Expand Down
2 changes: 2 additions & 0 deletions src/core/names/labels.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ std::size_t CaptionLabelEnd(std::string_view line);
// Whether the word between before and after is a part of a closed round-bracket speaker
// label at the start of a caption, followed by speech.
bool BracketLabelAt(std::string_view before, std::string_view after);
// The same in square brackets ([のぼる]はい, [たまお]うん; spec LEX-5800).
bool SquareLabelAt(std::string_view before, std::string_view after);

// Whether rest, the text after a speaker label in brackets, starts an utterance: there is text
// before the line ends, and it neither quotes the brackets with と or って nor starts with a
Expand Down
4 changes: 4 additions & 0 deletions src/core/names/name_cues.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,10 @@ std::vector<NameCue> NameCues(const dict::Snapshot& snap, std::string_view text)
return out;
}

bool SpeakerLabelAt(const dict::Snapshot& snap, std::string_view before, std::string_view after) {
return LabelAt(snap, before, after) || internal::SquareLabelAt(before, after);
}

bool PersonSlotAt(const dict::Snapshot& snap, std::string_view key, std::string_view before, std::string_view after) {
if (CommonSenseAt(after)) return false;
// An honorific: the document has named the word already, so a sense of an animal does not stand in the
Expand Down
5 changes: 5 additions & 0 deletions src/core/names/name_cues.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ std::vector<NameCue> NameCues(const dict::Snapshot& snap, std::string_view text)
// or as the subject or topic of what a person does or says (spec LEX-5175).
bool PersonSlotAt(const dict::Snapshot& snap, std::string_view key, std::string_view before, std::string_view after);

// Whether the word between before and after is a speaker label at the start of a line: a part of a label in
// round or square brackets followed by speech ((のぼる)うん, [たまお]はい), or the word alone before a colon,
// ≫, a quote that ends the line or a role in round brackets, after caption marks only (spec LEX-5800).
bool SpeakerLabelAt(const dict::Snapshot& snap, std::string_view before, std::string_view after);

// Whether after opens the value of a field of a status window: a colon and a value with no kana or kanji
// (力:35, 敏捷:B+; spec LEX-5175).
bool StatusFieldAt(std::string_view after);
Expand Down
10 changes: 10 additions & 0 deletions src/core/names/registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ class Registry {
std::string DropReadings(std::string_view line, std::string* cueText = nullptr,
std::vector<std::string>* captionNames = nullptr);

// line with each hiragana name of a speaker label at its start written in Hangul by its sound
// ((のぼる)うん 노보루, [たまお]はい, ゆう:うん, ひかる「待って」): a run of two to six kana that the
// dictionaries have as no whole common word, role or sound, read as the katakana names are (spec LEX-5800).
std::string ReadKanaLabels(std::string_view line);

text::Preset preset = text::Preset::FanShort;
// The rendering of ちゃん written to Dict; "" leaves ちゃん to the engine.
std::string chan = "짱";
Expand Down Expand Up @@ -176,6 +181,11 @@ class Registry {
std::vector<LooseUse> LooseKanaUses(std::string_view line);
// Whether the hiragana t is a form of a verb or an adjective of the dictionaries (いい, 来た).
bool InflectedRun(std::string_view t);
// Whether the hiragana run t of a speaker label is a name (ReadKanaLabels); bracketed: the label is in brackets,
// which also tag sounds and voices.
bool KanaLabelName(std::string_view t, bool bracketed);
// Whether the dictionaries have the hiragana run t as a word whole (KanaLabelName).
bool KanaWordRun(std::string_view t);
// Whether the hiragana t is a word of the dictionary and a particle after it (どこまで: どこ まで,
// それから), which is no name however often the document writes it (spec LEX-4828).
bool WordThenParticle(std::string_view t);
Expand Down
43 changes: 43 additions & 0 deletions tests/rules/cases/names-kana-speaker-labels-5800.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# 규칙: LEX-5800
rule input expected kind layer
names:kana-label (ひかる)待って! (히카루) 기다려! fix names
names:kana-label (まもる)大丈夫だよ。 (마모루) 괜찮아. fix names
names:kana-label [のぼる]行くぞ! has:[노보루] fix names
names:kana-label [あゆむ]うん。 has:[아유무] fix names
names:kana-label かける「早く来て」 has:카케루 「 fix names
names:kana-label (ひかる・まもる)せーの! has:(히카루·마모루) fix names
names:kana-label (会場 笑い)(のぼる)ほんと? has:(회장 웃음)(노보루) fix names
names:kana-label ぽんた(Feat.IA) has:폰타( fix names
names:kana-label いさむ:それは違う。 has:이사무: keep names
names:kana-label ⚟(すすむ)もしもし? has:⚟(스스무) keep names
names:kana-label (たまお)はい! has:(타마오) keep names
names:kana-label (かけるくん)おはよう。 has:(카케루 군) keep names
names:kana-label 山田太郎(たろー/T-BOX) has:(타로/T-BOX) keep names
names:kana-label (笑い)そうだね。 has:(웃음) keep names
names:kana-label (ざわめき)皆さん 静かに。 has:(웅성거림) keep names
names:kana-label (くしゃみ)ああ… has:(재채기) keep names
names:kana-label (おかあさん)ごはんよ。 has:(어머니) keep names
names:kana-label (おきゃくさん)すみません。 has:(손님) keep names
names:kana-label (わらい)そうだね。 lacks:와라이 keep names
names:kana-label (ひそひそ)聞いた? has:(소곤소곤) keep names
names:kana-label 昨日は(たぶん)晴れだった。 has:(아마) keep names
names:kana-label (はい)そうです。 has:(네) keep names
names:kana-label ねえ「待って」 has:저기 keep names
names:kana-label (ナレーション)その日、 has:(내레이션) keep names
names:kana-label ほら「見て」 has:자 「 keep names
names:kana-label それは(まもる)ためだ。 lacks:마모루 keep names
names:kana-label けもみみ:兎 美徳:純潔 lacks:케모미미 keep names
names:kana-label これは(とても/very)いい lacks:토테모 keep names
names:kana-label (おとこ)待て! has:(남자) keep names
names:kana-label (ははおや)ごはんよ。 has:(어머니) keep names
names:kana-label (てんいん)いらっしゃいませ。 has:(점원) keep names
names:kana-label (うた)ラララ has:(노래) keep names
names:kana-label (てき)来るぞ! lacks:테키 keep names
names:kana-label (ないしょ)だよ lacks:나이쇼 keep names
names:kana-label まって「行かないで」 has:기다려 「 keep names
names:kana-label やめて「お願い」 lacks:야메테 keep names
names:kana-label てか≫マジ? has:그보다 keep names
names:kana-label てか「マジ?」 has:그보다 「 keep names
names:kana-label いいよ「どうぞ」 has:좋아 「 keep names
names:kana-label あるぞ「おう」 lacks:아루조 keep names
names:kana-label さくら「早く来て」 has:사쿠라 「 fix names
4 changes: 4 additions & 0 deletions tests/rules/documents/names-kana-speaker-labels-5800.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 규칙: LEX-5800
rule input expected kind layer
names:kana-label (のぼる)行くぞ!\n(あゆむ)うん。\n(笑い)\n(のぼる)待って! has:(노보루) 가겠어!\n(아유무) 응.\n(웃음)\n(노보루) 기다려! fix names
names:kana-label かける「早く来て」\nかける「ほら」 has:카케루 「빨리 와」\n카케루 「 fix names
2 changes: 1 addition & 1 deletion tests/rules/wrapped/cut-word.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ wrapped:cut-word (患者)はあ\nおいくらでしょうか? (환자) 하아\
wrapped:cut-word これで間違いないと思います\nよう さっきは電話でどうも 이것으로 틀림없다고 생각합니다\n요우 조금 전은 전화로 아무래도 keep driver
wrapped:cut-word 含まれております\nよ~う 考えた 포함되어 있습니다\n요우~ 생각했다 keep driver
wrapped:cut-word 処刑されます\nそ… そんな! 처형당합니다\n그… 그런! keep driver
wrapped:cut-word キスしたくせに\n(るな)しおちゃん差し入れ 持ってきたよ~。 키스했으면서\n(루인) 시오짱 간식 가져왔어~. keep driver
wrapped:cut-word キスしたくせに\n(るな)しおちゃん差し入れ 持ってきたよ~。 키스했으면서\n(루나) 시오짱 간식 가져왔어~. fix driver
wrapped:cut-word 彼はゲームを始め\n\nるとか、そういう話。 그는 게임을 시작해\n\n루라든지, 그런 이야기. keep driver
wrapped:cut-word もう逃\n「げるしかない」 이제 도\n「밖에 없어」 keep driver
wrapped:cut-word 試合が始ま\nりです 시합이 시작\n입니다 keep driver
Expand Down
Loading