Require minimum length at right hand side of apostrophe too
This commit is contained in:
@@ -98,6 +98,8 @@ void appendSegmentPatternBreaks(const std::vector<CodepointInfo>& cps, const Lan
|
|||||||
|
|
||||||
void appendApostropheContractionBreaks(const std::vector<CodepointInfo>& cps,
|
void appendApostropheContractionBreaks(const std::vector<CodepointInfo>& cps,
|
||||||
std::vector<Hyphenator::BreakInfo>& outBreaks) {
|
std::vector<Hyphenator::BreakInfo>& outBreaks) {
|
||||||
|
constexpr size_t kMinLeftSegmentLen = 3;
|
||||||
|
constexpr size_t kMinRightSegmentLen = 2;
|
||||||
size_t segmentStart = 0;
|
size_t segmentStart = 0;
|
||||||
|
|
||||||
for (size_t i = 0; i < cps.size(); ++i) {
|
for (size_t i = 0; i < cps.size(); ++i) {
|
||||||
@@ -111,8 +113,15 @@ void appendApostropheContractionBreaks(const std::vector<CodepointInfo>& cps,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid stranding very short clitics like "l'" or "d'" at line end.
|
size_t rightSuffixLen = 0;
|
||||||
if (leftPrefixLen >= 3) {
|
for (size_t j = i + 1; j < cps.size() && !isSegmentSeparator(cps[j].value); ++j) {
|
||||||
|
if (isAlphabetic(cps[j].value)) {
|
||||||
|
++rightSuffixLen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Avoid stranding short clitics like "l'"/"d'" or tiny suffixes like "'t".
|
||||||
|
if (leftPrefixLen >= kMinLeftSegmentLen && rightSuffixLen >= kMinRightSegmentLen) {
|
||||||
outBreaks.push_back({cps[i + 1].byteOffset, false});
|
outBreaks.push_back({cps[i + 1].byteOffset, false});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ class Hyphenator {
|
|||||||
// 2. Apostrophe contractions between letters (e.g. all'improvviso).
|
// 2. Apostrophe contractions between letters (e.g. all'improvviso).
|
||||||
// Liang patterns are run per alphabetic segment around apostrophes.
|
// Liang patterns are run per alphabetic segment around apostrophes.
|
||||||
// A direct break at the apostrophe boundary is allowed only when the left
|
// A direct break at the apostrophe boundary is allowed only when the left
|
||||||
// segment has at least 3 letters to avoid stranding short clitics (e.g. l', d').
|
// segment has at least 3 letters and the right segment has at least 2 letters,
|
||||||
|
// avoiding short clitics (e.g. l', d') and short contraction tails (e.g. can't).
|
||||||
// 3. Language-specific Liang patterns (e.g. German de_patterns).
|
// 3. Language-specific Liang patterns (e.g. German de_patterns).
|
||||||
// Example: "Quadratkilometer" -> Qua|drat|ki|lo|me|ter.
|
// Example: "Quadratkilometer" -> Qua|drat|ki|lo|me|ter.
|
||||||
// 4. Fallback every-N-chars splitting (only when includeFallback is true AND no
|
// 4. Fallback every-N-chars splitting (only when includeFallback is true AND no
|
||||||
|
|||||||
Reference in New Issue
Block a user