summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--i18npool/source/search/textsearch.cxx4
-rw-r--r--sw/qa/extras/uiwriter/data/tdf137737_FindReplace.docxbin0 -> 6541 bytes
-rw-r--r--sw/qa/extras/uiwriter/uiwriter2.cxx32
3 files changed, 34 insertions, 2 deletions
diff --git a/i18npool/source/search/textsearch.cxx b/i18npool/source/search/textsearch.cxx
index dcb31762e6c2..e6ddd93c5be6 100644
--- a/i18npool/source/search/textsearch.cxx
+++ b/i18npool/source/search/textsearch.cxx
@@ -333,7 +333,7 @@ SearchResult TextSearch::searchForward( const OUString& searchStr, sal_Int32 sta
// apply normal transliteration (1<->1, 1<->0)
sal_Int32 nInStartPos = startPos;
- if (pRegexMatcher && startPos > 0)
+ if (pRegexMatcher && startPos > 0 && !aSrchPara.searchString.startsWith("^"))
{
// tdf#89665, tdf#75806: An optimization to avoid transliterating the whole string, yet
// transliterate enough of the leading text to allow sensible look-behind assertions.
@@ -345,7 +345,7 @@ SearchResult TextSearch::searchForward( const OUString& searchStr, sal_Int32 sta
nInStartPos -= std::min(nMaxLeadingLen, startPos);
}
sal_Int32 nInEndPos = endPos;
- if (pRegexMatcher && endPos < searchStr.getLength())
+ if (pRegexMatcher && endPos < searchStr.getLength() && !aSrchPara.searchString.endsWith("$"))
{
// tdf#65038: ditto for look-ahead assertions
const sal_Int32 nMaxTrailingLen = aSrchPara.searchString.endsWith(")") ? 100 : 3;
diff --git a/sw/qa/extras/uiwriter/data/tdf137737_FindReplace.docx b/sw/qa/extras/uiwriter/data/tdf137737_FindReplace.docx
new file mode 100644
index 000000000000..42914ce3feaa
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/tdf137737_FindReplace.docx
Binary files differ
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index c6c205a1d759..b7d4f0242f31 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -46,6 +46,7 @@
#include <xmloff/odffields.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
+#include <svl/srchitem.hxx>
#include <svl/stritem.hxx>
#include <comphelper/lok.hxx>
#include <comphelper/scopeguard.hxx>
@@ -3996,6 +3997,37 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf118311)
assertXPath(pXmlDoc, "//page[1]//body/tab", 0);
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf137737_FindReplace)
+{
+ createSwDoc(DATA_DIRECTORY, "tdf137737_FindReplace.docx");
+
+ // Replace staight quotes with something (opening quotes in real life, but X is adequate here)
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence({
+ { "SearchItem.SearchString", uno::makeAny(OUString("^\"")) },
+ { "SearchItem.ReplaceString", uno::makeAny(OUString("X")) },
+ { "SearchItem.Command", uno::makeAny(static_cast<sal_Int16>(SvxSearchCmd::REPLACE)) },
+ { "SearchItem.AlgorithmType", uno::makeAny(static_cast<sal_Int16>(1)) }, //REGEX
+ { "SearchItem.AlgorithmType2", uno::makeAny(static_cast<sal_Int16>(2)) }, //REGEX
+ }));
+ // Find the first match.
+ dispatchCommand(mxComponent, ".uno:ExecuteSearch", aArgs);
+ // Replace the first match.
+ dispatchCommand(mxComponent, ".uno:ExecuteSearch", aArgs);
+
+ // Replace staight quotes with something (closing quotes in real life)
+ aArgs[0].Value <<= OUString("\"$");
+ dispatchCommand(mxComponent, ".uno:ExecuteSearch", aArgs);
+ dispatchCommand(mxComponent, ".uno:ExecuteSearch", aArgs);
+
+ //Finding the searched string via XReplaceable
+ uno::Reference<util::XReplaceable> xReplace(mxComponent, uno::UNO_QUERY);
+ uno::Reference<util::XReplaceDescriptor> xReplaceDes = xReplace->createReplaceDescriptor();
+ xReplaceDes->setSearchString("\"");
+ //There should not be any straight quotes left.
+ uno::Reference<container::XIndexAccess> xIndex(xReplace->findAll(xReplaceDes));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndex->getCount());
+}
+
CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testRedlineTableRowDeletion)
{
// load a 1-row table, and delete the row with enabled change tracking: