diff options
author | Caolán McNamara <caolanm@redhat.com> | 2013-09-25 21:37:37 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-09-25 22:40:23 +0200 |
commit | 5342cd7533a51fd488de85565674ee01649ddcbc (patch) | |
tree | 533d33531076204c002bec87a4dcf8d71c4775dc /sw | |
parent | 2de32959d0041dddf5c47da9b7829c2e272478aa (diff) |
Resolves: fdo#66400 import combined characters from docx
move .doc combined character parser stuff from sw to filter for reuse in .docx
and fix bad length problem when nSavPtr == -1 after String->OUString conversion
thanks for the pasta CloudOn
Change-Id: I368ca30c14fd089271902b9b874de1099eb40038
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/filter/ww8/ww8par.hxx | 5 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par5.cxx | 303 |
2 files changed, 18 insertions, 290 deletions
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 946a3d7c923c..7d970e6348ec 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -23,6 +23,7 @@ #include <tools/string.hxx> #include "rtl/ustring.hxx" #include <filter/msfilter/msdffimp.hxx> +#include <filter/msfilter/util.hxx> #include <editeng/frmdir.hxx> #include <fltshell.hxx> @@ -100,7 +101,6 @@ class SwAttrSet; class GDIMetaFile; struct ESelection; class SfxItemSet; -class WW8ReadFieldParams; class wwZOrderer; class OutlinerParaObject; @@ -111,6 +111,8 @@ namespace com{namespace sun {namespace star{ namespace lang{class XMultiServiceFactory;} }}} +using namespace msfilter::util; + // defines nur fuer die WW8-variable der INI-Datei #define WW8FL_NO_TEXT 1 #define WW8FL_NO_STYLES 2 @@ -1771,7 +1773,6 @@ public: // eigentlich private, geht aber leider nur public eF_ResT Read_F_DBNum( WW8FieldDesc*, OUString& ); eF_ResT Read_F_Equation( WW8FieldDesc*, OUString& ); void Read_SubF_Ruby( WW8ReadFieldParams& rReadParam); - void Read_SubF_Combined( WW8ReadFieldParams& rReadParam); eF_ResT Read_F_IncludePicture( WW8FieldDesc*, OUString& rStr ); eF_ResT Read_F_IncludeText( WW8FieldDesc*, OUString& rStr ); eF_ResT Read_F_Seq( WW8FieldDesc*, OUString& rStr ); diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx index 885066683274..82ea7a4f8146 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -86,208 +86,12 @@ #define WW8_TOX_LEVEL_DELIM ':' using namespace ::com::sun::star; +using namespace msfilter::util; using namespace sw::util; using namespace sw::mark; using namespace std; // #i24377# using namespace nsSwDocInfoSubType; - -class WW8ReadFieldParams -{ -private: - const OUString aData; - sal_Int32 nFnd; - sal_Int32 nNext; - sal_Int32 nSavPtr; -public: - WW8ReadFieldParams( const OUString& rData ); - ~WW8ReadFieldParams(); - - bool GoToTokenParam(); - sal_Int32 SkipToNextToken(); - sal_Int32 GetTokenSttPtr() const { return nFnd; } - - sal_Int32 FindNextStringPiece( sal_Int32 _nStart = -1 ); - bool GetTokenSttFromTo(sal_Int32* _pFrom, sal_Int32* _pTo, sal_Int32 _nMax); - - OUString GetResult() const; -}; - - -WW8ReadFieldParams::WW8ReadFieldParams( const OUString& _rData ) - : aData( _rData ) - , nFnd( 0 ) - , nNext( 0 ) - , nSavPtr( 0 ) -{ - /* - erstmal nach einer oeffnenden Klammer oder einer Leerstelle oder einem - Anfuehrungszeichen oder einem Backslash suchen, damit der Feldbefehl - (also INCLUDEPICTURE bzw EINFUeGENGRAFIK bzw ...) ueberlesen wird - */ - const sal_Int32 nLen = aData.getLength(); - - while ( nNext<nLen && aData[nNext]==' ' ) - ++nNext; - - while ( nNext<nLen ) - { - const sal_Unicode c = aData[nNext]; - if ( c==' ' || c=='"' || c=='\\' || c==132 || c==0x201c ) - break; - ++nNext; - } - - nFnd = nNext; - nSavPtr = nNext; -} - - -WW8ReadFieldParams::~WW8ReadFieldParams() -{ - -} - - -OUString WW8ReadFieldParams::GetResult() const -{ - return nFnd<0 && nSavPtr>nFnd ? OUString() : aData.copy( nFnd, nSavPtr-nFnd ); -} - - -bool WW8ReadFieldParams::GoToTokenParam() -{ - const sal_Int32 nOld = nNext; - if( -2 == SkipToNextToken() ) - return GetTokenSttPtr()>=0; - nNext = nOld; - return false; -} - -// ret: -2: NOT a '\' parameter but normal Text -sal_Int32 WW8ReadFieldParams::SkipToNextToken() -{ - if ( nNext<0 || nNext>=aData.getLength() ) - return -1; - - nFnd = FindNextStringPiece(nNext); - if ( nFnd<0 ) - return -1; - - nSavPtr = nNext; - - if ( aData[nFnd]=='\\' && nFnd+1<aData.getLength() && aData[nFnd+1]!='\\' ) - { - const sal_Int32 nRet = aData[++nFnd]; - nNext = ++nFnd; // und dahinter setzen - return nRet; - } - - if ( nSavPtr>0 && (aData[nSavPtr-1]=='"' || aData[nSavPtr-1]==0x201d ) ) - { - --nSavPtr; - } - return -2; -} - -// FindNextPara sucht naechsten Backslash-Parameter oder naechste Zeichenkette -// bis zum Blank oder naechsten "\" oder zum schliessenden Anfuehrungszeichen -// oder zum String-Ende von pStr. -// -// Ausgabe ppNext (falls ppNext != 0) Suchbeginn fuer naechsten Parameter bzw. 0 -// -// Returnwert: 0 falls String-Ende erreicht, -// ansonsten Anfang des Paramters bzw. der Zeichenkette -// -sal_Int32 WW8ReadFieldParams::FindNextStringPiece(const sal_Int32 nStart) -{ - const sal_Int32 nLen = aData.getLength(); - sal_Int32 n = nStart<0 ? nFnd : nStart; // Anfang - sal_Int32 n2; // Ende - - nNext = -1; // Default fuer nicht gefunden - - while ( n<nLen && aData[n]==' ' ) - ++n; - - if ( n==nLen ) - return -1; - - if ( aData[n]==0x13 ) - { - // Skip the nested field code since it's not supported - while ( n<nLen && aData[n]!=0x14 ) - ++n; - if ( n==nLen ) - return -1; - } - - // Anfuehrungszeichen vor Para? - if ( aData[n]=='"' || aData[n]==0x201c || aData[n]==132 || aData[n]==0x14 ) - { - n++; // Anfuehrungszeichen ueberlesen - n2 = n; // ab hier nach Ende suchen - while( (nLen > n2) - && (aData[n2] != '"') - && (aData[n2] != 0x201d) - && (aData[n2] != 147) - && (aData[n2] != 0x15) ) - n2++; // Ende d. Paras suchen - } - else // keine Anfuehrungszeichen - { - n2 = n; // ab hier nach Ende suchen - while ( n2<nLen && aData[n2]!=' ' ) // Ende d. Paras suchen - { - if ( aData[n2]=='\\' ) - { - if ( n2+1<nLen && aData[n2+1]=='\\' ) - n2 += 2; // Doppel-Backslash -> OK - else - { - if( n2 > n ) - n2--; - break; // einfach-Backslash -> Ende - } - } - else - n2++; // kein Backslash -> OK - } - } - if( nLen > n2 ) - { - if (aData[n2]!=' ') ++n2; - nNext = n2; - } - return n; -} - - - -// read parameters "1-3" or 1-3 with both values between 1 and nMax -bool WW8ReadFieldParams::GetTokenSttFromTo(sal_Int32* pFrom, sal_Int32* pTo, sal_Int32 nMax) -{ - sal_Int32 nStart = 0; - sal_Int32 nEnd = 0; - if ( GoToTokenParam() ) - { - - const OUString sParams( GetResult() ); - - sal_Int32 nIndex = 0; - const OUString sStart( sParams.getToken(0, '-', nIndex) ); - if (nIndex>=0) - { - nStart = sStart.toInt32(); - nEnd = sParams.copy(nIndex).toInt32(); - } - } - if( pFrom ) *pFrom = nStart; - if( pTo ) *pTo = nEnd; - - return nStart && nEnd && (nMax >= nStart) && (nMax >= nEnd); -} - //---------------------------------------- // Bookmarks //---------------------------------------- @@ -2608,103 +2412,26 @@ eF_ResT SwWW8ImplReader::Read_F_Equation( WW8FieldDesc*, OUString& rStr ) WW8ReadFieldParams aReadParam( rStr ); const sal_Int32 cChar = aReadParam.SkipToNextToken(); if ('o' == cChar || 'O' == cChar) - Read_SubF_Combined(aReadParam); - else if ('*' == cChar) - Read_SubF_Ruby(aReadParam); - return FLD_OK; -} - -void SwWW8ImplReader::Read_SubF_Combined( WW8ReadFieldParams& rReadParam) -{ - String sCombinedCharacters; - WW8ReadFieldParams aOriFldParam = rReadParam; - const sal_Int32 cGetChar = rReadParam.SkipToNextToken(); - switch( cGetChar ) { - case 'a': - case 'A': - if ( !rReadParam.GetResult().startsWithIgnoreAsciiCase("d") ) + EquationResult aResult(ParseCombinedChars(rStr)); + + if (aResult.sType == "Input") { - break; + SwInputField aFld( (SwInputFieldType*)rDoc.GetSysFldType( RES_INPUTFLD ), + aResult.sResult, aResult.sResult, INP_TXT, 0 ); + rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 ); // insert input field } - rReadParam.SkipToNextToken(); - // intentional fall-through - case -2: + else if (aResult.sType == "CombinedCharacters") { - if ( rReadParam.GetResult().startsWithIgnoreAsciiCase("(") ) - { - for (int i=0;i<2;i++) - { - if ('s' == rReadParam.SkipToNextToken()) - { - const sal_Int32 cChar = rReadParam.SkipToNextToken(); - if (-2 != rReadParam.SkipToNextToken()) - break; - const OUString sF = rReadParam.GetResult(); - if ((('u' == cChar) && sF.startsWithIgnoreAsciiCase("p")) - || (('d' == cChar) && sF.startsWithIgnoreAsciiCase("o"))) - { - if (-2 == rReadParam.SkipToNextToken()) - { - String sPart = rReadParam.GetResult(); - xub_StrLen nBegin = sPart.Search('('); - - //Word disallows brackets in this field, which - //aids figuring out the case of an end of )) vs ) - xub_StrLen nEnd = sPart.Search(')'); - - if ((nBegin != STRING_NOTFOUND) && - (nEnd != STRING_NOTFOUND)) - { - sCombinedCharacters += - sPart.Copy(nBegin+1,nEnd-nBegin-1); - } - } - } - } - } - if (sCombinedCharacters.Len()) - { - SwCombinedCharField aFld((SwCombinedCharFieldType*) - rDoc.GetSysFldType(RES_COMBINED_CHARS),sCombinedCharacters); - rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0); - } - else - { - const String sPart = aOriFldParam.GetResult(); - xub_StrLen nBegin = sPart.Search('('); - xub_StrLen nEnd = sPart.Search(','); - if ( nEnd == STRING_NOTFOUND ) - { - nEnd = sPart.Search(')'); - } - if ( (nBegin != STRING_NOTFOUND) && (nEnd != STRING_NOTFOUND) ) - { - // skip certain leading characters - for (int i = nBegin;i < nEnd-1;i++) - { - const sal_Unicode cC = sPart.GetChar(nBegin+1); - if ( cC < 32 ) - { - nBegin++; - } - else - break; - } - sCombinedCharacters = sPart.Copy( nBegin+1, nEnd-nBegin-1 ); - if ( sCombinedCharacters.Len() ) - { - SwInputField aFld( (SwInputFieldType*)rDoc.GetSysFldType( RES_INPUTFLD ), - sCombinedCharacters, sCombinedCharacters, INP_TXT, 0 ); - rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 ); // insert input field - } - } - } - } + SwCombinedCharField aFld((SwCombinedCharFieldType*) + rDoc.GetSysFldType(RES_COMBINED_CHARS), aResult.sType); + rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0); } - default: - break; } + else if ('*' == cChar) + Read_SubF_Ruby(aReadParam); + + return FLD_OK; } void SwWW8ImplReader::Read_SubF_Ruby( WW8ReadFieldParams& rReadParam) |