28#include <com/sun/star/util/TextSearch2.hpp>
29#include <com/sun/star/util/SearchAlgorithms2.hpp>
30#include <com/sun/star/util/SearchFlags.hpp>
34#include <rtl/ustrbuf.hxx>
48 sal_uInt32 cWildEscChar,
92 struct CachedTextSearch
102 static CachedTextSearch theCachedTextSearch;
104 std::scoped_lock aGuard(theCachedTextSearch.mutex);
106 if (
lcl_Equals(theCachedTextSearch.Options, rPara) )
107 return theCachedTextSearch.xTextSearch;
109 Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
110 theCachedTextSearch.xTextSearch.set( ::TextSearch2::create(xContext) );
112 theCachedTextSearch.Options = rPara;
114 return theCachedTextSearch.xTextSearch;
123 Init( rParam, aLocale);
137 const css::lang::Locale& rLocale )
148 aSOpt.
searchFlag |= SearchFlags::WILD_MATCH_SELECTION;
160 for (;;) std::abort();
168 aSOpt.
searchFlag |= SearchFlags::ALL_IGNORE_CASE;
176 const css::lang::Locale& rLocale )
194 sal_Int32* pStart, sal_Int32* pEnd,
195 css::util::SearchResult* pRes)
202 SearchResult aRet(
xTextSearch->searchForward( rStr, *pStart, *pEnd ));
203 if( aRet.subRegExpressions > 0 )
210 *pStart = aRet.startOffset[ 0 ];
211 *pEnd = aRet.endOffset[ 0 ];
226 sal_Int32 pStart = 0;
227 sal_Int32 pEnd = rStr.getLength();
235 sal_Int32* pEnd, SearchResult* pRes )
242 SearchResult aRet(
xTextSearch->searchBackward( rStr, *pStart, *pEnd ));
243 if( aRet.subRegExpressions )
250 *pEnd = aRet.startOffset[ 0 ];
251 *pStart = aRet.endOffset[ 0 ];
266 if( rResult.subRegExpressions <= 0 )
271 OUStringBuffer sBuff(rReplaceStr.getLength()*4);
272 for(
i = 0;
i < rReplaceStr.getLength();
i++)
274 if( rReplaceStr[
i] ==
'&')
276 sal_Int32 nStart = rResult.startOffset[0];
277 sal_Int32
nLength = rResult.endOffset[0] - rResult.startOffset[0];
278 sBuff.append(rStr.substr(nStart,
nLength));
280 else if((
i < rReplaceStr.getLength() - 1) && rReplaceStr[
i] ==
'$')
282 sFndChar = rReplaceStr[
i + 1 ];
296 int j = sFndChar -
'0';
297 if(j < rResult.subRegExpressions)
299 sal_Int32 nSttReg = rResult.startOffset[j];
300 sal_Int32 nRegLen = rResult.endOffset[j];
301 if (nSttReg < 0 || nRegLen < 0)
303 nSttReg = nRegLen = 0;
305 else if (nRegLen >= nSttReg)
307 nRegLen = nRegLen - nSttReg;
311 nRegLen = nSttReg - nRegLen;
312 nSttReg = rResult.endOffset[j];
315 sBuff.append(rStr.substr(nSttReg, nRegLen));
321 sBuff.append(OUStringChar(rReplaceStr[
i]) + OUStringChar(rReplaceStr[
i+1]));
326 else if((
i < rReplaceStr.getLength() - 1) && rReplaceStr[
i] ==
'\\')
328 sFndChar = rReplaceStr[
i+1 ];
334 sBuff.append(sFndChar);
342 sBuff.append(OUStringChar(rReplaceStr[
i]) + OUStringChar(rReplaceStr[
i+1]));
349 sBuff.append(rReplaceStr[
i]);
352 rReplaceStr = sBuff.makeStringAndClear();
const LanguageTag & getLanguageTag() const
get current Locale
const css::lang::Locale & getLocale(bool bResolveSystem=true) const
static css::lang::Locale convertToLocale(LanguageType nLangID, bool bResolveSystem=true)
sal_Int32 GetWildEscChar() const
sal_uInt32 m_cWildEscChar
bool IsCaseSensitive() const
SearchType GetSrchType() const
const OUString & GetSrchStr() const
bool IsWildMatchSel() const
SearchParam(const OUString &rText, SearchType eSrchType, bool bCaseSensitive=true, sal_uInt32 cWildEscChar='\\', bool bWildMatchSel=false)
css::uno::Reference< css::util::XTextSearch2 > xTextSearch
bool SearchBackward(const OUString &rStr, sal_Int32 *pStart, sal_Int32 *pEnd, css::util::SearchResult *pRes=nullptr)
void SetLocale(const i18nutil::SearchOptions2 &rOpt, const css::lang::Locale &rLocale)
bool SearchForward(const OUString &rStr, sal_Int32 *pStart, sal_Int32 *pEnd, css::util::SearchResult *pRes=nullptr)
bool searchForward(const OUString &rStr)
searchForward Search forward beginning from the start to the end of the given text
TextSearch(const SearchParam &rPara, LanguageType nLanguage)
void ReplaceBackReferences(OUString &rReplaceStr, std::u16string_view rStr, const css::util::SearchResult &rResult) const
void Init(const SearchParam &rParam, const css::lang::Locale &rLocale)
static css::uno::Reference< css::util::XTextSearch2 > getXTextSearch(const i18nutil::SearchOptions2 &rPara)
#define TOOLS_WARN_EXCEPTION(area, stream)
static bool lcl_Equals(const i18nutil::SearchOptions2 &rSO1, const i18nutil::SearchOptions2 &rSO2)
css::util::SearchOptions2 toUnoSearchOptions2() const
TransliterationFlags transliterateFlags
sal_Int32 WildcardEscapeCharacter
css::uno::Reference< css::util::XTextSearch2 > xTextSearch