Skip to content

Commit f1e07b6

Browse files
authored
Merge pull request #18 from bee-san/claude/fix-anilist-alt-names-GqgZK
fix: improve AniList alternative name handling and reading generation
2 parents 6bb015e + 8bfe1a0 commit f1e07b6

File tree

7 files changed

+440
-25
lines changed

7 files changed

+440
-25
lines changed

yomitan-dict-builder/src/anilist_client.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ impl AnilistClient {
268268
full
269269
native
270270
alternative
271+
alternativeSpoiler
271272
first
272273
last
273274
}
@@ -412,6 +413,16 @@ impl AnilistClient {
412413
})
413414
.unwrap_or_default();
414415

416+
let spoiler_alternatives: Vec<String> = name_data["alternativeSpoiler"]
417+
.as_array()
418+
.map(|arr| {
419+
arr.iter()
420+
.filter_map(|v| v.as_str().map(|s| s.to_string()))
421+
.filter(|s| !s.is_empty())
422+
.collect()
423+
})
424+
.unwrap_or_default();
425+
415426
// Gender: "Male" → "m", "Female" → "f"
416427
let sex = node.get("gender").and_then(|g| g.as_str()).and_then(|g| {
417428
match g.to_lowercase().chars().next() {
@@ -482,6 +493,7 @@ impl AnilistClient {
482493
.and_then(|v| v.as_str())
483494
.map(|s| s.to_string()),
484495
aliases: alternatives,
496+
spoiler_aliases: spoiler_alternatives,
485497
personality: Vec::new(), // AniList has no trait categories
486498
roles: Vec::new(),
487499
engages_in: Vec::new(),
@@ -1638,6 +1650,77 @@ mod tests {
16381650
assert_eq!(ch.aliases, vec!["Valid", "Also Valid"]);
16391651
}
16401652

1653+
#[test]
1654+
fn test_process_character_spoiler_alternatives() {
1655+
let client = make_client();
1656+
let mut edge = make_edge(
1657+
ROLE_MAIN,
1658+
1,
1659+
"Test Character",
1660+
"テスト",
1661+
None,
1662+
None,
1663+
None,
1664+
None,
1665+
None,
1666+
vec!["Normal Alt"],
1667+
None,
1668+
);
1669+
edge["node"]["name"]["alternativeSpoiler"] =
1670+
serde_json::json!(["Spoiler Name", "Another Spoiler"]);
1671+
let ch = client.process_character(&edge).unwrap();
1672+
assert_eq!(ch.aliases, vec!["Normal Alt"]);
1673+
assert_eq!(
1674+
ch.spoiler_aliases,
1675+
vec!["Spoiler Name", "Another Spoiler"]
1676+
);
1677+
}
1678+
1679+
#[test]
1680+
fn test_process_character_spoiler_alternatives_with_nulls() {
1681+
let client = make_client();
1682+
let mut edge = make_edge(
1683+
ROLE_MAIN,
1684+
1,
1685+
"A",
1686+
"あ",
1687+
None,
1688+
None,
1689+
None,
1690+
None,
1691+
None,
1692+
vec![],
1693+
None,
1694+
);
1695+
edge["node"]["name"]["alternativeSpoiler"] =
1696+
serde_json::json!([null, "Valid Spoiler", null, ""]);
1697+
let ch = client.process_character(&edge).unwrap();
1698+
assert_eq!(ch.spoiler_aliases, vec!["Valid Spoiler"]);
1699+
}
1700+
1701+
#[test]
1702+
fn test_process_character_no_spoiler_alternatives() {
1703+
let client = make_client();
1704+
let edge = make_edge(
1705+
ROLE_MAIN,
1706+
1,
1707+
"A",
1708+
"あ",
1709+
None,
1710+
None,
1711+
None,
1712+
None,
1713+
None,
1714+
vec![],
1715+
None,
1716+
);
1717+
let ch = client.process_character(&edge).unwrap();
1718+
assert!(
1719+
ch.spoiler_aliases.is_empty(),
1720+
"Missing alternativeSpoiler should produce empty vec"
1721+
);
1722+
}
1723+
16411724
// === Edge case: hasNextPage missing ===
16421725

16431726
#[test]

yomitan-dict-builder/src/anilist_name_test_data.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,10 @@ mod tests {
384384
fn test_no_hints_no_space_kanji() {
385385
let readings =
386386
name_parser::generate_name_readings("幸平創真", "Souma Yukihira", None, None);
387-
assert_eq!(readings.full, "そうま ゆきひら");
388-
assert_eq!(readings.family, "そうま ゆきひら");
389-
assert_eq!(readings.given, "そうま ゆきひら");
387+
// Whitespace is stripped from readings — romaji spaces should not appear in kana
388+
assert_eq!(readings.full, "そうまゆきひら");
389+
assert_eq!(readings.family, "そうまゆきひら");
390+
assert_eq!(readings.given, "そうまゆきひら");
390391
}
391392

392393
// --- Split function with hints ---

0 commit comments

Comments
 (0)