editeng/source/misc/svxacorr.cxx | 39 +++++++++++++++---- sw/qa/extras/uiwriter/data/tdf133524_ro.fodt | 14 +++++++ sw/qa/extras/uiwriter/uiwriter.cxx | 54 ++++++++++++++++++++------- 3 files changed, 85 insertions(+), 22 deletions(-)
New commits: commit 81584e76961d1180bb95bfe2e8f226177a26b28c Author: László Németh <nem...@numbertext.org> AuthorDate: Sat Jul 4 16:37:33 2020 +0200 Commit: Adolfo Jayme Barrientos <fit...@ubuntu.com> CommitDate: Sun Jul 5 22:52:51 2020 +0200 tdf#133524 AutoCorrect: fix Romanian nested quotations typing " inside primary quotation marks: use the correct order of the double angle quotes: „... «quote» ...” Add also Aragonese, Asturian and Catalan to the "<<" and ">>" replacement. See commit 57f07b1d7378d218648667c5b1315cc8ad905875 (tdf#133524 AutoCorrect: support double angle quotes). Change-Id: I2e80cc45768eefa3eb62b446ca822ee6c46f7242 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97970 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98140 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx index f991370c6b99..217143f42845 100644 --- a/editeng/source/misc/svxacorr.cxx +++ b/editeng/source/misc/svxacorr.cxx @@ -318,8 +318,10 @@ static constexpr sal_Unicode cLeftSingleAngleQuote = 0x2039; static constexpr sal_Unicode cRightSingleAngleQuote = 0x203A; // stop characters for searching preceding quotes // (the first character is also the opening quote we are looking for) -const sal_Unicode aStopDoubleAngleQuoteStart[] = { 0x201E, 0x201D, 0 }; // preceding ,, +const sal_Unicode aStopDoubleAngleQuoteStart[] = { 0x201E, 0x201D, 0x201C, 0 }; // preceding ,, const sal_Unicode aStopDoubleAngleQuoteEnd[] = { cRightDoubleAngleQuote, cLeftDoubleAngleQuote, 0x201D, 0x201E, 0 }; // preceding >> +// preceding << for Romanian, handle also alternative primary closing quotation mark U+201C +const sal_Unicode aStopDoubleAngleQuoteEndRo[] = { cLeftDoubleAngleQuote, cRightDoubleAngleQuote, 0x201D, 0x201E, 0x201C, 0 }; const sal_Unicode aStopSingleQuoteEnd[] = { 0x201A, 0x2018, 0x201C, 0x201E, 0 }; const sal_Unicode aStopSingleQuoteEndRuUa[] = { 0x201E, 0x201C, cRightDoubleAngleQuote, cLeftDoubleAngleQuote, 0 }; @@ -1212,7 +1214,12 @@ void SvxAutoCorrect::InsertQuote( SvxAutoCorrDoc& rDoc, sal_Int32 nInsPos, if ( eType == ACQuotes::DoubleAngleQuote ) { bool bSwiss = eLang == LANGUAGE_FRENCH_SWISS; - cRet = ( '<' == cInsChar || ('\"' == cInsChar && !bSttQuote) ) + // pressing " inside a quotation -> use second level angle quotes + bool bLeftQuote = '\"' == cInsChar && + // start position and Romanian OR + // not start position and Hungarian + bSttQuote == (eLang != LANGUAGE_HUNGARIAN); + cRet = ( '<' == cInsChar || bLeftQuote ) ? ( bSwiss ? cLeftSingleAngleQuote : cLeftDoubleAngleQuote ) : ( bSwiss ? cRightSingleAngleQuote : cRightDoubleAngleQuote ); } @@ -1348,13 +1355,23 @@ void SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt, { eType = ACQuotes::CapitalizeIAm; } - // tdf#133524 support << and >> in Hungarian and Romanian - else if ( !bSingle && nInsPos && eLang.anyOf( LANGUAGE_HUNGARIAN, LANGUAGE_ROMANIAN ) && - lcl_HasPrecedingChar( rTxt, nInsPos, + // tdf#133524 support >>Hungarian<< and <<Romanian>> secondary level quotations + else if ( !bSingle && nInsPos && + ( ( eLang == LANGUAGE_HUNGARIAN && + lcl_HasPrecedingChar( rTxt, nInsPos, bSttQuote ? aStopDoubleAngleQuoteStart[0] : aStopDoubleAngleQuoteEnd[0], - bSttQuote ? aStopDoubleAngleQuoteStart + 1 : aStopDoubleAngleQuoteEnd + 1 ) ) + bSttQuote ? aStopDoubleAngleQuoteStart + 1 : aStopDoubleAngleQuoteEnd + 1 ) ) || + ( eLang.anyOf( + LANGUAGE_ROMANIAN, + LANGUAGE_ROMANIAN_MOLDOVA ) && + lcl_HasPrecedingChar( rTxt, nInsPos, + bSttQuote ? aStopDoubleAngleQuoteStart[0] : aStopDoubleAngleQuoteEndRo[0], + bSttQuote ? aStopDoubleAngleQuoteStart + 1 : aStopDoubleAngleQuoteEndRo + 1 ) ) ) ) { - eType = ACQuotes::DoubleAngleQuote; + LocaleDataWrapper& rLcl = GetLocaleDataWrapper( eLang ); + // only if the opening double quotation mark is the default one + if ( rLcl.getDoubleQuotationMarkStart() == OUStringChar(aStopDoubleAngleQuoteStart[0]) ) + eType = ACQuotes::DoubleAngleQuote; } else if ( bSingle && nInsPos && !bSttQuote && // tdf#128860 use apostrophe outside of second level quotation in Czech, German, Icelandic, @@ -1403,9 +1420,11 @@ void SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt, { const LanguageType eLang = GetDocLanguage( rDoc, nInsPos ); if ( eLang.anyOf( + LANGUAGE_CATALAN, // primary level + LANGUAGE_CATALAN_VALENCIAN, // primary level LANGUAGE_FINNISH, // alternative primary level LANGUAGE_FRENCH_SWISS, // second level - LANGUAGE_GALICIAN, + LANGUAGE_GALICIAN, // primary level LANGUAGE_HUNGARIAN, // second level LANGUAGE_POLISH, // second level LANGUAGE_PORTUGUESE, // primary level @@ -1414,7 +1433,9 @@ void SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt, LANGUAGE_ROMANIAN_MOLDOVA, // second level LANGUAGE_SWEDISH, // alternative primary level LANGUAGE_SWEDISH_FINLAND, // alternative primary level - LANGUAGE_UKRAINIAN ) || // primary level + LANGUAGE_UKRAINIAN, // primary level + LANGUAGE_USER_ARAGONESE, // primary level + LANGUAGE_USER_ASTURIAN ) || // primary level primary(eLang) == primary(LANGUAGE_GERMAN) || // alternative primary level primary(eLang) == primary(LANGUAGE_SPANISH) ) // primary level { diff --git a/sw/qa/extras/uiwriter/data/tdf133524_ro.fodt b/sw/qa/extras/uiwriter/data/tdf133524_ro.fodt new file mode 100644 index 000000000000..591db1f4eff3 --- /dev/null +++ b/sw/qa/extras/uiwriter/data/tdf133524_ro.fodt @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:styles> + <style:style style:name="Standard" style:family="paragraph" style:class="text"/> + <style:default-style style:family="paragraph"> + <style:text-properties fo:language="ro" fo:country="RO"/> + </style:default-style> + </office:styles> + <office:body> + <office:text> + <text:p text:style-name="Standard"></text:p> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 2e295b8f4d53..f3d92a4c0050 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -370,6 +370,7 @@ public: void testTdf38394(); void testTdf59666(); void testTdf133524(); + void testTdf133524_Romanian(); void testTdf128860(); void testTdf123786(); #if ENABLE_LIBNUMBERTEXT @@ -591,6 +592,7 @@ public: CPPUNIT_TEST(testTdf38394); CPPUNIT_TEST(testTdf59666); CPPUNIT_TEST(testTdf133524); + CPPUNIT_TEST(testTdf133524_Romanian); CPPUNIT_TEST(testTdf128860); CPPUNIT_TEST(testTdf123786); #if ENABLE_LIBNUMBERTEXT @@ -7193,7 +7195,6 @@ void SwUiWriterTest::testTdf38394() // tdf#132301 autocorrect of qu'« pWrtShell->Insert(u" qu\u2019"); pWrtShell->AutoCorrect(corr, cChar); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u" qu\u2019« "; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); } @@ -7228,7 +7229,6 @@ void SwUiWriterTest::testTdf133524() // << pWrtShell->Insert(u"word<"); pWrtShell->AutoCorrect(corr, '<'); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u"word«"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // 2. Testing autocorrect of " to >> and << inside „...” @@ -7236,29 +7236,64 @@ void SwUiWriterTest::testTdf133524() // opening primary level quote pWrtShell->Insert(u" "); pWrtShell->AutoCorrect(corr, '"'); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u" „"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // opening second level quote pWrtShell->Insert(u"Sentence and "); pWrtShell->AutoCorrect(corr, '"'); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u"Sentence and »"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // closing second level quote pWrtShell->Insert(u"word"); pWrtShell->AutoCorrect(corr, '"'); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u"word«"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // closing primary level quote pWrtShell->Insert(u"."); pWrtShell->AutoCorrect(corr, '"'); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u".”"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); } +void SwUiWriterTest::testTdf133524_Romanian() +{ + SwDoc* pDoc = createDoc("tdf133524_ro.fodt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect()); + // 1. Testing autocorrect of " to << and >> inside „...” + // Example: „Sentence and «word».” + // opening primary level quote + pWrtShell->AutoCorrect(corr, '"'); + sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); + OUString sReplaced(u"„"); + CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); + // opening second level quote + pWrtShell->Insert(u"Sentence and "); + pWrtShell->AutoCorrect(corr, '"'); + sReplaced += u"Sentence and «"; + CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); + // closing second level quote + pWrtShell->Insert(u"word"); + pWrtShell->AutoCorrect(corr, '"'); + sReplaced += u"word»"; + CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); + // closing primary level quote + pWrtShell->Insert(u"."); + pWrtShell->AutoCorrect(corr, '"'); + sReplaced += u".”"; + CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); + // 2. Testing recognition of closing double quotation mark ” + pWrtShell->Insert(u" "); + pWrtShell->AutoCorrect(corr, '"'); + sReplaced += u" „"; + CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); + // 3. Testing recognition of alternative closing double quotation mark “ + pWrtShell->Insert(u"Alternative.“ "); + pWrtShell->AutoCorrect(corr, '"'); + sReplaced += u"Alternative.“ „"; + CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); +} + void SwUiWriterTest::testTdf128860() { SwDoc* pDoc = createDoc("tdf128860.fodt"); @@ -7273,13 +7308,11 @@ void SwUiWriterTest::testTdf128860() // Us apostrophe without preceding starting quote: word' -> word’ pWrtShell->Insert(u" word"); pWrtShell->AutoCorrect(corr, '\''); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u" word’"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // But only after letters: word.' -> word.‘ pWrtShell->Insert(u" word."); pWrtShell->AutoCorrect(corr, '\''); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u" word.‘"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); } @@ -7298,13 +7331,11 @@ void SwUiWriterTest::testTdf123786() // Us apostrophe without preceding starting quote: word' -> word’ pWrtShell->Insert(u" слово"); pWrtShell->AutoCorrect(corr, '\''); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u" слово’"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // But only after letters: word.' -> word.“ pWrtShell->Insert(u" слово."); pWrtShell->AutoCorrect(corr, '\''); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u" слово.“"; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); } @@ -7325,7 +7356,6 @@ void SwUiWriterTest::testTdf133589() // disambiguate consonants: asszony -> asz|szony pWrtShell->Insert(u"asszony"); pWrtShell->AutoCorrect(corr, ' '); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u"𐳀𐳥𐳥𐳛𐳚 "; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // disambiguate consonants: kosszarv -> kos|szarv @@ -7334,13 +7364,11 @@ void SwUiWriterTest::testTdf133589() // pWrtShell->Insert(u"kosszarv"); pWrtShell->Insert(u"kosszarv"); pWrtShell->AutoCorrect(corr, ' '); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u"𐳓𐳛𐳤𐳥𐳀𐳢𐳮 "; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); // transliterate numbers to Old Hungarian pWrtShell->Insert(u"2020"); pWrtShell->AutoCorrect(corr, ' '); - nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); sReplaced += u"𐳺𐳺𐳿𐳼𐳼 "; CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText()); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits