Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <hintids.hxx>
30 : : #include <com/sun/star/i18n/ScriptType.hpp>
31 : : #include <comphelper/string.hxx>
32 : : #include <vcl/svapp.hxx>
33 : : #include <vcl/wrkwin.hxx>
34 : : #include <sfx2/sfx.hrc>
35 : : #include <svtools/htmlout.hxx>
36 : : #include <svtools/htmlkywd.hxx>
37 : : #include <svtools/htmltokn.h>
38 : : #include <svl/whiter.hxx>
39 : : #include <svx/htmlmode.hxx>
40 : : #include <editeng/escpitem.hxx>
41 : : #include <editeng/brkitem.hxx>
42 : : #include <editeng/boxitem.hxx>
43 : : #include <editeng/ulspitem.hxx>
44 : : #include <editeng/udlnitem.hxx>
45 : : #include <editeng/crsditem.hxx>
46 : : #include <editeng/blnkitem.hxx>
47 : : #include <editeng/cmapitem.hxx>
48 : : #include <editeng/colritem.hxx>
49 : : #include <editeng/fontitem.hxx>
50 : : #include <editeng/fhgtitem.hxx>
51 : : #include <editeng/postitem.hxx>
52 : : #include <editeng/kernitem.hxx>
53 : : #include <editeng/wghtitem.hxx>
54 : : #include <editeng/lspcitem.hxx>
55 : : #include <editeng/adjitem.hxx>
56 : : #include <editeng/lrspitem.hxx>
57 : : #include <editeng/brshitem.hxx>
58 : : #include <editeng/langitem.hxx>
59 : : #include <editeng/frmdiritem.hxx>
60 : : #include <fchrfmt.hxx>
61 : : #include <fmtautofmt.hxx>
62 : : #include <fmtfsize.hxx>
63 : : #include <fmtclds.hxx>
64 : : #include <fmtpdsc.hxx>
65 : : #include <fmtflcnt.hxx>
66 : : #include <fmtinfmt.hxx>
67 : : #include <fmtftn.hxx>
68 : : #include <txatbase.hxx>
69 : : #include <frmatr.hxx>
70 : : #include <charfmt.hxx>
71 : : #include <fmtfld.hxx>
72 : : #include <doc.hxx>
73 : : #include <pam.hxx>
74 : : #include <ndtxt.hxx>
75 : : #include <paratr.hxx>
76 : : #include <poolfmt.hxx>
77 : : #include <pagedesc.hxx>
78 : : #include <swtable.hxx>
79 : : #include "fldbas.hxx"
80 : : #include <breakit.hxx>
81 : : #include <htmlnum.hxx>
82 : : #include <wrthtml.hxx>
83 : : #include <htmlfly.hxx>
84 : : #include <numrule.hxx>
85 : : #include <rtl/strbuf.hxx>
86 : :
87 : : using namespace ::com::sun::star;
88 : :
89 : : /*
90 : : * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
91 : : * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
92 : : * definiert und mit der akt. verglichen. Bei unterschieden wird der
93 : : * Compiler schon meckern.
94 : : *
95 : : * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
96 : : * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
97 : : */
98 : : #if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(__MINGW32__)
99 : :
100 : : #define ATTRFNTAB_SIZE 130
101 : : #if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
102 : : #error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
103 : : #endif
104 : :
105 : : #define NODETAB_SIZE 3
106 : : #if NODETAB_SIZE != RES_NODE_END - RES_NODE_BEGIN
107 : : #error Node-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
108 : : #endif
109 : :
110 : : #endif
111 : :
112 : : //-----------------------------------------------------------------------
113 : :
114 : : HTMLOutEvent aAnchorEventTable[] =
115 : : {
116 : : { OOO_STRING_SVTOOLS_HTML_O_SDonclick, OOO_STRING_SVTOOLS_HTML_O_onclick, SFX_EVENT_MOUSECLICK_OBJECT },
117 : : { OOO_STRING_SVTOOLS_HTML_O_SDonmouseover, OOO_STRING_SVTOOLS_HTML_O_onmouseover, SFX_EVENT_MOUSEOVER_OBJECT },
118 : : { OOO_STRING_SVTOOLS_HTML_O_SDonmouseout, OOO_STRING_SVTOOLS_HTML_O_onmouseout, SFX_EVENT_MOUSEOUT_OBJECT },
119 : : { 0, 0, 0 }
120 : : };
121 : :
122 : : static Writer& OutHTML_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt );
123 : :
124 : 0 : sal_uInt16 SwHTMLWriter::GetDefListLvl( const String& rNm, sal_uInt16 nPoolId )
125 : : {
126 [ # # ]: 0 : if( nPoolId == RES_POOLCOLL_HTML_DD )
127 : : {
128 : 0 : return 1 | HTML_DLCOLL_DD;
129 : : }
130 [ # # ]: 0 : else if( nPoolId == RES_POOLCOLL_HTML_DT )
131 : : {
132 : 0 : return 1 | HTML_DLCOLL_DT;
133 : : }
134 : :
135 [ # # ]: 0 : String sDTDD( rtl::OUString(OOO_STRING_SVTOOLS_HTML_dt) );
136 [ # # ]: 0 : sDTDD += ' ';
137 [ # # ][ # # ]: 0 : if( COMPARE_EQUAL == sDTDD.CompareTo( rNm, sDTDD.Len() ) )
138 : : // DefinitionList - term
139 [ # # ][ # # ]: 0 : return (sal_uInt16)rNm.Copy( sDTDD.Len() ).ToInt32() | HTML_DLCOLL_DT;
[ # # ]
140 : :
141 [ # # ]: 0 : sDTDD.AssignAscii( OOO_STRING_SVTOOLS_HTML_dd );
142 [ # # ]: 0 : sDTDD += ' ';
143 [ # # ][ # # ]: 0 : if( COMPARE_EQUAL == sDTDD.CompareTo( rNm, sDTDD.Len() ) )
144 : : // DefinitionList - definition
145 [ # # ][ # # ]: 0 : return (sal_uInt16)rNm.Copy( sDTDD.Len() ).ToInt32() | HTML_DLCOLL_DD;
[ # # ]
146 : :
147 [ # # ]: 0 : return 0;
148 : : }
149 : :
150 : 2 : void SwHTMLWriter::OutAndSetDefList( sal_uInt16 nNewLvl )
151 : : {
152 : : // eventuell muss erst mal eine Liste aufgemacht werden
153 [ - + ]: 2 : if( nDefListLvl < nNewLvl )
154 : : {
155 : : // output </pre> for the previous(!) pararagraph, if required.
156 : : // Preferable, the <pre> is exported by OutHTML_SwFmtOff for the
157 : : // previous paragraph already, but that's not possible, because a very
158 : : // deep look at the next paragraph (this one) is required to figure
159 : : // out that a def list starts here.
160 : :
161 : 0 : ChangeParaToken( 0 );
162 : :
163 : : // entsprechend dem Level-Unterschied schreiben!
164 [ # # ]: 0 : for( sal_uInt16 i=nDefListLvl; i<nNewLvl; i++ )
165 : : {
166 [ # # ]: 0 : if( bLFPossible )
167 : 0 : OutNewLine();
168 : 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_deflist, sal_True );
169 : 0 : IncIndentLevel();
170 : 0 : bLFPossible = sal_True;
171 : : }
172 : : }
173 [ - + ]: 2 : else if( nDefListLvl > nNewLvl )
174 : : {
175 [ # # ]: 0 : for( sal_uInt16 i=nNewLvl ; i < nDefListLvl; i++ )
176 : : {
177 : 0 : DecIndentLevel();
178 [ # # ]: 0 : if( bLFPossible )
179 : 0 : OutNewLine();
180 : 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_deflist, sal_False );
181 : 0 : bLFPossible = sal_True;
182 : : }
183 : : }
184 : :
185 : 2 : nDefListLvl = nNewLvl;
186 : 2 : }
187 : :
188 : :
189 : 4 : void SwHTMLWriter::ChangeParaToken( sal_uInt16 nNew )
190 : : {
191 [ - + ][ # # ]: 4 : if( nNew != nLastParaToken && HTML_PREFORMTXT_ON == nLastParaToken )
192 : : {
193 : 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_preformtxt, sal_False );
194 : 0 : bLFPossible = sal_True;
195 : : }
196 : 4 : nLastParaToken = nNew;
197 : 4 : }
198 : :
199 : 0 : sal_uInt16 SwHTMLWriter::GetCSS1ScriptForScriptType( sal_uInt16 nScriptType )
200 : : {
201 : 0 : sal_uInt16 nRet = CSS1_OUTMODE_ANY_SCRIPT;
202 : :
203 [ # # # # ]: 0 : switch( nScriptType )
204 : : {
205 : : case i18n::ScriptType::LATIN:
206 : 0 : nRet = CSS1_OUTMODE_WESTERN;
207 : 0 : break;
208 : : case i18n::ScriptType::ASIAN:
209 : 0 : nRet = CSS1_OUTMODE_CJK;
210 : 0 : break;
211 : : case i18n::ScriptType::COMPLEX:
212 : 0 : nRet = CSS1_OUTMODE_CTL;
213 : 0 : break;
214 : : }
215 : :
216 : 0 : return nRet;
217 : : }
218 : :
219 : : // fuer die Formate muesste eine einzige Ausgabe-Funktion genuegen !
220 : : /*
221 : : * Formate wie folgt ausgeben:
222 : : * - fuer Formate, fuer die es entsprechende HTML-Tags gibt wird das
223 : : * Tag ausgegeben
224 : : * - fuer alle anderen wird ein Absatz-Tag <P> ausgegeben und bUserFmt
225 : : * gesetzt
226 : : * - Wenn eine Absatz-Ausrichtung am uebergebenen Item-Set des Nodes
227 : : * oder im Item-Set des Format gesetzt ist, wird ein ALIGN=xxx ausgegeben,
228 : : * sofern HTML es zulaesst
229 : : * - in jedem Fall wird harte Attributierung als STYLE-Option geschrieben.
230 : : * Wenn bUserFmt nicht gesetzt ist, wird nur der uebergebene Item-Set
231 : : * betrachtet. Sonst werden auch Attribute des Formats ausgegeben.
232 : : */
233 : :
234 : : struct SwHTMLTxtCollOutputInfo
235 : : {
236 : : rtl::OString aToken; // auszugendens End-Token
237 : : SfxItemSet *pItemSet; // harte Attributierung
238 : :
239 : : sal_Bool bInNumBulList; // in einer Aufzaehlungs-Liste;
240 : : sal_Bool bParaPossible; // ein </P> darf zusaetzlich ausgegeben werden
241 : : sal_Bool bOutPara; // ein </P> soll ausgegeben werden
242 : : sal_Bool bOutDiv; // write a </DIV>
243 : :
244 : 2 : SwHTMLTxtCollOutputInfo() :
245 : : pItemSet( 0 ),
246 : : bInNumBulList( sal_False ),
247 : : bParaPossible( sal_False ),
248 : : bOutPara( sal_False ),
249 : 2 : bOutDiv( sal_False )
250 : 2 : {}
251 : :
252 : : ~SwHTMLTxtCollOutputInfo();
253 : :
254 [ # # ][ # # ]: 0 : sal_Bool HasParaToken() const { return aToken.getLength()==1 && aToken[0]=='P'; }
255 [ - + ][ # # ]: 2 : sal_Bool ShouldOutputToken() const { return bOutPara || !HasParaToken(); }
256 : : };
257 : :
258 : 2 : SwHTMLTxtCollOutputInfo::~SwHTMLTxtCollOutputInfo()
259 : : {
260 [ + - ][ + - ]: 2 : delete pItemSet;
261 : 2 : }
262 : :
263 : 2 : SwHTMLFmtInfo::SwHTMLFmtInfo( const SwFmt *pF, SwDoc *pDoc, SwDoc *pTemplate,
264 : : sal_Bool bOutStyles,
265 : : LanguageType eDfltLang,
266 : : sal_uInt16 nCSS1Script, sal_Bool bHardDrop ) :
267 [ + - ]: 2 : pFmt( pF ), pRefFmt(0), pItemSet( 0 ), bScriptDependent( sal_False )
268 : : {
269 : 2 : sal_uInt16 nRefPoolId = 0;
270 : : // Den Selektor des Formats holen
271 : : sal_uInt16 nDeep = SwHTMLWriter::GetCSS1Selector( pFmt, aToken, aClass,
272 [ + - ]: 2 : nRefPoolId );
273 : : OSL_ENSURE( nDeep ? !aToken.isEmpty() : aToken.isEmpty(),
274 : : "Hier stimmt doch was mit dem Token nicht!" );
275 : : OSL_ENSURE( nDeep ? nRefPoolId : !nRefPoolId,
276 : : "Hier stimmt doch was mit der Vergleichs-Vorlage nicht!" );
277 : :
278 : 2 : sal_Bool bTxtColl = pFmt->Which() == RES_TXTFMTCOLL ||
279 [ + - ][ + - ]: 2 : pFmt->Which() == RES_CONDTXTFMTCOLL;
280 : :
281 : 2 : const SwFmt *pReferenceFmt = 0; // Vergleichs-Format
282 : 2 : sal_Bool bSetDefaults = sal_True, bClearSame = sal_True;
283 [ + - ]: 2 : if( nDeep != 0 )
284 : : {
285 : : // Es ist eine HTML-Tag-Vorlage oder die Vorlage ist von einer
286 : : // solchen abgeleitet
287 [ - + ]: 2 : if( !bOutStyles )
288 : : {
289 : : // wenn keine Styles exportiert werden, muss evtl. zusaetlich
290 : : // harte Attributierung geschrieben werden
291 [ # # ]: 0 : switch( nDeep )
292 : : {
293 : : case CSS1_FMT_ISTAG:
294 : : case CSS1_FMT_CMPREF:
295 : : // fuer HTML-Tag-Vorlagen die Unterscheide zum Original
296 : : // (sofern verfuegbar)
297 : : pReferenceFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId,
298 [ # # ][ # # ]: 0 : pTemplate );
299 : 0 : break;
300 : :
301 : : default:
302 : : // sonst die zur HTML-Tag-Vorlage des Originals oder des
303 : : // aktuellen Doks, wenn die nicht verfuegbar ist
304 [ # # ]: 0 : if( pTemplate )
305 : : pReferenceFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId,
306 [ # # ][ # # ]: 0 : pTemplate );
307 : : else
308 [ # # ]: 0 : pReferenceFmt = SwHTMLWriter::GetParentFmt( *pFmt, nDeep );
309 : 0 : break;
310 : : }
311 : : }
312 : : }
313 [ # # ]: 0 : else if( bTxtColl )
314 : : {
315 : : // Nicht von einer HTML-Tag-Vorlage abgeleitete Absatz-Vorlagen
316 : : // muessen als harte Attributierung relativ zur Textkoerper-Volage
317 : : // exportiert werden. Fuer Nicht-Styles-Export sollte die der
318 : : // HTML-Vorlage als Referenz dienen
319 [ # # ][ # # ]: 0 : if( !bOutStyles && pTemplate )
320 [ # # ]: 0 : pReferenceFmt = pTemplate->GetTxtCollFromPool( RES_POOLCOLL_TEXT, false );
321 : : else
322 [ # # ]: 0 : pReferenceFmt = pDoc->GetTxtCollFromPool( RES_POOLCOLL_TEXT, false );
323 : : }
324 : :
325 [ + - ][ - + ]: 2 : if( pReferenceFmt || nDeep==0 )
326 : : {
327 : 0 : pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
328 [ # # ][ # # ]: 0 : pFmt->GetAttrSet().GetRanges() );
329 : : // wenn Unterschiede zu einer anderen Vorlage geschrieben werden
330 : : // sollen ist harte Attributierung noetig. Fuer Vorlagen, die
331 : : // nicht von HTML-Tag-Vorlagen abgeleitet sind, gilt das immer
332 : :
333 [ # # ]: 0 : pItemSet->Set( pFmt->GetAttrSet(), sal_True );
334 : :
335 [ # # ]: 0 : if( pReferenceFmt )
336 : 0 : SwHTMLWriter::SubtractItemSet( *pItemSet, pReferenceFmt->GetAttrSet(),
337 [ # # ]: 0 : bSetDefaults, bClearSame );
338 : :
339 : : // einen leeren Item-Set gleich loeschen, das spart speater
340 : : // Arbeit
341 [ # # ]: 0 : if( !pItemSet->Count() )
342 : : {
343 [ # # ][ # # ]: 0 : delete pItemSet;
344 : 0 : pItemSet = 0;
345 : : }
346 : : }
347 : :
348 [ + - ]: 2 : if( bTxtColl )
349 : : {
350 [ + - ]: 2 : if( bOutStyles )
351 : : {
352 : : // We have to add hard attributes for any script dependent
353 : : // item that is not accessed by the style
354 : : static sal_uInt16 aWhichIds[3][4] =
355 : : {
356 : : { RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
357 : : RES_CHRATR_POSTURE, RES_CHRATR_WEIGHT },
358 : : { RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONTSIZE,
359 : : RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT },
360 : : { RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONTSIZE,
361 : : RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT }
362 : : };
363 : :
364 : 2 : sal_uInt16 nRef = 0;
365 : 2 : sal_uInt16 aSets[2] = {0,0};
366 [ + - - - ]: 2 : switch( nCSS1Script )
367 : : {
368 : : case CSS1_OUTMODE_WESTERN:
369 : 2 : nRef = 0;
370 : 2 : aSets[0] = 1;
371 : 2 : aSets[1] = 2;
372 : 2 : break;
373 : : case CSS1_OUTMODE_CJK:
374 : 0 : nRef = 1;
375 : 0 : aSets[0] = 0;
376 : 0 : aSets[1] = 2;
377 : 0 : break;
378 : : case CSS1_OUTMODE_CTL:
379 : 0 : nRef = 2;
380 : 0 : aSets[0] = 0;
381 : 0 : aSets[1] = 1;
382 : 0 : break;
383 : : }
384 [ + + ]: 10 : for( sal_uInt16 i=0; i<4; i++ )
385 : : {
386 [ + - ]: 8 : const SfxPoolItem& rRef = pFmt->GetFmtAttr( aWhichIds[nRef][i] );
387 [ + + ]: 24 : for( sal_uInt16 j=0; j<2; j++ )
388 : : {
389 [ + - ]: 16 : const SfxPoolItem& rSet = pFmt->GetFmtAttr( aWhichIds[aSets[j]][i] );
390 [ + - ][ + + ]: 16 : if( rSet != rRef )
391 : : {
392 [ + + ]: 6 : if( !pItemSet )
393 : 2 : pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
394 [ + - ][ + - ]: 2 : pFmt->GetAttrSet().GetRanges() );
395 [ + - ]: 6 : pItemSet->Put( rSet );
396 : : }
397 : : }
398 : : }
399 : : }
400 : :
401 : : // Ggf. noch ein DropCap-Attribut uebernehmen
402 [ + - ][ - + ]: 2 : if( bOutStyles && bHardDrop && nDeep != 0 )
[ # # ]
403 : : {
404 : : const SfxPoolItem *pItem;
405 [ # # ]: 0 : if( SFX_ITEM_SET==pFmt->GetAttrSet().GetItemState(
406 [ # # ]: 0 : RES_PARATR_DROP, sal_True, &pItem ) )
407 : : {
408 : 0 : sal_Bool bPut = sal_True;
409 [ # # ]: 0 : if( pTemplate )
410 : : {
411 [ # # ][ # # ]: 0 : pReferenceFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
412 : : const SfxPoolItem *pRefItem;
413 : : sal_Bool bRefItemSet =
414 : 0 : SFX_ITEM_SET==pReferenceFmt->GetAttrSet().GetItemState(
415 [ # # ]: 0 : RES_PARATR_DROP, sal_True, &pRefItem );
416 [ # # ][ # # ]: 0 : bPut = !bRefItemSet || *pItem!=*pRefItem;
[ # # ]
417 : : }
418 [ # # ]: 0 : if( bPut )
419 : : {
420 [ # # ]: 0 : if( !pItemSet )
421 : 0 : pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
422 [ # # ][ # # ]: 0 : pFmt->GetAttrSet().GetRanges() );
423 [ # # ]: 0 : pItemSet->Put( *pItem );
424 : : }
425 : : }
426 : : }
427 : :
428 : :
429 : : // Die diversen default-Abstaende aus der Vorlage oder der
430 : : // Vergleischs-Vorlage merken
431 : : const SvxLRSpaceItem &rLRSpace =
432 [ + - ][ + - ]: 2 : (pReferenceFmt ? pReferenceFmt : pFmt)->GetLRSpace();
433 : 2 : nLeftMargin = rLRSpace.GetTxtLeft();
434 : 2 : nRightMargin = rLRSpace.GetRight();
435 : 2 : nFirstLineIndent = rLRSpace.GetTxtFirstLineOfst();
436 : :
437 : : const SvxULSpaceItem &rULSpace =
438 [ + - ][ + - ]: 2 : (pReferenceFmt ? pReferenceFmt : pFmt)->GetULSpace();
439 : 2 : nTopMargin = rULSpace.GetUpper();
440 : 2 : nBottomMargin = rULSpace.GetLower();
441 : :
442 : : // export language if it differs from the default language
443 : : sal_uInt16 nWhichId =
444 [ + - ]: 2 : SwHTMLWriter::GetLangWhichIdFromScript( nCSS1Script );
445 : : const SvxLanguageItem& rLang =
446 [ + - ]: 2 : (const SvxLanguageItem&)pFmt->GetFmtAttr( nWhichId );
447 : 2 : LanguageType eLang = rLang.GetLanguage();
448 [ - + ]: 2 : if( eLang != eDfltLang )
449 : : {
450 [ # # ]: 0 : if( !pItemSet )
451 : 0 : pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
452 [ # # ][ # # ]: 0 : pFmt->GetAttrSet().GetRanges() );
453 [ # # ]: 0 : pItemSet->Put( rLang );
454 : : }
455 : :
456 : : static sal_uInt16 aWhichIds[3] =
457 : : { RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE,
458 : : RES_CHRATR_CTL_LANGUAGE };
459 [ + + ]: 8 : for( sal_uInt16 i=0; i<3; i++ )
460 : : {
461 [ + + ]: 6 : if( aWhichIds[i] != nWhichId )
462 : : {
463 : : const SvxLanguageItem& rTmpLang =
464 [ + - ]: 4 : (const SvxLanguageItem&)pFmt->GetFmtAttr(aWhichIds[i]);
465 [ + - ]: 4 : if( rTmpLang.GetLanguage() != eLang )
466 : : {
467 [ - + ]: 4 : if( !pItemSet )
468 : 0 : pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
469 [ # # ][ # # ]: 0 : pFmt->GetAttrSet().GetRanges() );
470 [ + - ]: 4 : pItemSet->Put( rTmpLang );
471 : : }
472 : : }
473 : : }
474 : : }
475 : 2 : }
476 : :
477 [ + - ]: 4 : SwHTMLFmtInfo::~SwHTMLFmtInfo()
478 : : {
479 [ + + ][ + - ]: 4 : delete pItemSet;
480 : 4 : }
481 : :
482 : 2 : void OutHTML_SwFmt( Writer& rWrt, const SwFmt& rFmt,
483 : : const SfxItemSet *pNodeItemSet,
484 : : SwHTMLTxtCollOutputInfo& rInfo )
485 : : {
486 : : OSL_ENSURE( RES_CONDTXTFMTCOLL==rFmt.Which() || RES_TXTFMTCOLL==rFmt.Which(),
487 : : "keine Absatz-Vorlage" );
488 : :
489 : 2 : SwHTMLWriter & rHWrt = (SwHTMLWriter&)rWrt;
490 : :
491 : : // Erstmal ein par Flags ...
492 : 2 : sal_uInt16 nNewDefListLvl = 0;
493 : 2 : sal_uInt16 nNumStart = USHRT_MAX;
494 : 2 : sal_Bool bForceDL = sal_False;
495 : 2 : sal_Bool bDT = sal_False;
496 : 2 : rInfo.bInNumBulList = sal_False; // Wir sind in einer Liste?
497 : 2 : sal_Bool bNumbered = sal_False; // Der aktuelle Absatz ist numeriert
498 : 2 : sal_Bool bPara = sal_False; // das aktuelle Token ist <P>
499 : 2 : rInfo.bParaPossible = sal_False; // ein <P> darf zusaetzlich ausgegeben werden
500 : 2 : sal_Bool bNoEndTag = sal_False; // kein End-Tag ausgeben
501 : :
502 : 2 : rHWrt.bNoAlign = sal_False; // kein ALIGN=... moeglich
503 : 2 : sal_Bool bNoStyle = sal_False; // kein STYLE=... moeglich
504 : 2 : sal_uInt8 nBulletGrfLvl = 255; // Die auszugebende Bullet-Grafik
505 : :
506 : : // Sind wir in einer Aufzaehlungs- oder Numerierungliste?
507 : 2 : const SwTxtNode* pTxtNd = rWrt.pCurPam->GetNode()->GetTxtNode();
508 : :
509 : 2 : SwHTMLNumRuleInfo aNumInfo;
510 [ - + ]: 2 : if( rHWrt.GetNextNumInfo() )
511 : : {
512 [ # # ]: 0 : aNumInfo = *rHWrt.GetNextNumInfo();
513 [ # # ]: 0 : rHWrt.ClearNextNumInfo();
514 : : }
515 : : else
516 : : {
517 [ + - ]: 2 : aNumInfo.Set( *pTxtNd );
518 : : }
519 : :
520 [ - + ]: 2 : if( aNumInfo.GetNumRule() )
521 : : {
522 : 0 : rInfo.bInNumBulList = sal_True;
523 : 0 : nNewDefListLvl = 0;
524 : :
525 : : // ist der aktuelle Absatz numeriert?
526 : 0 : bNumbered = aNumInfo.IsNumbered();
527 : 0 : sal_uInt8 nLvl = aNumInfo.GetLevel();
528 : :
529 : : OSL_ENSURE( pTxtNd->GetActualListLevel() == nLvl,
530 : : "Gemerkter Num-Level ist falsch" );
531 : : OSL_ENSURE( bNumbered == static_cast< sal_Bool >(pTxtNd->IsCountedInList()),
532 : : "Gemerkter Numerierungs-Zustand ist falsch" );
533 : :
534 [ # # ]: 0 : if( bNumbered )
535 : : {
536 : 0 : nBulletGrfLvl = nLvl; // nur veruebergehend!!!
537 : : // #i57919#
538 : : // correction of re-factoring done by cws swnumtree:
539 : : // - <nNumStart> has to contain the restart value, if the
540 : : // numbering is restarted at this text node. Value <USHRT_MAX>
541 : : // indicates, that no additional restart value has to be written.
542 [ # # ][ # # ]: 0 : if ( pTxtNd->IsListRestart() )
543 : : {
544 [ # # ]: 0 : nNumStart = static_cast< sal_uInt16 >(pTxtNd->GetActualListStartValue());
545 : : }
546 : : OSL_ENSURE( rHWrt.nLastParaToken == 0,
547 : : "<PRE> wurde nicht vor <LI> beendet." );
548 : : }
549 : : }
550 : :
551 : : // Jetzt holen wir das Token und ggf. die Klasse
552 [ + - ]: 2 : SwHTMLFmtInfo aFmtInfo( &rFmt );
553 : : SwHTMLFmtInfo *pFmtInfo;
554 [ + - ]: 2 : SwHTMLFmtInfos::iterator it = rHWrt.aTxtCollInfos.find( aFmtInfo );
555 [ + - ][ + - ]: 2 : if( it != rHWrt.aTxtCollInfos.end() )
[ - + ]
556 : : {
557 [ # # ]: 0 : pFmtInfo = &*it;
558 : : }
559 : : else
560 : : {
561 : : pFmtInfo = new SwHTMLFmtInfo( &rFmt, rWrt.pDoc, rHWrt.pTemplate,
562 : : rHWrt.bCfgOutStyles, rHWrt.eLang,
563 : : rHWrt.nCSS1Script,
564 [ + - ][ + - ]: 2 : false );
565 [ + - ]: 2 : rHWrt.aTxtCollInfos.insert( pFmtInfo );
566 [ + - ]: 2 : String aName( rFmt.GetName() );
567 [ + - ][ - + ]: 2 : if( 0 != rHWrt.aScriptParaStyles.count( aName ) )
568 [ + - ]: 2 : ((SwHTMLFmtInfo *)pFmtInfo)->bScriptDependent = sal_True;
569 : : }
570 : :
571 : : // Jetzt wird festgelegt, was aufgrund des Tokens so moeglich ist
572 : 2 : sal_uInt16 nToken = 0; // Token fuer Tag-Wechsel
573 : 2 : sal_Bool bOutNewLine = sal_False; // nur ein LF ausgeben?
574 [ + - ]: 2 : if( !pFmtInfo->aToken.isEmpty() )
575 : : {
576 : : // Es ist eine HTML-Tag-Vorlage oder die Vorlage ist von einer
577 : : // solchen abgeleitet
578 : 2 : rInfo.aToken = pFmtInfo->aToken;
579 : :
580 : : // der erste Buchstabe reicht meistens
581 [ - - + - : 2 : switch( rInfo.aToken[0] )
- ]
582 : : {
583 : : case 'A': OSL_ENSURE( rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_address)),
584 : : "Doch kein ADDRESS?" );
585 : 0 : rInfo.bParaPossible = sal_True;
586 : 0 : rHWrt.bNoAlign = sal_True;
587 : 0 : break;
588 : :
589 : : case 'B': OSL_ENSURE( rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_blockquote)),
590 : : "Doch kein BLOCKQUOTE?" );
591 : 0 : rInfo.bParaPossible = sal_True;
592 : 0 : rHWrt.bNoAlign = sal_True;
593 : 0 : break;
594 : :
595 [ + - ]: 2 : case 'P': if( rInfo.aToken.getLength() == 1 )
596 : : {
597 : 2 : bPara = sal_True;
598 : : }
599 : : else
600 : : {
601 : : OSL_ENSURE( rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_preformtxt)),
602 : : "Doch kein PRE?" );
603 [ # # ]: 0 : if( HTML_PREFORMTXT_ON == rHWrt.nLastParaToken )
604 : : {
605 : 0 : bOutNewLine = sal_True;
606 : : }
607 : : else
608 : : {
609 : 0 : nToken = HTML_PREFORMTXT_ON;
610 : 0 : rHWrt.bNoAlign = sal_True;
611 : 0 : bNoEndTag = sal_True;
612 : : }
613 : : }
614 : 2 : break;
615 : :
616 : : case 'D': OSL_ENSURE( rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_dt)) ||
617 : : rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_dd)),
618 : : "Doch kein DD/DT?" );
619 : 0 : bDT = rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_dt));
620 : 0 : rInfo.bParaPossible = !bDT;
621 : 0 : rHWrt.bNoAlign = sal_True;
622 : 0 : bForceDL = sal_True;
623 : 2 : break;
624 : : }
625 : : }
626 : : else
627 : : {
628 : : // alle Vorlagen, die nicht einem HTML-Tag entsprechen oder von
629 : : // diesem abgeleitet sind, werden als <P> exportiert
630 : :
631 : 0 : rInfo.aToken = OOO_STRING_SVTOOLS_HTML_parabreak;
632 : 0 : bPara = sal_True;
633 : : }
634 : :
635 : : // Falls noetig, die harte Attributierung der Vorlage uebernehmen
636 [ + - ]: 2 : if( pFmtInfo->pItemSet )
637 : : {
638 : : OSL_ENSURE( !rInfo.pItemSet, "Wo kommt der Item-Set her?" );
639 [ + - ][ + - ]: 2 : rInfo.pItemSet = new SfxItemSet( *pFmtInfo->pItemSet );
640 : : }
641 : :
642 : : // und noch die harte Attributierung des Absatzes dazunehmen
643 [ + - ]: 2 : if( pNodeItemSet )
644 : : {
645 [ + - ]: 2 : if( rInfo.pItemSet )
646 [ + - ]: 2 : rInfo.pItemSet->Put( *pNodeItemSet );
647 : : else
648 [ # # ][ # # ]: 0 : rInfo.pItemSet = new SfxItemSet( *pNodeItemSet );
649 : : }
650 : :
651 : : // den unteren Absatz-Abstand brauchen wir noch
652 : : const SvxULSpaceItem& rULSpace =
653 : 2 : pNodeItemSet ? ((const SvxULSpaceItem &)pNodeItemSet->Get(RES_UL_SPACE))
654 [ + - ][ + - ]: 2 : : rFmt.GetULSpace();
[ # # ]
655 : :
656 : :
657 [ - + # # ]: 2 : if( (rHWrt.bOutHeader &&
[ - + ][ - + ]
658 : 0 : rWrt.pCurPam->GetPoint()->nNode.GetIndex() ==
659 : 0 : rWrt.pCurPam->GetMark()->nNode.GetIndex()) ||
660 : : rHWrt.bOutFooter )
661 : : {
662 [ # # ]: 0 : if( rHWrt.bCfgOutStyles )
663 : : {
664 [ # # ]: 0 : SvxULSpaceItem aULSpaceItem( rULSpace );
665 [ # # ]: 0 : if( rHWrt.bOutHeader )
666 : 0 : aULSpaceItem.SetLower( rHWrt.nHeaderFooterSpace );
667 : : else
668 : 0 : aULSpaceItem.SetUpper( rHWrt.nHeaderFooterSpace );
669 : :
670 [ # # ]: 0 : if( !rInfo.pItemSet )
671 : : rInfo.pItemSet = new SfxItemSet(
672 : 0 : *rFmt.GetAttrSet().GetPool(),
673 [ # # ][ # # ]: 0 : RES_UL_SPACE, RES_UL_SPACE );
674 [ # # ][ # # ]: 0 : rInfo.pItemSet->Put( aULSpaceItem );
675 : : }
676 : 0 : rHWrt.bOutHeader = sal_False;
677 : 0 : rHWrt.bOutFooter = sal_False;
678 : : }
679 : :
680 [ - + ]: 2 : if( bOutNewLine )
681 : : {
682 : : // nur einen Zeilen-Umbruch (ohne Einrueckung) am Absatz-Anfang
683 : : // ausgeben
684 : 0 : rInfo.aToken = rtl::OString(); // kein End-Tag ausgeben
685 [ # # ][ # # ]: 0 : rWrt.Strm() << SwHTMLWriter::sNewLine;
686 : :
687 : 2 : return;
688 : : }
689 : :
690 : :
691 : : // soll ein ALIGN=... geschrieben werden?
692 : 2 : const SfxPoolItem* pAdjItem = 0;
693 : : const SfxPoolItem* pItem;
694 : :
695 [ + - ][ - + ]: 4 : if( rInfo.pItemSet &&
[ - + ]
696 : : SFX_ITEM_SET == rInfo.pItemSet->GetItemState( RES_PARATR_ADJUST,
697 [ + - ]: 2 : sal_False, &pItem ) )
698 : : {
699 : 0 : pAdjItem = pItem;
700 : : }
701 : :
702 : : // Unteren Absatz-Abstand beachten ? (nie im letzen Absatz von
703 : : // Tabellen)
704 : 2 : sal_Bool bUseParSpace = !rHWrt.bOutTable ||
705 : 0 : (rWrt.pCurPam->GetPoint()->nNode.GetIndex() !=
706 [ - + # # ]: 2 : rWrt.pCurPam->GetMark()->nNode.GetIndex());
707 : : // Wenn Styles exportiert werden, wird aus eingerueckten Absaetzen
708 : : // eine Definitions-Liste
709 : : const SvxLRSpaceItem& rLRSpace =
710 : 2 : pNodeItemSet ? ((const SvxLRSpaceItem &)pNodeItemSet->Get(RES_LR_SPACE))
711 [ + - ][ + - ]: 2 : : rFmt.GetLRSpace();
[ # # ]
712 [ + - ][ - + ]: 2 : if( (!rHWrt.bCfgOutStyles || bForceDL) && !rInfo.bInNumBulList )
[ # # ]
713 : : {
714 : : sal_Int32 nLeftMargin;
715 [ # # ]: 0 : if( bForceDL )
716 : 0 : nLeftMargin = rLRSpace.GetTxtLeft();
717 : : else
718 : 0 : nLeftMargin = rLRSpace.GetTxtLeft() > pFmtInfo->nLeftMargin
719 : 0 : ? rLRSpace.GetTxtLeft() - pFmtInfo->nLeftMargin
720 [ # # ]: 0 : : 0;
721 : :
722 [ # # ][ # # ]: 0 : if( nLeftMargin > 0 && rHWrt.nDefListMargin > 0 )
723 : : {
724 : : nNewDefListLvl = static_cast< sal_uInt16 >((nLeftMargin + (rHWrt.nDefListMargin/2)) /
725 : 0 : rHWrt.nDefListMargin);
726 [ # # ][ # # ]: 0 : if( nNewDefListLvl == 0 && bForceDL && !bDT )
[ # # ]
727 : 0 : nNewDefListLvl = 1;
728 : : }
729 : : else
730 : : {
731 : : // If the left margin is 0 or negative, emulating indent
732 : : // with <dd> does not work. We then set a def list only if
733 : : // the dd style is used.
734 [ # # ][ # # ]: 0 : nNewDefListLvl = (bForceDL&& !bDT) ? 1 : 0;
735 : : }
736 : :
737 : : sal_Bool bIsNextTxtNode =
738 [ # # ]: 0 : rWrt.pDoc->GetNodes()[rWrt.pCurPam->GetPoint()->nNode.GetIndex()+1]
739 [ # # ]: 0 : ->IsTxtNode();
740 : :
741 [ # # ][ # # ]: 0 : if( bForceDL && bDT )
742 : : {
743 : : // Statt eines DD muessen wir hier auch ein DT der Ebene
744 : : // darueber nehmen
745 : 0 : nNewDefListLvl++;
746 : : }
747 [ # # ][ # # ]: 0 : else if( !nNewDefListLvl && !rHWrt.bCfgOutStyles && bPara &&
[ # # # # ]
[ # # ][ # # ]
[ # # ]
[ # # # # ]
[ # # ]
748 : 0 : rULSpace.GetLower()==0 &&
749 : : ((bUseParSpace && bIsNextTxtNode) || rHWrt.nDefListLvl==1) &&
750 : : (!pAdjItem || SVX_ADJUST_LEFT==
751 : 0 : ((const SvxAdjustItem *)pAdjItem)->GetAdjust()) )
752 : : {
753 : : // Absaetze ohne unteren Abstand als DT exportieren
754 : 0 : nNewDefListLvl = 1;
755 : 0 : bDT = sal_True;
756 : 0 : rInfo.bParaPossible = sal_False;
757 : 0 : rHWrt.bNoAlign = sal_True;
758 : : }
759 : : }
760 : :
761 [ - + ]: 2 : if( nNewDefListLvl != rHWrt.nDefListLvl )
762 [ # # ]: 0 : rHWrt.OutAndSetDefList( nNewDefListLvl );
763 : :
764 : : // ggf. eine Aufzaehlung- oder Numerierungsliste beginnen
765 [ - + ]: 2 : if( rInfo.bInNumBulList )
766 : : {
767 : : OSL_ENSURE( !rHWrt.nDefListLvl, "DL in OL geht nicht!" );
768 [ # # ]: 0 : OutHTML_NumBulListStart( rHWrt, aNumInfo );
769 : :
770 [ # # ]: 0 : if( bNumbered )
771 : : {
772 [ # # ]: 0 : if( rHWrt.aBulletGrfs[nBulletGrfLvl].Len() )
773 : 0 : bNumbered = sal_False;
774 : : else
775 : 0 : nBulletGrfLvl = 255;
776 : : }
777 : : }
778 : :
779 : : // Die Defaults aus der Vorlage merken, denn sie muessen nicht
780 : : // exportiert werden
781 : 2 : rHWrt.nDfltLeftMargin = pFmtInfo->nLeftMargin;
782 : 2 : rHWrt.nDfltRightMargin = pFmtInfo->nRightMargin;
783 : 2 : rHWrt.nDfltFirstLineIndent = pFmtInfo->nFirstLineIndent;
784 : :
785 [ - + ]: 2 : if( rInfo.bInNumBulList )
786 : : {
787 [ # # ]: 0 : if( !rHWrt.IsHTMLMode( HTMLMODE_LSPACE_IN_NUMBUL ) )
788 : 0 : rHWrt.nDfltLeftMargin = rLRSpace.GetTxtLeft();
789 : :
790 : : // In Numerierungs-Listen keinen Ertzeilen-Einzug ausgeben.
791 : 0 : rHWrt.nFirstLineIndent = rLRSpace.GetTxtFirstLineOfst();
792 : : }
793 : :
794 [ - + ][ # # ]: 2 : if( rInfo.bInNumBulList && bNumbered && bPara && !rHWrt.bCfgOutStyles )
[ # # ][ # # ]
795 : : {
796 : : // ein einzelnes LI hat keinen Abstand
797 : 0 : rHWrt.nDfltTopMargin = 0;
798 : 0 : rHWrt.nDfltBottomMargin = 0;
799 : : }
800 [ - + ][ # # ]: 2 : else if( rHWrt.nDefListLvl && bPara )
801 : : {
802 : : // ein einzelnes DD hat auch keinen Abstand
803 : 0 : rHWrt.nDfltTopMargin = 0;
804 : 0 : rHWrt.nDfltBottomMargin = 0;
805 : : }
806 : : else
807 : : {
808 : 2 : rHWrt.nDfltTopMargin = pFmtInfo->nTopMargin;
809 : : // Wenn im letzten Absatz einer Tabelle der
810 : : // untere Absatz-Abstand veraendert wird, vertut sich
811 : : // Netscape total. Deshalb exportieren wir hier erstmal
812 : : // nichts, indem wir den Abstand aus dem Absatz als Default
813 : : // setzen.
814 [ + - ][ - + ]: 2 : if( rHWrt.bCfgNetscape4 && !bUseParSpace )
815 : 0 : rHWrt.nDfltBottomMargin = rULSpace.GetLower();
816 : : else
817 : 2 : rHWrt.nDfltBottomMargin = pFmtInfo->nBottomMargin;
818 : : }
819 : :
820 [ - + ]: 2 : if( rHWrt.nDefListLvl )
821 : : {
822 : : rHWrt.nLeftMargin =
823 : 0 : (rHWrt.nDefListLvl-1) * rHWrt.nDefListMargin;
824 : : }
825 : :
826 [ + - ]: 2 : if( rHWrt.bLFPossible )
827 [ + - ]: 2 : rHWrt.OutNewLine(); // Absatz-Tag in neue Zeile
828 : 2 : rInfo.bOutPara = sal_False;
829 : :
830 : : // das ist jetzt unser neues Token
831 [ + - ]: 2 : rHWrt.ChangeParaToken( nToken );
832 : :
833 [ + - ][ + - ]: 2 : sal_Bool bHasParSpace = bUseParSpace && rULSpace.GetLower() > 0;
834 : :
835 : : // ggf ein List-Item aufmachen
836 [ - + ][ # # ]: 2 : if( rInfo.bInNumBulList && bNumbered )
837 : : {
838 : 0 : rtl::OStringBuffer sOut;
839 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_li);
840 [ # # ]: 0 : if( USHRT_MAX != nNumStart )
841 : : {
842 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_value).
843 [ # # ][ # # ]: 0 : append('=').append(static_cast<sal_Int32>(nNumStart));
844 : : }
845 [ # # ]: 0 : sOut.append('>');
846 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.getStr();
847 : : }
848 : :
849 [ - + ][ # # ]: 2 : if( rHWrt.nDefListLvl > 0 && !bForceDL )
850 : : {
851 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), bDT ? OOO_STRING_SVTOOLS_HTML_dt : OOO_STRING_SVTOOLS_HTML_dd );
[ # # ]
852 : : }
853 : :
854 [ - + # # ]: 2 : if( pAdjItem &&
[ # # ][ - + ]
855 : 0 : rHWrt.IsHTMLMode( HTMLMODE_NO_CONTROL_CENTERING ) &&
856 [ # # ]: 0 : rHWrt.HasControls() )
857 : : {
858 : : // The align=... attribute does behave strange in netscape
859 : : // if there are controls in a paragraph, because the control and
860 : : // all text behind the control does not recognize this attribute.
861 : 0 : rtl::OStringBuffer sOut;
862 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_division);
863 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
864 : :
865 : 0 : rHWrt.bTxtAttr = sal_False;
866 : 0 : rHWrt.bOutOpts = sal_True;
867 [ # # ]: 0 : OutHTML_SvxAdjust( rWrt, *pAdjItem );
868 [ # # ][ # # ]: 0 : rWrt.Strm() << '>';
869 : 0 : pAdjItem = 0;
870 : 0 : rHWrt.bNoAlign = sal_False;
871 : 0 : rInfo.bOutDiv = sal_True;
872 : 0 : rHWrt.IncIndentLevel();
873 : 0 : rHWrt.bLFPossible = sal_True;
874 [ # # ]: 0 : rHWrt.OutNewLine();
875 : : }
876 : :
877 : : // fuer BLOCKQUOTE, ADDRESS und DD wird noch ein Absatz-Token
878 : : // ausgegeben, wenn,
879 : : // - keine Styles geschrieben werden, und
880 : : // - ein untere Abstand oder eine Absatz-Ausrichtung existiert
881 : 2 : rtl::OString aToken = rInfo.aToken;
882 [ # # ][ # # ]: 2 : if( !rHWrt.bCfgOutStyles && rInfo.bParaPossible && !bPara &&
[ # # ][ # # ]
[ - + ]
883 : : (bHasParSpace || pAdjItem) )
884 : : {
885 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), rInfo.aToken.getStr() );
886 : 0 : aToken = OOO_STRING_SVTOOLS_HTML_parabreak;
887 : 0 : bPara = sal_True;
888 : 0 : rHWrt.bNoAlign = sal_False;
889 : 0 : bNoStyle = sal_False;
890 : : }
891 : :
892 : : LanguageType eLang = rInfo.pItemSet
893 [ + - ][ + - ]: 2 : ? ((const SvxLanguageItem&)rInfo.pItemSet->Get(SwHTMLWriter::GetLangWhichIdFromScript(rHWrt.nCSS1Script))).GetLanguage()
894 [ + - ]: 4 : : rHWrt.eLang;
895 : :
896 [ + - ]: 2 : if( rInfo.pItemSet )
897 : : {
898 : : static sal_uInt16 aWhichIds[3] = { RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE };
899 : :
900 [ + + ]: 8 : for( sal_uInt16 i=0; i<3; i++ )
901 : : {
902 : : // export language if it differs from the default language only.
903 : : const SfxPoolItem *pTmpItem;
904 [ + + - + ]: 10 : if( SFX_ITEM_SET == rInfo.pItemSet->GetItemState( aWhichIds[i],
[ - + ]
905 [ + - ]: 6 : sal_True, &pTmpItem ) &&
906 : 4 : ((const SvxLanguageItem *)pTmpItem)->GetLanguage() == eLang )
907 [ # # ]: 0 : rInfo.pItemSet->ClearItem( aWhichIds[i] );
908 : : }
909 : : }
910 : :
911 : : // and the text direction
912 : : sal_uInt16 nDir = rHWrt.GetHTMLDirection(
913 : : (pNodeItemSet ? static_cast < const SvxFrameDirectionItem& >(
914 : 2 : pNodeItemSet->Get( RES_FRAMEDIR ) )
915 [ + - ][ + - ]: 2 : : rFmt.GetFrmDir() ).GetValue() );
[ # # ][ + - ]
916 : :
917 : : // Ein <P> wird nur geschrieben, wenn
918 : : // - wir in keiner OL/UL/DL sind, oder
919 : : // - der Absatz einer OL/UL nicht numeriert ist, oder
920 : : // - keine Styles exportiert werden und
921 : : // - ein unterer Abstand oder
922 : : // - eine Absatz-Ausrichtung existiert, ode
923 : : // - Styles exportiert werden und,
924 : : // - die Textkoerper-Vorlage geaendert wurde, oder
925 : : // - ein Benutzer-Format exportiert wird, oder
926 : : // - Absatz-Attribute existieren
927 [ + - ][ + - ]: 2 : if( !bPara ||
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
928 : 4 : (!rInfo.bInNumBulList && !rHWrt.nDefListLvl) ||
929 : : (rInfo.bInNumBulList && !bNumbered) ||
930 : 0 : (!rHWrt.bCfgOutStyles &&
931 : : (bHasParSpace || pAdjItem ||
932 : : (eLang != LANGUAGE_DONTKNOW && eLang != rHWrt.eLang))) ||
933 : : nDir != rHWrt.nDirection ||
934 : : rHWrt.bCfgOutStyles )
935 : : {
936 : : // jetzt werden Optionen ausgegeben
937 : 2 : rHWrt.bTxtAttr = sal_False;
938 : 2 : rHWrt.bOutOpts = sal_True;
939 : :
940 : 2 : rtl::OStringBuffer sOut;
941 [ + - ][ + - ]: 2 : sOut.append('<').append(aToken);
942 : :
943 [ + - ][ - + ]: 2 : if( eLang != LANGUAGE_DONTKNOW && eLang != rHWrt.eLang )
944 : : {
945 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
946 [ # # ]: 0 : rHWrt.OutLanguage( eLang );
947 : : }
948 : :
949 [ - + ]: 2 : if( nDir != rHWrt.nDirection )
950 : : {
951 [ # # ]: 0 : if( sOut.getLength() )
952 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
953 [ # # ]: 0 : rHWrt.OutDirection( nDir );
954 : : }
955 : :
956 [ + - + - ]: 4 : if( rHWrt.bCfgOutStyles &&
[ - + ][ - + ]
957 : 2 : (pFmtInfo->aClass.Len() || pFmtInfo->bScriptDependent) )
958 : : {
959 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_class)
960 [ # # ]: 0 : .append("=\"");
961 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
962 [ # # ]: 0 : String aClass( pFmtInfo->aClass );
963 [ # # ]: 0 : if( pFmtInfo->bScriptDependent )
964 : : {
965 [ # # ]: 0 : if( aClass.Len() )
966 [ # # ]: 0 : aClass += '-';
967 [ # # # # ]: 0 : switch( rHWrt.nCSS1Script )
968 : : {
969 : : case CSS1_OUTMODE_WESTERN:
970 [ # # ]: 0 : aClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("western") );
971 : 0 : break;
972 : : case CSS1_OUTMODE_CJK:
973 [ # # ]: 0 : aClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("cjk") );
974 : 0 : break;
975 : : case CSS1_OUTMODE_CTL:
976 [ # # ]: 0 : aClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("ctl") );
977 : 0 : break;
978 : : }
979 : : }
980 [ # # ]: 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aClass,
981 [ # # ]: 0 : rHWrt.eDestEnc, &rHWrt.aNonConvertableCharacters );
982 [ # # ][ # # ]: 0 : sOut.append('\"');
983 : : }
984 [ + - ][ + - ]: 2 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
985 : :
986 : : // ggf. Ausrichtung ausgeben.
987 [ - + ][ + - ]: 2 : if( !rHWrt.bNoAlign && pAdjItem )
988 [ # # ]: 0 : OutHTML_SvxAdjust( rWrt, *pAdjItem );
989 : :
990 : : // und nun ggf. noch die STYLE-Option
991 [ + - ][ + - ]: 2 : if( rHWrt.bCfgOutStyles && rInfo.pItemSet && !bNoStyle)
[ + - ]
992 : : {
993 [ + - ]: 2 : OutCSS1_ParaTagStyleOpt( rWrt, *rInfo.pItemSet );
994 : : }
995 : :
996 [ + - ][ + - ]: 2 : rWrt.Strm() << '>';
997 : :
998 : : // Soll ein </P> geschrieben wenrden
999 : : rInfo.bOutPara =
1000 : : bPara &&
1001 : : ( rHWrt.bCfgOutStyles ||
1002 [ + - ][ - + ]: 2 : (!rHWrt.bCfgOutStyles && bHasParSpace) );
[ # # ][ # # ]
1003 : :
1004 : : // wenn kein End-Tag geschrieben werden soll, es loeschen
1005 [ - + ]: 2 : if( bNoEndTag )
1006 : 2 : rInfo.aToken = rtl::OString();
1007 : : }
1008 : :
1009 [ - + ]: 2 : if( nBulletGrfLvl != 255 )
1010 : : {
1011 : : OSL_ENSURE( aNumInfo.GetNumRule(), "Wo ist die Numerierung geblieben???" );
1012 : : OSL_ENSURE( nBulletGrfLvl < MAXLEVEL, "So viele Ebenen gibt's nicht" );
1013 [ # # ]: 0 : const SwNumFmt& rNumFmt = aNumInfo.GetNumRule()->Get(nBulletGrfLvl);
1014 : :
1015 : : OutHTML_BulletImage( rWrt, OOO_STRING_SVTOOLS_HTML_image, 0,
1016 : 0 : rHWrt.aBulletGrfs[nBulletGrfLvl],
1017 [ # # ][ # # ]: 0 : rNumFmt.GetGraphicSize(), rNumFmt.GetGraphicOrientation() );
1018 : : }
1019 : :
1020 [ + - ]: 2 : rHWrt.GetNumInfo() = aNumInfo;
1021 : :
1022 : : // die Defaults zuruecksetzen
1023 : 2 : rHWrt.nDfltLeftMargin = 0;
1024 : 2 : rHWrt.nDfltRightMargin = 0;
1025 : 2 : rHWrt.nDfltFirstLineIndent = 0;
1026 : 2 : rHWrt.nDfltTopMargin = 0;
1027 : 2 : rHWrt.nDfltBottomMargin = 0;
1028 : 2 : rHWrt.nLeftMargin = 0;
1029 [ + - ][ + - ]: 2 : rHWrt.nFirstLineIndent = 0;
1030 : : }
1031 : :
1032 : 2 : void OutHTML_SwFmtOff( Writer& rWrt, const SwHTMLTxtCollOutputInfo& rInfo )
1033 : : {
1034 : 2 : SwHTMLWriter & rHWrt = (SwHTMLWriter&)rWrt;
1035 : :
1036 : : // wenn es kein Token gibt haben wir auch nichts auszugeben
1037 [ - + ]: 2 : if( rInfo.aToken.isEmpty() )
1038 : : {
1039 : 0 : rHWrt.FillNextNumInfo();
1040 : 0 : const SwHTMLNumRuleInfo& rNextInfo = *rHWrt.GetNextNumInfo();
1041 : : // Auch in PRE muss eine Bullet-Liste beendet werden
1042 [ # # ]: 0 : if( rInfo.bInNumBulList )
1043 : : {
1044 : :
1045 : 0 : const SwHTMLNumRuleInfo& rNRInfo = rHWrt.GetNumInfo();
1046 [ # # ][ # # : 0 : if( rNextInfo.GetNumRule() != rNRInfo.GetNumRule() ||
# # # # #
# ]
1047 : 0 : rNextInfo.GetDepth() != rNRInfo.GetDepth() ||
1048 : 0 : rNextInfo.IsNumbered() || rNextInfo.IsRestart() )
1049 : 0 : rHWrt.ChangeParaToken( 0 );
1050 : 0 : OutHTML_NumBulListEnd( rHWrt, rNextInfo );
1051 : : }
1052 [ # # ]: 0 : else if( rNextInfo.GetNumRule() != 0 )
1053 : 0 : rHWrt.ChangeParaToken( 0 );
1054 : :
1055 : 2 : return;
1056 : : }
1057 : :
1058 [ + - ]: 2 : if( rInfo.ShouldOutputToken() )
1059 : : {
1060 [ + - ]: 2 : if( rHWrt.bLFPossible )
1061 : 2 : rHWrt.OutNewLine( sal_True );
1062 : :
1063 : : // fuer BLOCKQUOTE, ADDRESS und DD wird ggf noch ein
1064 : : // Absatz-Token ausgegeben, wenn
1065 : : // - keine Styles geschrieben werden, und
1066 : : // - ein untere Abstand existiert
1067 [ - + ][ # # ]: 2 : if( rInfo.bParaPossible && rInfo.bOutPara )
1068 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_parabreak, sal_False );
1069 : :
1070 : 2 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), rInfo.aToken.getStr(),
1071 : 4 : sal_False );
1072 : : rHWrt.bLFPossible =
1073 : 2 : !rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_dt)) &&
1074 : 2 : !rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_dd)) &&
1075 [ + - ]: 4 : !rInfo.aToken.equalsL(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_li));
[ + - + - ]
1076 : : }
1077 [ - + ]: 2 : if( rInfo.bOutDiv )
1078 : : {
1079 : 0 : rHWrt.DecIndentLevel();
1080 [ # # ]: 0 : if( rHWrt.bLFPossible )
1081 : 0 : rHWrt.OutNewLine();
1082 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_division, sal_False );
1083 : 0 : rHWrt.bLFPossible = sal_True;
1084 : : }
1085 : :
1086 : : // ggf. eine Aufzaehlung- oder Numerierungsliste beenden
1087 [ - + ]: 2 : if( rInfo.bInNumBulList )
1088 : : {
1089 : 0 : rHWrt.FillNextNumInfo();
1090 : 0 : OutHTML_NumBulListEnd( rHWrt, *rHWrt.GetNextNumInfo() );
1091 : : }
1092 : : }
1093 : :
1094 : :
1095 : : class HTMLSttEndPos
1096 : : {
1097 : : xub_StrLen nStart;
1098 : : xub_StrLen nEnd;
1099 : : SfxPoolItem* pItem;
1100 : :
1101 : : public:
1102 : :
1103 : : HTMLSttEndPos( const SfxPoolItem& rItem, xub_StrLen nStt, xub_StrLen nE );
1104 : : ~HTMLSttEndPos();
1105 : :
1106 : 0 : const SfxPoolItem *GetItem() const { return pItem; }
1107 : :
1108 : : void SetStart( xub_StrLen nStt ) { nStart = nStt; }
1109 : 0 : xub_StrLen GetStart() const { return nStart; }
1110 : :
1111 : 0 : xub_StrLen GetEnd() const { return nEnd; }
1112 : 0 : void SetEnd( xub_StrLen nE ) { nEnd = nE; }
1113 : : };
1114 : :
1115 : 0 : HTMLSttEndPos::HTMLSttEndPos( const SfxPoolItem& rItem, xub_StrLen nStt,
1116 : : xub_StrLen nE ) :
1117 : : nStart( nStt ),
1118 : : nEnd( nE ),
1119 : 0 : pItem( rItem.Clone() )
1120 : 0 : {}
1121 : :
1122 : 0 : HTMLSttEndPos::~HTMLSttEndPos()
1123 : : {
1124 [ # # ]: 0 : delete pItem;
1125 : 0 : }
1126 : :
1127 : : typedef std::vector<HTMLSttEndPos *> _HTMLEndLst;
1128 : :
1129 : : enum HTMLOnOffState { HTML_NOT_SUPPORTED, // nicht unterst. Attribut
1130 : : HTML_REAL_VALUE, // Attribut mit Wert
1131 : : HTML_ON_VALUE, // Attribut entspricht On-Tag
1132 : : HTML_OFF_VALUE, // Attribut entspricht Off-Tag
1133 : : HTML_CHRFMT_VALUE, // Attribut fuer Zeichenvorlage
1134 : : HTML_COLOR_VALUE, // Attribut fuer Vordergrundfarbe
1135 : : HTML_STYLE_VALUE, // Attribut muss als Style exp.
1136 : : HTML_DROPCAP_VALUE, // DropCap-Attributs
1137 : : HTML_AUTOFMT_VALUE }; // Attribute for automatic character styles
1138 : :
1139 : :
1140 : : class HTMLEndPosLst
1141 : : {
1142 : : _HTMLEndLst aStartLst; // nach Anfangs-Psoitionen sortierte Liste
1143 : : _HTMLEndLst aEndLst; // nach End-Psotionen sortierte Liste
1144 : : std::deque<xub_StrLen> aScriptChgLst; // positions where script changes
1145 : : // 0 is not contained in this list,
1146 : : // but the text length
1147 : : // the script that is valif up to the position
1148 : : // contained in aScriptChgList at the same index
1149 : : ::std::vector<sal_uInt16> aScriptLst;
1150 : :
1151 : : SwDoc *pDoc; // das aktuelle Dokument
1152 : : SwDoc* pTemplate; // die HTML-Vorlage (oder 0)
1153 : : const Color* pDfltColor;// die Default-Vordergrund-Farbe
1154 : : std::set<String>& rScriptTxtStyles; //
1155 : :
1156 : : sal_uLong nHTMLMode;
1157 : : sal_Bool bOutStyles : 1; // werden Styles exportiert
1158 : :
1159 : :
1160 : : // die Position eines Items in der Start-/Ende-Liste suchen
1161 : : sal_uInt16 _FindStartPos( const HTMLSttEndPos *pPos ) const;
1162 : : sal_uInt16 _FindEndPos( const HTMLSttEndPos *pPos ) const;
1163 : :
1164 : : // Eine SttEndPos in die Start- und Ende-Listen eintragen bzw. aus
1165 : : // ihnen loeschen, wobei die Ende-Position bekannt ist
1166 : : void _InsertItem( HTMLSttEndPos *pPos, sal_uInt16 nEndPos );
1167 : : void _RemoveItem( sal_uInt16 nEndPos );
1168 : :
1169 : : // die "Art" es Attributs ermitteln
1170 : : HTMLOnOffState GetHTMLItemState( const SfxPoolItem& rItem );
1171 : :
1172 : : // Existiert ein bestimmtes On-Tag-Item
1173 : : sal_Bool ExistsOnTagItem( sal_uInt16 nWhich, xub_StrLen nPos );
1174 : :
1175 : : // Existiert ein Item zum ausschalten eines Attributs, das genauso
1176 : : // exportiert wird wie das uebergebene Item im gleichen Bereich?
1177 : : sal_Bool ExistsOffTagItem( sal_uInt16 nWhich, xub_StrLen nStartPos,
1178 : : xub_StrLen nEndPos );
1179 : :
1180 : :
1181 : : // das Ende eines gesplitteten Items anpassen
1182 : : void FixSplittedItem( HTMLSttEndPos *pPos, sal_uInt16 nStartPos,
1183 : : xub_StrLen nNewEnd );
1184 : :
1185 : : // Ein Attribut in die Listen eintragen und ggf. aufteilen
1186 : : void InsertItem( const SfxPoolItem& rItem, xub_StrLen nStart,
1187 : : xub_StrLen nEnd );
1188 : :
1189 : : // Ein bereits vorhandenes Attribut aufteilen
1190 : : void SplitItem( const SfxPoolItem& rItem, xub_StrLen nStart,
1191 : : xub_StrLen nEnd );
1192 : :
1193 : : // Insert without taking care of script
1194 : : void InsertNoScript( const SfxPoolItem& rItem, xub_StrLen nStart,
1195 : : xub_StrLen nEnd, SwHTMLFmtInfos& rFmtInfos,
1196 : : sal_Bool bParaAttrs=sal_False );
1197 : :
1198 : : const SwHTMLFmtInfo *GetFmtInfo( const SwFmt& rFmt,
1199 : : SwHTMLFmtInfos& rFmtInfos );
1200 : :
1201 : : public:
1202 : :
1203 : : HTMLEndPosLst( SwDoc *pDoc, SwDoc* pTemplate, const Color* pDfltColor,
1204 : : sal_Bool bOutStyles, sal_uLong nHTMLMode,
1205 : : const String& rText, std::set<String>& rStyles );
1206 : : ~HTMLEndPosLst();
1207 : :
1208 : : // Ein Attribut einfuegen
1209 : : void Insert( const SfxPoolItem& rItem, xub_StrLen nStart, xub_StrLen nEnd,
1210 : : SwHTMLFmtInfos& rFmtInfos, sal_Bool bParaAttrs=sal_False );
1211 : : void Insert( const SfxItemSet& rItemSet, xub_StrLen nStart, xub_StrLen nEnd,
1212 : : SwHTMLFmtInfos& rFmtInfos, sal_Bool bDeep,
1213 : : sal_Bool bParaAttrs=sal_False );
1214 : : void Insert( const SwDrawFrmFmt& rFmt, xub_StrLen nPos,
1215 : : SwHTMLFmtInfos& rFmtInfos );
1216 : :
1217 : : sal_uInt16 GetScriptAtPos( xub_StrLen nPos,
1218 : : sal_uInt16 nWeak=CSS1_OUTMODE_ANY_SCRIPT );
1219 : :
1220 : : void OutStartAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos,
1221 : : HTMLOutContext *pContext = 0 );
1222 : : void OutEndAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos,
1223 : : HTMLOutContext *pContext = 0 );
1224 : :
1225 : : sal_uInt16 Count() const { return aEndLst.size(); }
1226 : :
1227 : 0 : sal_Bool IsHTMLMode( sal_uLong nMode ) const { return (nHTMLMode & nMode) != 0; }
1228 : : };
1229 : :
1230 : :
1231 : 0 : sal_uInt16 HTMLEndPosLst::_FindStartPos( const HTMLSttEndPos *pPos ) const
1232 : : {
1233 : : sal_uInt16 i;
1234 [ # # ][ # # ]: 0 : for( i = 0; i < aStartLst.size() && aStartLst[i] != pPos; i++ )
[ # # ]
1235 : : ;
1236 : :
1237 : : OSL_ENSURE(i != aStartLst.size(), "Item not found in Start List!" );
1238 : :
1239 [ # # ]: 0 : return i==aStartLst.size() ? USHRT_MAX : i;
1240 : : }
1241 : :
1242 : 0 : sal_uInt16 HTMLEndPosLst::_FindEndPos( const HTMLSttEndPos *pPos ) const
1243 : : {
1244 : : sal_uInt16 i;
1245 : :
1246 [ # # ][ # # ]: 0 : for( i = 0; i < aEndLst.size() && aEndLst[i] != pPos; i++ )
[ # # ]
1247 : : ;
1248 : :
1249 : : OSL_ENSURE(i != aEndLst.size(), "Item not found in End List!" );
1250 : :
1251 [ # # ]: 0 : return i==aEndLst.size() ? USHRT_MAX : i;
1252 : : }
1253 : :
1254 : :
1255 : 0 : void HTMLEndPosLst::_InsertItem( HTMLSttEndPos *pPos, sal_uInt16 nEndPos )
1256 : : {
1257 : : // In der Start-Liste das Attribut hinter allen vorher und an
1258 : : // der gleichen Position gestarteten Attributen einfuegen
1259 : 0 : xub_StrLen nStart = pPos->GetStart();
1260 : : sal_uInt16 i;
1261 : :
1262 [ # # # # ]: 0 : for( i = 0; i < aStartLst.size() &&
[ # # ]
1263 : 0 : aStartLst[i]->GetStart() <= nStart; i++ )
1264 : : ;
1265 [ # # ][ # # ]: 0 : aStartLst.insert( aStartLst.begin() + i, pPos );
1266 : :
1267 : : // die Position in der Ende-Liste wurde uebergeben
1268 [ # # ][ # # ]: 0 : aEndLst.insert( aEndLst.begin() + nEndPos, pPos );
1269 : 0 : }
1270 : :
1271 : 0 : void HTMLEndPosLst::_RemoveItem( sal_uInt16 nEndPos )
1272 : : {
1273 : 0 : HTMLSttEndPos *pPos = aEndLst[nEndPos];
1274 : :
1275 : : // jetzt Suchen wir es in der Start-Liste
1276 : 0 : sal_uInt16 nStartPos = _FindStartPos( pPos );
1277 [ # # ]: 0 : if( nStartPos != USHRT_MAX )
1278 [ # # ][ # # ]: 0 : aStartLst.erase( aStartLst.begin() + nStartPos );
1279 : :
1280 [ # # ][ # # ]: 0 : aEndLst.erase( aEndLst.begin() + nEndPos );
1281 : :
1282 [ # # ]: 0 : delete pPos;
1283 : 0 : }
1284 : :
1285 : 0 : HTMLOnOffState HTMLEndPosLst::GetHTMLItemState( const SfxPoolItem& rItem )
1286 : : {
1287 : 0 : HTMLOnOffState eState = HTML_NOT_SUPPORTED;
1288 [ # # # # : 0 : switch( rItem.Which() )
# # # # #
# # # # #
# # ]
1289 : : {
1290 : : case RES_CHRATR_POSTURE:
1291 : : case RES_CHRATR_CJK_POSTURE:
1292 : : case RES_CHRATR_CTL_POSTURE:
1293 [ # # # ]: 0 : switch( ((const SvxPostureItem&)rItem).GetPosture() )
1294 : : {
1295 : : case ITALIC_NORMAL:
1296 : 0 : eState = HTML_ON_VALUE;
1297 : 0 : break;
1298 : : case ITALIC_NONE:
1299 : 0 : eState = HTML_OFF_VALUE;
1300 : 0 : break;
1301 : : default:
1302 [ # # ]: 0 : if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
1303 : 0 : eState = HTML_STYLE_VALUE;
1304 : 0 : break;
1305 : : }
1306 : 0 : break;
1307 : :
1308 : : case RES_CHRATR_CROSSEDOUT:
1309 [ # # # ]: 0 : switch( ((const SvxCrossedOutItem&)rItem).GetStrikeout() )
1310 : : {
1311 : : case STRIKEOUT_SINGLE:
1312 : : case STRIKEOUT_DOUBLE:
1313 : 0 : eState = HTML_ON_VALUE;
1314 : 0 : break;
1315 : : case STRIKEOUT_NONE:
1316 : 0 : eState = HTML_OFF_VALUE;
1317 : 0 : break;
1318 : : default:
1319 : : ;
1320 : : }
1321 : 0 : break;
1322 : :
1323 : : case RES_CHRATR_ESCAPEMENT:
1324 [ # # # ]: 0 : switch( (const SvxEscapement)
1325 : 0 : ((const SvxEscapementItem&)rItem).GetEnumValue() )
1326 : : {
1327 : : case SVX_ESCAPEMENT_SUPERSCRIPT:
1328 : : case SVX_ESCAPEMENT_SUBSCRIPT:
1329 : 0 : eState = HTML_ON_VALUE;
1330 : 0 : break;
1331 : : case SVX_ESCAPEMENT_OFF:
1332 : 0 : eState = HTML_OFF_VALUE;
1333 : 0 : break;
1334 : : default:
1335 : : ;
1336 : : }
1337 : 0 : break;
1338 : :
1339 : : case RES_CHRATR_UNDERLINE:
1340 [ # # # ]: 0 : switch( ((const SvxUnderlineItem&)rItem).GetLineStyle() )
1341 : : {
1342 : : case UNDERLINE_SINGLE:
1343 : 0 : eState = HTML_ON_VALUE;
1344 : 0 : break;
1345 : : case UNDERLINE_NONE:
1346 : 0 : eState = HTML_OFF_VALUE;
1347 : 0 : break;
1348 : : default:
1349 [ # # ]: 0 : if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
1350 : 0 : eState = HTML_STYLE_VALUE;
1351 : 0 : break;
1352 : : }
1353 : 0 : break;
1354 : :
1355 : : case RES_CHRATR_OVERLINE:
1356 [ # # ]: 0 : if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
1357 : 0 : eState = HTML_STYLE_VALUE;
1358 : 0 : break;
1359 : :
1360 : : case RES_CHRATR_WEIGHT:
1361 : : case RES_CHRATR_CJK_WEIGHT:
1362 : : case RES_CHRATR_CTL_WEIGHT:
1363 [ # # # ]: 0 : switch( ((const SvxWeightItem&)rItem).GetWeight() )
1364 : : {
1365 : : case WEIGHT_BOLD:
1366 : 0 : eState = HTML_ON_VALUE;
1367 : 0 : break;
1368 : : case WEIGHT_NORMAL:
1369 : 0 : eState = HTML_OFF_VALUE;
1370 : 0 : break;
1371 : : default:
1372 [ # # ]: 0 : if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
1373 : 0 : eState = HTML_STYLE_VALUE;
1374 : 0 : break;
1375 : : }
1376 : 0 : break;
1377 : :
1378 : : case RES_CHRATR_BLINK:
1379 : 0 : eState = ((const SvxBlinkItem&)rItem).GetValue() ? HTML_ON_VALUE
1380 [ # # ]: 0 : : HTML_OFF_VALUE;
1381 : 0 : break;
1382 : :
1383 : : case RES_CHRATR_COLOR:
1384 : 0 : eState = HTML_COLOR_VALUE;
1385 : 0 : break;
1386 : :
1387 : : case RES_CHRATR_FONT:
1388 : : case RES_CHRATR_FONTSIZE:
1389 : : case RES_CHRATR_LANGUAGE:
1390 : : case RES_CHRATR_CJK_FONT:
1391 : : case RES_CHRATR_CJK_FONTSIZE:
1392 : : case RES_CHRATR_CJK_LANGUAGE:
1393 : : case RES_CHRATR_CTL_FONT:
1394 : : case RES_CHRATR_CTL_FONTSIZE:
1395 : : case RES_CHRATR_CTL_LANGUAGE:
1396 : : case RES_TXTATR_INETFMT:
1397 : 0 : eState = HTML_REAL_VALUE;
1398 : 0 : break;
1399 : :
1400 : : case RES_TXTATR_CHARFMT:
1401 : 0 : eState = HTML_CHRFMT_VALUE;
1402 : 0 : break;
1403 : :
1404 : : case RES_TXTATR_AUTOFMT:
1405 : 0 : eState = HTML_AUTOFMT_VALUE;
1406 : 0 : break;
1407 : :
1408 : : case RES_CHRATR_CASEMAP:
1409 : 0 : eState = HTML_STYLE_VALUE;
1410 : 0 : break;
1411 : :
1412 : : case RES_CHRATR_KERNING:
1413 [ # # ]: 0 : if( IsHTMLMode(HTMLMODE_FULL_STYLES) )
1414 : 0 : eState = HTML_STYLE_VALUE;
1415 : 0 : break;
1416 : :
1417 : : case RES_CHRATR_BACKGROUND:
1418 [ # # ]: 0 : if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
1419 : 0 : eState = HTML_STYLE_VALUE;
1420 : 0 : break;
1421 : :
1422 : : case RES_PARATR_DROP:
1423 : 0 : eState = HTML_DROPCAP_VALUE;
1424 : 0 : break;
1425 : : }
1426 : :
1427 : 0 : return eState;
1428 : : }
1429 : :
1430 : 0 : sal_Bool HTMLEndPosLst::ExistsOnTagItem( sal_uInt16 nWhich, xub_StrLen nPos )
1431 : : {
1432 [ # # ]: 0 : for( sal_uInt16 i=0; i<aStartLst.size(); i++ )
1433 : : {
1434 : 0 : HTMLSttEndPos *pTest = aStartLst[i];
1435 : :
1436 [ # # ]: 0 : if( pTest->GetStart() > nPos )
1437 : : {
1438 : : // dieses uns alle folgenden Attribute beginnen spaeter
1439 : 0 : break;
1440 : : }
1441 [ # # ]: 0 : else if( pTest->GetEnd() > nPos )
1442 : : {
1443 : : // das Attribut beginnt vor oder an der aktuellen Position
1444 : : // und endet hinter ihr
1445 : 0 : const SfxPoolItem *pItem = pTest->GetItem();
1446 [ # # ]: 0 : if( pItem->Which() == nWhich &&
[ # # # # ]
1447 : 0 : HTML_ON_VALUE == GetHTMLItemState(*pItem) )
1448 : : {
1449 : : // ein On-Tag-Attibut wurde gefunden
1450 : 0 : return sal_True;
1451 : : }
1452 : : }
1453 : : }
1454 : :
1455 : 0 : return sal_False;
1456 : : }
1457 : :
1458 : 0 : sal_Bool HTMLEndPosLst::ExistsOffTagItem( sal_uInt16 nWhich, xub_StrLen nStartPos,
1459 : : xub_StrLen nEndPos )
1460 : : {
1461 [ # # ][ # # ]: 0 : if( nWhich != RES_CHRATR_CROSSEDOUT &&
[ # # ]
1462 : : nWhich != RES_CHRATR_UNDERLINE &&
1463 : : nWhich != RES_CHRATR_BLINK )
1464 : : {
1465 : 0 : return sal_False;
1466 : : }
1467 : :
1468 [ # # ]: 0 : for( sal_uInt16 i=0; i<aStartLst.size(); i++ )
1469 : : {
1470 : 0 : HTMLSttEndPos *pTest = aStartLst[i];
1471 : :
1472 [ # # ]: 0 : if( pTest->GetStart() > nStartPos )
1473 : : {
1474 : : // dieses uns alle folgenden Attribute beginnen spaeter
1475 : 0 : break;
1476 : : }
1477 [ # # # # ]: 0 : else if( pTest->GetStart()==nStartPos &&
[ # # ]
1478 : 0 : pTest->GetEnd()==nEndPos )
1479 : : {
1480 : : // das Attribut beginnt vor oder an der aktuellen Position
1481 : : // und endet hinter ihr
1482 : 0 : const SfxPoolItem *pItem = pTest->GetItem();
1483 : 0 : sal_uInt16 nTstWhich = pItem->Which() ;
1484 [ # # ]: 0 : if( (nTstWhich == RES_CHRATR_CROSSEDOUT ||
[ # # # # ]
[ # # ][ # # ]
1485 : : nTstWhich == RES_CHRATR_UNDERLINE ||
1486 : : nTstWhich == RES_CHRATR_BLINK) &&
1487 : 0 : HTML_OFF_VALUE == GetHTMLItemState(*pItem) )
1488 : : {
1489 : : // Ein Off-Tag-Attibut wurde gefunden, das genauso
1490 : : // exportiert wird, wie das aktuelle Item
1491 : 0 : return sal_True;
1492 : : }
1493 : : }
1494 : : }
1495 : :
1496 : 0 : return sal_False;
1497 : : }
1498 : :
1499 : 0 : void HTMLEndPosLst::FixSplittedItem( HTMLSttEndPos *pPos, xub_StrLen nNewEnd,
1500 : : sal_uInt16 nStartPos )
1501 : : {
1502 : : // die End-Position entsprechend fixen
1503 : 0 : pPos->SetEnd( nNewEnd );
1504 : :
1505 : : // das Item aus der End-Liste entfernen
1506 : 0 : sal_uInt16 nEndPos = _FindEndPos( pPos );
1507 [ # # ]: 0 : if( nEndPos != USHRT_MAX )
1508 [ # # ][ # # ]: 0 : aEndLst.erase( aEndLst.begin() + nEndPos );
1509 : :
1510 : : // es wird von nun an als letztes an der entsprechenden Position
1511 : : // beendet
1512 [ # # # # ]: 0 : for( nEndPos=0; nEndPos < aEndLst.size() &&
[ # # ]
1513 : 0 : aEndLst[nEndPos]->GetEnd() <= nNewEnd; nEndPos++ )
1514 : : ;
1515 [ # # ][ # # ]: 0 : aEndLst.insert( aEndLst.begin() + nEndPos, pPos );
1516 : :
1517 : : // jetzt noch die spaeter gestarteten Attribute anpassen
1518 [ # # ]: 0 : for( sal_uInt16 i=nStartPos+1; i<aStartLst.size(); i++ )
1519 : : {
1520 : 0 : HTMLSttEndPos *pTest = aStartLst[i];
1521 : 0 : xub_StrLen nTestEnd = pTest->GetEnd();
1522 [ # # ]: 0 : if( pTest->GetStart() >= nNewEnd )
1523 : : {
1524 : : // das Test-Attribut und alle folgenden beginnen, nachdem das
1525 : : // gesplittete Attribut endet
1526 : : break;
1527 : : }
1528 [ # # ]: 0 : else if( nTestEnd > nNewEnd )
1529 : : {
1530 : : // das Test-Attribut beginnt, bevor das gesplittete Attribut
1531 : : // endet und endet danach, muss also auch gesplittet werden
1532 : :
1533 : : // das neue Ende setzen
1534 : 0 : pTest->SetEnd( nNewEnd );
1535 : :
1536 : : // das Attribut aus der End-Liste entfernen
1537 [ # # ]: 0 : sal_uInt16 nEPos = _FindEndPos( pTest );
1538 [ # # ]: 0 : if( nEPos != USHRT_MAX )
1539 [ # # ][ # # ]: 0 : aEndLst.erase( aEndLst.begin() + nEPos );
1540 : :
1541 : : // es endet jetzt als erstes Attribut an der entsprechenden
1542 : : // Position. Diese Position in der Ende-Liste kennen wir schon.
1543 [ # # ][ # # ]: 0 : aEndLst.insert( aEndLst.begin() + nEndPos, pTest );
1544 : :
1545 : : // den "Rest" des Attributs neu einfuegen
1546 [ # # ]: 0 : InsertItem( *pTest->GetItem(), nNewEnd, nTestEnd );
1547 : : }
1548 : : }
1549 : 0 : }
1550 : :
1551 : :
1552 : 0 : void HTMLEndPosLst::InsertItem( const SfxPoolItem& rItem, xub_StrLen nStart,
1553 : : xub_StrLen nEnd )
1554 : : {
1555 : : sal_uInt16 i;
1556 [ # # ]: 0 : for( i = 0; i < aEndLst.size(); i++ )
1557 : : {
1558 : 0 : HTMLSttEndPos *pTest = aEndLst[i];
1559 : 0 : xub_StrLen nTestEnd = pTest->GetEnd();
1560 [ # # ]: 0 : if( nTestEnd <= nStart )
1561 : : {
1562 : : // das Test-Attribut endet, bevor das neue beginnt
1563 : 0 : continue;
1564 : : }
1565 [ # # ]: 0 : else if( nTestEnd < nEnd )
1566 : : {
1567 : : // das Test-Attribut endet, bevor das neue endet. Das
1568 : : // neue Attribut muss deshalb aufgesplittet werden
1569 [ # # ]: 0 : _InsertItem( new HTMLSttEndPos( rItem, nStart, nTestEnd ), i );
1570 : 0 : nStart = nTestEnd;
1571 : : }
1572 : : else
1573 : : {
1574 : : // das Test-Attribut (und alle folgenden) endet, bevor das neue
1575 : : // endet
1576 : 0 : break;
1577 : : }
1578 : : }
1579 : :
1580 : : // ein Attribut muss noch eingefuegt werden
1581 [ # # ]: 0 : _InsertItem( new HTMLSttEndPos( rItem, nStart, nEnd ), i );
1582 : 0 : }
1583 : :
1584 : :
1585 : :
1586 : 0 : void HTMLEndPosLst::SplitItem( const SfxPoolItem& rItem, xub_StrLen nStart,
1587 : : xub_StrLen nEnd )
1588 : : {
1589 : 0 : sal_uInt16 nWhich = rItem.Which();
1590 : :
1591 : : // erstmal muessen wir die alten Items anhand der Startliste suchen
1592 : : // und die neuen Item-Bereiche festlegen
1593 : :
1594 [ # # ]: 0 : for( sal_uInt16 i=0; i<aStartLst.size(); i++ )
1595 : : {
1596 : 0 : HTMLSttEndPos *pTest = aStartLst[i];
1597 : 0 : xub_StrLen nTestStart = pTest->GetStart();
1598 : 0 : xub_StrLen nTestEnd = pTest->GetEnd();
1599 : :
1600 [ # # ]: 0 : if( nTestStart >= nEnd )
1601 : : {
1602 : : // dieses und alle nachfolgenden Attribute beginnen spaeter
1603 : 0 : break;
1604 : : }
1605 [ # # ]: 0 : else if( nTestEnd > nStart )
1606 : : {
1607 : : // das Test Attribut endet im zu loeschenenden Bereich
1608 : 0 : const SfxPoolItem *pItem = pTest->GetItem();
1609 : :
1610 : : // nur entsprechende On-Tag Attribute muessen beruecksichtigt
1611 : : // werden
1612 [ # # ]: 0 : if( pItem->Which() == nWhich &&
[ # # # # ]
1613 : 0 : HTML_ON_VALUE == GetHTMLItemState( *pItem ) )
1614 : : {
1615 : 0 : sal_Bool bDelete = sal_True;
1616 : :
1617 [ # # ]: 0 : if( nTestStart < nStart )
1618 : : {
1619 : : // der Start des neuen Attribut entspricht
1620 : : // dem neuen Ende des Attribts
1621 : 0 : FixSplittedItem( pTest, nStart, i );
1622 : 0 : bDelete = sal_False;
1623 : : }
1624 : : else
1625 : : {
1626 : : // das Test-Item beginnt erst hinter dem neuen
1627 : : // Ende des Attribts und kann deshalb komplett
1628 : : // geloescht werden
1629 [ # # ][ # # ]: 0 : aStartLst.erase( aStartLst.begin() + i );
1630 : 0 : i--;
1631 : :
1632 : 0 : sal_uInt16 nEndPos = _FindEndPos( pTest );
1633 [ # # ]: 0 : if( nEndPos != USHRT_MAX )
1634 [ # # ][ # # ]: 0 : aEndLst.erase( aEndLst.begin() + nEndPos );
1635 : : }
1636 : :
1637 : : // ggf den zweiten Teil des gesplitteten Attribts einfuegen
1638 [ # # ]: 0 : if( nTestEnd > nEnd )
1639 : : {
1640 : 0 : InsertItem( *pTest->GetItem(), nEnd, nTestEnd );
1641 : : }
1642 : :
1643 [ # # ]: 0 : if( bDelete )
1644 [ # # ]: 0 : delete pTest;
1645 : : }
1646 : : }
1647 : : }
1648 : 0 : }
1649 : :
1650 : 0 : const SwHTMLFmtInfo *HTMLEndPosLst::GetFmtInfo( const SwFmt& rFmt,
1651 : : SwHTMLFmtInfos& rFmtInfos )
1652 : : {
1653 : : SwHTMLFmtInfo *pFmtInfo;
1654 [ # # ]: 0 : const SwHTMLFmtInfo aFmtInfo( &rFmt );
1655 [ # # ]: 0 : SwHTMLFmtInfos::iterator it = rFmtInfos.find( aFmtInfo );
1656 [ # # ][ # # ]: 0 : if( it != rFmtInfos.end() )
[ # # ]
1657 : : {
1658 [ # # ]: 0 : pFmtInfo = &*it;
1659 : : }
1660 : : else
1661 : : {
1662 : : pFmtInfo = new SwHTMLFmtInfo( &rFmt, pDoc, pTemplate,
1663 [ # # ][ # # ]: 0 : bOutStyles );
1664 [ # # ]: 0 : rFmtInfos.insert( pFmtInfo );
1665 [ # # ]: 0 : String aName( rFmt.GetName() );
1666 [ # # ][ # # ]: 0 : if( 0 != rScriptTxtStyles.count( aName ) )
1667 [ # # ]: 0 : ((SwHTMLFmtInfo *)pFmtInfo)->bScriptDependent = sal_True;
1668 : : }
1669 : :
1670 [ # # ]: 0 : return pFmtInfo;
1671 : : }
1672 : :
1673 : 2 : HTMLEndPosLst::HTMLEndPosLst( SwDoc *pD, SwDoc* pTempl,
1674 : : const Color* pDfltCol, sal_Bool bStyles,
1675 : : sal_uLong nMode, const String& rText,
1676 : : std::set<String>& rStyles ):
1677 : : pDoc( pD ),
1678 : : pTemplate( pTempl ),
1679 : : pDfltColor( pDfltCol ),
1680 : : rScriptTxtStyles( rStyles ),
1681 : : nHTMLMode( nMode ),
1682 [ + - ][ + - ]: 2 : bOutStyles( bStyles )
[ + - ]
1683 : : {
1684 : 2 : xub_StrLen nEndPos = rText.Len();
1685 : 2 : xub_StrLen nPos = 0;
1686 [ - + ]: 2 : while( nPos < nEndPos )
1687 : : {
1688 [ # # ][ # # ]: 0 : sal_uInt16 nScript = pBreakIt->GetBreakIter()->getScriptType( rText, nPos );
[ # # ][ # # ]
1689 [ # # ][ # # ]: 0 : nPos = (xub_StrLen)pBreakIt->GetBreakIter()->endOfScript( rText, nPos, nScript );
[ # # ][ # # ]
1690 [ # # ]: 0 : aScriptChgLst.push_back( nPos );
1691 [ # # ]: 0 : aScriptLst.push_back( nScript );
1692 : : }
1693 : 2 : }
1694 : :
1695 : 2 : HTMLEndPosLst::~HTMLEndPosLst()
1696 : : {
1697 : : OSL_ENSURE(aStartLst.empty(), "Start List not empty in destructor");
1698 : : OSL_ENSURE(aEndLst.empty(), "End List not empty in destructor");
1699 : 2 : }
1700 : :
1701 : :
1702 : :
1703 : 6 : void HTMLEndPosLst::InsertNoScript( const SfxPoolItem& rItem,
1704 : : xub_StrLen nStart, xub_StrLen nEnd,
1705 : : SwHTMLFmtInfos& rFmtInfos, sal_Bool bParaAttrs )
1706 : : {
1707 : : // kein Bereich ?? dann nicht aufnehmen, wird nie wirksam !!
1708 [ - + ]: 6 : if( nStart != nEnd )
1709 : : {
1710 : 0 : sal_Bool bSet = sal_False, bSplit = sal_False;
1711 [ # # # # : 0 : switch( GetHTMLItemState(rItem) )
# # # #
# ]
1712 : : {
1713 : : case HTML_ON_VALUE:
1714 : : // das Attribut wird ausgegeben, wenn es nicht sowieso
1715 : : // schon an ist
1716 [ # # ]: 0 : if( !ExistsOnTagItem( rItem.Which(), nStart ) )
1717 : 0 : bSet = sal_True;
1718 : 0 : break;
1719 : :
1720 : : case HTML_OFF_VALUE:
1721 : : // wenn das entsprechne Attribut an ist, wird es gesplittet,
1722 : : // Zusaetlich wird es aber als Style ausgegeben, wenn es nicht
1723 : : // am ganzen Absatz gesetzt ist, weil es dann ja schon mit dem
1724 : : // ABsatz-Tag ausgegeben wurde.
1725 [ # # ]: 0 : if( ExistsOnTagItem( rItem.Which(), nStart ) )
1726 : 0 : bSplit = sal_True;
1727 : : bSet = bOutStyles && !bParaAttrs &&
1728 [ # # ][ # # ]: 0 : !ExistsOffTagItem( rItem.Which(), nStart, nEnd );
[ # # ]
1729 : 0 : break;
1730 : :
1731 : : case HTML_REAL_VALUE:
1732 : : // das Attribut kann immer ausgegeben werden
1733 : 0 : bSet = sal_True;
1734 : 0 : break;
1735 : :
1736 : : case HTML_STYLE_VALUE:
1737 : : // Das Attribut kann nur als CSS1 ausgegeben werden. Wenn
1738 : : // es am Absatz gesetzt ist, wurde es schon mit dem
1739 : : // Absatz-Tag ausgegeben. Einzige Ausnahme ist das
1740 : : // Zeichen-Hintergrund-Attribut. Es muss immer wie ein
1741 : : // Hint behandelt werden.
1742 : : bSet = bOutStyles &&
1743 : : (!bParaAttrs
1744 : 0 : || rItem.Which()==RES_CHRATR_BACKGROUND
1745 [ # # ]: 0 : || rItem.Which()==RES_CHRATR_OVERLINE);
[ # # # # ]
[ # # ]
1746 : 0 : break;
1747 : :
1748 : : case HTML_CHRFMT_VALUE:
1749 : : {
1750 : : OSL_ENSURE( RES_TXTATR_CHARFMT == rItem.Which(),
1751 : : "Doch keine Zeichen-Vorlage" );
1752 : 0 : const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rItem;
1753 : 0 : const SwCharFmt* pFmt = rChrFmt.GetCharFmt();
1754 : :
1755 : 0 : const SwHTMLFmtInfo *pFmtInfo = GetFmtInfo( *pFmt, rFmtInfos );
1756 [ # # ]: 0 : if( !pFmtInfo->aToken.isEmpty() )
1757 : : {
1758 : : // das Zeichenvorlagen-Tag muss vor den harten
1759 : : // Attributen ausgegeben werden
1760 : 0 : InsertItem( rItem, nStart, nEnd );
1761 : : }
1762 [ # # ]: 0 : if( pFmtInfo->pItemSet )
1763 : : {
1764 : : Insert( *pFmtInfo->pItemSet, nStart, nEnd,
1765 : 0 : rFmtInfos, sal_True, bParaAttrs );
1766 : : }
1767 : : }
1768 : 0 : break;
1769 : :
1770 : : case HTML_AUTOFMT_VALUE:
1771 : : {
1772 : 0 : const SwFmtAutoFmt& rAutoFmt = (const SwFmtAutoFmt&)rItem;
1773 [ # # ]: 0 : const boost::shared_ptr<SfxItemSet> pSet = rAutoFmt.GetStyleHandle();
1774 [ # # ]: 0 : if( pSet.get() )
1775 [ # # ][ # # ]: 0 : Insert( *pSet.get(), nStart, nEnd, rFmtInfos, sal_True, bParaAttrs );
1776 : : }
1777 : 0 : break;
1778 : :
1779 : : case HTML_COLOR_VALUE:
1780 : : // Eine Vordergrund-Farbe als Absatz-Attribut wird nur
1781 : : // exportiert, wenn sie nicht der Default-Farbe entspricht.
1782 : : {
1783 : : OSL_ENSURE( RES_CHRATR_COLOR == rItem.Which(),
1784 : : "Doch keine Vordergrund-Farbe" );
1785 : 0 : Color aColor( ((const SvxColorItem&)rItem).GetValue() );
1786 [ # # ]: 0 : if( COL_AUTO == aColor.GetColor() )
1787 : 0 : aColor.SetColor( COL_BLACK );
1788 : 0 : bSet = !bParaAttrs || !pDfltColor ||
1789 [ # # ][ # # ]: 0 : !pDfltColor->IsRGBEqual( aColor );
[ # # ][ # # ]
1790 : : }
1791 : 0 : break;
1792 : :
1793 : : case HTML_DROPCAP_VALUE:
1794 : : {
1795 : : OSL_ENSURE( RES_PARATR_DROP == rItem.Which(),
1796 : : "Doch kein Drop-Cap" );
1797 : 0 : const SwFmtDrop& rDrop = (const SwFmtDrop&)rItem;
1798 : 0 : nEnd = nStart + rDrop.GetChars();
1799 [ # # ]: 0 : if( !bOutStyles )
1800 : : {
1801 : : // Zumindest die Attribute der Zeichenvorlage uebernehmen
1802 : 0 : const SwCharFmt *pCharFmt = rDrop.GetCharFmt();
1803 [ # # ]: 0 : if( pCharFmt )
1804 : : {
1805 : 0 : Insert( pCharFmt->GetAttrSet(), nStart, nEnd,
1806 : 0 : rFmtInfos, sal_True, bParaAttrs );
1807 : : }
1808 : : }
1809 : : else
1810 : : {
1811 : 0 : bSet = sal_True;
1812 : : }
1813 : : }
1814 : 0 : break;
1815 : : default:
1816 : : ;
1817 : : }
1818 : :
1819 [ # # ]: 0 : if( bSet )
1820 : 0 : InsertItem( rItem, nStart, nEnd );
1821 [ # # ]: 0 : if( bSplit )
1822 : 0 : SplitItem( rItem, nStart, nEnd );
1823 : : }
1824 : 6 : }
1825 : :
1826 : 16 : void HTMLEndPosLst::Insert( const SfxPoolItem& rItem,
1827 : : xub_StrLen nStart, xub_StrLen nEnd,
1828 : : SwHTMLFmtInfos& rFmtInfos, sal_Bool bParaAttrs )
1829 : : {
1830 : 16 : sal_Bool bDependsOnScript = sal_False, bDependsOnAnyScript = sal_False;
1831 : 16 : sal_uInt16 nScript = i18n::ScriptType::LATIN;
1832 [ - + + - : 16 : switch( rItem.Which() )
- + ]
1833 : : {
1834 : : case RES_CHRATR_FONT:
1835 : : case RES_CHRATR_FONTSIZE:
1836 : : case RES_CHRATR_LANGUAGE:
1837 : : case RES_CHRATR_POSTURE:
1838 : : case RES_CHRATR_WEIGHT:
1839 : 0 : bDependsOnScript = sal_True;
1840 : 0 : nScript = i18n::ScriptType::LATIN;
1841 : 0 : break;
1842 : :
1843 : : case RES_CHRATR_CJK_FONT:
1844 : : case RES_CHRATR_CJK_FONTSIZE:
1845 : : case RES_CHRATR_CJK_LANGUAGE:
1846 : : case RES_CHRATR_CJK_POSTURE:
1847 : : case RES_CHRATR_CJK_WEIGHT:
1848 : 6 : bDependsOnScript = sal_True;
1849 : 6 : nScript = i18n::ScriptType::ASIAN;
1850 : 6 : break;
1851 : :
1852 : : case RES_CHRATR_CTL_FONT:
1853 : : case RES_CHRATR_CTL_FONTSIZE:
1854 : : case RES_CHRATR_CTL_LANGUAGE:
1855 : : case RES_CHRATR_CTL_POSTURE:
1856 : : case RES_CHRATR_CTL_WEIGHT:
1857 : 4 : bDependsOnScript = sal_True;
1858 : 4 : nScript = i18n::ScriptType::COMPLEX;
1859 : 4 : break;
1860 : : case RES_TXTATR_CHARFMT:
1861 : : {
1862 : 0 : const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rItem;
1863 : 0 : const SwCharFmt* pFmt = rChrFmt.GetCharFmt();
1864 : 0 : const SwHTMLFmtInfo *pFmtInfo = GetFmtInfo( *pFmt, rFmtInfos );
1865 [ # # ]: 0 : if( pFmtInfo->bScriptDependent )
1866 : : {
1867 : 0 : bDependsOnScript = sal_True;
1868 : 0 : bDependsOnAnyScript = sal_True;
1869 : : }
1870 : : }
1871 : 0 : break;
1872 : : case RES_TXTATR_INETFMT:
1873 : : {
1874 [ # # ]: 0 : if( GetFmtInfo( *pDoc->GetCharFmtFromPool(
[ # # # # ]
1875 : 0 : RES_POOLCHR_INET_NORMAL), rFmtInfos )->bScriptDependent ||
1876 : : GetFmtInfo( *pDoc->GetCharFmtFromPool(
1877 : 0 : RES_POOLCHR_INET_VISIT), rFmtInfos )->bScriptDependent )
1878 : : {
1879 : 0 : bDependsOnScript = sal_True;
1880 : 0 : bDependsOnAnyScript = sal_True;
1881 : : }
1882 : : }
1883 : 0 : break;
1884 : : }
1885 : :
1886 [ + + ]: 16 : if( bDependsOnScript )
1887 : : {
1888 : 10 : xub_StrLen nPos = nStart;
1889 [ - + ]: 10 : for( size_t i=0; i < aScriptChgLst.size(); i++ )
1890 : : {
1891 : 0 : xub_StrLen nChgPos = aScriptChgLst[i];
1892 [ # # ]: 0 : if( nPos >= nChgPos )
1893 : : {
1894 : : // the hint starts behind or at the next script change,
1895 : : // so we may continue with this position.
1896 : 0 : continue;
1897 : : }
1898 [ # # ]: 0 : if( nEnd <= nChgPos )
1899 : : {
1900 : : // the (rest of) the hint ends before or at the next script
1901 : : // change, so we can insert it, but only if it belongs
1902 : : // to the current script.
1903 [ # # ][ # # ]: 0 : if( bDependsOnAnyScript || nScript == aScriptLst[i] )
[ # # ]
1904 : : InsertNoScript( rItem, nPos, nEnd, rFmtInfos,
1905 : 0 : bParaAttrs );
1906 : 0 : break;
1907 : : }
1908 : :
1909 : : // the hint starts before the next script change and ends behind
1910 : : // it, so we can insert a hint upto the next script change and
1911 : : // continue with the rest of the hint.
1912 [ # # ][ # # ]: 0 : if( bDependsOnAnyScript || nScript == aScriptLst[i] )
[ # # ]
1913 : 0 : InsertNoScript( rItem, nPos, nChgPos, rFmtInfos, bParaAttrs );
1914 : 0 : nPos = nChgPos;
1915 : : }
1916 : : }
1917 : : else
1918 : : {
1919 : 6 : InsertNoScript( rItem, nStart, nEnd, rFmtInfos, bParaAttrs );
1920 : : }
1921 : 16 : }
1922 : :
1923 : 2 : void HTMLEndPosLst::Insert( const SfxItemSet& rItemSet,
1924 : : xub_StrLen nStart, xub_StrLen nEnd,
1925 : : SwHTMLFmtInfos& rFmtInfos,
1926 : : sal_Bool bDeep, sal_Bool bParaAttrs )
1927 : : {
1928 [ + - ]: 2 : SfxWhichIter aIter( rItemSet );
1929 : :
1930 [ + - ]: 2 : sal_uInt16 nWhich = aIter.FirstWhich();
1931 [ + + ]: 202 : while( nWhich )
1932 : : {
1933 : : const SfxPoolItem *pItem;
1934 [ + - ][ + + ]: 200 : if( SFX_ITEM_SET == rItemSet.GetItemState( nWhich, bDeep, &pItem ) )
1935 : : {
1936 [ + - ]: 16 : Insert( *pItem, nStart, nEnd, rFmtInfos, bParaAttrs );
1937 : : }
1938 : :
1939 [ + - ]: 200 : nWhich = aIter.NextWhich();
1940 [ + - ]: 2 : }
1941 : 2 : }
1942 : :
1943 : 0 : void HTMLEndPosLst::Insert( const SwDrawFrmFmt& rFmt, xub_StrLen nPos,
1944 : : SwHTMLFmtInfos& rFmtInfos )
1945 : : {
1946 : : // der Type-Cast ist nur noetig, um nicht seinetwegen
1947 : : // svdrwobt.hxx zu includem
1948 : : const SdrObject* pTextObj =
1949 : 0 : (const SdrObject *)SwHTMLWriter::GetMarqueeTextObj( rFmt );
1950 : :
1951 [ # # ]: 0 : if( pTextObj )
1952 : : {
1953 : : // die Edit-Engine-Attribute des Objekts als SW-Attribute holen
1954 : : // und als Hints einsortieren. Wegen der Menge der Hints werden
1955 : : // Styles hierbei nicht beruecksichtigt!
1956 : 0 : const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
1957 : 0 : SfxItemSet aItemSet( *rFmtItemSet.GetPool(), RES_CHRATR_BEGIN,
1958 [ # # ]: 0 : RES_CHRATR_END );
1959 [ # # ]: 0 : SwHTMLWriter::GetEEAttrsFromDrwObj( aItemSet, pTextObj, sal_True );
1960 : 0 : sal_Bool bOutStylesOld = bOutStyles;
1961 : 0 : bOutStyles = sal_False;
1962 [ # # ]: 0 : Insert( aItemSet, nPos, nPos+1, rFmtInfos, sal_False, sal_False );
1963 [ # # ]: 0 : bOutStyles = bOutStylesOld;
1964 : : }
1965 : 0 : }
1966 : :
1967 : 0 : sal_uInt16 HTMLEndPosLst::GetScriptAtPos( xub_StrLen nPos ,
1968 : : sal_uInt16 nWeak )
1969 : : {
1970 : 0 : sal_uInt16 nRet = CSS1_OUTMODE_ANY_SCRIPT;
1971 : :
1972 : 0 : size_t nScriptChgs = aScriptChgLst.size();
1973 : 0 : size_t i=0;
1974 [ # # ][ # # ]: 0 : while( i < nScriptChgs && nPos >= aScriptChgLst[i] )
[ # # ]
1975 : 0 : i++;
1976 : : OSL_ENSURE( i < nScriptChgs, "script list is to short" );
1977 [ # # ]: 0 : if( i < nScriptChgs )
1978 : : {
1979 [ # # ]: 0 : if( i18n::ScriptType::WEAK == aScriptLst[i] )
1980 : 0 : nRet = nWeak;
1981 : : else
1982 : 0 : nRet = SwHTMLWriter::GetCSS1ScriptForScriptType( aScriptLst[i] );
1983 : : }
1984 : :
1985 : 0 : return nRet;
1986 : : }
1987 : :
1988 : 0 : void HTMLEndPosLst::OutStartAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos,
1989 : : HTMLOutContext *pContext )
1990 : : {
1991 : 0 : rHWrt.bTagOn = sal_True;
1992 : :
1993 : : // die Attribute in der Start-Liste sind aufsteigend sortiert
1994 [ # # ]: 0 : for( sal_uInt16 i=0; i< aStartLst.size(); i++ )
1995 : : {
1996 : 0 : HTMLSttEndPos *pPos = aStartLst[i];
1997 : 0 : xub_StrLen nStart = pPos->GetStart();
1998 [ # # ]: 0 : if( nStart > nPos )
1999 : : {
2000 : : // dieses und alle folgenden Attribute werden erst noch geoeffnet
2001 : 0 : break;
2002 : : }
2003 [ # # ]: 0 : else if( nStart == nPos )
2004 : : {
2005 : : // das Attribut ausgeben
2006 : 0 : sal_uInt16 nCSS1Script = rHWrt.nCSS1Script;
2007 : 0 : sal_uInt16 nWhich = pPos->GetItem()->Which();
2008 [ # # ][ # # ]: 0 : if( RES_TXTATR_CHARFMT == nWhich ||
[ # # ]
2009 : : RES_TXTATR_INETFMT == nWhich ||
2010 : : RES_PARATR_DROP == nWhich )
2011 : : {
2012 : 0 : rHWrt.nCSS1Script = GetScriptAtPos( nPos, nCSS1Script );
2013 : : }
2014 [ # # ]: 0 : if( pContext )
2015 : : {
2016 : 0 : HTMLOutFuncs::FlushToAscii( rHWrt.Strm(), *pContext );
2017 : 0 : pContext = 0; // one time ony
2018 : : }
2019 : 0 : Out( aHTMLAttrFnTab, *pPos->GetItem(), rHWrt );
2020 : 0 : rHWrt.nCSS1Script = nCSS1Script;
2021 : : }
2022 : : }
2023 : 0 : }
2024 : :
2025 : 2 : void HTMLEndPosLst::OutEndAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos,
2026 : : HTMLOutContext *pContext )
2027 : : {
2028 : 2 : rHWrt.bTagOn = sal_False;
2029 : :
2030 : : // die Attribute in der End-Liste sind aufsteigend sortiert
2031 : 2 : sal_uInt16 i=0;
2032 [ - + ]: 2 : while( i < aEndLst.size() )
2033 : : {
2034 : 0 : HTMLSttEndPos *pPos = aEndLst[i];
2035 : 0 : xub_StrLen nEnd = pPos->GetEnd();
2036 : :
2037 [ # # ][ # # ]: 0 : if( STRING_MAXLEN==nPos || nEnd == nPos )
2038 : : {
2039 [ # # ]: 0 : if( pContext )
2040 : : {
2041 : 0 : HTMLOutFuncs::FlushToAscii( rHWrt.Strm(), *pContext );
2042 : 0 : pContext = 0; // one time ony
2043 : : }
2044 : 0 : Out( aHTMLAttrFnTab, *pPos->GetItem(), rHWrt );
2045 : 0 : _RemoveItem( i );
2046 : : }
2047 [ # # ]: 0 : else if( nEnd > nPos )
2048 : : {
2049 : : // dieses und alle folgenden Attribute werden erst spaeter beendet
2050 : 0 : break;
2051 : : }
2052 : : else
2053 : : {
2054 : : // Das Attribut wird vor der aktuellen Position beendet. Das
2055 : : // darf nicht sein, aber wie koennen trotzdem damit umgehen
2056 : : OSL_ENSURE( nEnd >= nPos,
2057 : : "Das Attribut sollte schon laengst beendet sein" );
2058 : 0 : i++;
2059 : : }
2060 : : }
2061 : 2 : }
2062 : :
2063 : :
2064 : : /* Ausgabe der Nodes */
2065 : 2 : Writer& OutHTML_SwTxtNode( Writer& rWrt, const SwCntntNode& rNode )
2066 : : {
2067 : 2 : SwTxtNode * pNd = &((SwTxtNode&)rNode);
2068 : 2 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2069 : :
2070 : 2 : const String& rStr = pNd->GetTxt();
2071 : 2 : xub_StrLen nEnde = rStr.Len();
2072 : :
2073 : : // Besonderheit: leere Node und HR-Vorlage (horizontaler Strich)
2074 : : // nur ein <HR> ausgeben
2075 : 2 : sal_uInt16 nPoolId = pNd->GetAnyFmtColl().GetPoolFmtId();
2076 : :
2077 [ + - ][ - + ]: 4 : if( !nEnde && (RES_POOLCOLL_HTML_HR==nPoolId ||
[ - + ][ + - ]
2078 [ + - ]: 2 : pNd->GetAnyFmtColl().GetName().EqualsAscii( OOO_STRING_SVTOOLS_HTML_horzrule) ) )
2079 : : {
2080 : : // dann die absatz-gebundenen Grafiken/OLE-Objekte im Absatz
2081 : : // MIB 8.7.97: Ein <PRE> spannen wir um die Linie auf. Dann stimmen
2082 : : // zwar die Abstaende nicht, aber sonst bekommen wir einen leeren
2083 : : // Absatz hinter dem <HR> und das ist noch unschoener.
2084 [ # # ]: 0 : rHTMLWrt.ChangeParaToken( 0 );
2085 : :
2086 : : // Alle an dem Node verankerten Rahmen ausgeben
2087 [ # # ]: 0 : rHTMLWrt.OutFlyFrm( rNode.GetIndex(), 0, HTML_POS_ANY );
2088 : :
2089 [ # # ]: 0 : if( rHTMLWrt.bLFPossible )
2090 [ # # ]: 0 : rHTMLWrt.OutNewLine(); // Absatz-Tag in eine neue Zeile
2091 : :
2092 : 0 : rHTMLWrt.bLFPossible = sal_True;
2093 : :
2094 : 0 : rtl::OStringBuffer sOut;
2095 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_horzrule);
2096 : :
2097 [ # # ]: 0 : const SfxItemSet* pItemSet = pNd->GetpSwAttrSet();
2098 [ # # ]: 0 : if( !pItemSet )
2099 : : {
2100 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr() << '>';
[ # # ]
2101 : 0 : return rHTMLWrt;
2102 : : }
2103 : : const SfxPoolItem* pItem;
2104 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET == pItemSet->GetItemState( RES_LR_SPACE, sal_False, &pItem ))
2105 : : {
2106 : 0 : sal_Int32 nLeft = ((SvxLRSpaceItem*)pItem)->GetLeft();
2107 : 0 : sal_Int32 nRight = ((SvxLRSpaceItem*)pItem)->GetRight();
2108 [ # # ][ # # ]: 0 : if( nLeft || nRight )
2109 : : {
2110 : : const SwFrmFmt& rPgFmt =
2111 : : rHTMLWrt.pDoc->GetPageDescFromPool
2112 [ # # ]: 0 : ( RES_POOLPAGE_HTML, false )->GetMaster();
2113 [ # # ]: 0 : const SwFmtFrmSize& rSz = rPgFmt.GetFrmSize();
2114 [ # # ]: 0 : const SvxLRSpaceItem& rLR = rPgFmt.GetLRSpace();
2115 [ # # ]: 0 : const SwFmtCol& rCol = rPgFmt.GetCol();
2116 : :
2117 : 0 : long nPageWidth = rSz.GetWidth() - rLR.GetLeft() - rLR.GetRight();
2118 : :
2119 [ # # ][ # # ]: 0 : if( 1 < rCol.GetNumCols() )
2120 [ # # ]: 0 : nPageWidth /= rCol.GetNumCols();
2121 : :
2122 [ # # ]: 0 : const SwTableNode* pTblNd = pNd->FindTableNode();
2123 [ # # ]: 0 : if( pTblNd )
2124 : : {
2125 : 0 : const SwTableBox* pBox = pTblNd->GetTable().GetTblBox(
2126 [ # # ]: 0 : pNd->StartOfSectionIndex() );
2127 [ # # ]: 0 : if( pBox )
2128 [ # # ]: 0 : nPageWidth = pBox->GetFrmFmt()->GetFrmSize().GetWidth();
2129 : : }
2130 : :
2131 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_width)
2132 [ # # ]: 0 : .append('=');
2133 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2134 [ # # ][ # # ]: 0 : rWrt.OutULong( rHTMLWrt.ToPixel(nPageWidth-nLeft-nRight) );
2135 : :
2136 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_align)
2137 [ # # ]: 0 : .append('=');
2138 [ # # ]: 0 : if( !nLeft )
2139 [ # # ]: 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_AL_left);
2140 [ # # ]: 0 : else if( !nRight )
2141 [ # # ]: 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_AL_right);
2142 : : else
2143 [ # # ]: 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_AL_center);
2144 : : }
2145 : : }
2146 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2147 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET == pItemSet->GetItemState( RES_BOX, sal_False, &pItem ))
2148 : : {
2149 : 0 : const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
2150 : 0 : const editeng::SvxBorderLine* pBorderLine = pBoxItem->GetBottom();
2151 [ # # ]: 0 : if( pBorderLine )
2152 : : {
2153 [ # # ]: 0 : sal_uInt16 nWidth = pBorderLine->GetOutWidth() +
2154 [ # # ]: 0 : pBorderLine->GetInWidth() +
2155 [ # # ]: 0 : pBorderLine->GetDistance();
2156 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_size)
2157 [ # # ]: 0 : .append('=');
2158 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2159 [ # # ][ # # ]: 0 : rWrt.OutULong( rHTMLWrt.ToPixel(nWidth) );
2160 : :
2161 : 0 : const Color& rBorderColor = pBorderLine->GetColor();
2162 [ # # ][ # # ]: 0 : if( !rBorderColor.IsRGBEqual( Color(COL_GRAY) ) )
2163 : : {
2164 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_color)
2165 [ # # ]: 0 : .append('=');
2166 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2167 [ # # ]: 0 : HTMLOutFuncs::Out_Color( rWrt.Strm(), rBorderColor,
2168 [ # # ]: 0 : rHTMLWrt.eDestEnc );
2169 : : }
2170 : :
2171 [ # # ][ # # ]: 0 : if( !pBorderLine->GetInWidth() )
2172 : : {
2173 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_noshade);
2174 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2175 : : }
2176 : : }
2177 : : }
2178 [ # # ][ # # ]: 0 : rWrt.Strm() << '>';
2179 : 0 : return rHTMLWrt;
2180 : : }
2181 : :
2182 : : // Die leeren Nodes mit 2pt Font-Hoehe und der Stand-Vorlage, die
2183 : : // vor Tabellen und Bereichen eingefuegt werden, nicht exportieren,
2184 : : // Bookmarks oder absatzgebundene Grafiken aber schon.
2185 : : // MIB 21.7.97: Ausserdem auch keine leeren Tabellen-Zellen exportieren.
2186 [ + - ][ + - ]: 2 : if( !nEnde && (nPoolId == RES_POOLCOLL_STANDARD ||
[ + - ][ - + ]
2187 : : nPoolId == RES_POOLCOLL_TABLE ||
2188 : : nPoolId == RES_POOLCOLL_TABLE_HDLN) )
2189 : : {
2190 : : // Der aktuelle Node ist leer und enthaelt Standard-Vorlage ...
2191 : : const SfxPoolItem* pItem;
2192 [ # # ]: 0 : const SfxItemSet *pItemSet = pNd->GetpSwAttrSet();
2193 [ # # ][ # # ]: 0 : if( pItemSet && pItemSet->Count() &&
[ # # # # ]
[ # # ]
2194 [ # # ]: 0 : SFX_ITEM_SET == pItemSet->GetItemState( RES_CHRATR_FONTSIZE, sal_False, &pItem ) &&
2195 : 0 : 40 == ((const SvxFontHeightItem *)pItem)->GetHeight() )
2196 : : {
2197 : : // ... ausserdem ist die 2pt Schrift eingestellt ...
2198 : 0 : sal_uLong nNdPos = rWrt.pCurPam->GetPoint()->nNode.GetIndex();
2199 [ # # ][ # # ]: 0 : const SwNode *pNextNd = rWrt.pDoc->GetNodes()[nNdPos+1];
2200 [ # # ][ # # ]: 0 : const SwNode *pPrevNd = rWrt.pDoc->GetNodes()[nNdPos-1];
2201 : 0 : sal_Bool bStdColl = nPoolId == RES_POOLCOLL_STANDARD;
2202 [ # # ]: 0 : if( ( bStdColl && (pNextNd->IsTableNode() ||
[ # # # # ]
[ # # # #
# # # # ]
[ # # ]
2203 : 0 : pNextNd->IsSectionNode()) ) ||
2204 : 0 : ( !bStdColl && pNextNd->IsEndNode() &&
2205 : 0 : pPrevNd->IsStartNode() &&
2206 : : SwTableBoxStartNode==
2207 : 0 : pPrevNd->GetStartNode()->GetStartNodeType() ) )
2208 : : {
2209 : : // ... und er steht vor einer Tabelle ohne einem Bereich
2210 [ # # ]: 0 : rHTMLWrt.OutBookmarks();
2211 : 0 : rHTMLWrt.bLFPossible = !rHTMLWrt.nLastParaToken;
2212 : :
2213 : : // Alle an dem Node verankerten Rahmen ausgeben
2214 [ # # ]: 0 : rHTMLWrt.OutFlyFrm( rNode.GetIndex(), 0, HTML_POS_ANY );
2215 : 0 : rHTMLWrt.bLFPossible = sal_False;
2216 : :
2217 : 0 : return rWrt;
2218 : : }
2219 : : }
2220 : : }
2221 : :
2222 : : // PagePreaks uns PagDescs abfangen
2223 : 2 : sal_Bool bPageBreakBehind = sal_False;
2224 [ - + ]: 2 : if( rHTMLWrt.bCfgFormFeed &&
[ # # # # ]
[ - + ]
2225 [ # # ]: 0 : !(rHTMLWrt.bOutTable || rHTMLWrt.bOutFlyFrame) &&
2226 : 0 : rHTMLWrt.pStartNdIdx->GetIndex() !=
2227 : 0 : rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex() )
2228 : : {
2229 : 0 : sal_Bool bPageBreakBefore = sal_False;
2230 : : const SfxPoolItem* pItem;
2231 [ # # ]: 0 : const SfxItemSet* pItemSet = pNd->GetpSwAttrSet();
2232 : :
2233 [ # # ]: 0 : if( pItemSet )
2234 : : {
2235 [ # # # # ]: 0 : if( SFX_ITEM_SET ==
[ # # ]
2236 [ # # ]: 0 : pItemSet->GetItemState( RES_PAGEDESC, sal_True, &pItem ) &&
2237 : 0 : ((SwFmtPageDesc *)pItem)->GetPageDesc() )
2238 : 0 : bPageBreakBefore = sal_True;
2239 [ # # ]: 0 : else if( SFX_ITEM_SET ==
2240 [ # # ]: 0 : pItemSet->GetItemState( RES_BREAK, sal_True, &pItem ) )
2241 : : {
2242 [ # # # # ]: 0 : switch( ((SvxFmtBreakItem *)pItem)->GetBreak() )
2243 : : {
2244 : : case SVX_BREAK_PAGE_BEFORE:
2245 : 0 : bPageBreakBefore = sal_True;
2246 : 0 : break;
2247 : : case SVX_BREAK_PAGE_AFTER:
2248 : 0 : bPageBreakBehind = sal_True;
2249 : 0 : break;
2250 : : case SVX_BREAK_PAGE_BOTH:
2251 : 0 : bPageBreakBefore = sal_True;
2252 : 0 : bPageBreakBehind = sal_True;
2253 : 0 : break;
2254 : : default:
2255 : : ;
2256 : : }
2257 : : }
2258 : : }
2259 : :
2260 [ # # ]: 0 : if( bPageBreakBefore )
2261 [ # # ][ # # ]: 0 : rWrt.Strm() << '\f';
2262 : : }
2263 : :
2264 : : // eventuell eine Form oeffnen
2265 [ + - ]: 2 : rHTMLWrt.OutForm();
2266 : :
2267 : : // An dem Node "verankerte" Seitenegebunde Rahmen ausgeben
2268 : : sal_Bool bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
2269 [ + - ]: 2 : 0, HTML_POS_PREFIX );
2270 : : // An dem Node verankerte Rahmen ausgeben, die vor dem
2271 : : // Absatz-Tag geschrieben werden sollen.
2272 [ - + ]: 2 : if( bFlysLeft )
2273 : : bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
2274 [ # # ]: 0 : 0, HTML_POS_BEFORE );
2275 : :
2276 [ - + ]: 2 : if( rHTMLWrt.pCurPam->GetPoint()->nNode == rHTMLWrt.pCurPam->GetMark()->nNode )
2277 : 0 : nEnde = rHTMLWrt.pCurPam->GetMark()->nContent.GetIndex();
2278 : :
2279 : : // gibt es harte Attribute, die als Optionen geschrieben werden muessen?
2280 : 2 : rHTMLWrt.bTagOn = sal_True;
2281 : :
2282 : : // jetzt das Tag des Absatzes ausgeben
2283 : 2 : const SwFmt& rFmt = pNd->GetAnyFmtColl();
2284 : 2 : SwHTMLTxtCollOutputInfo aFmtInfo;
2285 : 2 : sal_Bool bOldLFPossible = rHTMLWrt.bLFPossible;
2286 [ + - ][ + - ]: 2 : OutHTML_SwFmt( rWrt, rFmt, pNd->GetpSwAttrSet(), aFmtInfo );
2287 : :
2288 : : // Wenn vor dem Absatz-Tag keine neue Zeile aufgemacht wurde, dann
2289 : : // tun wir das jetzt
2290 : 2 : rHTMLWrt.bLFPossible = !rHTMLWrt.nLastParaToken;
2291 [ - + ][ # # ]: 2 : if( !bOldLFPossible && rHTMLWrt.bLFPossible )
2292 [ # # ]: 0 : rHTMLWrt.OutNewLine();
2293 : :
2294 : :
2295 : : // dann die Bookmarks (inkl. End-Tag)
2296 : 2 : rHTMLWrt.bOutOpts = sal_False;
2297 [ + - ]: 2 : rHTMLWrt.OutBookmarks();
2298 : :
2299 : : // jetzt ist noch mal eine gute Gelegenheit fuer ein LF, sofern es noch
2300 : : // erlaubt ist
2301 [ + - ][ - + ]: 4 : if( rHTMLWrt.bLFPossible &&
[ - + ]
2302 [ + - ]: 2 : rHTMLWrt.GetLineLen() >= rHTMLWrt.nWhishLineLen )
2303 : : {
2304 [ # # ]: 0 : rHTMLWrt.OutNewLine();
2305 : : }
2306 : 2 : rHTMLWrt.bLFPossible = sal_False;
2307 : :
2308 : : // Text, der aus einer Outline-Numerierung kommt ermitteln
2309 : 2 : xub_StrLen nOffset = 0;
2310 [ + - ]: 2 : String aOutlineTxt;
2311 [ + - ]: 2 : String aFullText;
2312 : :
2313 : : // export numbering string as plain text only for the outline numbering,
2314 : : // because the outline numbering isn't exported as a numbering - see <SwHTMLNumRuleInfo::Set(..)>
2315 [ + - ]: 2 : if ( pNd->IsOutline() &&
[ - + # # ]
[ - + ]
2316 [ # # ]: 0 : pNd->GetNumRule() == pNd->GetDoc()->GetOutlineNumRule() )
2317 : : {
2318 [ # # ][ # # ]: 0 : aOutlineTxt = pNd->GetNumString();
[ # # ]
2319 : 0 : nOffset = nOffset + aOutlineTxt.Len();
2320 [ # # ]: 0 : aFullText = aOutlineTxt;
2321 : : }
2322 [ + - ]: 2 : String aFootEndNoteSym;
2323 [ - + ]: 2 : if( rHTMLWrt.pFmtFtn )
2324 : : {
2325 [ # # ][ # # ]: 0 : aFootEndNoteSym = rHTMLWrt.GetFootEndNoteSym( *rHTMLWrt.pFmtFtn );
[ # # ]
2326 : 0 : nOffset = nOffset + aFootEndNoteSym.Len();
2327 [ # # ]: 0 : aFullText += aFootEndNoteSym;
2328 : : }
2329 : :
2330 : : // gibt es harte Attribute, die als Tags geschrieben werden muessen?
2331 [ + - ]: 2 : aFullText += rStr;
2332 : : HTMLEndPosLst aEndPosLst( rWrt.pDoc, rHTMLWrt.pTemplate,
2333 : : rHTMLWrt.pDfltColor, rHTMLWrt.bCfgOutStyles,
2334 : : rHTMLWrt.GetHTMLMode(), aFullText,
2335 [ + - ]: 2 : rHTMLWrt.aScriptTextStyles );
2336 [ + - ]: 2 : if( aFmtInfo.pItemSet )
2337 : : {
2338 : : aEndPosLst.Insert( *aFmtInfo.pItemSet, 0, nEnde + nOffset,
2339 [ + - ]: 2 : rHTMLWrt.aChrFmtInfos, sal_False, sal_True );
2340 : : }
2341 : :
2342 : :
2343 [ + - ][ - + ]: 2 : if( aOutlineTxt.Len() || rHTMLWrt.pFmtFtn )
[ - + ]
2344 : : {
2345 : : // Absatz-Attribute ausgeben, damit der Text die Attribute des
2346 : : // Absatzes bekommt.
2347 [ # # ]: 0 : aEndPosLst.OutStartAttrs( rHTMLWrt, 0 );
2348 : :
2349 : : // Theoretisch muesste man hier die Zeichen-Vorlage der Numerierung
2350 : : // beachten. Da man die ueber die UI nicht setzen kann, ignorieren
2351 : : // wir sie erstmal.
2352 : :
2353 [ # # ]: 0 : if( aOutlineTxt.Len() )
2354 [ # # ]: 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aOutlineTxt,
2355 [ # # ]: 0 : rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters);
2356 : :
2357 [ # # ]: 0 : if( rHTMLWrt.pFmtFtn )
2358 : : {
2359 : : rHTMLWrt.OutFootEndNoteSym( *rHTMLWrt.pFmtFtn, aFootEndNoteSym,
2360 [ # # ][ # # ]: 0 : aEndPosLst.GetScriptAtPos( aOutlineTxt.Len(), rHTMLWrt.nCSS1Script ) );
2361 : 0 : rHTMLWrt.pFmtFtn = 0;
2362 : : }
2363 : : }
2364 : :
2365 : : // erstmal den Start berichtigen. D.h. wird nur ein Teil vom Satz
2366 : : // ausgegeben, so muessen auch da die Attribute stimmen!!
2367 : 2 : rHTMLWrt.bTxtAttr = sal_True;
2368 : :
2369 : :
2370 : 2 : sal_uInt16 nAttrPos = 0;
2371 : 2 : xub_StrLen nStrPos = rHTMLWrt.pCurPam->GetPoint()->nContent.GetIndex();
2372 : 2 : const SwTxtAttr * pHt = 0;
2373 [ - + ]: 2 : sal_uInt16 nCntAttr = pNd->HasHints() ? pNd->GetSwpHints().Count() : 0;
2374 [ - + ][ # # ]: 2 : if( nCntAttr && nStrPos > *( pHt = pNd->GetSwpHints()[ 0 ] )->GetStart() )
[ # # ][ - + ]
2375 : : {
2376 : : // Ok, es gibt vorher Attribute, die ausgegeben werden muessen
2377 [ # # # # : 0 : do {
# # ][ # # ]
2378 [ # # ]: 0 : aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset );
2379 : :
2380 : 0 : nAttrPos++;
2381 [ # # ][ # # ]: 0 : if( RES_TXTATR_FIELD == pHt->Which() ) // Felder nicht
2382 : 0 : continue; // ausgeben
2383 : :
2384 [ # # ][ # # ]: 0 : if ( pHt->GetEnd() && !pHt->HasDummyChar() )
[ # # ][ # # ]
2385 : : {
2386 [ # # ]: 0 : xub_StrLen nHtEnd = *pHt->GetEnd(),
2387 : 0 : nHtStt = *pHt->GetStart();
2388 [ # # ][ # # ]: 0 : if( !rHTMLWrt.bWriteAll && nHtEnd <= nStrPos )
2389 : 0 : continue;
2390 : :
2391 : : // leere Hints am Anfang nicht beachten, oder ??
2392 [ # # ]: 0 : if( nHtEnd == nHtStt )
2393 : 0 : continue;
2394 : :
2395 : : // Attribut in die Liste aufnehemen
2396 [ # # ]: 0 : if( rHTMLWrt.bWriteAll )
2397 : 0 : aEndPosLst.Insert( pHt->GetAttr(), nHtStt + nOffset,
2398 : : nHtEnd + nOffset,
2399 [ # # ]: 0 : rHTMLWrt.aChrFmtInfos );
2400 : : else
2401 : : {
2402 [ # # ]: 0 : xub_StrLen nTmpStt = nHtStt < nStrPos ? nStrPos : nHtStt;
2403 [ # # ]: 0 : xub_StrLen nTmpEnd = nHtEnd < nEnde ? nHtEnd : nEnde;
2404 : 0 : aEndPosLst.Insert( pHt->GetAttr(), nTmpStt + nOffset,
2405 : : nTmpEnd + nOffset,
2406 [ # # ]: 0 : rHTMLWrt.aChrFmtInfos );
2407 : : }
2408 : 0 : continue;
2409 : : // aber nicht ausgeben, das erfolgt spaeter !!
2410 : : }
2411 : :
2412 : : } while( nAttrPos < nCntAttr && nStrPos >
2413 : 0 : *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() );
2414 : :
2415 : : // dann gebe mal alle gesammelten Attribute von der String-Pos aus
2416 [ # # ]: 0 : aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset );
2417 [ # # ]: 0 : aEndPosLst.OutStartAttrs( rHTMLWrt, nStrPos + nOffset );
2418 : : }
2419 : :
2420 : 2 : sal_Bool bWriteBreak = (HTML_PREFORMTXT_ON != rHTMLWrt.nLastParaToken);
2421 [ + - ][ + - ]: 2 : if( bWriteBreak && pNd->GetNumRule() )
[ - + ][ - + ]
2422 : 0 : bWriteBreak = sal_False;
2423 : :
2424 : : {
2425 [ + - ]: 2 : HTMLOutContext aContext( rHTMLWrt.eDestEnc );
2426 : :
2427 : 2 : xub_StrLen nPreSplitPos = 0;
2428 [ - + ]: 2 : for( ; nStrPos < nEnde; nStrPos++ )
2429 : : {
2430 [ # # ]: 0 : aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset, &aContext );
2431 : :
2432 : : // Die an der aktuellen Position verankerten Rahmen ausgeben
2433 [ # # ]: 0 : if( bFlysLeft )
2434 : : bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
2435 : : nStrPos, HTML_POS_INSIDE,
2436 [ # # ]: 0 : &aContext );
2437 : :
2438 : 0 : sal_Bool bOutChar = sal_True;
2439 : 0 : const SwTxtAttr * pTxtHt = 0;
2440 [ # # ][ # # ]: 0 : if( nAttrPos < nCntAttr && *pHt->GetStart() == nStrPos
[ # # ][ # # ]
2441 : : && nStrPos != nEnde )
2442 : : {
2443 [ # # # # : 0 : do {
# # ][ # # ]
2444 [ # # ][ # # ]: 0 : if ( pHt->GetEnd() && !pHt->HasDummyChar() )
[ # # ][ # # ]
2445 : : {
2446 [ # # ][ # # ]: 0 : if( *pHt->GetEnd() != nStrPos )
2447 : : {
2448 : : // Hints mit Ende einsortieren, wenn sie keinen
2449 : : // leeren Bereich aufspannen (Hints, die keinen
2450 : : // Bereich aufspannen werden ignoriert
2451 : 0 : aEndPosLst.Insert( pHt->GetAttr(), nStrPos + nOffset,
2452 [ # # ]: 0 : *pHt->GetEnd() + nOffset,
2453 [ # # ]: 0 : rHTMLWrt.aChrFmtInfos );
2454 : : }
2455 : : }
2456 : : else
2457 : : {
2458 : : // Hints ohne-Ende werden als letztes ausgebeben
2459 : : OSL_ENSURE( !pTxtHt,
2460 : : "Wieso gibt es da schon ein Attribut ohne Ende?" );
2461 [ # # ]: 0 : if( rHTMLWrt.nTxtAttrsToIgnore>0 )
2462 : : {
2463 : 0 : rHTMLWrt.nTxtAttrsToIgnore--;
2464 : : }
2465 : : else
2466 : : {
2467 : 0 : pTxtHt = pHt;
2468 : : sal_uInt16 nFldWhich;
2469 [ # # ]: 0 : if( RES_TXTATR_FIELD != pHt->Which() ||
[ # # # # ]
[ # # ][ # # ]
2470 : 0 : ( RES_POSTITFLD != (nFldWhich = ((const SwFmtFld&)pHt->GetAttr()).GetFld()->Which()) &&
2471 : : RES_SCRIPTFLD != nFldWhich ) )
2472 : 0 : bWriteBreak = sal_False;
2473 : : }
2474 : 0 : bOutChar = sal_False; // keine 255 ausgeben
2475 : : }
2476 : : } while( ++nAttrPos < nCntAttr && nStrPos ==
2477 : 0 : *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() );
2478 : : }
2479 : :
2480 : : // Manche Draw-Formate koennen auch noch Attribute mitbringen
2481 [ # # ][ # # ]: 0 : if( pTxtHt && RES_TXTATR_FLYCNT == pTxtHt->Which() )
[ # # ][ # # ]
2482 : : {
2483 : : const SwFrmFmt* pFrmFmt =
2484 : 0 : ((const SwFmtFlyCnt &)pTxtHt->GetAttr()).GetFrmFmt();
2485 : :
2486 [ # # ]: 0 : if( RES_DRAWFRMFMT == pFrmFmt->Which() )
2487 : : aEndPosLst.Insert( *((const SwDrawFrmFmt *)pFrmFmt),
2488 : : nStrPos + nOffset,
2489 [ # # ]: 0 : rHTMLWrt.aChrFmtInfos );
2490 : : }
2491 : :
2492 [ # # ]: 0 : aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset, &aContext );
2493 [ # # ]: 0 : aEndPosLst.OutStartAttrs( rHTMLWrt, nStrPos + nOffset, &aContext );
2494 : :
2495 [ # # ]: 0 : if( pTxtHt )
2496 : : {
2497 : 0 : rHTMLWrt.bLFPossible = !rHTMLWrt.nLastParaToken && nStrPos > 0 &&
2498 [ # # ][ # # ]: 0 : rStr.GetChar(nStrPos-1) == ' ';
[ # # ]
2499 : 0 : sal_uInt16 nCSS1Script = rHTMLWrt.nCSS1Script;
2500 : : rHTMLWrt.nCSS1Script = aEndPosLst.GetScriptAtPos(
2501 [ # # ]: 0 : nStrPos + nOffset, nCSS1Script );
2502 [ # # ][ # # ]: 0 : HTMLOutFuncs::FlushToAscii( rWrt.Strm(), aContext );
2503 [ # # ]: 0 : Out( aHTMLAttrFnTab, pTxtHt->GetAttr(), rHTMLWrt );
2504 : 0 : rHTMLWrt.nCSS1Script = nCSS1Script;
2505 : 0 : rHTMLWrt.bLFPossible = sal_False;
2506 : : }
2507 : :
2508 [ # # ]: 0 : if( bOutChar )
2509 : : {
2510 : 0 : sal_Unicode c = rStr.GetChar( nStrPos );
2511 : : // versuche nach ungefaehr 255 Zeichen eine neue Zeile zu
2512 : : // beginnen, aber nicht in PRE und nur bei Spaces
2513 [ # # ][ # # ]: 0 : if( ' '==c && !rHTMLWrt.nLastParaToken )
2514 : : {
2515 : : xub_StrLen nLineLen;
2516 [ # # ]: 0 : if( rHTMLWrt.nLastParaToken )
2517 : 0 : nLineLen = nStrPos - nPreSplitPos;
2518 : : else
2519 [ # # ]: 0 : nLineLen = rHTMLWrt.GetLineLen();
2520 : :
2521 [ # # ]: 0 : xub_StrLen nWordLen = rStr.Search( ' ', nStrPos+1 );
2522 [ # # ]: 0 : if( nWordLen == STRING_NOTFOUND )
2523 : 0 : nWordLen = nEnde;
2524 : 0 : nWordLen = nWordLen - nStrPos;
2525 : :
2526 [ # # ][ # # ]: 0 : if( nLineLen >= rHTMLWrt.nWhishLineLen ||
2527 : : (nLineLen+nWordLen) >= rHTMLWrt.nWhishLineLen )
2528 : : {
2529 [ # # ][ # # ]: 0 : HTMLOutFuncs::FlushToAscii( rWrt.Strm(), aContext );
2530 [ # # ]: 0 : rHTMLWrt.OutNewLine();
2531 : 0 : bOutChar = sal_False;
2532 [ # # ]: 0 : if( rHTMLWrt.nLastParaToken )
2533 : 0 : nPreSplitPos = nStrPos+1;
2534 : : }
2535 : : }
2536 : :
2537 [ # # ]: 0 : if( bOutChar )
2538 : : {
2539 [ # # ]: 0 : if( 0x0a == c )
2540 : : {
2541 [ # # ][ # # ]: 0 : HTMLOutFuncs::FlushToAscii( rWrt.Strm(), aContext );
2542 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_linebreak );
2543 : : }
2544 : : else
2545 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_Char( rWrt.Strm(), c, aContext, &rHTMLWrt.aNonConvertableCharacters );
2546 : :
2547 : : // Wenn das letzte Zeichen eines Absatzed ein harter
2548 : : // Zeilen-Umbruch ist brauchen wir noch ein <BR> mehr, weil
2549 : : // Netscape & Co in diesem Fall fuer den naechsten Absatz
2550 : : // nicht in die naechste Zeile gehen.
2551 : : bWriteBreak = (0x0a == c) &&
2552 [ # # ][ # # ]: 0 : (HTML_PREFORMTXT_ON != rHTMLWrt.nLastParaToken);
2553 : : }
2554 : : }
2555 : : }
2556 [ + - ][ + - ]: 2 : HTMLOutFuncs::FlushToAscii( rWrt.Strm(), aContext );
[ + - ]
2557 : : }
2558 : :
2559 [ + - ]: 2 : aEndPosLst.OutEndAttrs( rHTMLWrt, STRING_MAXLEN );
2560 : :
2561 : : // Die an der letzten Position verankerten Rahmen ausgeben
2562 [ - + ]: 2 : if( bFlysLeft )
2563 : : bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
2564 [ # # ]: 0 : nEnde, HTML_POS_INSIDE );
2565 : : OSL_ENSURE( !bFlysLeft, "Es wurden nicht alle Rahmen gespeichert!" );
2566 : :
2567 : 2 : rHTMLWrt.bTxtAttr = sal_False;
2568 : :
2569 [ + - ]: 2 : if( bWriteBreak )
2570 : : {
2571 : : sal_Bool bEndOfCell = rHTMLWrt.bOutTable &&
2572 : 0 : rWrt.pCurPam->GetPoint()->nNode.GetIndex() ==
2573 [ - + # # ]: 2 : rWrt.pCurPam->GetMark()->nNode.GetIndex();
2574 : :
2575 [ - + ]: 2 : if( bEndOfCell && !nEnde &&
[ # # # # ]
[ - + ]
2576 : 0 : rHTMLWrt.IsHTMLMode(HTMLMODE_NBSP_IN_TABLES) )
2577 : : {
2578 : : // Wenn der letzte Absatz einer Tabellezelle leer ist und
2579 : : // wir fuer den MS-IE exportieren, schreiben wir statt eines
2580 : : // <BR> ein
2581 [ # # ][ # # ]: 0 : rWrt.Strm() << '&' << OOO_STRING_SVTOOLS_HTML_S_nbsp << ';';
[ # # ][ # # ]
2582 : : }
2583 : : else
2584 : : {
2585 [ + - ][ + - ]: 2 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_linebreak );
2586 : : const SvxULSpaceItem& rULSpace =
2587 [ + - ][ + - ]: 2 : (const SvxULSpaceItem &)pNd->GetSwAttrSet().Get(RES_UL_SPACE);
2588 [ + - ]: 4 : if( rULSpace.GetLower() > 0 && !bEndOfCell &&
[ + - + - ]
[ + - ]
2589 : 2 : !rHTMLWrt.IsHTMLMode(HTMLMODE_NO_BR_AT_PAREND) )
2590 [ + - ][ + - ]: 2 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_linebreak );
2591 : 2 : rHTMLWrt.bLFPossible = sal_True;
2592 : : }
2593 : : }
2594 : :
2595 [ + - ][ - + ]: 2 : if( rHTMLWrt.bClearLeft || rHTMLWrt.bClearRight )
2596 : : {
2597 : : const sal_Char *pStr;
2598 [ # # ]: 0 : if( rHTMLWrt.bClearLeft )
2599 : : {
2600 [ # # ]: 0 : if( rHTMLWrt.bClearRight )
2601 : 0 : pStr = OOO_STRING_SVTOOLS_HTML_AL_all;
2602 : : else
2603 : 0 : pStr = OOO_STRING_SVTOOLS_HTML_AL_left;
2604 : : }
2605 : : else
2606 : 0 : pStr = OOO_STRING_SVTOOLS_HTML_AL_right;
2607 : :
2608 [ # # ]: 0 : rtl::OStringBuffer sOut(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_linebreak));
2609 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_clear).append('=').append(pStr);
[ # # ][ # # ]
2610 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_AsciiTag( rHTMLWrt.Strm(), sOut.getStr() );
2611 : :
2612 : 0 : rHTMLWrt.bClearLeft = sal_False;
2613 : 0 : rHTMLWrt.bClearRight = sal_False;
2614 : :
2615 : 0 : rHTMLWrt.bLFPossible = sal_True;
2616 : : }
2617 : :
2618 : : // wenn ein LF nicht schon erlaubt ist wird es erlaubt, wenn der
2619 : : // Absatz mit einem ' ' endet
2620 [ - + ][ # # ]: 2 : if( !rHTMLWrt.bLFPossible && !rHTMLWrt.nLastParaToken &&
[ # # # # ]
[ - + ]
2621 : 0 : nEnde > 0 && ' ' == rStr.GetChar(nEnde-1) )
2622 : 0 : rHTMLWrt.bLFPossible = sal_True;
2623 : :
2624 : 2 : rHTMLWrt.bTagOn = sal_False;
2625 [ + - ]: 2 : OutHTML_SwFmtOff( rWrt, aFmtInfo );
2626 : :
2627 : : // eventuell eine Form schliessen
2628 [ + - ]: 2 : rHTMLWrt.OutForm( sal_False );
2629 : :
2630 [ - + ]: 2 : if( bPageBreakBehind )
2631 [ # # ][ # # ]: 0 : rWrt.Strm() << '\f';
2632 : :
2633 [ + - ][ + - ]: 2 : return rHTMLWrt;
[ + - ][ + - ]
2634 : : }
2635 : :
2636 : :
2637 : 0 : sal_uInt32 SwHTMLWriter::ToPixel( sal_uInt32 nVal ) const
2638 : : {
2639 [ # # ][ # # ]: 0 : if( Application::GetDefaultDevice() && nVal )
[ # # ]
2640 : : {
2641 : : nVal = Application::GetDefaultDevice()->LogicToPixel(
2642 [ # # ][ # # ]: 0 : Size( nVal, nVal ), MapMode( MAP_TWIP ) ).Width();
2643 [ # # ]: 0 : if( !nVal ) // wo ein Twip ist sollte auch ein Pixel sein
2644 : 0 : nVal = 1;
2645 : : }
2646 : 0 : return nVal;
2647 : : }
2648 : :
2649 : :
2650 : 0 : static Writer& OutHTML_CSS1Attr( Writer& rWrt, const SfxPoolItem& rHt )
2651 : : {
2652 : : // wenn gerade Hints geschrieben werden versuchen wir den Hint als
2653 : : // CSS1-Attribut zu schreiben
2654 : :
2655 [ # # ][ # # ]: 0 : if( ((SwHTMLWriter&)rWrt).bCfgOutStyles && ((SwHTMLWriter&)rWrt).bTxtAttr )
2656 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2657 : :
2658 : 0 : return rWrt;
2659 : : }
2660 : :
2661 : :
2662 : : /* File CHRATR.HXX: */
2663 : :
2664 : 0 : static Writer& OutHTML_SvxColor( Writer& rWrt, const SfxPoolItem& rHt )
2665 : : {
2666 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2667 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2668 : 0 : return rWrt;
2669 : :
2670 [ # # ][ # # ]: 0 : if( !rHTMLWrt.bTxtAttr && rHTMLWrt.bCfgOutStyles && rHTMLWrt.bCfgPreferStyles )
[ # # ]
2671 : : {
2672 : : // Font-Farbe nicht als Tag schreiben, wenn Styles normalen Tags
2673 : : // vorgezogen werden
2674 : 0 : return rWrt;
2675 : : }
2676 : :
2677 [ # # ]: 0 : if( rHTMLWrt.bTagOn )
2678 : : {
2679 : 0 : Color aColor( ((const SvxColorItem&)rHt).GetValue() );
2680 [ # # ]: 0 : if( COL_AUTO == aColor.GetColor() )
2681 : 0 : aColor.SetColor( COL_BLACK );
2682 : :
2683 : 0 : rtl::OStringBuffer sOut;
2684 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_font).append(' ')
[ # # ]
2685 [ # # ][ # # ]: 0 : .append(OOO_STRING_SVTOOLS_HTML_O_color).append('=');
2686 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2687 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_Color( rWrt.Strm(), aColor, rHTMLWrt.eDestEnc ) << '>';
[ # # ]
2688 : : }
2689 : : else
2690 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_font, sal_False );
2691 : :
2692 : 0 : return rWrt;
2693 : : }
2694 : :
2695 : :
2696 : 0 : static Writer& OutHTML_SwPosture( Writer& rWrt, const SfxPoolItem& rHt )
2697 : : {
2698 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2699 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2700 : 0 : return rWrt;
2701 : :
2702 : 0 : const FontItalic nPosture = ((const SvxPostureItem&)rHt).GetPosture();
2703 [ # # ]: 0 : if( ITALIC_NORMAL == nPosture )
2704 : : {
2705 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_italic, rHTMLWrt.bTagOn );
2706 : : }
2707 [ # # ][ # # ]: 0 : else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
2708 : : {
2709 : : // vielleicht als CSS1-Attribut ?
2710 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2711 : : }
2712 : :
2713 : 0 : return rWrt;
2714 : : }
2715 : :
2716 : 0 : static Writer& OutHTML_SvxFont( Writer& rWrt, const SfxPoolItem& rHt )
2717 : : {
2718 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2719 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2720 : 0 : return rWrt;
2721 : :
2722 [ # # ]: 0 : if( rHTMLWrt.bTagOn )
2723 : : {
2724 [ # # ]: 0 : String aNames;
2725 : : SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), aNames, 0,
2726 [ # # ]: 0 : rHTMLWrt.IsHTMLMode(HTMLMODE_FONT_GENERIC) );
2727 : 0 : rtl::OStringBuffer sOut;
2728 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_font).append(' ')
[ # # ]
2729 [ # # ][ # # ]: 0 : .append(OOO_STRING_SVTOOLS_HTML_O_face).append("=\"");
2730 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2731 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aNames, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters )
2732 [ # # ][ # # ]: 0 : << "\">";
2733 : : }
2734 : : else
2735 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_font , sal_False );
2736 : :
2737 : 0 : return rWrt;
2738 : : }
2739 : :
2740 : 0 : static Writer& OutHTML_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt )
2741 : : {
2742 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2743 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2744 : 0 : return rWrt;
2745 : :
2746 [ # # ]: 0 : if( rHTMLWrt.bTagOn )
2747 : : {
2748 : 0 : rtl::OStringBuffer sOut;
2749 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_font);
2750 : :
2751 : 0 : sal_uInt32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight();
2752 [ # # ]: 0 : sal_uInt16 nSize = rHTMLWrt.GetHTMLFontSize( nHeight );
2753 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_size).append('=').
[ # # ]
2754 [ # # ]: 0 : append(static_cast<sal_Int32>(nSize));
2755 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.getStr();
2756 : :
2757 [ # # ][ # # ]: 0 : if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr &&
[ # # ]
2758 : 0 : rHTMLWrt.aFontHeights[nSize-1] != nHeight )
2759 : : {
2760 : : // wenn die Groesse keiner HTML-Groesse entspricht,
2761 : : // wird sie noch zusatzlich als Style-Option exportiert
2762 [ # # ]: 0 : OutCSS1_HintStyleOpt( rWrt, rHt );
2763 : : }
2764 [ # # ][ # # ]: 0 : rWrt.Strm() << '>';
2765 : : }
2766 : : else
2767 : : {
2768 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_font, sal_False );
2769 : : }
2770 : :
2771 : 0 : return rWrt;
2772 : : }
2773 : :
2774 : 0 : static Writer& OutHTML_SvxLanguage( Writer& rWrt, const SfxPoolItem& rHt )
2775 : : {
2776 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2777 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2778 : 0 : return rWrt;
2779 : :
2780 : 0 : LanguageType eLang = ((const SvxLanguageItem &)rHt).GetLanguage();
2781 [ # # ]: 0 : if( LANGUAGE_DONTKNOW == eLang )
2782 : 0 : return rWrt;
2783 : :
2784 [ # # ]: 0 : if( rHTMLWrt.bTagOn )
2785 : : {
2786 : 0 : rtl::OStringBuffer sOut;
2787 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_span);
2788 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2789 [ # # ]: 0 : rHTMLWrt.OutLanguage( ((const SvxLanguageItem &)rHt).GetLanguage() );
2790 [ # # ][ # # ]: 0 : rWrt.Strm() << '>';
2791 : : }
2792 : : else
2793 : : {
2794 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_span, sal_False );
2795 : : }
2796 : :
2797 : 0 : return rWrt;
2798 : : }
2799 : 0 : static Writer& OutHTML_SwWeight( Writer& rWrt, const SfxPoolItem& rHt )
2800 : : {
2801 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2802 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2803 : 0 : return rWrt;
2804 : :
2805 : 0 : const FontWeight nBold = ((const SvxWeightItem&)rHt).GetWeight();
2806 [ # # ]: 0 : if( WEIGHT_BOLD == nBold )
2807 : : {
2808 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_bold, rHTMLWrt.bTagOn );
2809 : : }
2810 [ # # ][ # # ]: 0 : else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
2811 : : {
2812 : : // vielleicht als CSS1-Attribut ?
2813 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2814 : : }
2815 : :
2816 : 0 : return rWrt;
2817 : : }
2818 : :
2819 : :
2820 : 0 : static Writer& OutHTML_SwCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
2821 : : {
2822 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2823 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2824 : 0 : return rWrt;
2825 : :
2826 : : // Wegen Netscape schrieben wir hier STRIKE und nicht S raus!
2827 : 0 : const FontStrikeout nStrike = ((const SvxCrossedOutItem&)rHt).GetStrikeout();
2828 [ # # ]: 0 : if( STRIKEOUT_NONE != nStrike )
2829 : : {
2830 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_strike, rHTMLWrt.bTagOn );
2831 : : }
2832 [ # # ][ # # ]: 0 : else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
2833 : : {
2834 : : // vielleicht als CSS1-Attribut ?
2835 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2836 : : }
2837 : :
2838 : 0 : return rWrt;
2839 : : }
2840 : :
2841 : :
2842 : 0 : static Writer& OutHTML_SvxEscapement( Writer& rWrt, const SfxPoolItem& rHt )
2843 : : {
2844 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2845 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2846 : 0 : return rWrt;
2847 : :
2848 : : const SvxEscapement eEscape =
2849 : 0 : (const SvxEscapement)((const SvxEscapementItem&)rHt).GetEnumValue();
2850 : 0 : const sal_Char *pStr = 0;
2851 [ # # # ]: 0 : switch( eEscape )
2852 : : {
2853 : 0 : case SVX_ESCAPEMENT_SUPERSCRIPT: pStr = OOO_STRING_SVTOOLS_HTML_superscript; break;
2854 : 0 : case SVX_ESCAPEMENT_SUBSCRIPT: pStr = OOO_STRING_SVTOOLS_HTML_subscript; break;
2855 : : default:
2856 : : ;
2857 : : }
2858 : :
2859 [ # # ]: 0 : if( pStr )
2860 : : {
2861 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, rHTMLWrt.bTagOn );
2862 : : }
2863 [ # # ][ # # ]: 0 : else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
2864 : : {
2865 : : // vielleicht als CSS1-Attribut ?
2866 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2867 : : }
2868 : :
2869 : 0 : return rWrt;
2870 : : }
2871 : :
2872 : :
2873 : :
2874 : 0 : static Writer& OutHTML_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt )
2875 : : {
2876 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2877 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2878 : 0 : return rWrt;
2879 : :
2880 : 0 : const FontUnderline eUnder = ((const SvxUnderlineItem&)rHt).GetLineStyle();
2881 [ # # ]: 0 : if( UNDERLINE_NONE != eUnder )
2882 : : {
2883 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_underline, rHTMLWrt.bTagOn );
2884 : : }
2885 [ # # ][ # # ]: 0 : else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
2886 : : {
2887 : : // vielleicht als CSS1-Attribut ?
2888 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2889 : : }
2890 : :
2891 : 0 : return rWrt;
2892 : : }
2893 : :
2894 : :
2895 : 0 : static Writer& OutHTML_SwFlyCnt( Writer& rWrt, const SfxPoolItem& rHt )
2896 : : {
2897 : 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2898 : 0 : SwFmtFlyCnt& rFlyCnt = (SwFmtFlyCnt&)rHt;
2899 : :
2900 : 0 : const SwFrmFmt& rFmt = *rFlyCnt.GetFrmFmt();
2901 : 0 : const SdrObject *pSdrObj = 0;
2902 : :
2903 : : SwHTMLFrmType eType =
2904 [ # # ]: 0 : (SwHTMLFrmType)rHTMLWrt.GuessFrmType( rFmt, pSdrObj );
2905 : 0 : sal_uInt8 nMode = aHTMLOutFrmAsCharTable[eType][rHTMLWrt.nExportMode];
2906 [ # # ]: 0 : rHTMLWrt.OutFrmFmt( nMode, rFmt, pSdrObj );
2907 : 0 : return rWrt;
2908 : : }
2909 : :
2910 : :
2911 : : // Das ist jetzt unser Blink-Item. Blinkend wird eingeschaltet, indem man
2912 : : // das Item auf sal_True setzt!
2913 : 0 : static Writer& OutHTML_SwBlink( Writer& rWrt, const SfxPoolItem& rHt )
2914 : : {
2915 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2916 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
2917 : 0 : return rWrt;
2918 : :
2919 [ # # ]: 0 : if( ((const SvxBlinkItem&)rHt).GetValue() )
2920 : : {
2921 : 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_blink, rHTMLWrt.bTagOn );
2922 : : }
2923 [ # # ][ # # ]: 0 : else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
2924 : : {
2925 : : // vielleicht als CSS1-Attribut ?
2926 : 0 : OutCSS1_HintSpanTag( rWrt, rHt );
2927 : : }
2928 : :
2929 : 0 : return rWrt;
2930 : : }
2931 : :
2932 : 0 : Writer& OutHTML_INetFmt( Writer& rWrt, const SwFmtINetFmt& rINetFmt, sal_Bool bOn )
2933 : : {
2934 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2935 : :
2936 [ # # ]: 0 : String aURL( rINetFmt.GetValue() );
2937 : 0 : const SvxMacroTableDtor *pMacTable = rINetFmt.GetMacroTbl();
2938 [ # # ][ # # ]: 0 : sal_Bool bEvents = pMacTable != 0 && !pMacTable->empty();
2939 : :
2940 : : // Gibt es ueberhaupt etwas auszugeben?
2941 [ # # ][ # # ]: 0 : if( !aURL.Len() && !bEvents && !rINetFmt.GetName().Len() )
[ # # ][ # # ]
2942 : 0 : return rWrt;
2943 : :
2944 : : // Tag aus? Dann nur ein </A> ausgeben.
2945 [ # # ]: 0 : if( !bOn )
2946 : : {
2947 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_anchor, sal_False );
2948 : 0 : return rWrt;
2949 : : }
2950 : :
2951 : 0 : rtl::OStringBuffer sOut;
2952 [ # # ][ # # ]: 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_anchor);
2953 : :
2954 : 0 : sal_Bool bScriptDependent = sal_False;
2955 : : {
2956 : : const SwCharFmt* pFmt = rWrt.pDoc->GetCharFmtFromPool(
2957 [ # # ]: 0 : RES_POOLCHR_INET_NORMAL );
2958 [ # # ]: 0 : SwHTMLFmtInfo aFmtInfo( pFmt );
2959 [ # # ][ # # ]: 0 : SwHTMLFmtInfos::const_iterator it = rHTMLWrt.aChrFmtInfos.find( aFmtInfo );
2960 [ # # ][ # # ]: 0 : if( it != rHTMLWrt.aChrFmtInfos.end() )
[ # # ]
2961 : : {
2962 [ # # ]: 0 : bScriptDependent = it->bScriptDependent;
2963 [ # # ]: 0 : }
2964 : : }
2965 [ # # ]: 0 : if( !bScriptDependent )
2966 : : {
2967 : : const SwCharFmt* pFmt = rWrt.pDoc->GetCharFmtFromPool(
2968 [ # # ]: 0 : RES_POOLCHR_INET_VISIT );
2969 [ # # ]: 0 : SwHTMLFmtInfo aFmtInfo( pFmt );
2970 [ # # ][ # # ]: 0 : SwHTMLFmtInfos::const_iterator it = rHTMLWrt.aChrFmtInfos.find( aFmtInfo );
2971 [ # # ][ # # ]: 0 : if( it != rHTMLWrt.aChrFmtInfos.end() )
[ # # ]
2972 : : {
2973 [ # # ]: 0 : bScriptDependent = it->bScriptDependent;
2974 [ # # ]: 0 : }
2975 : : }
2976 : :
2977 [ # # ]: 0 : if( bScriptDependent )
2978 : : {
2979 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_class).append("=\"");
[ # # ]
2980 [ # # # # ]: 0 : switch( rHTMLWrt.nCSS1Script )
2981 : : {
2982 : : case CSS1_OUTMODE_WESTERN:
2983 [ # # ]: 0 : sOut.append("western");
2984 : 0 : break;
2985 : : case CSS1_OUTMODE_CJK:
2986 [ # # ]: 0 : sOut.append("cjk");
2987 : 0 : break;
2988 : : case CSS1_OUTMODE_CTL:
2989 [ # # ]: 0 : sOut.append("ctl");
2990 : 0 : break;
2991 : : }
2992 [ # # ]: 0 : sOut.append('\"');
2993 : : }
2994 : :
2995 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
2996 : :
2997 [ # # ]: 0 : String sRel;
2998 : :
2999 [ # # ][ # # ]: 0 : if( aURL.Len() || bEvents )
[ # # ]
3000 : : {
3001 [ # # ]: 0 : String sTmp( aURL );
3002 [ # # ]: 0 : sTmp.ToUpperAscii();
3003 [ # # ]: 0 : xub_StrLen nPos = sTmp.SearchAscii( "\" REL=" );
3004 [ # # ]: 0 : if( nPos!=STRING_NOTFOUND )
3005 : : {
3006 [ # # ][ # # ]: 0 : sRel = aURL.Copy( nPos+1 );
[ # # ]
3007 [ # # ]: 0 : aURL.Erase( nPos );
3008 : : }
3009 [ # # ][ # # ]: 0 : aURL = comphelper::string::strip(aURL, ' ');
[ # # ]
3010 : :
3011 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_href).append("=\"");
[ # # ]
3012 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3013 [ # # ]: 0 : rHTMLWrt.OutHyperlinkHRefValue( aURL );
3014 [ # # ][ # # ]: 0 : sOut.append('\"');
3015 : : }
3016 : :
3017 [ # # ]: 0 : if( rINetFmt.GetName().Len() )
3018 : : {
3019 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_name).append("=\"");
[ # # ]
3020 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3021 [ # # ]: 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), rINetFmt.GetName(),
3022 [ # # ]: 0 : rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
3023 [ # # ]: 0 : sOut.append('\"');
3024 : : }
3025 : :
3026 : 0 : const String& rTarget = rINetFmt.GetTargetFrame();
3027 [ # # ]: 0 : if( rTarget.Len() )
3028 : : {
3029 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_target).append("=\"");
[ # # ]
3030 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3031 [ # # ][ # # ]: 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), rTarget, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
3032 [ # # ]: 0 : sOut.append('\"');
3033 : : }
3034 : :
3035 [ # # ]: 0 : if( sRel.Len() )
3036 [ # # ][ # # ]: 0 : sOut.append(rtl::OUStringToOString(sRel, RTL_TEXTENCODING_ASCII_US));
[ # # ]
3037 : :
3038 [ # # ]: 0 : if( sOut.getLength() )
3039 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3040 : :
3041 [ # # ]: 0 : if( bEvents )
3042 [ # # ]: 0 : HTMLOutFuncs::Out_Events( rWrt.Strm(), *pMacTable, aAnchorEventTable,
3043 : : rHTMLWrt.bCfgStarBasic, rHTMLWrt.eDestEnc,
3044 [ # # ]: 0 : &rHTMLWrt.aNonConvertableCharacters );
3045 [ # # ][ # # ]: 0 : rWrt.Strm() << ">";
3046 : :
3047 [ # # ][ # # ]: 0 : return rWrt;
3048 : : }
3049 : :
3050 : 0 : static Writer& OutHTML_SwFmtINetFmt( Writer& rWrt, const SfxPoolItem& rHt )
3051 : : {
3052 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3053 : :
3054 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
3055 : 0 : return rWrt;
3056 : :
3057 : 0 : const SwFmtINetFmt& rINetFmt = (const SwFmtINetFmt&)rHt;
3058 : :
3059 [ # # ]: 0 : if( rHTMLWrt.bTagOn )
3060 : : {
3061 : : // ggf. ein noch offenes Attribut voruebergehend beenden
3062 [ # # ]: 0 : if( rHTMLWrt.aINetFmts.size() )
3063 : : {
3064 : : SwFmtINetFmt *pINetFmt =
3065 [ # # ]: 0 : rHTMLWrt.aINetFmts.back();
3066 [ # # ]: 0 : OutHTML_INetFmt( rWrt, *pINetFmt, sal_False );
3067 : : }
3068 : :
3069 : : // jetzt das neue aufmachen
3070 [ # # ]: 0 : OutHTML_INetFmt( rWrt, rINetFmt, sal_True );
3071 : :
3072 : : // und merken
3073 [ # # ][ # # ]: 0 : SwFmtINetFmt *pINetFmt = new SwFmtINetFmt( rINetFmt );
3074 [ # # ]: 0 : rHTMLWrt.aINetFmts.push_back( pINetFmt );
3075 : : }
3076 : : else
3077 : : {
3078 : : // das
3079 : 0 : OutHTML_INetFmt( rWrt, rINetFmt, sal_False );
3080 : :
3081 : : OSL_ENSURE( rHTMLWrt.aINetFmts.size(), "da fehlt doch ein URL-Attribut" );
3082 [ # # ]: 0 : if( rHTMLWrt.aINetFmts.size() )
3083 : : {
3084 : : // das eigene Attribut vom Stack holen
3085 : 0 : SwFmtINetFmt *pINetFmt = rHTMLWrt.aINetFmts.back();
3086 : 0 : rHTMLWrt.aINetFmts.pop_back();
3087 [ # # ]: 0 : delete pINetFmt;
3088 : : }
3089 : :
3090 [ # # ]: 0 : if( !rHTMLWrt.aINetFmts.empty() )
3091 : : {
3092 : : // es ist noch ein Attribut auf dem Stack, das wieder geoeffnet
3093 : : // werden muss
3094 : 0 : SwFmtINetFmt *pINetFmt = rHTMLWrt.aINetFmts.back();
3095 : 0 : OutHTML_INetFmt( rWrt, *pINetFmt, sal_True );
3096 : : }
3097 : : }
3098 : :
3099 : 0 : return rWrt;
3100 : : }
3101 : :
3102 : 0 : static Writer& OutHTML_SwTxtCharFmt( Writer& rWrt, const SfxPoolItem& rHt )
3103 : : {
3104 : 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3105 [ # # ]: 0 : if( rHTMLWrt.bOutOpts )
3106 : 0 : return rWrt;
3107 : :
3108 : 0 : const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rHt;
3109 : 0 : const SwCharFmt* pFmt = rChrFmt.GetCharFmt();
3110 : :
3111 [ # # ]: 0 : if( !pFmt )
3112 : : {
3113 : 0 : return rWrt;
3114 : : }
3115 : :
3116 [ # # ]: 0 : SwHTMLFmtInfo aFmtInfo( pFmt );
3117 [ # # ][ # # ]: 0 : SwHTMLFmtInfos::const_iterator it = rHTMLWrt.aChrFmtInfos.find( aFmtInfo );
3118 [ # # ][ # # ]: 0 : if( it == rHTMLWrt.aChrFmtInfos.end())
[ # # ]
3119 : 0 : return rWrt;
3120 : :
3121 [ # # ]: 0 : const SwHTMLFmtInfo *pFmtInfo = &*it;
3122 : : OSL_ENSURE( pFmtInfo, "Wieso gint es keine Infos ueber die Zeichenvorlage?" );
3123 : :
3124 [ # # ]: 0 : if( rHTMLWrt.bTagOn )
3125 : : {
3126 : 0 : rtl::OStringBuffer sOut;
3127 [ # # ]: 0 : sOut.append('<');
3128 [ # # ]: 0 : if( !pFmtInfo->aToken.isEmpty() )
3129 [ # # ]: 0 : sOut.append(pFmtInfo->aToken);
3130 : : else
3131 [ # # ]: 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_span);
3132 [ # # # # ]: 0 : if( rHTMLWrt.bCfgOutStyles &&
[ # # ][ # # ]
3133 : 0 : (pFmtInfo->aClass.Len() || pFmtInfo->bScriptDependent) )
3134 : : {
3135 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_class)
3136 [ # # ]: 0 : .append("=\"");
3137 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3138 [ # # ]: 0 : String aClass( pFmtInfo->aClass );
3139 [ # # ]: 0 : if( pFmtInfo->bScriptDependent )
3140 : : {
3141 [ # # ]: 0 : if( aClass.Len() )
3142 [ # # ]: 0 : aClass += '-';
3143 [ # # # # ]: 0 : switch( rHTMLWrt.nCSS1Script )
3144 : : {
3145 : : case CSS1_OUTMODE_WESTERN:
3146 [ # # ]: 0 : aClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("western") );
3147 : 0 : break;
3148 : : case CSS1_OUTMODE_CJK:
3149 [ # # ]: 0 : aClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("cjk") );
3150 : 0 : break;
3151 : : case CSS1_OUTMODE_CTL:
3152 [ # # ]: 0 : aClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("ctl") );
3153 : 0 : break;
3154 : : }
3155 : : }
3156 [ # # ]: 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aClass,
3157 [ # # ]: 0 : rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
3158 [ # # ][ # # ]: 0 : sOut.append('\"');
3159 : : }
3160 [ # # ]: 0 : sOut.append('>');
3161 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3162 : : }
3163 : : else
3164 : : {
3165 [ # # ]: 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
3166 : 0 : !pFmtInfo->aToken.isEmpty() ? pFmtInfo->aToken.getStr()
3167 : : : OOO_STRING_SVTOOLS_HTML_span,
3168 [ # # ][ # # ]: 0 : sal_False );
3169 : : }
3170 : :
3171 [ # # ]: 0 : return rWrt;
3172 : : }
3173 : :
3174 : 0 : static Writer& OutHTML_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
3175 : : {
3176 : 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3177 [ # # ][ # # ]: 0 : if( !rHTMLWrt.bOutOpts || !rHTMLWrt.bTagOn )
3178 : 0 : return rWrt;
3179 : :
3180 : 0 : SvxAdjustItem& rAdjust = (SvxAdjustItem&)rHt;
3181 : 0 : const sal_Char* pStr = 0;
3182 [ # # # # : 0 : switch( rAdjust.GetAdjust() )
# ]
3183 : : {
3184 : 0 : case SVX_ADJUST_CENTER: pStr = OOO_STRING_SVTOOLS_HTML_AL_center; break;
3185 : 0 : case SVX_ADJUST_LEFT: pStr = OOO_STRING_SVTOOLS_HTML_AL_left; break;
3186 : 0 : case SVX_ADJUST_RIGHT: pStr = OOO_STRING_SVTOOLS_HTML_AL_right; break;
3187 : 0 : case SVX_ADJUST_BLOCK: pStr = OOO_STRING_SVTOOLS_HTML_AL_justify; break;
3188 : : default:
3189 : : ;
3190 : : }
3191 [ # # ]: 0 : if( pStr )
3192 : : {
3193 : 0 : rtl::OStringBuffer sOut;
3194 [ # # ][ # # ]: 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_align).append('=')
[ # # ]
3195 [ # # ]: 0 : .append(pStr);
3196 [ # # ][ # # ]: 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
3197 : : }
3198 : :
3199 : 0 : return rWrt;
3200 : : }
3201 : :
3202 : : /*
3203 : : * lege hier die Tabellen fuer die HTML-Funktions-Pointer auf
3204 : : * die Ausgabe-Funktionen an.
3205 : : * Es sind lokale Strukturen, die nur innerhalb der HTML-DLL
3206 : : * bekannt sein muessen.
3207 : : */
3208 : :
3209 : :
3210 : : SwAttrFnTab aHTMLAttrFnTab = {
3211 : : /* RES_CHRATR_CASEMAP */ OutHTML_CSS1Attr,
3212 : : /* RES_CHRATR_CHARSETCOLOR */ 0,
3213 : : /* RES_CHRATR_COLOR */ OutHTML_SvxColor,
3214 : : /* RES_CHRATR_CONTOUR */ 0,
3215 : : /* RES_CHRATR_CROSSEDOUT */ OutHTML_SwCrossedOut,
3216 : : /* RES_CHRATR_ESCAPEMENT */ OutHTML_SvxEscapement,
3217 : : /* RES_CHRATR_FONT */ OutHTML_SvxFont,
3218 : : /* RES_CHRATR_FONTSIZE */ OutHTML_SvxFontHeight,
3219 : : /* RES_CHRATR_KERNING */ OutHTML_CSS1Attr,
3220 : : /* RES_CHRATR_LANGUAGE */ OutHTML_SvxLanguage,
3221 : : /* RES_CHRATR_POSTURE */ OutHTML_SwPosture,
3222 : : /* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
3223 : : /* RES_CHRATR_SHADOWED */ 0,
3224 : : /* RES_CHRATR_UNDERLINE */ OutHTML_SwUnderline,
3225 : : /* RES_CHRATR_WEIGHT */ OutHTML_SwWeight,
3226 : : /* RES_CHRATR_WORDLINEMODE */ 0,
3227 : : /* RES_CHRATR_AUTOKERN */ 0,
3228 : : /* RES_CHRATR_BLINK */ OutHTML_SwBlink,
3229 : : /* RES_CHRATR_NOHYPHEN */ 0, // Neu: nicht trennen
3230 : : /* RES_CHRATR_NOLINEBREAK */ 0, // Neu: nicht umbrechen
3231 : : /* RES_CHRATR_BACKGROUND */ OutHTML_CSS1Attr, // Neu: Zeichenhintergrund
3232 : : /* RES_CHRATR_CJK_FONT */ OutHTML_SvxFont,
3233 : : /* RES_CHRATR_CJK_FONTSIZE */ OutHTML_SvxFontHeight,
3234 : : /* RES_CHRATR_CJK_LANGUAGE */ OutHTML_SvxLanguage,
3235 : : /* RES_CHRATR_CJK_POSTURE */ OutHTML_SwPosture,
3236 : : /* RES_CHRATR_CJK_WEIGHT */ OutHTML_SwWeight,
3237 : : /* RES_CHRATR_CTL_FONT */ OutHTML_SvxFont,
3238 : : /* RES_CHRATR_CTL_FONTSIZE */ OutHTML_SvxFontHeight,
3239 : : /* RES_CHRATR_CTL_LANGUAGE */ OutHTML_SvxLanguage,
3240 : : /* RES_CHRATR_CTL_POSTURE */ OutHTML_SwPosture,
3241 : : /* RES_CHRATR_CTL_WEIGHT */ OutHTML_SwWeight,
3242 : : /* RES_CHRATR_ROTATE */ 0,
3243 : : /* RES_CHRATR_EMPHASIS_MARK */ 0,
3244 : : /* RES_CHRATR_TWO_LINES */ 0,
3245 : : /* RES_CHRATR_SCALEW */ 0,
3246 : : /* RES_CHRATR_RELIEF */ 0,
3247 : : /* RES_CHRATR_HIDDEN */ 0,
3248 : : /* RES_CHRATR_OVERLINE */ OutHTML_CSS1Attr,
3249 : : /* RES_CHRATR_RSID */ 0,
3250 : : /* RES_CHRATR_DUMMY1 */ 0,
3251 : :
3252 : : /* RES_TXTATR_REFMARK */ 0,
3253 : : /* RES_TXTATR_TOXMARK */ 0,
3254 : : /* RES_TXTATR_META */ 0,
3255 : : /* RES_TXTATR_METAFIELD */ 0,
3256 : : /* RES_TXTATR_AUTOFMT */ 0,
3257 : : /* RES_TXTATR_INETFMT */ OutHTML_SwFmtINetFmt,
3258 : : /* RES_TXTATR_CHARFMT */ OutHTML_SwTxtCharFmt,
3259 : : /* RES_TXTATR_CJK_RUBY */ 0,
3260 : : /* RES_TXTATR_UNKNOWN_CONTAINER */ 0,
3261 : : /* RES_TXTATR_DUMMY5 */ 0,
3262 : :
3263 : : /* RES_TXTATR_FIELD */ OutHTML_SwFmtFld,
3264 : : /* RES_TXTATR_FLYCNT */ OutHTML_SwFlyCnt,
3265 : : /* RES_TXTATR_FTN */ OutHTML_SwFmtFtn,
3266 : : /* RES_TXTATR_DUMMY4 */ 0,
3267 : : /* RES_TXTATR_DUMMY3 */ 0,
3268 : : /* RES_TXTATR_DUMMY1 */ 0, // Dummy:
3269 : : /* RES_TXTATR_DUMMY2 */ 0, // Dummy:
3270 : :
3271 : : /* RES_PARATR_LINESPACING */ 0,
3272 : : /* RES_PARATR_ADJUST */ OutHTML_SvxAdjust,
3273 : : /* RES_PARATR_SPLIT */ 0,
3274 : : /* RES_PARATR_WIDOWS */ 0,
3275 : : /* RES_PARATR_ORPHANS */ 0,
3276 : : /* RES_PARATR_TABSTOP */ 0,
3277 : : /* RES_PARATR_HYPHENZONE*/ 0,
3278 : : /* RES_PARATR_DROP */ OutHTML_CSS1Attr,
3279 : : /* RES_PARATR_REGISTER */ 0, // neu: Registerhaltigkeit
3280 : : /* RES_PARATR_NUMRULE */ 0, // Dummy:
3281 : : /* RES_PARATR_SCRIPTSPACE */ 0, // Dummy:
3282 : : /* RES_PARATR_HANGINGPUNCTUATION */ 0, // Dummy:
3283 : : /* RES_PARATR_FORBIDDEN_RULES */ 0, // new
3284 : : /* RES_PARATR_VERTALIGN */ 0, // new
3285 : : /* RES_PARATR_SNAPTOGRID*/ 0, // new
3286 : : /* RES_PARATR_CONNECT_TO_BORDER */ 0, // new
3287 : :
3288 : : /* RES_PARATR_LIST_ID */ 0, // new
3289 : : /* RES_PARATR_LIST_LEVEL */ 0, // new
3290 : : /* RES_PARATR_LIST_ISRESTART */ 0, // new
3291 : : /* RES_PARATR_LIST_RESTARTVALUE */ 0, // new
3292 : : /* RES_PARATR_LIST_ISCOUNTED */ 0, // new
3293 : :
3294 : : /* RES_FILL_ORDER */ 0,
3295 : : /* RES_FRM_SIZE */ 0,
3296 : : /* RES_PAPER_BIN */ 0,
3297 : : /* RES_LR_SPACE */ 0,
3298 : : /* RES_UL_SPACE */ 0,
3299 : : /* RES_PAGEDESC */ 0,
3300 : : /* RES_BREAK */ 0,
3301 : : /* RES_CNTNT */ 0,
3302 : : /* RES_HEADER */ 0,
3303 : : /* RES_FOOTER */ 0,
3304 : : /* RES_PRINT */ 0,
3305 : : /* RES_OPAQUE */ 0,
3306 : : /* RES_PROTECT */ 0,
3307 : : /* RES_SURROUND */ 0,
3308 : : /* RES_VERT_ORIENT */ 0,
3309 : : /* RES_HORI_ORIENT */ 0,
3310 : : /* RES_ANCHOR */ 0,
3311 : : /* RES_BACKGROUND */ 0,
3312 : : /* RES_BOX */ 0,
3313 : : /* RES_SHADOW */ 0,
3314 : : /* RES_FRMMACRO */ 0,
3315 : : /* RES_COL */ 0,
3316 : : /* RES_KEEP */ 0,
3317 : : /* RES_URL */ 0,
3318 : : /* RES_EDIT_IN_READONLY */ 0,
3319 : : /* RES_LAYOUT_SPLIT */ 0,
3320 : : /* RES_FRMATR_DUMMY1 */ 0, // Dummy:
3321 : : /* RES_FRMATR_DUMMY2 */ 0, // Dummy:
3322 : : /* RES_AUTO_STYLE */ 0, // Dummy:
3323 : : /* RES_FRMATR_DUMMY4 */ 0, // Dummy:
3324 : : /* RES_FRMATR_DUMMY5 */ 0, // Dummy:
3325 : : /* RES_FRMATR_DUMMY6 */ 0, // Dummy:
3326 : : /* RES_FRMATR_DUMMY7 */ 0, // Dummy:
3327 : : /* RES_FRMATR_DUMMY8 */ 0, // Dummy:
3328 : : /* RES_FRMATR_DUMMY9 */ 0, // Dummy:
3329 : : /* RES_FOLLOW_TEXT_FLOW */ 0,
3330 : : /* RES_WRAP_INFLUENCE_ON_OBJPOS */ 0,
3331 : : /* RES_FRMATR_DUMMY2 */ 0, // Dummy:
3332 : : /* RES_AUTO_STYLE */ 0, // Dummy:
3333 : : /* RES_FRMATR_DUMMY4 */ 0, // Dummy:
3334 : : /* RES_FRMATR_DUMMY5 */ 0, // Dummy:
3335 : :
3336 : : /* RES_GRFATR_MIRRORGRF */ 0,
3337 : : /* RES_GRFATR_CROPGRF */ 0,
3338 : : /* RES_GRFATR_ROTATION */ 0,
3339 : : /* RES_GRFATR_LUMINANCE */ 0,
3340 : : /* RES_GRFATR_CONTRAST */ 0,
3341 : : /* RES_GRFATR_CHANNELR */ 0,
3342 : : /* RES_GRFATR_CHANNELG */ 0,
3343 : : /* RES_GRFATR_CHANNELB */ 0,
3344 : : /* RES_GRFATR_GAMMA */ 0,
3345 : : /* RES_GRFATR_INVERT */ 0,
3346 : : /* RES_GRFATR_TRANSPARENCY */ 0,
3347 : : /* RES_GRFATR_DRWAMODE */ 0,
3348 : : /* RES_GRFATR_DUMMY1 */ 0,
3349 : : /* RES_GRFATR_DUMMY2 */ 0,
3350 : : /* RES_GRFATR_DUMMY3 */ 0,
3351 : : /* RES_GRFATR_DUMMY4 */ 0,
3352 : : /* RES_GRFATR_DUMMY5 */ 0,
3353 : :
3354 : : /* RES_BOXATR_FORMAT */ 0,
3355 : : /* RES_BOXATR_FORMULA */ 0,
3356 : : /* RES_BOXATR_VALUE */ 0
3357 : : };
3358 : :
3359 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|