sw/source/core/crsr/findtxt.cxx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
New commits: commit 657ec7ff6863ebc79dcea228898b619d43543a6c Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri Aug 27 10:18:05 2021 +0300 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Wed Sep 22 12:37:49 2021 +0200 tdf#137737: treat foot/endnote anchor as a "normal" (control) character The anchor uses Unicode codepoint U+0001 (START OF HEADING) internally. It was removed from start and end of the search string (but not from the middle) previously, and only when the character appeared inside the search range; before 0cd3b7926cafc01d06b589124215e9cb7c148f19, such anchors outside of the range were ignored in TextSearch::searchForward. The said change made search consider the data outside of the range for context (e.g., look-ahead/behind assertions), and then the asymmetry of removal when the range includes or excludes the character started to affect the "replace after find" case, when initial find searches the entire paragraph, and removes the anchor character, then finds '"$' and selects the quote before the anchor; then replace uses the selection as the range, does not remove the anchor, and it prevents the match. This change excludes the anchor from the set of removed characters. Now the foot/endnote anchors always stay in the string, and make the "find" consistent with the following "replace" by preventing the match when there's no [\p{Control}] (or [:control:]) in the regex explicitly for the anchor. This allows for more flexibility in search, and makes it more consistent in making this visible element participate in search. The other elements that are still removed: RES_TXTATR_FLYCNT, RES_TXTATR_FIELD, RES_TXTATR_REFMARK, RES_TXTATR_TOXMARK, RES_TXTATR_META, RES_TXTATR_METAFIELD need separate consideration. Some of them may be also excluded in follow-up commits; the other need more correct removal (both when they are inside and outside of the range; also in the middle) to create consistent results when searching/replacing. This change also makes sure that ReplaceBackReferences uses the same special preprocessing that DoSearch uses. Change-Id: I87195508695eef9fe379df369d6fef3ca1dffafb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121134 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx index ccb3a650c86f..79405979143b 100644 --- a/sw/source/core/crsr/findtxt.cxx +++ b/sw/source/core/crsr/findtxt.cxx @@ -275,7 +275,6 @@ lcl_CleanStr(const SwTextNode& rNd, switch (pNextHint->Which()) { case RES_TXTATR_FLYCNT: - case RES_TXTATR_FTN: case RES_TXTATR_FIELD: case RES_TXTATR_REFMARK: case RES_TXTATR_TOXMARK: @@ -1153,9 +1152,6 @@ std::optional<OUString> ReplaceBackReferences(const i18nutil::SearchOptions2& rS } else { - OUString const aStr(pLayout - ? pFrame->GetText() - : pTextNode->GetTextNode()->GetText()); AmbiguousIndex nStart; AmbiguousIndex nEnd; if (pLayout) @@ -1168,6 +1164,9 @@ std::optional<OUString> ReplaceBackReferences(const i18nutil::SearchOptions2& rS nStart.SetModelIndex(pPam->Start()->nContent.GetIndex()); nEnd.SetModelIndex(pPam->End()->nContent.GetIndex()); } + std::vector<AmbiguousIndex> aFltArr; + OUString const aStr = lcl_CleanStr(*pTextNode->GetTextNode(), pFrame, pLayout, + nStart, nEnd, aFltArr, false, false); if (aSText.SearchForward(aStr, &nStart.GetAnyIndex(), &nEnd.GetAnyIndex(), &aResult)) { aSText.ReplaceBackReferences( aReplaceStr, aStr, aResult );