summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2020-11-06 19:14:45 +0100
committerLászló Németh <nemeth@numbertext.org>2020-11-06 22:38:33 +0100
commit5a96093f0ecee53432bdf35f247edd6deb501baf (patch)
treeb57feebc4d201ba46b6b4805e491f04c13eb986b /sw
parent2e4657f57f8ac559a2f3be4286a4726465e88203 (diff)
tdf#130546 sw autocorrect: don't replace redlining
if it starts or ends within the removed text to avoid various problems, for example, reappearing deleted comma before ellipsis replacement: text[,]... -> text,...[,] or replacing words based on already deleted text: [tt]he -> [tt]the Add test/user-template/user/autocorr/acor_en-GB.dat unit test autocorrect definition with three dots to ellipsis replacement. Change-Id: I195922cb92bc29d3ded694fea4ca351244dab17b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105424 Tested-by: Jenkins Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt24
-rw-r--r--sw/qa/extras/uiwriter/uiwriter.cxx46
-rw-r--r--sw/source/core/edit/acorrect.cxx26
3 files changed, 92 insertions, 4 deletions
diff --git a/sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt b/sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt
new file mode 100644
index 000000000000..4d65c5f465a2
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt
@@ -0,0 +1,24 @@
+<?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: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" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <office:styles>
+ <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+ <style:default-style style:family="paragraph">
+ <style:text-properties fo:language="en" fo:country="GB"/>
+ </style:default-style>
+ </office:styles>
+ <office:body>
+ <office:text>
+ <text:tracked-changes text:track-changes="false">
+ <text:changed-region xml:id="ct94099223789984" text:id="ct94099223789984">
+ <text:deletion>
+ <office:change-info>
+ <dc:creator>Unknown Author</dc:creator>
+ <dc:date>2020-11-03T19:19:05</dc:date>
+ </office:change-info>
+ </text:deletion>
+ </text:changed-region>
+ </text:tracked-changes>
+ <text:p text:style-name="P1">Lorem<text:change-start text:change-id="ct94099223789984"/>,<text:change-end text:change-id="ct94099223789984"/></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 aca558b923a6..2acfc17b7082 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -391,6 +391,7 @@ public:
void testInsertLongDateFormat();
void testSpellOnlineParameter();
void testRedlineAutoCorrect();
+ void testRedlineAutoCorrect2();
#if HAVE_FEATURE_PDFIUM
void testInsertPdf();
#endif
@@ -618,6 +619,7 @@ public:
CPPUNIT_TEST(testInsertLongDateFormat);
CPPUNIT_TEST(testSpellOnlineParameter);
CPPUNIT_TEST(testRedlineAutoCorrect);
+ CPPUNIT_TEST(testRedlineAutoCorrect2);
#if HAVE_FEATURE_PDFIUM
CPPUNIT_TEST(testInsertPdf);
#endif
@@ -7638,7 +7640,15 @@ void SwUiWriterTest::testRedlineAutoCorrect()
pWrtShell->Insert("et");
pWrtShell->AutoCorrect(corr, ' ');
// This was "Ttest" removing the tracked deletion silently.
- sReplaced = "ttest ";
+ // Don't replace, if a redline starts or ends within the text.
+ sReplaced = "tset ";
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
+
+ // Otherwise replace it
+ pWrtShell->Insert("tset");
+ pWrtShell->AutoCorrect(corr, ' ');
+ sReplaced = "tset test ";
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
@@ -7646,8 +7656,40 @@ void SwUiWriterTest::testRedlineAutoCorrect()
dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {});
pWrtShell->Insert("a");
pWrtShell->AutoCorrect(corr, ' ');
- sReplaced = "A ttest ";
+ sReplaced = "A tset test ";
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
+}
+
+void SwUiWriterTest::testRedlineAutoCorrect2()
+{
+ SwDoc* pDoc = createDoc("redline-autocorrect2.fodt");
+ SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+
+ dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {});
+
+ // show tracked deletion
+ RedlineFlags const nMode(pWrtShell->GetRedlineFlags() | RedlineFlags::On);
+ CPPUNIT_ASSERT(nMode & (RedlineFlags::ShowDelete | RedlineFlags::ShowInsert));
+ pWrtShell->SetRedlineFlags(nMode);
+ CPPUNIT_ASSERT(nMode & RedlineFlags::ShowDelete);
+
+ SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
+ pWrtShell->Insert("...");
+ pWrtShell->AutoCorrect(corr, ' ');
+ sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+
+ // This was "LoremLorem,…," (duplicating the deleted comma, but without deletion)
+ // Don't replace, if a redline starts or ends within the text.
+ OUString sReplaced = "Lorem,... ";
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
+
+ // Continue it:
+ pWrtShell->Insert("Lorem,...");
+ pWrtShell->AutoCorrect(corr, ' ');
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ sReplaced = u"Lorem,... Lorem,… ";
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
}
diff --git a/sw/source/core/edit/acorrect.cxx b/sw/source/core/edit/acorrect.cxx
index 7ae0a778a59b..d7003ccfbaed 100644
--- a/sw/source/core/edit/acorrect.cxx
+++ b/sw/source/core/edit/acorrect.cxx
@@ -40,6 +40,8 @@
#include <svl/zformat.hxx>
#include <editeng/acorrcfg.hxx>
+#include <redline.hxx>
+#include <IDocumentRedlineAccess.hxx>
using namespace ::com::sun::star;
@@ -427,8 +429,28 @@ bool SwAutoCorrDoc::ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
const bool replaceLastChar = sFrameText.getLength() > nEndPos && pFnd->GetShort()[0] == ':'
&& pFnd->GetShort().endsWith(":");
- SwPaM aPam(pFrame->MapViewToModelPos(TextFrameIndex(rSttPos)),
- pFrame->MapViewToModelPos(TextFrameIndex(nEndPos + (replaceLastChar ? 1 : 0))));
+ SwPosition aStartPos( pFrame->MapViewToModelPos(TextFrameIndex(rSttPos) ));
+ SwPosition aEndPos( pFrame->MapViewToModelPos(TextFrameIndex(nEndPos + (replaceLastChar ? 1 : 0))) );
+ SwPaM aPam(aStartPos, aEndPos);
+
+ // don't replace, if a redline starts or ends within the original text
+ for ( SwRedlineTable::size_type nAct =
+ pDoc->getIDocumentRedlineAccess().GetRedlinePos( m_rCursor.GetNode(), RedlineType::Any );
+ nAct < pDoc->getIDocumentRedlineAccess().GetRedlineTable().size(); ++nAct )
+ {
+ const SwRangeRedline* pRed = pDoc->getIDocumentRedlineAccess().GetRedlineTable()[ nAct ];
+
+ if ( pRed->Start()->nNode > pTextNd->GetIndex() )
+ break;
+
+ // redline over the original text
+ if ( aStartPos < *pRed->End() && *pRed->Start() < aEndPos &&
+ // starting or ending within the original text
+ ( aStartPos < *pRed->Start() || *pRed->End() < aEndPos ) )
+ {
+ return bRet;
+ }
+ }
if( pFnd->IsTextOnly() )
{