/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svl.hxx" #include #include #include #include #include #include using namespace rtl; namespace linguistic { /////////////////////////////////////////////////////////////////////////// sal_Int32 GetNumControlChars( const OUString &rTxt ) { sal_Int32 nCnt = 0; sal_Int32 nLen = rTxt.getLength(); for (sal_Int32 i = 0; i < nLen; ++i) { if (IsControlChar( rTxt[i] )) ++nCnt; } return nCnt; } sal_Bool RemoveHyphens( OUString &rTxt ) { sal_Bool bModified = sal_False; if (HasHyphens( rTxt )) { String aTmp( rTxt ); aTmp.EraseAllChars( SVT_SOFT_HYPHEN ); aTmp.EraseAllChars( SVT_HARD_HYPHEN ); rTxt = aTmp; bModified = sal_True; } return bModified; } sal_Bool RemoveControlChars( OUString &rTxt ) { sal_Bool bModified = sal_False; sal_Int32 nCtrlChars = GetNumControlChars( rTxt ); if (nCtrlChars) { sal_Int32 nLen = rTxt.getLength(); sal_Int32 nSize = nLen - nCtrlChars; OUStringBuffer aBuf( nSize ); aBuf.setLength( nSize ); sal_Int32 nCnt = 0; for (sal_Int32 i = 0; i < nLen; ++i) { sal_Unicode cChar = rTxt[i]; if (!IsControlChar( cChar )) { DBG_ASSERT( nCnt < nSize, "index out of range" ); aBuf.setCharAt( nCnt++, cChar ); } } DBG_ASSERT( nCnt == nSize, "wrong size" ); rTxt = aBuf.makeStringAndClear(); bModified = sal_True; } return bModified; } // non breaking field character #define CH_TXTATR_INWORD ((sal_Char) 0x02) sal_Bool ReplaceControlChars( rtl::OUString &rTxt, sal_Char /*aRplcChar*/ ) { // the resulting string looks like this: // 1. non breaking field characters get removed // 2. remaining control characters will be replaced by ' ' sal_Bool bModified = sal_False; sal_Int32 nCtrlChars = GetNumControlChars( rTxt ); if (nCtrlChars) { sal_Int32 nLen = rTxt.getLength(); OUStringBuffer aBuf( nLen ); sal_Int32 nCnt = 0; for (sal_Int32 i = 0; i < nLen; ++i) { sal_Unicode cChar = rTxt[i]; if (CH_TXTATR_INWORD != cChar) { if (IsControlChar( cChar )) cChar = ' '; DBG_ASSERT( nCnt < nLen, "index out of range" ); aBuf.setCharAt( nCnt++, cChar ); } } aBuf.setLength( nCnt ); rTxt = aBuf.makeStringAndClear(); bModified = sal_True; } return bModified; } String GetThesaurusReplaceText( const String &rText ) { // The strings for synonyms returned by the thesaurus sometimes have some // explanation text put in between '(' and ')' or a trailing '*'. // These parts should not be put in the ReplaceEdit Text that may get // inserted into the document. Thus we strip them from the text. String aText( rText ); xub_StrLen nPos = aText.Search( sal_Unicode('(') ); while (STRING_NOTFOUND != nPos) { xub_StrLen nEnd = aText.Search( sal_Unicode(')'), nPos ); if (STRING_NOTFOUND != nEnd) aText.Erase( nPos, nEnd-nPos+1 ); else break; nPos = aText.Search( sal_Unicode('(') ); } nPos = aText.Search( sal_Unicode('*') ); if (STRING_NOTFOUND != nPos) aText.Erase( nPos ); // remove any possible remaining ' ' that may confuse the thesaurus // when it gets called with the text aText.EraseLeadingAndTrailingChars( sal_Unicode(' ') ); return aText; } /////////////////////////////////////////////////////////////////////////// } // namespace linguistic