/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Dieses File enthaelt alle Ausgabe-Funktionen des ASCII-Writers; * fuer alle Nodes, Attribute, Formate und Chars. */ class SwASC_AttrIter { SwASCWriter& rWrt; const SwTxtNode& rNd; xub_StrLen nAktSwPos; xub_StrLen SearchNext( xub_StrLen nStartPos ); public: SwASC_AttrIter( SwASCWriter& rWrt, const SwTxtNode& rNd, xub_StrLen nStt ); void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); } xub_StrLen WhereNext() const { return nAktSwPos; } sal_Bool OutAttr( xub_StrLen nSwPos ); }; SwASC_AttrIter::SwASC_AttrIter( SwASCWriter& rWr, const SwTxtNode& rTxtNd, xub_StrLen nStt ) : rWrt( rWr ), rNd( rTxtNd ), nAktSwPos( 0 ) { nAktSwPos = SearchNext( nStt + 1 ); } xub_StrLen SwASC_AttrIter::SearchNext( xub_StrLen nStartPos ) { xub_StrLen nMinPos = STRING_MAXLEN; const SwpHints* pTxtAttrs = rNd.GetpSwpHints(); if( pTxtAttrs ) { // kann noch optimiert werden, wenn ausgenutzt wird, dass die TxtAttrs // nach der Anfangsposition geordnet sind. Dann muessten // allerdings noch 2 Indices gemerkt werden for ( sal_uInt16 i = 0; i < pTxtAttrs->Count(); i++ ) { const SwTxtAttr* pHt = (*pTxtAttrs)[i]; if (pHt->HasDummyChar()) { xub_StrLen nPos = *pHt->GetStart(); if( nPos >= nStartPos && nPos <= nMinPos ) nMinPos = nPos; if( ( ++nPos ) >= nStartPos && nPos < nMinPos ) nMinPos = nPos; } } } return nMinPos; } sal_Bool SwASC_AttrIter::OutAttr( xub_StrLen nSwPos ) { sal_Bool bRet = sal_False; const SwpHints* pTxtAttrs = rNd.GetpSwpHints(); if( pTxtAttrs ) { sal_uInt16 i; for( i = 0; i < pTxtAttrs->Count(); i++ ) { const SwTxtAttr* pHt = (*pTxtAttrs)[i]; if ( pHt->HasDummyChar() && nSwPos == *pHt->GetStart() ) { bRet = sal_True; String sOut; switch( pHt->Which() ) { case RES_TXTATR_FIELD: sOut = static_cast(pHt)->GetFld().GetFld() ->ExpandField(true); break; case RES_TXTATR_FTN: { const SwFmtFtn& rFtn = pHt->GetFtn(); if( rFtn.GetNumStr().Len() ) sOut = rFtn.GetNumStr(); else if( rFtn.IsEndNote() ) sOut = rWrt.pDoc->GetEndNoteInfo().aFmt. GetNumStr( rFtn.GetNumber() ); else sOut = rWrt.pDoc->GetFtnInfo().aFmt. GetNumStr( rFtn.GetNumber() ); } break; } if( sOut.Len() ) rWrt.Strm().WriteUnicodeOrByteText( sOut ); } else if( nSwPos < *pHt->GetStart() ) break; } } return bRet; } //------------------------ /* Ausgabe der Nodes */ //------------------------ static Writer& OutASC_SwTxtNode( Writer& rWrt, SwCntntNode& rNode ) { const SwTxtNode& rNd = (SwTxtNode&)rNode; xub_StrLen nStrPos = rWrt.pCurPam->GetPoint()->nContent.GetIndex(); xub_StrLen nNodeEnde = rNd.Len(), nEnde = nNodeEnde; sal_Bool bLastNd = rWrt.pCurPam->GetPoint()->nNode == rWrt.pCurPam->GetMark()->nNode; if( bLastNd ) nEnde = rWrt.pCurPam->GetMark()->nContent.GetIndex(); SwASC_AttrIter aAttrIter( (SwASCWriter&)rWrt, rNd, nStrPos ); if( !nStrPos && rWrt.bExportPargraphNumbering ) { String numString( rNd.GetNumString() ); if (numString.Len()) { numString.Append(' '); rWrt.Strm().WriteUnicodeOrByteText(numString); } } String aStr( rNd.GetTxt() ); if( rWrt.bASCII_ParaAsBlanc ) aStr.SearchAndReplaceAll( 0x0A, ' ' ); const bool bExportSoftHyphens = RTL_TEXTENCODING_UCS2 == rWrt.GetAsciiOptions().GetCharSet() || RTL_TEXTENCODING_UTF8 == rWrt.GetAsciiOptions().GetCharSet(); do { xub_StrLen nNextAttr = aAttrIter.WhereNext(); if( nNextAttr > nEnde ) nNextAttr = nEnde; if( !aAttrIter.OutAttr( nStrPos )) { String aOutStr( aStr.Copy( nStrPos, nNextAttr - nStrPos ) ); if ( !bExportSoftHyphens ) aOutStr = comphelper::string::remove(aOutStr, CHAR_SOFTHYPHEN); rWrt.Strm().WriteUnicodeOrByteText( aOutStr ); } nStrPos = nNextAttr; aAttrIter.NextPos(); } while( nStrPos < nEnde ); if( !bLastNd || ( ( !rWrt.bWriteClipboardDoc && !rWrt.bASCII_NoLastLineEnd ) && !nStrPos && nEnde == nNodeEnde ) ) rWrt.Strm().WriteUnicodeOrByteText( ((SwASCWriter&)rWrt).GetLineEnd()); return rWrt; } /* * lege hier jetzt die Tabellen fuer die ASCII-Funktions-Pointer auf * die Ausgabe-Funktionen an. * Es sind lokale Strukturen, die nur innerhalb der ASCII-DLL * bekannt sein muessen. */ SwNodeFnTab aASCNodeFnTab = { /* RES_TXTNODE */ OutASC_SwTxtNode, /* RES_GRFNODE */ 0, /* RES_OLENODE */ 0 }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ tro/mimo/mimo-7-1 LibreOffice 核心代码仓库文档基金会
summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2013-08-21Related: #i122600# access memory problem in SvgSvgNode::getCurrentViewPortOliver-Rainer Wittmann
2013-08-21Revert "returning pointers to temporaries"Caolán McNamara
2013-08-15cppcheck: fix duplicateBreakJulien Nabet
2013-08-14returning pointers to temporariesCaolán McNamara
2013-08-14Resolves: fdo#67047 fdo#64125 #i122600# svgio improvementsArmin Le Grand
2013-07-16Resolves: #i122724# Better handling of line-only pathsArmin Le Grand
2013-07-04Fix fdo#64125 - Use default for preserveAspectRatio scalingChr. Rossmanith
2013-07-02Related: #i122594# Added same handling for outer SVG elementArmin Le Grand
2013-07-02Resolves: #i122594# correctly handle inner svg node...Armin Le Grand
2013-07-02fdo#43460: Use isEmpty() instead of getLength() in svgioChr. Rossmanith
2013-06-27Fix fdo#65847 - avoid infinite recursion in style resolution.Thorsten Behrens
2013-06-18fdo#43460: Use isEmpty() instead of getLength() in svgioChr. Rossmanith
2013-06-18Resolves: #i122524# fixed some text import aspects for super/sub-baselineArmin Le Grand
2013-06-17Resolves: #i121801# Corrected handling of gradient transformationsArmin Le Grand
2013-06-17Resolves: #i122324# detect own re-import of EmbeddedFonts...Armin Le Grand
2013-06-14Resolves: #i122522# apply needed order to CSS styles to presentation stylesArmin Le Grand
2013-06-13Resolves: #i121656# Some more cleanups for SVG importArmin Le Grand
2013-06-13don't make it a secret what the errors areCaolán McNamara
2013-04-14WaE: type qualifiers ignored on function return typeTor Lillqvist
2013-04-14#120435# Corrected CSS style detection to be executed only once per nodeArmin Le Grand
2013-04-14#121221# added boolean state to remember when the StrokeDasharray was set to ...Armin Le Grand
2013-04-14Fix #120334# Added support for multiple CSS styles per graphic primitiveArmin Le Grand
2013-04-07remove needless forward rtl::OUString declarationsLuboš Luňák
2013-04-07mass removal of rtl:: prefixes for O(U)String*Luboš Luňák
2013-03-25coverity#704311 Logically dead codeJulien Nabet
2013-03-19removal of RTL_CONSTASCII_USTRINGPARAM for quoted OUStrings declarationsThomas Arnhold
2013-03-19automated removal of RTL_CONSTASCII_USTRINGPARAM for quoted OUStringsThomas Arnhold
2013-03-16Resolves: #i118780# Moved ObjectInfoPrimitive2D extractor to drawinglayer...Armin Le Grand
2013-03-13Related: #i119125# corrected gradient renderingArmin Le Grand
2013-03-11use startsWith() instead of compareToAscii()Thomas Arnhold
2013-03-04doubled includesThomas Arnhold
2013-02-22#120616# Corrected SVG gradient primitive and it's decompositionArmin Le Grand