diff --git a/lib/Epub/Epub/hyphenation/Hyphenator.cpp b/lib/Epub/Epub/hyphenation/Hyphenator.cpp index 4ae5307e..ef4d24a7 100644 --- a/lib/Epub/Epub/hyphenation/Hyphenator.cpp +++ b/lib/Epub/Epub/hyphenation/Hyphenator.cpp @@ -8,15 +8,19 @@ #include "LanguageHyphenator.h" #include "LanguageRegistry.h" -const LanguageHyphenator* Hyphenator::cachedHyphenator_ = nullptr; +struct Iso639Mapping { + const char* iso639_2; + const char* iso639_1; +}; +static constexpr Iso639Mapping kIso639Mappings[] = {{"eng", "en"}, {"fra", "fr"}, {"fre", "fr"}, {"deu", "de"}, + {"ger", "de"}, {"rus", "ru"}, {"spa", "es"}, {"ita", "it"}, + {"ukr", "uk"}, {"swe", "sv"}}; namespace { -// Maps a BCP-47 language tag to a language-specific hyphenator. const LanguageHyphenator* hyphenatorForLanguage(const std::string& langTag) { if (langTag.empty()) return nullptr; - // Extract primary subtag and normalize to lowercase (e.g., "en-US" -> "en"). std::string primary; primary.reserve(langTag.size()); for (char c : langTag) { @@ -26,6 +30,12 @@ const LanguageHyphenator* hyphenatorForLanguage(const std::string& langTag) { } if (primary.empty()) return nullptr; + for (const auto& mapping : kIso639Mappings) { + if (primary == mapping.iso639_2) { + return getLanguageHyphenatorForPrimaryTag(mapping.iso639_1); + } + } + return getLanguageHyphenatorForPrimaryTag(primary); } diff --git a/lib/Epub/Epub/hyphenation/LanguageRegistry.cpp b/lib/Epub/Epub/hyphenation/LanguageRegistry.cpp index 541e9a27..673fa0a4 100644 --- a/lib/Epub/Epub/hyphenation/LanguageRegistry.cpp +++ b/lib/Epub/Epub/hyphenation/LanguageRegistry.cpp @@ -11,6 +11,7 @@ #include "generated/hyph-it.trie.h" #include "generated/hyph-pl.trie.h" #include "generated/hyph-ru.trie.h" +#include "generated/hyph-sv.trie.h" #include "generated/hyph-uk.trie.h" namespace { @@ -22,10 +23,11 @@ LanguageHyphenator germanHyphenator(de_patterns, isLatinLetter, toLowerLatin); LanguageHyphenator russianHyphenator(ru_patterns, isCyrillicLetter, toLowerCyrillic); LanguageHyphenator spanishHyphenator(es_patterns, isLatinLetter, toLowerLatin); LanguageHyphenator italianHyphenator(it_patterns, isLatinLetter, toLowerLatin); +LanguageHyphenator swedishHyphenator(sv_patterns, isLatinLetter, toLowerLatin); LanguageHyphenator ukrainianHyphenator(uk_patterns, isCyrillicLetter, toLowerCyrillic); LanguageHyphenator polishHyphenator(pl_patterns, isLatinLetter, toLowerLatin); -using EntryArray = std::array; +using EntryArray = std::array; const EntryArray& entries() { static const EntryArray kEntries = {{{"english", "en", &englishHyphenator}, @@ -34,6 +36,7 @@ const EntryArray& entries() { {"russian", "ru", &russianHyphenator}, {"spanish", "es", &spanishHyphenator}, {"italian", "it", &italianHyphenator}, + {"swedish", "sv", &swedishHyphenator}, {"polish", "pl", &polishHyphenator}, {"ukrainian", "uk", &ukrainianHyphenator}}}; return kEntries; diff --git a/lib/Epub/Epub/hyphenation/generated/hyph-sv.trie.h b/lib/Epub/Epub/hyphenation/generated/hyph-sv.trie.h new file mode 100644 index 00000000..dd4a14b4 Binary files /dev/null and b/lib/Epub/Epub/hyphenation/generated/hyph-sv.trie.h differ diff --git a/scripts/update_hypenation.sh b/scripts/update_hypenation.sh index ed12aef7..a4b89574 100755 --- a/scripts/update_hypenation.sh +++ b/scripts/update_hypenation.sh @@ -23,3 +23,4 @@ process es process ru process it process uk +process sv diff --git a/test/hyphenation_eval/HyphenationEvaluationTest.cpp b/test/hyphenation_eval/HyphenationEvaluationTest.cpp index a56467a9..85c92f30 100644 --- a/test/hyphenation_eval/HyphenationEvaluationTest.cpp +++ b/test/hyphenation_eval/HyphenationEvaluationTest.cpp @@ -44,6 +44,7 @@ const std::vector kSupportedLanguages = { {"russian", "test/hyphenation_eval/resources/russian_hyphenation_tests.txt", "ru"}, {"spanish", "test/hyphenation_eval/resources/spanish_hyphenation_tests.txt", "es"}, {"italian", "test/hyphenation_eval/resources/italian_hyphenation_tests.txt", "it"}, + {"swedish", "test/hyphenation_eval/resources/swedish_hyphenation_tests.txt", "sv"}, }; std::vector expectedPositionsFromAnnotatedWord(const std::string& annotated) { diff --git a/test/hyphenation_eval/resources/swedish_hyphenation_tests.txt b/test/hyphenation_eval/resources/swedish_hyphenation_tests.txt new file mode 100644 index 00000000..7bc83221 Binary files /dev/null and b/test/hyphenation_eval/resources/swedish_hyphenation_tests.txt differ