Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4fb6516a authored by Igor Viarheichyk's avatar Igor Viarheichyk
Browse files

Improved word break for BiDi pseudolocalizer.

Characted sequences \n and \t are now treated as word separators
by BiDi pseudolocalizer. This solves issues when text rendering
engine breaks a line in the middle of a text chunk marked with
RLM+RLO and PDF+RLM sequences.

Bug:34064580
Change-Id: I52e6018785fae25479fa167440f24c534b0e3253
Fixes:34064580
Test: make aapt2_tests
Test: Run aapt2_tests binary
parent f02beb06
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -360,9 +360,15 @@ String16 PseudoMethodBidi::text(const String16& source)
    String16 result;
    bool lastspace = true;
    bool space = true;
    bool escape = false;
    const char16_t ESCAPE_CHAR = '\\';
    for (size_t i=0; i<source.size(); i++) {
        char16_t c = s[i];
        space = is_space(c);
        if (!escape && c == ESCAPE_CHAR) {
          escape = true;
          continue;
        }
        space = (!escape && is_space(c)) || (escape && (c == 'n' || c == 't'));
        if (lastspace && !space) {
          // Word start
          result += k_rlm + k_rlo;
@@ -371,6 +377,10 @@ String16 PseudoMethodBidi::text(const String16& source)
          result += k_pdf + k_rlm;
        }
        lastspace = space;
        if (escape) {
          result.append(&ESCAPE_CHAR, 1);
          escape=false;
        }
        result.append(&c, 1);
    }
    if (!lastspace) {
+4 −0
Original line number Diff line number Diff line
@@ -87,6 +87,10 @@ TEST(Pseudolocales, PlaintextBidi) {
                "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n" \
                "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
                PSEUDO_BIDI);
  simple_helper("hello\\nworld\\n",
                "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\\n"
                "\xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\\n",
                PSEUDO_BIDI);
}

TEST(Pseudolocales, SimpleICU) {
+11 −1
Original line number Diff line number Diff line
@@ -445,9 +445,15 @@ std::string PseudoMethodBidi::Text(const StringPiece& source) {
  std::string result;
  bool lastspace = true;
  bool space = true;
  bool escape = false;
  const char ESCAPE_CHAR = '\\';
  for (size_t i = 0; i < source.size(); i++) {
    char c = s[i];
    space = isspace(c);
    if (!escape && c == ESCAPE_CHAR) {
      escape = true;
      continue;
    }
    space = (!escape && isspace(c)) || (escape && (c == 'n' || c == 't'));
    if (lastspace && !space) {
      // Word start
      result += kRlm + kRlo;
@@ -456,6 +462,10 @@ std::string PseudoMethodBidi::Text(const StringPiece& source) {
      result += kPdf + kRlm;
    }
    lastspace = space;
    if (escape) {
      result.append(&ESCAPE_CHAR, 1);
      escape=false;
    }
    result.append(&c, 1);
  }
  if (!lastspace) {
+5 −0
Original line number Diff line number Diff line
@@ -97,6 +97,11 @@ TEST(PseudolocalizerTest, PlaintextBidi) {
      "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n"
      "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
      Pseudolocalizer::Method::kBidi));
  EXPECT_TRUE(
      SimpleHelper("hello\\nworld\\n",
                   "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\\n"
                   "\xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\\n",
                   Pseudolocalizer::Method::kBidi));
}

TEST(PseudolocalizerTest, SimpleICU) {