1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svl.hxx" 26 #include <svl/lngmisc.hxx> 27 #include <tools/solar.h> 28 #include <tools/string.hxx> 29 #include <tools/debug.hxx> 30 #include <rtl/ustrbuf.hxx> 31 #include <rtl/ustring.hxx> 32 33 using namespace rtl; 34 35 namespace linguistic 36 { 37 38 /////////////////////////////////////////////////////////////////////////// 39 40 sal_Int32 GetNumControlChars( const OUString &rTxt ) 41 { 42 sal_Int32 nCnt = 0; 43 sal_Int32 nLen = rTxt.getLength(); 44 for (sal_Int32 i = 0; i < nLen; ++i) 45 { 46 if (IsControlChar( rTxt[i] )) 47 ++nCnt; 48 } 49 return nCnt; 50 } 51 52 53 sal_Bool RemoveHyphens( OUString &rTxt ) 54 { 55 sal_Bool bModified = sal_False; 56 if (HasHyphens( rTxt )) 57 { 58 String aTmp( rTxt ); 59 aTmp.EraseAllChars( SVT_SOFT_HYPHEN ); 60 aTmp.EraseAllChars( SVT_HARD_HYPHEN ); 61 rTxt = aTmp; 62 bModified = sal_True; 63 } 64 return bModified; 65 } 66 67 68 sal_Bool RemoveControlChars( OUString &rTxt ) 69 { 70 sal_Bool bModified = sal_False; 71 sal_Int32 nCtrlChars = GetNumControlChars( rTxt ); 72 if (nCtrlChars) 73 { 74 sal_Int32 nLen = rTxt.getLength(); 75 sal_Int32 nSize = nLen - nCtrlChars; 76 OUStringBuffer aBuf( nSize ); 77 aBuf.setLength( nSize ); 78 sal_Int32 nCnt = 0; 79 for (sal_Int32 i = 0; i < nLen; ++i) 80 { 81 sal_Unicode cChar = rTxt[i]; 82 if (!IsControlChar( cChar )) 83 { 84 DBG_ASSERT( nCnt < nSize, "index out of range" ); 85 aBuf.setCharAt( nCnt++, cChar ); 86 } 87 } 88 DBG_ASSERT( nCnt == nSize, "wrong size" ); 89 rTxt = aBuf.makeStringAndClear(); 90 bModified = sal_True; 91 } 92 return bModified; 93 } 94 95 96 // non breaking field character 97 #define CH_TXTATR_INWORD ((sal_Char) 0x02) 98 99 sal_Bool ReplaceControlChars( rtl::OUString &rTxt, sal_Char /*aRplcChar*/ ) 100 { 101 // the resulting string looks like this: 102 // 1. non breaking field characters get removed 103 // 2. remaining control characters will be replaced by ' ' 104 105 sal_Bool bModified = sal_False; 106 sal_Int32 nCtrlChars = GetNumControlChars( rTxt ); 107 if (nCtrlChars) 108 { 109 sal_Int32 nLen = rTxt.getLength(); 110 OUStringBuffer aBuf( nLen ); 111 sal_Int32 nCnt = 0; 112 for (sal_Int32 i = 0; i < nLen; ++i) 113 { 114 sal_Unicode cChar = rTxt[i]; 115 if (CH_TXTATR_INWORD != cChar) 116 { 117 if (IsControlChar( cChar )) 118 cChar = ' '; 119 DBG_ASSERT( nCnt < nLen, "index out of range" ); 120 aBuf.setCharAt( nCnt++, cChar ); 121 } 122 } 123 aBuf.setLength( nCnt ); 124 rTxt = aBuf.makeStringAndClear(); 125 bModified = sal_True; 126 } 127 return bModified; 128 } 129 130 131 String GetThesaurusReplaceText( const String &rText ) 132 { 133 // The strings for synonyms returned by the thesaurus sometimes have some 134 // explanation text put in between '(' and ')' or a trailing '*'. 135 // These parts should not be put in the ReplaceEdit Text that may get 136 // inserted into the document. Thus we strip them from the text. 137 138 String aText( rText ); 139 140 xub_StrLen nPos = aText.Search( sal_Unicode('(') ); 141 while (STRING_NOTFOUND != nPos) 142 { 143 xub_StrLen nEnd = aText.Search( sal_Unicode(')'), nPos ); 144 if (STRING_NOTFOUND != nEnd) 145 aText.Erase( nPos, nEnd-nPos+1 ); 146 else 147 break; 148 nPos = aText.Search( sal_Unicode('(') ); 149 } 150 151 nPos = aText.Search( sal_Unicode('*') ); 152 if (STRING_NOTFOUND != nPos) 153 aText.Erase( nPos ); 154 155 // remove any possible remaining ' ' that may confuse the thesaurus 156 // when it gets called with the text 157 aText.EraseLeadingAndTrailingChars( sal_Unicode(' ') ); 158 159 return aText; 160 } 161 162 /////////////////////////////////////////////////////////////////////////// 163 164 } // namespace linguistic 165 166