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>
This commit is contained in:
24
sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt
Normal file
24
sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt
Normal file
@@ -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>
|
@@ -391,6 +391,7 @@ public:
|
|||||||
void testInsertLongDateFormat();
|
void testInsertLongDateFormat();
|
||||||
void testSpellOnlineParameter();
|
void testSpellOnlineParameter();
|
||||||
void testRedlineAutoCorrect();
|
void testRedlineAutoCorrect();
|
||||||
|
void testRedlineAutoCorrect2();
|
||||||
#if HAVE_FEATURE_PDFIUM
|
#if HAVE_FEATURE_PDFIUM
|
||||||
void testInsertPdf();
|
void testInsertPdf();
|
||||||
#endif
|
#endif
|
||||||
@@ -618,6 +619,7 @@ public:
|
|||||||
CPPUNIT_TEST(testInsertLongDateFormat);
|
CPPUNIT_TEST(testInsertLongDateFormat);
|
||||||
CPPUNIT_TEST(testSpellOnlineParameter);
|
CPPUNIT_TEST(testSpellOnlineParameter);
|
||||||
CPPUNIT_TEST(testRedlineAutoCorrect);
|
CPPUNIT_TEST(testRedlineAutoCorrect);
|
||||||
|
CPPUNIT_TEST(testRedlineAutoCorrect2);
|
||||||
#if HAVE_FEATURE_PDFIUM
|
#if HAVE_FEATURE_PDFIUM
|
||||||
CPPUNIT_TEST(testInsertPdf);
|
CPPUNIT_TEST(testInsertPdf);
|
||||||
#endif
|
#endif
|
||||||
@@ -7638,7 +7640,15 @@ void SwUiWriterTest::testRedlineAutoCorrect()
|
|||||||
pWrtShell->Insert("et");
|
pWrtShell->Insert("et");
|
||||||
pWrtShell->AutoCorrect(corr, ' ');
|
pWrtShell->AutoCorrect(corr, ' ');
|
||||||
// This was "Ttest" removing the tracked deletion silently.
|
// 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();
|
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
|
||||||
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
|
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
|
||||||
|
|
||||||
@@ -7646,11 +7656,43 @@ void SwUiWriterTest::testRedlineAutoCorrect()
|
|||||||
dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {});
|
dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {});
|
||||||
pWrtShell->Insert("a");
|
pWrtShell->Insert("a");
|
||||||
pWrtShell->AutoCorrect(corr, ' ');
|
pWrtShell->AutoCorrect(corr, ' ');
|
||||||
sReplaced = "A ttest ";
|
sReplaced = "A tset test ";
|
||||||
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
|
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
|
||||||
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
void SwUiWriterTest::testTdf108423()
|
void SwUiWriterTest::testTdf108423()
|
||||||
{
|
{
|
||||||
SwDoc* pDoc = createDoc();
|
SwDoc* pDoc = createDoc();
|
||||||
|
@@ -40,6 +40,8 @@
|
|||||||
#include <svl/zformat.hxx>
|
#include <svl/zformat.hxx>
|
||||||
|
|
||||||
#include <editeng/acorrcfg.hxx>
|
#include <editeng/acorrcfg.hxx>
|
||||||
|
#include <redline.hxx>
|
||||||
|
#include <IDocumentRedlineAccess.hxx>
|
||||||
|
|
||||||
using namespace ::com::sun::star;
|
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] == ':'
|
const bool replaceLastChar = sFrameText.getLength() > nEndPos && pFnd->GetShort()[0] == ':'
|
||||||
&& pFnd->GetShort().endsWith(":");
|
&& pFnd->GetShort().endsWith(":");
|
||||||
|
|
||||||
SwPaM aPam(pFrame->MapViewToModelPos(TextFrameIndex(rSttPos)),
|
SwPosition aStartPos( pFrame->MapViewToModelPos(TextFrameIndex(rSttPos) ));
|
||||||
pFrame->MapViewToModelPos(TextFrameIndex(nEndPos + (replaceLastChar ? 1 : 0))));
|
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() )
|
if( pFnd->IsTextOnly() )
|
||||||
{
|
{
|
||||||
|
@@ -24,6 +24,7 @@ $(eval $(call gb_Package_add_file,test_unittest,unittest/user/autotext/en-US/sta
|
|||||||
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autotext/en-US/crdbus50.bau,user/autotext/en-US/crdbus50.bau))
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autotext/en-US/crdbus50.bau,user/autotext/en-US/crdbus50.bau))
|
||||||
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/.dummy,empty-directory-dummy))
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/.dummy,empty-directory-dummy))
|
||||||
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autocorr/acor_en-US.dat,user/autocorr/acor_fr.dat))
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autocorr/acor_en-US.dat,user/autocorr/acor_fr.dat))
|
||||||
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autocorr/acor_en-GB.dat,user/autocorr/acor_en-GB.dat))
|
||||||
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/scalc/popupmenu/draw.xml,user/config/soffice.cfg/modules/scalc/popupmenu/draw.xml))
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/scalc/popupmenu/draw.xml,user/config/soffice.cfg/modules/scalc/popupmenu/draw.xml))
|
||||||
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/scalc/popupmenu/anchor.xml,user/config/soffice.cfg/modules/scalc/popupmenu/anchor.xml))
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/scalc/popupmenu/anchor.xml,user/config/soffice.cfg/modules/scalc/popupmenu/anchor.xml))
|
||||||
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/swriter/popupmenu/text.xml,user/config/soffice.cfg/modules/swriter/popupmenu/text.xml))
|
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/swriter/popupmenu/text.xml,user/config/soffice.cfg/modules/swriter/popupmenu/text.xml))
|
||||||
|
BIN
test/user-template/user/autocorr/acor_en-GB.dat
Normal file
BIN
test/user-template/user/autocorr/acor_en-GB.dat
Normal file
Binary file not shown.
Reference in New Issue
Block a user