Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "hintids.hxx"
21 : #include <comphelper/string.hxx>
22 : #include <vcl/svapp.hxx>
23 : #include <vcl/wrkwin.hxx>
24 : #include <svl/whiter.hxx>
25 : #include <editeng/boxitem.hxx>
26 : #include <editeng/ulspitem.hxx>
27 : #include <editeng/udlnitem.hxx>
28 : #include <editeng/crossedoutitem.hxx>
29 : #include <editeng/blinkitem.hxx>
30 : #include <editeng/cmapitem.hxx>
31 : #include <editeng/colritem.hxx>
32 : #include <editeng/fontitem.hxx>
33 : #include <editeng/fhgtitem.hxx>
34 : #include <editeng/postitem.hxx>
35 : #include <editeng/kernitem.hxx>
36 : #include <editeng/wghtitem.hxx>
37 : #include <editeng/lspcitem.hxx>
38 : #include <editeng/adjustitem.hxx>
39 : #include <editeng/lrspitem.hxx>
40 : #include <editeng/brushitem.hxx>
41 : #include <editeng/formatbreakitem.hxx>
42 : #include <editeng/keepitem.hxx>
43 : #include <editeng/widwitem.hxx>
44 : #include <editeng/spltitem.hxx>
45 : #include <editeng/orphitem.hxx>
46 : #include <editeng/charhiddenitem.hxx>
47 : #include <svx/xoutbmp.hxx>
48 : #include <svx/svdobj.hxx>
49 : #include <editeng/langitem.hxx>
50 : #include <editeng/frmdiritem.hxx>
51 : #include <svtools/htmlout.hxx>
52 : #include <svtools/htmlkywd.hxx>
53 : #include <sfx2/htmlmode.hxx>
54 : #include <svl/urihelper.hxx>
55 : #include <tools/urlobj.hxx>
56 : #include <tools/bigint.hxx>
57 : #include <unotools/charclass.hxx>
58 : #include <i18nlangtag/languagetag.hxx>
59 : #include <charfmt.hxx>
60 : #include <fmtclds.hxx>
61 : #include <fmtcol.hxx>
62 : #include <fmtfsize.hxx>
63 : #include <fmtornt.hxx>
64 : #include <fmtpdsc.hxx>
65 : #include <fmtlsplt.hxx>
66 : #include <pagedesc.hxx>
67 : #include <fmtanchr.hxx>
68 : #include <docary.hxx>
69 : #include <pam.hxx>
70 : #include <viewsh.hxx>
71 : #include <viewopt.hxx>
72 : #include <swtable.hxx>
73 : // OTES
74 : #include <ftninfo.hxx>
75 : #include <ftnidx.hxx>
76 : #include <txtftn.hxx>
77 : #include <fmtftn.hxx>
78 : // FOOTNOTES
79 : #include "doc.hxx"
80 : #include "swerror.h"
81 : #include "charatr.hxx"
82 : #include "paratr.hxx"
83 : #include "frmatr.hxx"
84 : #include "poolfmt.hxx"
85 : #include "fltini.hxx"
86 : #include "css1kywd.hxx"
87 : #include "wrthtml.hxx"
88 : #include "htmlnum.hxx"
89 :
90 : #include <IDocumentStylePoolAccess.hxx>
91 : #include <numrule.hxx>
92 :
93 : #include <rtl/strbuf.hxx>
94 :
95 : using namespace css;
96 : using editeng::SvxBorderLine;
97 :
98 : #define HTML_HEADSPACE (12*20)
99 :
100 : #define CSS1_BACKGROUND_ATTR 1
101 : #define CSS1_BACKGROUND_PAGE 2
102 : #define CSS1_BACKGROUND_TABLE 3
103 : #define CSS1_BACKGROUND_FLY 4
104 : #define CSS1_BACKGROUND_SECTION 5
105 :
106 : #define CSS1_FRMSIZE_WIDTH 0x01
107 : #define CSS1_FRMSIZE_VARHEIGHT 0x02
108 : #define CSS1_FRMSIZE_MINHEIGHT 0x04
109 : #define CSS1_FRMSIZE_FIXHEIGHT 0x08
110 : #define CSS1_FRMSIZE_ANYHEIGHT 0x0e
111 : #define CSS1_FRMSIZE_PIXEL 0x10
112 :
113 : extern SwAttrFnTab aCSS1AttrFnTab;
114 :
115 : static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
116 : IDocumentStylePoolAccess /*SwDoc*/ *pDoc, SwDoc *pTemplate );
117 : static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rFmt,
118 : IDocumentStylePoolAccess /*SwDoc*/ *pDoc, SwDoc *pTemplate,
119 : sal_uInt16 nRefPoolId, bool bExtRef,
120 : bool bPseudo=true );
121 : static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
122 : SwDoc *pDoc, sal_uInt16 nNotes, bool bEndNote );
123 : static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
124 : const SwFmtDrop& rDrop,
125 : const SfxItemSet *pCharFmtItemSet=0 );
126 : static Writer& OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( Writer& rWrt,
127 : const SvxUnderlineItem *pUItem,
128 : const SvxOverlineItem *pOItem,
129 : const SvxCrossedOutItem *pCOItem,
130 : const SvxBlinkItem *pBItem );
131 : static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt );
132 : static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt );
133 : static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt );
134 : static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt );
135 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
136 : const SvxULSpaceItem *pULSpace,
137 : const SvxLRSpaceItem *pLRSpace );
138 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
139 : const SfxItemSet& rItemSet,
140 : sal_Bool bDeep );
141 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
142 : sal_uInt16 nMode );
143 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt );
144 : static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
145 : sal_uInt16 nMode );
146 : static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
147 : const SfxItemSet& rItemSet,
148 : sal_Bool bDeep );
149 : static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt );
150 :
151 : namespace
152 : {
153 :
154 : const sal_Char* sCSS1_rule_end = " }";
155 : const sal_Char* sCSS1_span_tag_end = "\">";
156 : const sal_Char cCSS1_style_opt_end = '\"';
157 :
158 : const sal_Char* sHTML_FTN_fontheight = "57%";
159 :
160 801 : OString lclConvToHex(sal_uInt16 nHex)
161 : {
162 801 : sal_Char aNToABuf[] = "00";
163 :
164 : // set pointer to end of buffer
165 801 : sal_Char *pStr = aNToABuf + (sizeof(aNToABuf)-1);
166 2403 : for( sal_uInt8 n = 0; n < 2; ++n )
167 : {
168 1602 : *(--pStr) = (sal_Char)(nHex & 0xf ) + 48;
169 1602 : if( *pStr > '9' )
170 12 : *pStr += 39;
171 1602 : nHex >>= 4;
172 : }
173 :
174 801 : return OString(aNToABuf, 2);
175 : }
176 :
177 267 : static OString lclGetCSS1Color(const Color& rColor)
178 : {
179 267 : return "#" + lclConvToHex(rColor.GetRed()) + lclConvToHex(rColor.GetGreen()) + lclConvToHex(rColor.GetBlue());
180 : }
181 :
182 : }
183 :
184 : class SwCSS1OutMode
185 : {
186 : SwHTMLWriter& rWrt;
187 : sal_uInt16 nOldMode;
188 :
189 : public:
190 :
191 829 : SwCSS1OutMode( SwHTMLWriter& rHWrt, sal_uInt16 nMode, bool bStartFirst=true,
192 : const OUString *pSelector=0 ) :
193 : rWrt( rHWrt ),
194 829 : nOldMode( rHWrt.nCSS1OutMode )
195 : {
196 829 : rWrt.nCSS1OutMode = nMode;
197 829 : if( bStartFirst )
198 829 : rWrt.bFirstCSS1Property = sal_True;
199 829 : if( pSelector )
200 19 : rWrt.aCSS1Selector = *pSelector;
201 829 : }
202 :
203 829 : ~SwCSS1OutMode()
204 : {
205 829 : rWrt.nCSS1OutMode = nOldMode;
206 829 : }
207 : };
208 :
209 1593 : void SwHTMLWriter::OutCSS1_Property( const sal_Char *pProp,
210 : const sal_Char *pVal,
211 : const OUString *pSVal )
212 : {
213 1593 : OStringBuffer sOut;
214 :
215 1593 : if( bFirstCSS1Rule && (nCSS1OutMode & CSS1_OUTMODE_RULE_ON)!=0 )
216 : {
217 4 : bFirstCSS1Rule = sal_False;
218 4 : OutNewLine();
219 8 : sOut.append("<" + OString(OOO_STRING_SVTOOLS_HTML_style) + " " +
220 12 : OString(OOO_STRING_SVTOOLS_HTML_O_type) + "=\"text/css\">");
221 4 : Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
222 :
223 4 : IncIndentLevel();
224 : }
225 :
226 1593 : if( bFirstCSS1Property )
227 : {
228 510 : switch( nCSS1OutMode & CSS1_OUTMODE_ANY_ON )
229 : {
230 : case CSS1_OUTMODE_SPAN_TAG_ON:
231 : case CSS1_OUTMODE_SPAN_TAG1_ON:
232 11 : if( bTagOn )
233 : {
234 12 : sOut.append("<" + OString(OOO_STRING_SVTOOLS_HTML_span) +
235 18 : " " + OString(OOO_STRING_SVTOOLS_HTML_O_style) + "=\"");
236 : }
237 : else
238 : {
239 5 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_span, false );
240 1598 : return;
241 : }
242 6 : break;
243 :
244 : case CSS1_OUTMODE_RULE_ON:
245 : {
246 18 : OutNewLine();
247 18 : sOut.append(OUStringToOString(aCSS1Selector, eDestEnc) + " { ");
248 : }
249 18 : break;
250 :
251 : case CSS1_OUTMODE_STYLE_OPT_ON:
252 481 : sOut.append(" " + OString(OOO_STRING_SVTOOLS_HTML_O_style) + "=\"");
253 481 : break;
254 : }
255 505 : bFirstCSS1Property = sal_False;
256 : }
257 : else
258 : {
259 1083 : sOut.append("; ");
260 : }
261 :
262 1588 : sOut.append(OString(pProp) + ": ");
263 1588 : if( nCSS1OutMode & CSS1_OUTMODE_ENCODE )
264 : {
265 : // for STYLE-Option encode string
266 1541 : Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
267 1541 : if( pVal )
268 1540 : HTMLOutFuncs::Out_String( Strm(), OUString::createFromAscii(pVal),
269 3080 : eDestEnc, &aNonConvertableCharacters );
270 1 : else if( pSVal )
271 1 : HTMLOutFuncs::Out_String( Strm(), *pSVal, eDestEnc, &aNonConvertableCharacters );
272 : }
273 : else
274 : {
275 : // for STYLE-Tag print string directly
276 47 : if( pVal )
277 32 : sOut.append(pVal);
278 15 : else if( pSVal )
279 15 : sOut.append(OUStringToOString(*pSVal, eDestEnc));
280 : }
281 :
282 1588 : if (!sOut.isEmpty())
283 47 : Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
284 : }
285 :
286 1269 : static void AddUnitPropertyValue(OStringBuffer &rOut, long nVal,
287 : FieldUnit eUnit)
288 : {
289 1269 : if( nVal < 0 )
290 : {
291 : // special-case sign symbol
292 0 : nVal = -nVal;
293 0 : rOut.append('-');
294 : }
295 :
296 : // the recalculated unit results from (x * nMul)/(nDiv*nFac*10)
297 1269 : long nMul = 1000;
298 1269 : long nDiv = 1;
299 1269 : long nFac = 100;
300 : const sal_Char *pUnit;
301 1269 : switch( eUnit )
302 : {
303 : case FUNIT_100TH_MM:
304 : OSL_ENSURE( FUNIT_MM == eUnit, "Measuring unit not supported" );
305 : case FUNIT_MM:
306 : // 0.01mm = 0.57twip
307 0 : nMul = 25400; // 25.4 * 1000
308 0 : nDiv = 1440; // 72 * 20;
309 0 : nFac = 100;
310 0 : pUnit = sCSS1_UNIT_mm;
311 0 : break;
312 :
313 : case FUNIT_M:
314 : case FUNIT_KM:
315 : OSL_ENSURE( FUNIT_CM == eUnit, "Measuring unit not supported" );
316 : case FUNIT_CM:
317 : // 0.01cm = 5.7twip (not exact, but the UI is also not exact)
318 9 : nMul = 2540; // 2.54 * 1000
319 9 : nDiv = 1440; // 72 * 20;
320 9 : nFac = 100;
321 9 : pUnit = sCSS1_UNIT_cm;
322 9 : break;
323 :
324 : case FUNIT_TWIP:
325 : OSL_ENSURE( FUNIT_POINT == eUnit, "Measuring unit not supported" );
326 : case FUNIT_POINT:
327 : // 0.1pt = 2.0twip (not exact, but the UI is also not exact)
328 0 : nMul = 100;
329 0 : nDiv = 20;
330 0 : nFac = 10;
331 0 : pUnit = sCSS1_UNIT_pt;
332 0 : break;
333 :
334 : case FUNIT_PICA:
335 : // 0.01pc = 2.40twip (not exact, but the UI is also not exact)
336 0 : nMul = 1000;
337 0 : nDiv = 240; // 12 * 20;
338 0 : nFac = 100;
339 0 : pUnit = sCSS1_UNIT_pc;
340 0 : break;
341 :
342 : case FUNIT_NONE:
343 : case FUNIT_FOOT:
344 : case FUNIT_MILE:
345 : case FUNIT_CUSTOM:
346 : case FUNIT_PERCENT:
347 : case FUNIT_INCH:
348 : default:
349 : OSL_ENSURE( FUNIT_INCH == eUnit, "Measuring unit not supported" );
350 : // 0.01in = 14.4twip (not exact, but the UI is also not exact)
351 1260 : nMul = 1000;
352 1260 : nDiv = 1440; // 72 * 20;
353 1260 : nFac = 100;
354 1260 : pUnit = sCSS1_UNIT_inch;
355 1260 : break;
356 : }
357 :
358 1269 : long nLongVal = 0;
359 1269 : bool bOutLongVal = true;
360 1269 : if( nVal > LONG_MAX / nMul )
361 : {
362 : // needs a BigInt to translate this unit
363 : #ifdef SAL_INT64_IS_STRUCT
364 : BigInt nBigVal( nVal );
365 : nBigVal *= nMul;
366 : nBigVal /= nDiv;
367 : nBigVal += 5;
368 : nBigVal /= 10;
369 :
370 : if( nBigVal.IsLong() )
371 : {
372 : // a long is sufficient
373 : nLongVal = (long)nBigVal;
374 : }
375 : else
376 : {
377 : BigInt nBigFac( nFac );
378 : BigInt nBig10( 10 );
379 : rOut += (long)(nBigVal / nBigFac);
380 : if( !(nBigVal % nBigFac).IsZero() )
381 : {
382 : rOut.append('.');
383 : while( nFac > 1 && !(nBigVal % nBigFac).IsZero() )
384 : {
385 : nFac /= 10;
386 : nBigFac = nFac;
387 : rOut.append(OString::number((nBigVal / nBigFac) % nBig10));
388 : }
389 : }
390 : bOutLongVal = false;
391 : }
392 : #else
393 0 : sal_Int64 nBigVal( nVal );
394 0 : nBigVal *= nMul;
395 0 : nBigVal /= nDiv;
396 0 : nBigVal += 5;
397 0 : nBigVal /= 10;
398 :
399 0 : if( nBigVal <= LONG_MAX )
400 : {
401 : // a long is sufficient
402 0 : nLongVal = (long)nBigVal;
403 : }
404 : else
405 : {
406 0 : rOut.append(nBigVal / (sal_Int64)nFac);
407 0 : if( (nBigVal % (sal_Int64)nFac) != 0 )
408 : {
409 0 : rOut.append('.');
410 0 : while( nFac > 1 && (nBigVal % (sal_Int64)nFac) != 0 )
411 : {
412 0 : nFac /= 10;
413 0 : rOut.append((nBigVal / (sal_Int64)nFac) % (sal_Int64)10);
414 : }
415 : }
416 0 : bOutLongVal = false;
417 : }
418 : #endif
419 : }
420 : else
421 : {
422 1269 : nLongVal = nVal * nMul;
423 1269 : nLongVal /= nDiv;
424 1269 : nLongVal += 5;
425 1269 : nLongVal /= 10;
426 : }
427 :
428 1269 : if( bOutLongVal )
429 : {
430 1269 : rOut.append(OString::number(nLongVal/nFac));
431 1269 : if( (nLongVal % nFac) != 0 )
432 : {
433 1262 : rOut.append('.');
434 5047 : while( nFac > 1 && (nLongVal % nFac) != 0 )
435 : {
436 2523 : nFac /= 10;
437 2523 : rOut.append(OString::number((nLongVal / nFac) % 10));
438 : }
439 : }
440 : }
441 :
442 1269 : rOut.append(pUnit);
443 1269 : }
444 :
445 1265 : void SwHTMLWriter::OutCSS1_UnitProperty( const sal_Char *pProp, long nVal )
446 : {
447 1265 : OStringBuffer sOut;
448 1265 : AddUnitPropertyValue(sOut, nVal, eCSS1Unit);
449 1265 : OutCSS1_PropertyAscii(pProp, sOut.makeStringAndClear());
450 1265 : }
451 :
452 0 : void SwHTMLWriter::OutCSS1_PixelProperty( const sal_Char *pProp, long nVal,
453 : sal_Bool bVert )
454 : {
455 0 : OString sOut(OString::number(ToPixel(nVal,bVert)) + sCSS1_UNIT_px);
456 0 : OutCSS1_PropertyAscii(pProp, sOut);
457 0 : }
458 :
459 280 : void SwHTMLWriter::OutCSS1_SfxItemSet( const SfxItemSet& rItemSet,
460 : sal_Bool bDeep )
461 : {
462 : // print ItemSet, including all attributes
463 280 : Out_SfxItemSet( aCSS1AttrFnTab, *this, rItemSet, bDeep );
464 :
465 : // some Attributes require special treatment
466 280 : const SfxPoolItem *pItem = 0;
467 :
468 : // Underline, Overline, CrossedOut and Blink form together a CSS1-Property
469 : // (doesn't work of course for Hints)
470 280 : if( !IsCSS1Source(CSS1_OUTMODE_HINT) )
471 : {
472 280 : const SvxUnderlineItem *pUnderlineItem = 0;
473 280 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_UNDERLINE, bDeep, &pItem ))
474 7 : pUnderlineItem = (const SvxUnderlineItem *)pItem;
475 :
476 280 : const SvxOverlineItem *pOverlineItem = 0;
477 280 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_OVERLINE, bDeep, &pItem ))
478 0 : pOverlineItem = (const SvxOverlineItem *)pItem;
479 :
480 280 : const SvxCrossedOutItem *pCrossedOutItem = 0;
481 280 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_CROSSEDOUT, bDeep, &pItem ))
482 0 : pCrossedOutItem = (const SvxCrossedOutItem *)pItem;
483 :
484 280 : const SvxBlinkItem *pBlinkItem = 0;
485 280 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_BLINK, bDeep, &pItem ))
486 0 : pBlinkItem = (const SvxBlinkItem *)pItem;
487 :
488 280 : if( pUnderlineItem || pOverlineItem || pCrossedOutItem || pBlinkItem )
489 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( *this, pUnderlineItem,
490 : pOverlineItem,
491 : pCrossedOutItem,
492 7 : pBlinkItem );
493 :
494 280 : OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, bDeep );
495 : }
496 :
497 280 : if( !bFirstCSS1Property )
498 : {
499 : // if a Property was exported as part of a Style-Option,
500 : // the Option still needs to be finished
501 228 : OStringBuffer sOut;
502 228 : switch( nCSS1OutMode & CSS1_OUTMODE_ANY_OFF )
503 : {
504 : case CSS1_OUTMODE_SPAN_TAG_OFF:
505 0 : sOut.append(sCSS1_span_tag_end);
506 0 : break;
507 :
508 : case CSS1_OUTMODE_STYLE_OPT_OFF:
509 214 : sOut.append(cCSS1_style_opt_end);
510 214 : break;
511 :
512 : case CSS1_OUTMODE_RULE_OFF:
513 14 : sOut.append(sCSS1_rule_end);
514 14 : break;
515 : }
516 228 : if (!sOut.isEmpty())
517 228 : Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
518 : }
519 280 : }
520 :
521 5 : void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc, sal_Bool bUsed )
522 : {
523 5 : bFirstCSS1Rule = sal_True;
524 :
525 : // Feature: PrintExt
526 5 : if( IsHTMLMode(HTMLMODE_PRINT_EXT) )
527 : {
528 5 : const SwPageDesc *pFirstPageDesc = 0;
529 5 : sal_uInt16 nFirstRefPoolId = RES_POOLPAGE_HTML;
530 5 : bCSS1IgnoreFirstPageDesc = sal_True;
531 :
532 : // First we try to guess how the document is constructed.
533 : // Allowed are only the templates: HTML, 1st page, left page, and right page.
534 : // A first page is only exported, if it matches the template "1st page".
535 : // Left and right pages are only exported, if their templates are linked.
536 : // If other templates are used, only very simple cases are exported.
537 5 : const SwPageDesc *pPageDesc = &rPageDesc;
538 5 : const SwPageDesc *pFollow = rPageDesc.GetFollow();
539 10 : if( RES_POOLPAGE_FIRST == pPageDesc->GetPoolFmtId() &&
540 5 : pFollow != pPageDesc &&
541 0 : !IsPoolUserFmt( pFollow->GetPoolFmtId() ) )
542 : {
543 : // the document has a first page
544 0 : pFirstPageDesc = pPageDesc;
545 0 : pPageDesc = pFollow;
546 0 : pFollow = pPageDesc->GetFollow();
547 : }
548 :
549 5 : IDocumentStylePoolAccess* pStylePoolAccess = getIDocumentStylePoolAccess();
550 5 : if( pPageDesc == pFollow )
551 : {
552 : // The document is one-sided; no matter what page, we do not create a 2-sided doc.
553 : // The attribute is exported relative to the HTML page template.
554 : OutCSS1_SwPageDesc( *this, *pPageDesc, pStylePoolAccess, pTemplate,
555 5 : RES_POOLPAGE_HTML, true, false );
556 5 : nFirstRefPoolId = pFollow->GetPoolFmtId();
557 : }
558 0 : else if( (RES_POOLPAGE_LEFT == pPageDesc->GetPoolFmtId() &&
559 0 : RES_POOLPAGE_RIGHT == pFollow->GetPoolFmtId()) ||
560 0 : (RES_POOLPAGE_RIGHT == pPageDesc->GetPoolFmtId() &&
561 0 : RES_POOLPAGE_LEFT == pFollow->GetPoolFmtId()) )
562 : {
563 : // the document is double-sided
564 : OutCSS1_SwPageDesc( *this, *pPageDesc, pStylePoolAccess, pTemplate,
565 0 : RES_POOLPAGE_HTML, true );
566 : OutCSS1_SwPageDesc( *this, *pFollow, pStylePoolAccess, pTemplate,
567 0 : RES_POOLPAGE_HTML, true );
568 0 : nFirstRefPoolId = RES_POOLPAGE_RIGHT;
569 0 : bCSS1IgnoreFirstPageDesc = sal_False;
570 : }
571 : // other cases we miss
572 :
573 5 : if( pFirstPageDesc )
574 : OutCSS1_SwPageDesc( *this, *pFirstPageDesc, pStylePoolAccess, pTemplate,
575 0 : nFirstRefPoolId, false );
576 : }
577 : // /Feature: PrintExt
578 :
579 : // The text body style has to be exported always (if it is changed compared
580 : // to the template), because it is used as reference for any style
581 : // that maps to <P>, and that's especially the standard style
582 5 : getIDocumentStylePoolAccess()->GetTxtCollFromPool( RES_POOLCOLL_TEXT, false );
583 :
584 : // the Default-TextStyle is not also exported !!
585 : // 0-Style is the Default; is never exported !!
586 5 : sal_uInt16 nArrLen = pDoc->GetTxtFmtColls()->size();
587 : sal_uInt16 i;
588 :
589 53 : for( i = 1; i < nArrLen; i++ )
590 : {
591 48 : const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[i];
592 48 : sal_uInt16 nPoolId = pColl->GetPoolFmtId();
593 91 : if( !bUsed || nPoolId == RES_POOLCOLL_TEXT ||
594 43 : pDoc->IsUsed( *pColl ) )
595 11 : OutCSS1_SwFmt( *this, *pColl, pDoc, pTemplate );
596 : }
597 :
598 : // the Default-TextStyle is not also exported !!
599 5 : nArrLen = pDoc->GetCharFmts()->size();
600 20 : for( i=1; i<nArrLen; i++ )
601 : {
602 15 : const SwCharFmt *pCFmt = (*pDoc->GetCharFmts())[i];
603 15 : sal_uInt16 nPoolId = pCFmt->GetPoolFmtId();
604 30 : if( !bUsed || nPoolId == RES_POOLCHR_INET_NORMAL ||
605 28 : nPoolId == RES_POOLCHR_INET_VISIT ||
606 13 : pDoc->IsUsed( *pCFmt ) )
607 2 : OutCSS1_SwFmt( *this, *pCFmt, pDoc, pTemplate );
608 : }
609 :
610 5 : const SwFtnIdxs& rIdxs = pDoc->GetFtnIdxs();
611 5 : nArrLen = rIdxs.size();
612 5 : sal_uInt16 nEnd = 0, nFtn = 0;
613 5 : for( i=0; i < nArrLen; i++ )
614 : {
615 0 : if( rIdxs[i]->GetFtn().IsEndNote() )
616 0 : nEnd++;
617 : else
618 0 : nFtn++;
619 : }
620 5 : OutCSS1_SwFtnInfo( *this, pDoc->GetFtnInfo(), pDoc, nFtn, false );
621 5 : OutCSS1_SwFtnInfo( *this, pDoc->GetEndNoteInfo(), pDoc, nEnd, true );
622 :
623 5 : if( !bFirstCSS1Rule )
624 : {
625 4 : DecIndentLevel();
626 :
627 4 : OutNewLine();
628 4 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_style, false );
629 : }
630 : else
631 : {
632 1 : bFirstCSS1Rule = sal_False;
633 : }
634 :
635 5 : nDfltTopMargin = 0;
636 5 : nDfltBottomMargin = 0;
637 5 : }
638 :
639 : // if pPseudo is set, Styles-Sheets will be exported;
640 : // otherwise we only search for Token and Class for a Format
641 19 : sal_uInt16 SwHTMLWriter::GetCSS1Selector( const SwFmt *pFmt, OString& rToken,
642 : OUString& rClass, sal_uInt16& rRefPoolId,
643 : OUString *pPseudo )
644 : {
645 19 : sal_uInt16 nDeep = 0;
646 19 : rToken = OString();
647 19 : rClass = "";
648 19 : rRefPoolId = 0;
649 19 : if( pPseudo )
650 13 : *pPseudo = "";
651 :
652 19 : sal_Bool bChrFmt = RES_CHRFMT==pFmt->Which();
653 :
654 : // search formats above for the nearest standard or HTML-Tag template
655 19 : const SwFmt *pPFmt = pFmt;
656 42 : while( pPFmt && !pPFmt->IsDefault() )
657 : {
658 21 : bool bStop = false;
659 21 : sal_uInt16 nPoolId = pPFmt->GetPoolFmtId();
660 21 : if( USER_FMT & nPoolId )
661 : {
662 : // user templates
663 2 : const OUString aNm(pPFmt->GetName());
664 :
665 2 : if (!bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_blockquote)
666 : {
667 0 : rRefPoolId = RES_POOLCOLL_HTML_BLOCKQUOTE;
668 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_blockquote);
669 : }
670 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_citiation)
671 : {
672 0 : rRefPoolId = RES_POOLCHR_HTML_CITIATION;
673 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_citiation);
674 : }
675 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_code)
676 : {
677 0 : rRefPoolId = RES_POOLCHR_HTML_CODE;
678 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_code);
679 : }
680 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_definstance)
681 : {
682 0 : rRefPoolId = RES_POOLCHR_HTML_DEFINSTANCE;
683 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_definstance);
684 : }
685 4 : else if (!bChrFmt && (aNm == OOO_STRING_SVTOOLS_HTML_dd ||
686 2 : aNm == OOO_STRING_SVTOOLS_HTML_dt))
687 : {
688 0 : sal_uInt16 nDefListLvl = GetDefListLvl(aNm, nPoolId);
689 : // Export the templates DD 1/DT 1,
690 : // but none of their derived templates,
691 : // also not DD 2/DT 2 etc.
692 0 : if (nDefListLvl)
693 : {
694 0 : if (pPseudo && (nDeep || (nDefListLvl & 0x0fff) > 1))
695 : {
696 0 : bStop = true;
697 : }
698 0 : else if (nDefListLvl & HTML_DLCOLL_DD)
699 : {
700 0 : rRefPoolId = RES_POOLCOLL_HTML_DD;
701 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_dd);
702 : }
703 : else
704 : {
705 0 : rRefPoolId = RES_POOLCOLL_HTML_DT;
706 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_dt);
707 : }
708 : }
709 : }
710 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_emphasis)
711 : {
712 0 : rRefPoolId = RES_POOLCHR_HTML_EMPHASIS;
713 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_emphasis);
714 : }
715 2 : else if (!bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_horzrule)
716 : {
717 : // do not export HR !
718 0 : bStop = (nDeep==0);
719 : }
720 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_keyboard)
721 : {
722 0 : rRefPoolId = RES_POOLCHR_HTML_KEYBOARD;
723 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_keyboard);
724 : }
725 2 : else if (!bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_listing)
726 : {
727 : // Export Listings as PRE or PRE-derived template
728 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
729 0 : rRefPoolId = RES_POOLCOLL_HTML_PRE;
730 0 : nDeep = CSS1_FMT_CMPREF;
731 : }
732 2 : else if (!bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_preformtxt)
733 : {
734 0 : rRefPoolId = RES_POOLCOLL_HTML_PRE;
735 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
736 : }
737 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_sample)
738 : {
739 0 : rRefPoolId = RES_POOLCHR_HTML_SAMPLE;
740 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_sample);
741 : }
742 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_strong)
743 : {
744 0 : rRefPoolId = RES_POOLCHR_HTML_STRONG;
745 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_strong);
746 : }
747 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_teletype)
748 : {
749 0 : rRefPoolId = RES_POOLCHR_HTML_TELETYPE;
750 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_teletype);
751 : }
752 2 : else if (bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_variable)
753 : {
754 0 : rRefPoolId = RES_POOLCHR_HTML_VARIABLE;
755 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_variable);
756 : }
757 2 : else if (!bChrFmt && aNm == OOO_STRING_SVTOOLS_HTML_xmp)
758 : {
759 : // export XMP as PRE (but not the template as Style)
760 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
761 0 : rRefPoolId = RES_POOLCOLL_HTML_PRE;
762 0 : nDeep = CSS1_FMT_CMPREF;
763 : }
764 :
765 : // if a PoolId is set, the Name of the template is that of the related Token
766 : OSL_ENSURE( (rRefPoolId != 0) == (!rToken.isEmpty()),
767 2 : "Token missing" );
768 : }
769 : else
770 : {
771 : // Pool templates
772 19 : switch( nPoolId )
773 : {
774 : // paragraph templates
775 : case RES_POOLCOLL_HEADLINE_BASE:
776 : case RES_POOLCOLL_STANDARD:
777 : // do not export this template
778 11 : bStop = (nDeep==0);
779 11 : break;
780 : case RES_POOLCOLL_TEXT:
781 6 : rToken = OString(OOO_STRING_SVTOOLS_HTML_parabreak);
782 6 : break;
783 : case RES_POOLCOLL_HEADLINE1:
784 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_head1);
785 0 : break;
786 : case RES_POOLCOLL_HEADLINE2:
787 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_head2);
788 0 : break;
789 : case RES_POOLCOLL_HEADLINE3:
790 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_head3);
791 0 : break;
792 : case RES_POOLCOLL_HEADLINE4:
793 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_head4);
794 0 : break;
795 : case RES_POOLCOLL_HEADLINE5:
796 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_head5);
797 0 : break;
798 : case RES_POOLCOLL_HEADLINE6:
799 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_head6);
800 0 : break;
801 : case RES_POOLCOLL_SENDADRESS:
802 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_address);
803 0 : break;
804 : case RES_POOLCOLL_HTML_BLOCKQUOTE:
805 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_blockquote);
806 0 : break;
807 : case RES_POOLCOLL_HTML_PRE:
808 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
809 0 : break;
810 :
811 : case RES_POOLCOLL_HTML_DD:
812 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_dd);
813 0 : break;
814 : case RES_POOLCOLL_HTML_DT:
815 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_dt);
816 0 : break;
817 :
818 : case RES_POOLCOLL_TABLE:
819 0 : if( pPseudo )
820 : {
821 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_tabledata) + " " +
822 0 : OString(OOO_STRING_SVTOOLS_HTML_parabreak);
823 : }
824 : else
825 0 : rToken = OOO_STRING_SVTOOLS_HTML_parabreak;
826 0 : break;
827 : case RES_POOLCOLL_TABLE_HDLN:
828 0 : if( pPseudo )
829 : {
830 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_tableheader) + " " +
831 0 : OString(OOO_STRING_SVTOOLS_HTML_parabreak);
832 : }
833 : else
834 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_parabreak);
835 0 : break;
836 : case RES_POOLCOLL_HTML_HR:
837 : // do not exort HR !
838 0 : bStop = (nDeep==0);
839 0 : break;
840 : case RES_POOLCOLL_FOOTNOTE:
841 0 : if( !nDeep )
842 : {
843 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_parabreak);
844 0 : rClass = OOO_STRING_SVTOOLS_HTML_sdfootnote;
845 0 : rRefPoolId = RES_POOLCOLL_TEXT;
846 0 : nDeep = CSS1_FMT_CMPREF;
847 : }
848 0 : break;
849 : case RES_POOLCOLL_ENDNOTE:
850 0 : if( !nDeep )
851 : {
852 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_parabreak);
853 0 : rClass = OOO_STRING_SVTOOLS_HTML_sdendnote;
854 0 : rRefPoolId = RES_POOLCOLL_TEXT;
855 0 : nDeep = CSS1_FMT_CMPREF;
856 : }
857 0 : break;
858 :
859 : // character templates
860 : case RES_POOLCHR_HTML_EMPHASIS:
861 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_emphasis);
862 0 : break;
863 : case RES_POOLCHR_HTML_CITIATION:
864 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_citiation);
865 0 : break;
866 : case RES_POOLCHR_HTML_STRONG:
867 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_strong);
868 0 : break;
869 : case RES_POOLCHR_HTML_CODE:
870 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_code);
871 0 : break;
872 : case RES_POOLCHR_HTML_SAMPLE:
873 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_sample);
874 0 : break;
875 : case RES_POOLCHR_HTML_KEYBOARD:
876 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_keyboard);
877 0 : break;
878 : case RES_POOLCHR_HTML_VARIABLE:
879 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_variable);
880 0 : break;
881 : case RES_POOLCHR_HTML_DEFINSTANCE:
882 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_definstance);
883 0 : break;
884 : case RES_POOLCHR_HTML_TELETYPE:
885 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_teletype);
886 0 : break;
887 :
888 : case RES_POOLCHR_INET_NORMAL:
889 2 : if( pPseudo )
890 : {
891 2 : rToken = OString(OOO_STRING_SVTOOLS_HTML_anchor);
892 2 : *pPseudo = OStringToOUString( sCSS1_link, RTL_TEXTENCODING_ASCII_US );
893 : }
894 2 : break;
895 : case RES_POOLCHR_INET_VISIT:
896 0 : if( pPseudo )
897 : {
898 0 : rToken = OString(OOO_STRING_SVTOOLS_HTML_anchor);
899 0 : *pPseudo = OStringToOUString( sCSS1_visited, RTL_TEXTENCODING_ASCII_US );
900 : }
901 0 : break;
902 : }
903 :
904 : // if a token is set, PoolId contains the related template
905 19 : if( !rToken.isEmpty() && !rRefPoolId )
906 8 : rRefPoolId = nPoolId;
907 : }
908 :
909 21 : if( !rToken.isEmpty() || bStop )
910 : {
911 : // stop if a HTML-Tag template was found
912 17 : break;
913 : }
914 : else
915 : {
916 : // continue otherwise
917 4 : nDeep++;
918 4 : pPFmt = pPFmt->DerivedFrom();
919 : }
920 : }
921 :
922 19 : if( !rToken.isEmpty() )
923 : {
924 : // this is a HTML-Tag template
925 8 : if( !nDeep )
926 8 : nDeep = CSS1_FMT_ISTAG;
927 : }
928 : else
929 : {
930 : // this is not a HTML-Tag template nor derived from one
931 11 : nDeep = 0;
932 : }
933 19 : if( nDeep > 0 && nDeep < CSS1_FMT_SPECIAL )
934 : {
935 : // If the template is derived from a HTML template,
936 : // we export it as <TOKEN>.<CLASS>, otherwise as .<CLASS>.
937 : // <CLASS> is the name of the template after removing all characters
938 : // before and including the first '.'
939 0 : rClass = pFmt->GetName();
940 0 : sal_Int32 nPos = rClass.indexOf( '.' );
941 0 : if( nPos >= 0 && rClass.getLength() > nPos+1 )
942 : {
943 0 : rClass = rClass.replaceAt( 0, nPos+1, "" );
944 : }
945 :
946 0 : rClass = GetAppCharClass().lowercase( rClass );
947 0 : rClass = rClass.replaceAll( ".", "-" );
948 0 : rClass = rClass.replaceAll( " ", "-" );
949 0 : rClass = rClass.replaceAll( "_", "-" );
950 : }
951 :
952 19 : return nDeep;
953 : }
954 :
955 13 : static sal_uInt16 GetCSS1Selector( const SwFmt *pFmt, OUString& rSelector,
956 : sal_uInt16& rRefPoolId )
957 : {
958 13 : OString aToken;
959 26 : OUString aClass;
960 26 : OUString aPseudo;
961 :
962 : sal_uInt16 nDeep = SwHTMLWriter::GetCSS1Selector( pFmt, aToken, aClass,
963 13 : rRefPoolId, &aPseudo );
964 13 : if( nDeep )
965 : {
966 7 : if( !aToken.isEmpty() )
967 7 : rSelector = OStringToOUString(aToken, RTL_TEXTENCODING_ASCII_US);
968 : else
969 0 : rSelector = "";
970 :
971 7 : if( !aClass.isEmpty() )
972 0 : rSelector += "." + aClass;
973 7 : if( !aPseudo.isEmpty() )
974 2 : rSelector += ":" + aPseudo;
975 : }
976 :
977 26 : return nDeep;
978 : }
979 :
980 22 : const SwFmt *SwHTMLWriter::GetTemplateFmt( sal_uInt16 nPoolFmtId,
981 : IDocumentStylePoolAccess* pTemplate /*SwDoc *pTemplate*/)
982 : {
983 22 : const SwFmt *pRefFmt = 0;
984 :
985 22 : if( pTemplate )
986 : {
987 : OSL_ENSURE( !(USER_FMT & nPoolFmtId),
988 : "No user templates found" );
989 22 : if( POOLGRP_NOCOLLID & nPoolFmtId )
990 12 : pRefFmt = pTemplate->GetCharFmtFromPool( nPoolFmtId );
991 : else
992 10 : pRefFmt = pTemplate->GetTxtCollFromPool( nPoolFmtId, false );
993 : }
994 :
995 22 : return pRefFmt;
996 : }
997 :
998 0 : const SwFmt *SwHTMLWriter::GetParentFmt( const SwFmt& rFmt, sal_uInt16 nDeep )
999 : {
1000 : OSL_ENSURE( nDeep != USHRT_MAX, "Called GetParent for HTML-template!" );
1001 0 : const SwFmt *pRefFmt = 0;
1002 :
1003 0 : if( nDeep > 0 )
1004 : {
1005 : // get the pointer for the HTML-Tag template, from which the template is derived
1006 0 : pRefFmt = &rFmt;
1007 0 : for( sal_uInt16 i=nDeep; i>0; i-- )
1008 0 : pRefFmt = pRefFmt->DerivedFrom();
1009 :
1010 0 : if( pRefFmt && pRefFmt->IsDefault() )
1011 0 : pRefFmt = 0;
1012 : }
1013 :
1014 0 : return pRefFmt;
1015 : }
1016 :
1017 2 : bool swhtml_css1atr_equalFontItems( const SfxPoolItem& r1, const SfxPoolItem& r2 )
1018 : {
1019 2 : return ((const SvxFontItem &)r1).GetFamilyName() ==
1020 4 : ((const SvxFontItem &)r2).GetFamilyName() &&
1021 0 : ((const SvxFontItem &)r1).GetFamily() ==
1022 2 : ((const SvxFontItem &)r2).GetFamily();
1023 : }
1024 :
1025 27 : void SwHTMLWriter::SubtractItemSet( SfxItemSet& rItemSet,
1026 : const SfxItemSet& rRefItemSet,
1027 : sal_Bool bSetDefaults,
1028 : sal_Bool bClearSame,
1029 : const SfxItemSet *pRefScriptItemSet )
1030 : {
1031 : OSL_ENSURE( bSetDefaults || bClearSame,
1032 : "SwHTMLWriter::SubtractItemSet: No action for this Flag" );
1033 27 : SfxItemSet aRefItemSet( *rRefItemSet.GetPool(), rRefItemSet.GetRanges() );
1034 27 : aRefItemSet.Set( rRefItemSet );
1035 :
1036 : // compare with the Attr-Set of the template
1037 54 : SfxWhichIter aIter( rItemSet );
1038 27 : sal_uInt16 nWhich = aIter.FirstWhich();
1039 1896 : while( nWhich )
1040 : {
1041 : const SfxPoolItem *pRefItem, *pItem;
1042 : bool bItemSet = ( SFX_ITEM_SET ==
1043 1842 : rItemSet.GetItemState( nWhich, false, &pItem) );
1044 : bool bRefItemSet;
1045 :
1046 1842 : if( pRefScriptItemSet )
1047 : {
1048 0 : switch( nWhich )
1049 : {
1050 : case RES_CHRATR_FONT:
1051 : case RES_CHRATR_FONTSIZE:
1052 : case RES_CHRATR_LANGUAGE:
1053 : case RES_CHRATR_POSTURE:
1054 : case RES_CHRATR_WEIGHT:
1055 : case RES_CHRATR_CJK_FONT:
1056 : case RES_CHRATR_CJK_FONTSIZE:
1057 : case RES_CHRATR_CJK_LANGUAGE:
1058 : case RES_CHRATR_CJK_POSTURE:
1059 : case RES_CHRATR_CJK_WEIGHT:
1060 : case RES_CHRATR_CTL_FONT:
1061 : case RES_CHRATR_CTL_FONTSIZE:
1062 : case RES_CHRATR_CTL_LANGUAGE:
1063 : case RES_CHRATR_CTL_POSTURE:
1064 : case RES_CHRATR_CTL_WEIGHT:
1065 : bRefItemSet = ( SFX_ITEM_SET ==
1066 0 : pRefScriptItemSet->GetItemState( nWhich, true, &pRefItem) );
1067 0 : break;
1068 : default:
1069 : bRefItemSet = ( SFX_ITEM_SET ==
1070 0 : aRefItemSet.GetItemState( nWhich, false, &pRefItem) );
1071 0 : break;
1072 : }
1073 : }
1074 : else
1075 : {
1076 : bRefItemSet = ( SFX_ITEM_SET ==
1077 1842 : aRefItemSet.GetItemState( nWhich, false, &pRefItem) );
1078 : }
1079 :
1080 1842 : if( bItemSet )
1081 : {
1082 280 : if( (bClearSame || pRefScriptItemSet) && bRefItemSet &&
1083 91 : ( *pItem == *pRefItem ||
1084 10 : ((RES_CHRATR_FONT == nWhich ||
1085 10 : RES_CHRATR_CJK_FONT == nWhich ||
1086 0 : RES_CHRATR_CTL_FONT == nWhich) &&
1087 0 : swhtml_css1atr_equalFontItems( *pItem, *pRefItem )) ) )
1088 : {
1089 : // the Attribute is in both templates wit the same value
1090 : // and does not need to be exported
1091 71 : rItemSet.ClearItem( nWhich );
1092 : }
1093 : }
1094 : else
1095 : {
1096 1714 : if( (bSetDefaults || pRefScriptItemSet) && bRefItemSet )
1097 : {
1098 : // the Attribute exists only in the reference; the default
1099 : // might have to be exported
1100 10 : rItemSet.Put( rItemSet.GetPool()->GetDefaultItem(nWhich) );
1101 : }
1102 : }
1103 :
1104 1842 : nWhich = aIter.NextWhich();
1105 27 : }
1106 27 : }
1107 :
1108 8 : void SwHTMLWriter::PrepareFontList( const SvxFontItem& rFontItem,
1109 : OUString& rNames,
1110 : sal_Unicode cQuote, sal_Bool bGeneric )
1111 : {
1112 8 : rNames = aEmptyOUStr;
1113 8 : const OUString& rName = rFontItem.GetFamilyName();
1114 8 : sal_Bool bContainsKeyword = sal_False;
1115 8 : if( !rName.isEmpty() )
1116 : {
1117 6 : sal_Int32 nStrPos = 0;
1118 18 : while( nStrPos != -1 )
1119 : {
1120 6 : OUString aName = rName.getToken( 0, ';', nStrPos );
1121 6 : aName = comphelper::string::strip(aName, ' ');
1122 6 : if( aName.isEmpty() )
1123 0 : continue;
1124 :
1125 6 : sal_Bool bIsKeyword = sal_False;
1126 6 : switch( aName[0] )
1127 : {
1128 : case 'c':
1129 : case 'C':
1130 2 : bIsKeyword = aName.equalsIgnoreAsciiCaseAscii( sCSS1_PV_cursive );
1131 2 : break;
1132 :
1133 : case 'f':
1134 : case 'F':
1135 0 : bIsKeyword = aName.equalsIgnoreAsciiCaseAscii( sCSS1_PV_fantasy );
1136 0 : break;
1137 :
1138 : case 'm':
1139 : case 'M':
1140 0 : bIsKeyword = aName.equalsIgnoreAsciiCaseAscii( sCSS1_PV_monospace );
1141 0 : break;
1142 :
1143 : case 's':
1144 : case 'S':
1145 : bIsKeyword =
1146 0 : aName.equalsIgnoreAsciiCaseAscii( sCSS1_PV_serif ) ||
1147 0 : aName.equalsIgnoreAsciiCaseAscii( sCSS1_PV_sans_serif );
1148 0 : break;
1149 : }
1150 :
1151 6 : bContainsKeyword |= bIsKeyword;
1152 :
1153 6 : if( !rNames.isEmpty() )
1154 0 : rNames += ", ";
1155 6 : if( cQuote && !bIsKeyword )
1156 5 : rNames += OUString( cQuote );
1157 6 : rNames += aName;
1158 6 : if( cQuote && !bIsKeyword )
1159 5 : rNames += OUString( cQuote );
1160 6 : }
1161 : }
1162 :
1163 8 : if( !bContainsKeyword && bGeneric )
1164 : {
1165 8 : const sal_Char *pStr = 0;
1166 8 : switch( rFontItem.GetFamily() )
1167 : {
1168 3 : case FAMILY_ROMAN: pStr = sCSS1_PV_serif; break;
1169 0 : case FAMILY_SWISS: pStr = sCSS1_PV_sans_serif; break;
1170 0 : case FAMILY_SCRIPT: pStr = sCSS1_PV_cursive; break;
1171 0 : case FAMILY_DECORATIVE: pStr = sCSS1_PV_fantasy; break;
1172 0 : case FAMILY_MODERN: pStr = sCSS1_PV_monospace; break;
1173 : default:
1174 : ;
1175 : }
1176 :
1177 8 : if( pStr )
1178 : {
1179 3 : if( !rNames.isEmpty() )
1180 3 : rNames += ", ";
1181 3 : rNames += OStringToOUString( pStr, RTL_TEXTENCODING_ASCII_US );
1182 : }
1183 : }
1184 8 : }
1185 :
1186 5 : sal_Bool SwHTMLWriter::HasScriptDependentItems( const SfxItemSet& rItemSet,
1187 : sal_Bool bCheckDropCap )
1188 : {
1189 : static const sal_uInt16 aWhichIds[] =
1190 : {
1191 : RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT,
1192 : RES_CHRATR_FONTSIZE, RES_CHRATR_CJK_FONTSIZE, RES_CHRATR_CTL_FONTSIZE,
1193 : RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
1194 : RES_CHRATR_POSTURE, RES_CHRATR_CJK_POSTURE, RES_CHRATR_CTL_POSTURE,
1195 : RES_CHRATR_WEIGHT, RES_CHRATR_CJK_WEIGHT, RES_CHRATR_CTL_WEIGHT,
1196 : 0, 0, 0
1197 : };
1198 :
1199 30 : for( sal_uInt16 i=0; aWhichIds[i]; i += 3 )
1200 : {
1201 13 : const SfxPoolItem *pItem = 0, *pItemCJK = 0, *pItemCTL = 0, *pTmp;
1202 13 : sal_uInt16 nItemCount = 0;
1203 26 : if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i], false,
1204 13 : &pTmp ) )
1205 : {
1206 2 : pItem = pTmp;
1207 2 : nItemCount++;
1208 : }
1209 26 : if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i+1], false,
1210 13 : &pTmp ) )
1211 : {
1212 2 : pItemCJK = pTmp;
1213 2 : nItemCount++;
1214 : }
1215 26 : if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i+2], false,
1216 13 : &pTmp ) )
1217 : {
1218 3 : pItemCTL = pTmp;
1219 3 : nItemCount++;
1220 : }
1221 :
1222 : // If some of the items are set, but not all, we need script dependent
1223 : // styles
1224 13 : if( nItemCount > 0 && nItemCount < 3 )
1225 4 : return sal_True;
1226 :
1227 12 : if( 3 == nItemCount )
1228 : {
1229 : // If all items are set, but some of them have different values,
1230 : // we need script dependent styles, too. For font items, we have
1231 : // to take care about their special HTML/CSS1 representation.
1232 2 : if( RES_CHRATR_FONT == aWhichIds[i] )
1233 : {
1234 4 : if( !swhtml_css1atr_equalFontItems( *pItem, *pItemCJK ) ||
1235 2 : !swhtml_css1atr_equalFontItems( *pItem, *pItemCTL ) ||
1236 0 : !swhtml_css1atr_equalFontItems( *pItemCJK, *pItemCTL ) )
1237 2 : return sal_True;
1238 : }
1239 : else
1240 : {
1241 0 : if( !( *pItem == *pItemCJK ) ||
1242 0 : !( *pItem == *pItemCTL ) ||
1243 0 : !( *pItemCJK == *pItemCTL ) )
1244 0 : return sal_True;
1245 : }
1246 : }
1247 : }
1248 :
1249 : const SfxPoolItem *pItem;
1250 2 : if( bCheckDropCap &&
1251 : SFX_ITEM_SET == rItemSet.GetItemState( RES_PARATR_DROP, true,
1252 0 : &pItem ) )
1253 : {
1254 0 : const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;
1255 0 : const SwCharFmt *pDCCharFmt = pDrop->GetCharFmt();
1256 0 : if( pDCCharFmt )
1257 : {
1258 : //sequence of (start, end) property ranges we want to
1259 : //query
1260 0 : SfxItemSet aTstItemSet( *pDCCharFmt->GetAttrSet().GetPool(),
1261 : RES_CHRATR_FONT, RES_CHRATR_FONT,
1262 : RES_CHRATR_POSTURE, RES_CHRATR_POSTURE,
1263 : RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
1264 : RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT,
1265 : RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT,
1266 : RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT,
1267 : RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT,
1268 0 : 0 );
1269 0 : aTstItemSet.Set( pDCCharFmt->GetAttrSet(), true );
1270 0 : return HasScriptDependentItems( aTstItemSet, sal_False );
1271 : }
1272 : }
1273 :
1274 2 : return sal_False;
1275 : }
1276 :
1277 5 : static bool OutCSS1Rule( SwHTMLWriter& rHTMLWrt, const OUString& rSelector,
1278 : const SfxItemSet& rItemSet, sal_Bool bHasClass,
1279 : bool bCheckForPseudo )
1280 : {
1281 5 : bool bScriptDependent = false;
1282 5 : if( SwHTMLWriter::HasScriptDependentItems( rItemSet, bHasClass ) )
1283 : {
1284 3 : bScriptDependent = true;
1285 3 : OUString aSelector( rSelector );
1286 :
1287 6 : OUString aPseudo;
1288 3 : if( bCheckForPseudo )
1289 : {
1290 0 : sal_Int32 nPos = aSelector.lastIndexOf( ':' );
1291 0 : if( nPos >= 0 )
1292 : {
1293 0 : aPseudo = aSelector.copy( nPos );
1294 0 : aSelector =aSelector.copy( 0, nPos );
1295 : }
1296 : }
1297 :
1298 3 : if( !bHasClass )
1299 : {
1300 : // If we are exporting styles for a tag we have to export a tag
1301 : // rule for all properties that aren't style dependent and
1302 : // some class rule for the additional style dependen properties
1303 : {
1304 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_NO_SCRIPT|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1305 3 : true, &rSelector );
1306 3 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1307 : }
1308 :
1309 : //sequence of (start, end) property ranges we want to
1310 : //query
1311 3 : SfxItemSet aScriptItemSet( *rItemSet.GetPool(),
1312 : RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
1313 : RES_CHRATR_LANGUAGE, RES_CHRATR_POSTURE,
1314 : RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
1315 : RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
1316 3 : 0 );
1317 3 : aScriptItemSet.Put( rItemSet );
1318 :
1319 6 : OUString aNewSelector( aSelector );
1320 3 : aNewSelector += ".western" + aPseudo;
1321 : {
1322 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1323 3 : true, &aNewSelector );
1324 3 : rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False );
1325 : }
1326 :
1327 3 : aNewSelector = aSelector + ".cjk" + aPseudo;
1328 : {
1329 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1330 3 : true, &aNewSelector );
1331 3 : rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False );
1332 : }
1333 :
1334 3 : aNewSelector = aSelector + ".ctl" + aPseudo;
1335 : {
1336 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1337 3 : true, &aNewSelector );
1338 3 : rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False );
1339 3 : }
1340 : }
1341 : else
1342 : {
1343 : // If ther are script dependencies and we are derived from a tag,
1344 : // when we have to export a style dependent class for all
1345 : // scripts
1346 0 : OUString aNewSelector( aSelector );
1347 0 : aNewSelector += "-western" + aPseudo;
1348 : {
1349 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1350 0 : true, &aNewSelector );
1351 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1352 : }
1353 :
1354 0 : aNewSelector = aSelector + "-cjk" + aPseudo;
1355 : {
1356 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1357 0 : true, &aNewSelector );
1358 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1359 : }
1360 :
1361 0 : aNewSelector = aSelector + "-ctl" + aPseudo;
1362 : {
1363 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1364 0 : true, &aNewSelector );
1365 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1366 0 : }
1367 3 : }
1368 : }
1369 : else
1370 : {
1371 : // If there are no script dependencies, when all items are
1372 : // exported in one step. For hyperlinks only, a script information
1373 : // must be there, because these two chr formats don't support
1374 : // script dependencies by now.
1375 : SwCSS1OutMode aMode( rHTMLWrt,
1376 : rHTMLWrt.nCSS1Script|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1377 2 : true, &rSelector );
1378 2 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1379 : }
1380 :
1381 5 : return bScriptDependent;
1382 : }
1383 :
1384 0 : static void OutCSS1DropCapRule(
1385 : SwHTMLWriter& rHTMLWrt, const OUString& rSelector,
1386 : const SwFmtDrop& rDrop, sal_Bool bHasClass,
1387 : bool bHasScriptDependencies )
1388 : {
1389 0 : const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
1390 0 : if( (bHasScriptDependencies && bHasClass) ||
1391 0 : (pDCCharFmt && SwHTMLWriter::HasScriptDependentItems( pDCCharFmt->GetAttrSet(), sal_False ) ) )
1392 : {
1393 0 : OUString aSelector( rSelector );
1394 :
1395 0 : OUString aPseudo;
1396 0 : sal_Int32 nPos = aSelector.lastIndexOf( ':' );
1397 0 : if( nPos >= 0 )
1398 : {
1399 0 : aPseudo = aSelector.copy( nPos );
1400 0 : aSelector = aSelector.copy( 0, nPos );
1401 : }
1402 :
1403 0 : if( !bHasClass )
1404 : {
1405 : // If we are exporting styles for a tag we have to export a tag
1406 : // rule for all properties that aren't style dependent and
1407 : // some class rule for the additional style dependen properties
1408 : {
1409 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_NO_SCRIPT|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1410 0 : true, &rSelector );
1411 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1412 : }
1413 :
1414 0 : SfxItemSet aScriptItemSet( rHTMLWrt.pDoc->GetAttrPool(),
1415 : RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
1416 : RES_CHRATR_LANGUAGE, RES_CHRATR_POSTURE,
1417 : RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
1418 : RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
1419 0 : 0 );
1420 0 : if( pDCCharFmt )
1421 0 : aScriptItemSet.Set( pDCCharFmt->GetAttrSet(), true );
1422 :
1423 0 : OUString aNewSelector( aSelector );
1424 0 : aNewSelector += ".western" + aPseudo;
1425 : {
1426 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1427 0 : true, &aNewSelector );
1428 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
1429 : }
1430 :
1431 0 : aNewSelector = aSelector + ".cjk" + aPseudo;
1432 : {
1433 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1434 0 : true, &aNewSelector );
1435 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
1436 : }
1437 :
1438 0 : aNewSelector = aSelector + ".ctl" + aPseudo;
1439 : {
1440 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1441 0 : true, &aNewSelector );
1442 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
1443 0 : }
1444 : }
1445 : else
1446 : {
1447 : // If ther are script dependencies and we are derived from a tag,
1448 : // when we have to export a style dependent class for all
1449 : // scripts
1450 0 : OUString aNewSelector( aSelector );
1451 0 : aNewSelector += "-western" + aPseudo;
1452 : {
1453 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1454 0 : true, &aNewSelector );
1455 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1456 : }
1457 :
1458 0 : aNewSelector = aSelector + "-cjk" + aPseudo;
1459 : {
1460 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1461 0 : true, &aNewSelector );
1462 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1463 : }
1464 :
1465 0 : aNewSelector = aSelector + "-ctl" + aPseudo;
1466 : {
1467 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1468 0 : true, &aNewSelector );
1469 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1470 0 : }
1471 0 : }
1472 : }
1473 : else
1474 : {
1475 : // If there are no script dependencies, when all items are
1476 : // exported in one step. For hyperlinks only, a script information
1477 : // must be there, because these two chr formats don't support
1478 : // script dependencies by now.
1479 : SwCSS1OutMode aMode( rHTMLWrt,
1480 : rHTMLWrt.nCSS1Script|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1481 0 : true, &rSelector );
1482 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1483 : }
1484 0 : }
1485 :
1486 13 : static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
1487 : IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate )
1488 : {
1489 13 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1490 :
1491 13 : bool bCharFmt = false;
1492 13 : switch( rFmt.Which() )
1493 : {
1494 : case RES_CHRFMT:
1495 2 : bCharFmt = true;
1496 2 : break;
1497 :
1498 : case RES_TXTFMTCOLL:
1499 : case RES_CONDTXTFMTCOLL:
1500 : // these template-types can be exported
1501 11 : break;
1502 :
1503 : default:
1504 : // but not these
1505 0 : return rWrt;
1506 : }
1507 :
1508 : // determine Selector and the to-be-exported Attr-Set-depth
1509 13 : OUString aSelector;
1510 13 : sal_uInt16 nRefPoolId = 0;
1511 13 : sal_uInt16 nDeep = GetCSS1Selector( &rFmt, aSelector, nRefPoolId );
1512 13 : if( !nDeep )
1513 6 : return rWrt; // not derived from a HTML-template
1514 :
1515 7 : sal_uInt16 nPoolFmtId = rFmt.GetPoolFmtId();
1516 :
1517 : // Determine the to-be-exported Attr-Set. We have to distinguish 3 cases:
1518 : // - HTML-Tag templates (nDeep==USHRT_MAX):
1519 : // Export Attrs...
1520 : // - that are set in the template, but not in the original of the HTML template
1521 : // - the Default-Attrs for the Attrs, that are set in the Original of the
1522 : // HTML template, but not in the current template.
1523 : // - templates directly derived from HTML templates (nDeep==1):
1524 : // Export only Attributes of the template Item-Set w/o its parents.
1525 : // - templates in-directly derived from HTML templates (nDeep>1):
1526 : // Export Attributes of the template Item-Set incl. its Parents,
1527 : // but w/o Attributes that are set in the HTML-Tag template.
1528 :
1529 : // create Item-Set with all Attributes from the template
1530 : // (all but for nDeep==1)
1531 7 : const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
1532 14 : SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
1533 7 : aItemSet.Set( rFmtItemSet, true ); // Was nDeep!=1 that is not working
1534 : // for script dependent items buts should
1535 : // not make a difference for any other
1536 :
1537 7 : sal_Bool bSetDefaults = sal_True, bClearSame = sal_True;
1538 7 : const SwFmt *pRefFmt = 0;
1539 7 : const SwFmt *pRefFmtScript = 0;
1540 7 : switch( nDeep )
1541 : {
1542 : case CSS1_FMT_ISTAG:
1543 7 : pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
1544 7 : break;
1545 : case CSS1_FMT_CMPREF:
1546 0 : pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pDoc );
1547 0 : pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
1548 0 : bClearSame = sal_False;
1549 0 : break;
1550 : default:
1551 0 : pRefFmt = SwHTMLWriter::GetParentFmt( rFmt, nDeep );
1552 0 : pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
1553 0 : bSetDefaults = sal_False;
1554 0 : break;
1555 : }
1556 :
1557 7 : if( pRefFmt )
1558 : {
1559 : // subtract Item-Set of the Reference template (incl. its Parents)
1560 7 : SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
1561 : bSetDefaults, bClearSame,
1562 : pRefFmtScript
1563 : ? &pRefFmtScript->GetAttrSet()
1564 14 : : 0 );
1565 :
1566 7 : if( !bCharFmt )
1567 : {
1568 5 : const SvxULSpaceItem& rULItem = pRefFmt->GetULSpace();
1569 5 : rHTMLWrt.nDfltTopMargin = rULItem.GetUpper();
1570 5 : rHTMLWrt.nDfltBottomMargin = rULItem.GetLower();
1571 : }
1572 : }
1573 0 : else if( CSS1_FMT_ISTAG==nDeep && !bCharFmt )
1574 : {
1575 : // set Default-distance above and below (for the
1576 : // case that there is no reference template)
1577 0 : rHTMLWrt.nDfltTopMargin = 0;
1578 0 : rHTMLWrt.nDfltBottomMargin = HTML_PARSPACE;
1579 0 : if( USER_FMT & nPoolFmtId )
1580 : {
1581 : // user templates
1582 0 : const OUString aNm(rFmt.GetName());
1583 :
1584 0 : if (aNm == "DD 1" || aNm == "DT 1")
1585 0 : rHTMLWrt.nDfltBottomMargin = 0;
1586 0 : else if (aNm == OOO_STRING_SVTOOLS_HTML_listing)
1587 0 : rHTMLWrt.nDfltBottomMargin = 0;
1588 0 : else if (aNm == OOO_STRING_SVTOOLS_HTML_preformtxt)
1589 0 : rHTMLWrt.nDfltBottomMargin = 0;
1590 0 : else if (aNm == OOO_STRING_SVTOOLS_HTML_xmp)
1591 0 : rHTMLWrt.nDfltBottomMargin = 0;
1592 : }
1593 : else
1594 : {
1595 : // Pool templates
1596 0 : switch( nPoolFmtId )
1597 : {
1598 : case RES_POOLCOLL_HEADLINE1:
1599 : case RES_POOLCOLL_HEADLINE2:
1600 : case RES_POOLCOLL_HEADLINE3:
1601 : case RES_POOLCOLL_HEADLINE4:
1602 : case RES_POOLCOLL_HEADLINE5:
1603 : case RES_POOLCOLL_HEADLINE6:
1604 0 : rHTMLWrt.nDfltTopMargin = HTML_HEADSPACE;
1605 0 : break;
1606 : case RES_POOLCOLL_SENDADRESS:
1607 : case RES_POOLCOLL_HTML_DT:
1608 : case RES_POOLCOLL_HTML_DD:
1609 : case RES_POOLCOLL_HTML_PRE:
1610 0 : rHTMLWrt.nDfltBottomMargin = 0;
1611 0 : break;
1612 : }
1613 : }
1614 : }
1615 :
1616 : // if nothing is to be exported ...
1617 7 : if( !aItemSet.Count() )
1618 2 : return rWrt;
1619 :
1620 : // There is no support for script dependent hyperlinks by now.
1621 5 : bool bCheckForPseudo = false;
1622 6 : if( bCharFmt &&
1623 1 : (RES_POOLCHR_INET_NORMAL==nRefPoolId ||
1624 0 : RES_POOLCHR_INET_VISIT==nRefPoolId) )
1625 1 : bCheckForPseudo = true;
1626 :
1627 : // export now the Attributes (incl. Selektor)
1628 5 : bool bHasScriptDependencies = false;
1629 5 : if( OutCSS1Rule( rHTMLWrt, aSelector, aItemSet, CSS1_FMT_ISTAG != nDeep,
1630 5 : bCheckForPseudo ) )
1631 : {
1632 3 : if( bCharFmt )
1633 0 : rHTMLWrt.aScriptTextStyles.insert( rFmt.GetName() );
1634 : else
1635 : {
1636 3 : if( nPoolFmtId==RES_POOLCOLL_TEXT )
1637 3 : rHTMLWrt.aScriptParaStyles.insert( pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD, false )->GetName() );
1638 3 : rHTMLWrt.aScriptParaStyles.insert( rFmt.GetName() );
1639 : }
1640 3 : bHasScriptDependencies = true;
1641 : }
1642 :
1643 5 : if( nPoolFmtId==RES_POOLCOLL_TEXT && !rHTMLWrt.bFirstCSS1Property )
1644 4 : rHTMLWrt.bPoolCollTextModified = sal_True;
1645 :
1646 : // export Drop-Caps
1647 : const SfxPoolItem *pItem;
1648 5 : if( SFX_ITEM_SET==aItemSet.GetItemState( RES_PARATR_DROP, false, &pItem ))
1649 : {
1650 0 : OUString sOut( aSelector );
1651 0 : sOut += ":" + OStringToOUString( sCSS1_first_letter, RTL_TEXTENCODING_ASCII_US );
1652 0 : const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;
1653 0 : OutCSS1DropCapRule( rHTMLWrt, sOut, *pDrop, CSS1_FMT_ISTAG != nDeep, bHasScriptDependencies );
1654 : }
1655 :
1656 18 : return rWrt;
1657 : }
1658 :
1659 5 : static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rPageDesc,
1660 : IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate,
1661 : sal_uInt16 nRefPoolId, bool bExtRef,
1662 : bool bPseudo )
1663 : {
1664 5 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1665 :
1666 5 : const SwPageDesc* pRefPageDesc = 0;
1667 5 : if( !bExtRef )
1668 0 : pRefPageDesc = pDoc->GetPageDescFromPool( nRefPoolId, false );
1669 5 : else if( pTemplate )
1670 5 : pRefPageDesc = pTemplate->GetPageDescFromPool( nRefPoolId, false );
1671 :
1672 5 : OUString aSelector = "@" + OStringToOUString( sCSS1_page, RTL_TEXTENCODING_ASCII_US );
1673 :
1674 5 : if( bPseudo )
1675 : {
1676 0 : const sal_Char *pPseudo = 0;
1677 0 : switch( rPageDesc.GetPoolFmtId() )
1678 : {
1679 0 : case RES_POOLPAGE_FIRST: pPseudo = sCSS1_first; break;
1680 0 : case RES_POOLPAGE_LEFT: pPseudo = sCSS1_left; break;
1681 0 : case RES_POOLPAGE_RIGHT: pPseudo = sCSS1_right; break;
1682 : }
1683 0 : if( pPseudo )
1684 0 : aSelector += ":" + OStringToOUString( pPseudo, RTL_TEXTENCODING_ASCII_US );
1685 : }
1686 :
1687 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE_ON|CSS1_OUTMODE_TEMPLATE,
1688 5 : true, &aSelector );
1689 :
1690 : // Size: If the only difference is the Landscape-Flag,
1691 : // only export Portrait oder Landscape. Otherwise export size.
1692 5 : sal_Bool bRefLandscape = pRefPageDesc ? pRefPageDesc->GetLandscape() : sal_False;
1693 5 : Size aRefSz;
1694 5 : const Size& rSz = rPageDesc.GetMaster().GetFrmSize().GetSize();
1695 5 : if( pRefPageDesc )
1696 : {
1697 5 : aRefSz = pRefPageDesc->GetMaster().GetFrmSize().GetSize();
1698 5 : if( bRefLandscape != rPageDesc.GetLandscape() )
1699 : {
1700 1 : long nTmp = aRefSz.Height();
1701 1 : aRefSz.Height() = aRefSz.Width();
1702 1 : aRefSz.Width() = nTmp;
1703 : }
1704 : }
1705 :
1706 : // TODO: Bad Hack: On the Page-Tabpage there are small rounding errors
1707 : // for the page size. Partially because of bug 25535, we stupidly still
1708 : // use the Size-Item from Dialog, even if nothing changed.
1709 : // Thus: once one visited the Page-Dialog and left it with OK, we get a
1710 : // new page size that then gets exported here. To avoid that, we allow
1711 : // here small deviations.
1712 8 : if( std::abs( rSz.Width() - aRefSz.Width() ) <= 2 &&
1713 3 : std::abs( rSz.Height() - aRefSz.Height() ) <= 2 )
1714 : {
1715 3 : if( bRefLandscape != rPageDesc.GetLandscape() )
1716 : {
1717 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_size,
1718 0 : rPageDesc.GetLandscape() ? sCSS1_PV_landscape
1719 0 : : sCSS1_PV_portrait );
1720 : }
1721 : }
1722 : else
1723 : {
1724 2 : OStringBuffer sVal;
1725 2 : AddUnitPropertyValue(sVal, rSz.Width(), rHTMLWrt.GetCSS1Unit());
1726 2 : sVal.append(' ');
1727 2 : AddUnitPropertyValue(sVal, rSz.Height(), rHTMLWrt.GetCSS1Unit());
1728 2 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_size, sVal.makeStringAndClear());
1729 : }
1730 :
1731 : // Export the distance-Attributes as normally
1732 5 : const SwFrmFmt &rMaster = rPageDesc.GetMaster();
1733 5 : SfxItemSet aItemSet( *rMaster.GetAttrSet().GetPool(),
1734 10 : RES_LR_SPACE, RES_UL_SPACE );
1735 5 : aItemSet.Set( rMaster.GetAttrSet(), true );
1736 :
1737 5 : if( pRefPageDesc )
1738 : {
1739 : SwHTMLWriter::SubtractItemSet( aItemSet,
1740 5 : pRefPageDesc->GetMaster().GetAttrSet(),
1741 5 : sal_True );
1742 : }
1743 :
1744 5 : OutCSS1_SvxULSpace_SvxLRSpace( rWrt, aItemSet, sal_False );
1745 :
1746 : // If for a Pseudo-Selector no Property had been set, we still
1747 : // have to export something, so that the corresponding template is
1748 : // created on the next import.
1749 5 : if( rHTMLWrt.bFirstCSS1Property && bPseudo )
1750 : {
1751 0 : rHTMLWrt.OutNewLine();
1752 0 : OString sTmp(OUStringToOString(aSelector, rHTMLWrt.eDestEnc));
1753 0 : rWrt.Strm().WriteCharPtr( sTmp.getStr() ).WriteCharPtr( " {" );
1754 0 : rHTMLWrt.bFirstCSS1Property = sal_False;
1755 : }
1756 :
1757 5 : if( !rHTMLWrt.bFirstCSS1Property )
1758 4 : rWrt.Strm().WriteCharPtr( sCSS1_rule_end );
1759 :
1760 10 : return rWrt;
1761 : }
1762 :
1763 10 : static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
1764 : SwDoc *pDoc, sal_uInt16 nNotes, bool bEndNote )
1765 : {
1766 10 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1767 :
1768 10 : OUString aSelector;
1769 :
1770 10 : if( nNotes > 0 )
1771 : {
1772 0 : aSelector = (OUString)OOO_STRING_SVTOOLS_HTML_anchor + "." +
1773 : OStringToOUString( bEndNote ? OOO_STRING_SVTOOLS_HTML_sdendnote_anc
1774 0 : : OOO_STRING_SVTOOLS_HTML_sdfootnote_anc, RTL_TEXTENCODING_ASCII_US );
1775 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1776 0 : true, &aSelector );
1777 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size,
1778 0 : sHTML_FTN_fontheight );
1779 0 : rHTMLWrt.Strm().WriteCharPtr( sCSS1_rule_end );
1780 : }
1781 :
1782 10 : const SwCharFmt *pSymCharFmt = rInfo.GetCharFmt( *pDoc );
1783 10 : if( pSymCharFmt )
1784 : {
1785 10 : const SfxItemSet& rFmtItemSet = pSymCharFmt->GetAttrSet();
1786 10 : SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
1787 10 : aItemSet.Set( rFmtItemSet, true );
1788 :
1789 : // If there are footnotes or endnotes, then all Attributes have to be
1790 : // exported, so that Netscape displays the document correctly.
1791 : // Otherwise it is sufficient, to export the differences to the
1792 : // footnote and endnote template.
1793 10 : if( nNotes == 0 && rHTMLWrt.pTemplate )
1794 : {
1795 : SwFmt *pRefFmt = rHTMLWrt.pTemplate->GetCharFmtFromPool(
1796 10 : static_cast< sal_uInt16 >(bEndNote ? RES_POOLCHR_ENDNOTE : RES_POOLCHR_FOOTNOTE) );
1797 10 : if( pRefFmt )
1798 10 : SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
1799 10 : sal_True );
1800 : }
1801 10 : if( aItemSet.Count() )
1802 : {
1803 0 : aSelector = (OUString)OOO_STRING_SVTOOLS_HTML_anchor + "." +
1804 : OStringToOUString( bEndNote ? OOO_STRING_SVTOOLS_HTML_sdendnote_sym
1805 0 : : OOO_STRING_SVTOOLS_HTML_sdfootnote_sym, RTL_TEXTENCODING_ASCII_US );
1806 0 : if( OutCSS1Rule( rHTMLWrt, aSelector, aItemSet, sal_True, false ))
1807 0 : rHTMLWrt.aScriptTextStyles.insert( pSymCharFmt->GetName() );
1808 10 : }
1809 : }
1810 :
1811 10 : return rWrt;
1812 : }
1813 :
1814 5 : Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet )
1815 : {
1816 5 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1817 :
1818 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
1819 5 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_BODY );
1820 :
1821 : // Only export the attributes of the page template.
1822 : // The attributes of the default paragraph template were
1823 : // considered already when exporting the paragraph template.
1824 :
1825 : const SfxPoolItem *pItem;
1826 5 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, false,
1827 5 : &pItem ) )
1828 : {
1829 1 : OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE );
1830 : }
1831 :
1832 5 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, false,
1833 5 : &pItem ))
1834 : {
1835 0 : OutCSS1_SvxBox( rWrt, *pItem );
1836 : }
1837 :
1838 5 : if( !rHTMLWrt.bFirstCSS1Property )
1839 : {
1840 : // if a Property was exported as part of a Style-Option,
1841 : // the Option still needs to be finished
1842 1 : rWrt.Strm().WriteChar( '\"' );
1843 : }
1844 :
1845 5 : return rWrt;
1846 : }
1847 :
1848 266 : Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet )
1849 : {
1850 266 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1851 :
1852 : SwCSS1OutMode aMode( rHTMLWrt, rHTMLWrt.nCSS1Script|CSS1_OUTMODE_STYLE_OPT |
1853 266 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
1854 266 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1855 :
1856 266 : return rWrt;
1857 : }
1858 :
1859 12 : Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt )
1860 : {
1861 12 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1862 :
1863 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_SPAN_TAG |
1864 12 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_HINT );
1865 :
1866 12 : Out( aCSS1AttrFnTab, rHt, rWrt );
1867 :
1868 12 : if( !rHTMLWrt.bFirstCSS1Property && rHTMLWrt.bTagOn )
1869 6 : rWrt.Strm().WriteCharPtr( sCSS1_span_tag_end );
1870 :
1871 12 : return rWrt;
1872 : }
1873 :
1874 5 : Writer& OutCSS1_HintStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
1875 : {
1876 5 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1877 :
1878 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
1879 : CSS1_OUTMODE_ENCODE|
1880 5 : CSS1_OUTMODE_HINT );
1881 :
1882 5 : Out( aCSS1AttrFnTab, rHt, rWrt );
1883 :
1884 5 : if( !rHTMLWrt.bFirstCSS1Property )
1885 5 : rWrt.Strm().WriteChar( '\"' );
1886 :
1887 5 : return rWrt;
1888 : }
1889 :
1890 : // Wrapper for Table background
1891 260 : Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
1892 : {
1893 260 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1894 :
1895 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
1896 : CSS1_OUTMODE_ENCODE|
1897 260 : CSS1_OUTMODE_TABLEBOX );
1898 260 : OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE );
1899 :
1900 260 : if( !rHTMLWrt.bFirstCSS1Property )
1901 0 : rWrt.Strm().WriteChar( '\"' );
1902 :
1903 260 : return rWrt;
1904 : }
1905 :
1906 0 : Writer& OutCSS1_NumBulListStyleOpt( Writer& rWrt, const SwNumRule& rNumRule,
1907 : sal_uInt8 nLevel )
1908 : {
1909 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1910 :
1911 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT |
1912 0 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
1913 :
1914 0 : const SwNumFmt& rNumFmt = rNumRule.Get( nLevel );
1915 :
1916 0 : long nLSpace = rNumFmt.GetAbsLSpace();
1917 0 : long nFirstLineOffset = rNumFmt.GetFirstLineOffset();
1918 0 : long nDfltFirstLineOffset = HTML_NUMBUL_INDENT;
1919 0 : if( nLevel > 0 )
1920 : {
1921 0 : const SwNumFmt& rPrevNumFmt = rNumRule.Get( nLevel-1 );
1922 0 : nLSpace -= rPrevNumFmt.GetAbsLSpace();
1923 0 : nDfltFirstLineOffset = rPrevNumFmt.GetFirstLineOffset();
1924 : }
1925 :
1926 0 : if( rHTMLWrt.IsHTMLMode(HTMLMODE_LSPACE_IN_NUMBUL) &&
1927 : nLSpace != HTML_NUMBUL_MARGINLEFT )
1928 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLSpace );
1929 :
1930 0 : if( rHTMLWrt.IsHTMLMode(HTMLMODE_FRSTLINE_IN_NUMBUL) &&
1931 : nFirstLineOffset != nDfltFirstLineOffset )
1932 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent, nFirstLineOffset );
1933 :
1934 0 : if( !rHTMLWrt.bFirstCSS1Property )
1935 0 : rWrt.Strm().WriteChar( '\"' );
1936 :
1937 0 : return rWrt;
1938 : }
1939 :
1940 1 : void SwHTMLWriter::OutCSS1_FrmFmtOptions( const SwFrmFmt& rFrmFmt,
1941 : sal_uInt32 nFrmOpts,
1942 : const SdrObject *pSdrObj,
1943 : const SfxItemSet *pItemSet )
1944 : {
1945 : SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
1946 : CSS1_OUTMODE_ENCODE|
1947 1 : CSS1_OUTMODE_FRAME );
1948 :
1949 1 : const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
1950 2 : SvxLRSpaceItem aLRItem( rFrmFmt.GetLRSpace() );
1951 2 : SvxULSpaceItem aULItem( rFrmFmt.GetULSpace() );
1952 1 : if( nFrmOpts & HTML_FRMOPT_S_ALIGN )
1953 : {
1954 1 : const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
1955 1 : switch( rAnchor.GetAnchorId() )
1956 : {
1957 : case FLY_AT_PARA:
1958 : case FLY_AT_CHAR:
1959 1 : if( text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
1960 0 : text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
1961 : {
1962 1 : if( !(nFrmOpts & HTML_FRMOPT_ALIGN) )
1963 : {
1964 : // float
1965 0 : const sal_Char *pStr = text::HoriOrientation::RIGHT==rHoriOri.GetHoriOrient()
1966 : ? sCSS1_PV_right
1967 0 : : sCSS1_PV_left;
1968 0 : OutCSS1_PropertyAscii( sCSS1_P_float, pStr );
1969 : }
1970 1 : break;
1971 : }
1972 :
1973 : case FLY_AT_PAGE:
1974 : case FLY_AT_FLY:
1975 : {
1976 : // position
1977 0 : OutCSS1_PropertyAscii( sCSS1_P_position, sCSS1_PV_absolute );
1978 :
1979 : // For top/left we need to subtract the distance to the frame
1980 : // from the position, as in CSS1 it is added to the position.
1981 : // This works also for automatically aligned frames, even that
1982 : // in this case Writer also adds the distance; because in this
1983 : // case the Orient-Attribute contains the correct position.
1984 :
1985 : // top
1986 0 : long nXPos=0, nYPos=0;
1987 0 : bool bOutXPos = false, bOutYPos = false;
1988 0 : if( RES_DRAWFRMFMT == rFrmFmt.Which() )
1989 : {
1990 : OSL_ENSURE( pSdrObj, "Do not pass a SdrObject. Inefficient" );
1991 0 : if( !pSdrObj )
1992 0 : pSdrObj = rFrmFmt.FindSdrObject();
1993 : OSL_ENSURE( pSdrObj, "Where is the SdrObject" );
1994 0 : if( pSdrObj )
1995 : {
1996 0 : Point aPos( pSdrObj->GetRelativePos() );
1997 0 : nXPos = aPos.A();
1998 0 : nYPos = aPos.B();
1999 : }
2000 0 : bOutXPos = bOutYPos = true;
2001 : }
2002 : else
2003 : {
2004 0 : bOutXPos = text::RelOrientation::CHAR != rHoriOri.GetRelationOrient();
2005 0 : nXPos = text::HoriOrientation::NONE == rHoriOri.GetHoriOrient()
2006 0 : ? rHoriOri.GetPos() : 0;
2007 :
2008 0 : const SwFmtVertOrient& rVertOri = rFrmFmt.GetVertOrient();
2009 0 : bOutYPos = text::RelOrientation::CHAR != rVertOri.GetRelationOrient();
2010 0 : nYPos = text::VertOrientation::NONE == rVertOri.GetVertOrient()
2011 0 : ? rVertOri.GetPos() : 0;
2012 : }
2013 :
2014 0 : if( bOutYPos )
2015 : {
2016 0 : if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
2017 : {
2018 0 : nYPos -= aULItem.GetUpper();
2019 0 : if( nYPos < 0 )
2020 : {
2021 0 : aULItem.SetUpper( (sal_uInt16)(aULItem.GetUpper() + nYPos) );
2022 0 : nYPos = 0;
2023 : }
2024 : }
2025 :
2026 0 : OutCSS1_UnitProperty( sCSS1_P_top, nYPos );
2027 : }
2028 :
2029 0 : if( bOutXPos )
2030 : {
2031 : // left
2032 0 : if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
2033 : {
2034 0 : nXPos -= aLRItem.GetLeft();
2035 0 : if( nXPos < 0 )
2036 : {
2037 0 : aLRItem.SetLeft( (sal_uInt16)(aLRItem.GetLeft() + nXPos) );
2038 0 : nXPos = 0;
2039 : }
2040 : }
2041 :
2042 0 : OutCSS1_UnitProperty( sCSS1_P_left, nXPos );
2043 : }
2044 : }
2045 0 : break;
2046 :
2047 : default:
2048 : ;
2049 : }
2050 : }
2051 :
2052 : // width/height
2053 1 : if( nFrmOpts & HTML_FRMOPT_S_SIZE )
2054 : {
2055 0 : if( RES_DRAWFRMFMT == rFrmFmt.Which() )
2056 : {
2057 : OSL_ENSURE( pSdrObj, "Do not pass a SdrObject. Inefficient" );
2058 0 : if( !pSdrObj )
2059 0 : pSdrObj = rFrmFmt.FindSdrObject();
2060 : OSL_ENSURE( pSdrObj, "Where is the SdrObject" );
2061 0 : if( pSdrObj )
2062 : {
2063 0 : Size aTwipSz( pSdrObj->GetLogicRect().GetSize() );
2064 0 : if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
2065 : {
2066 0 : if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
2067 0 : OutCSS1_PixelProperty( sCSS1_P_width, aTwipSz.Width(),
2068 0 : sal_False );
2069 : else
2070 0 : OutCSS1_UnitProperty( sCSS1_P_width, aTwipSz.Width() );
2071 : }
2072 0 : if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
2073 : {
2074 0 : if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
2075 0 : OutCSS1_PixelProperty( sCSS1_P_height, aTwipSz.Height(),
2076 0 : sal_True );
2077 : else
2078 0 : OutCSS1_UnitProperty( sCSS1_P_height, aTwipSz.Height() );
2079 : }
2080 : }
2081 : }
2082 : else
2083 : {
2084 : OSL_ENSURE( HTML_FRMOPT_ABSSIZE & nFrmOpts,
2085 : "Export absolute size" );
2086 : OSL_ENSURE( HTML_FRMOPT_ANYSIZE & nFrmOpts,
2087 : "Export every size" );
2088 0 : sal_uInt16 nMode = 0;
2089 0 : if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
2090 0 : nMode |= CSS1_FRMSIZE_WIDTH;
2091 0 : if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
2092 0 : nMode |= (CSS1_FRMSIZE_MINHEIGHT|CSS1_FRMSIZE_FIXHEIGHT);
2093 0 : if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
2094 0 : nMode |= CSS1_FRMSIZE_PIXEL;
2095 :
2096 0 : OutCSS1_SwFmtFrmSize( *this, rFrmFmt.GetFrmSize(), nMode );
2097 : }
2098 : }
2099 :
2100 1 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
2101 : // margin-*
2102 2 : if( (nFrmOpts & HTML_FRMOPT_S_SPACE) &&
2103 1 : IsHTMLMode( HTMLMODE_FLY_MARGINS) )
2104 : {
2105 0 : const SvxLRSpaceItem *pLRItem = 0;
2106 0 : const SvxULSpaceItem *pULItem = 0;
2107 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, true ) )
2108 0 : pLRItem = &aLRItem;
2109 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, true ) )
2110 0 : pULItem = &aULItem;
2111 0 : if( pLRItem || pULItem )
2112 0 : OutCSS1_SvxULSpace_SvxLRSpace( *this, pULItem, pLRItem );
2113 : }
2114 :
2115 : // border
2116 1 : if( nFrmOpts & HTML_FRMOPT_S_BORDER )
2117 : {
2118 : const SfxPoolItem* pItem;
2119 0 : if( nFrmOpts & HTML_FRMOPT_S_NOBORDER )
2120 0 : OutCSS1_SvxBox( *this, rFrmFmt.GetBox() );
2121 0 : else if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BOX, true, &pItem ) )
2122 0 : OutCSS1_SvxBox( *this, *pItem );
2123 : }
2124 :
2125 : // background (if, then the color must be set also)
2126 1 : if( nFrmOpts & HTML_FRMOPT_S_BACKGROUND )
2127 0 : OutCSS1_FrmFmtBackground( rFrmFmt );
2128 :
2129 1 : if( pItemSet )
2130 0 : OutCSS1_SfxItemSet( *pItemSet, sal_False );
2131 :
2132 1 : if( !bFirstCSS1Property )
2133 1 : Strm().WriteChar( '\"' );
2134 1 : }
2135 :
2136 1 : void SwHTMLWriter::OutCSS1_TableFrmFmtOptions( const SwFrmFmt& rFrmFmt )
2137 : {
2138 : SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
2139 : CSS1_OUTMODE_ENCODE|
2140 1 : CSS1_OUTMODE_TABLE );
2141 :
2142 : const SfxPoolItem *pItem;
2143 1 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
2144 1 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, false, &pItem ) )
2145 1 : OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE );
2146 :
2147 1 : if( IsHTMLMode( HTMLMODE_PRINT_EXT ) )
2148 1 : OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, sal_False );
2149 :
2150 1 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_LAYOUT_SPLIT, false, &pItem ) )
2151 0 : OutCSS1_SwFmtLayoutSplit( *this, *pItem );
2152 :
2153 1 : if( !bFirstCSS1Property )
2154 1 : Strm().WriteChar( '\"' );
2155 1 : }
2156 :
2157 260 : void SwHTMLWriter::OutCSS1_TableCellBorderHack(SwFrmFmt const& rFrmFmt)
2158 : {
2159 : SwCSS1OutMode const aMode( *this,
2160 260 : CSS1_OUTMODE_STYLE_OPT_ON|CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_TABLEBOX );
2161 260 : OutCSS1_SvxBox(*this, rFrmFmt.GetBox());
2162 260 : if (!bFirstCSS1Property)
2163 : {
2164 260 : this->Strm().WriteChar( cCSS1_style_opt_end );
2165 260 : }
2166 260 : }
2167 :
2168 0 : void SwHTMLWriter::OutCSS1_SectionFmtOptions( const SwFrmFmt& rFrmFmt, const SwFmtCol *pCol )
2169 : {
2170 : SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
2171 : CSS1_OUTMODE_ENCODE|
2172 0 : CSS1_OUTMODE_SECTION );
2173 :
2174 : const SfxPoolItem *pItem;
2175 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
2176 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, false, &pItem ) )
2177 0 : OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION );
2178 :
2179 0 : if (pCol)
2180 : {
2181 0 : OString sColumnCount(OString::number(static_cast<sal_Int32>(pCol->GetNumCols())));
2182 0 : OutCSS1_PropertyAscii(sCSS1_P_column_count, sColumnCount);
2183 : }
2184 :
2185 0 : if( !bFirstCSS1Property )
2186 0 : Strm().WriteChar( '\"' );
2187 0 : }
2188 :
2189 0 : static bool OutCSS1_FrmFmtBrush( SwHTMLWriter& rWrt,
2190 : const SvxBrushItem& rBrushItem )
2191 : {
2192 0 : bool bWritten = false;
2193 : /// output brush of frame format, if its background color is not "no fill"/"auto fill"
2194 : /// or it has a background graphic.
2195 0 : if( rBrushItem.GetColor() != COL_TRANSPARENT ||
2196 0 : 0 != rBrushItem.GetGraphicLink() ||
2197 0 : 0 != rBrushItem.GetGraphicPos() )
2198 : {
2199 0 : OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY );
2200 0 : bWritten = true;
2201 : }
2202 0 : return bWritten;
2203 : }
2204 :
2205 0 : void SwHTMLWriter::OutCSS1_FrmFmtBackground( const SwFrmFmt& rFrmFmt )
2206 : {
2207 : // If the frame itself has a background, then export.
2208 0 : if( OutCSS1_FrmFmtBrush( *this, rFrmFmt.GetBackground() ) )
2209 0 : return;
2210 :
2211 : // If the frame is not linked to a page, we use the background of the anchor.
2212 0 : const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
2213 0 : RndStdIds eAnchorId = rAnchor.GetAnchorId();
2214 0 : const SwPosition *pAnchorPos = rAnchor.GetCntntAnchor();
2215 0 : if (FLY_AT_PAGE != eAnchorId && pAnchorPos)
2216 : {
2217 0 : const SwNode& rNode = pAnchorPos->nNode.GetNode();
2218 0 : if( rNode.IsCntntNode() )
2219 : {
2220 : // If the frame is linked to a content-node,
2221 : // we take the background of the content-node, if it has one.
2222 0 : if( OutCSS1_FrmFmtBrush( *this,
2223 0 : rNode.GetCntntNode()->GetSwAttrSet().GetBackground()) )
2224 0 : return;
2225 :
2226 : // Otherwise we also could be in a table
2227 0 : const SwTableNode *pTableNd = rNode.FindTableNode();
2228 0 : if( pTableNd )
2229 : {
2230 0 : const SwStartNode *pBoxSttNd = rNode.FindTableBoxStartNode();
2231 : const SwTableBox *pBox =
2232 0 : pTableNd->GetTable().GetTblBox( pBoxSttNd->GetIndex() );
2233 :
2234 : // If the box has a background, we take it.
2235 0 : if( OutCSS1_FrmFmtBrush( *this,
2236 0 : pBox->GetFrmFmt()->GetBackground() ) )
2237 0 : return;
2238 :
2239 : // Otherwise we use that of the lines
2240 0 : const SwTableLine *pLine = pBox->GetUpper();
2241 0 : while( pLine )
2242 : {
2243 0 : if( OutCSS1_FrmFmtBrush( *this,
2244 0 : pLine->GetFrmFmt()->GetBackground() ) )
2245 0 : return;
2246 0 : pBox = pLine->GetUpper();
2247 0 : pLine = pBox ? pBox->GetUpper() : 0;
2248 : }
2249 :
2250 : // If there was none either, we use the background of the table.
2251 0 : if( OutCSS1_FrmFmtBrush( *this,
2252 0 : pTableNd->GetTable().GetFrmFmt()->GetBackground() ) )
2253 0 : return;
2254 : }
2255 :
2256 : }
2257 :
2258 : // If the anchor is again in a Fly-Frame, use the background of the Fly-Frame.
2259 0 : const SwFrmFmt *pFrmFmt = rNode.GetFlyFmt();
2260 0 : if( pFrmFmt )
2261 : {
2262 0 : OutCSS1_FrmFmtBackground( *pFrmFmt );
2263 0 : return;
2264 : }
2265 : }
2266 :
2267 : // At last there is the background of the page, and as the final rescue
2268 : // the value of the Config.
2269 : OSL_ENSURE( pCurrPageDesc, "no page template found" );
2270 0 : if( !OutCSS1_FrmFmtBrush( *this,
2271 0 : pCurrPageDesc->GetMaster().GetBackground() ) )
2272 : {
2273 0 : Color aColor( COL_WHITE );
2274 :
2275 : // The background color is normally only used in Browse-Mode.
2276 : // We always use it for a HTML document, but for a text document
2277 : // only if viewed in Browse-Mode.
2278 0 : if( pDoc->get(IDocumentSettingAccess::HTML_MODE) ||
2279 0 : pDoc->get(IDocumentSettingAccess::BROWSE_MODE))
2280 : {
2281 0 : SwViewShell *pVSh = 0;
2282 0 : pDoc->GetEditShell( &pVSh );
2283 0 : if ( pVSh &&
2284 0 : COL_TRANSPARENT != pVSh->GetViewOptions()->GetRetoucheColor().GetColor())
2285 0 : aColor = pVSh->GetViewOptions()->GetRetoucheColor().GetColor();
2286 : }
2287 :
2288 0 : OutCSS1_PropertyAscii(sCSS1_P_background, lclGetCSS1Color(aColor));
2289 : }
2290 : }
2291 :
2292 7 : static Writer& OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( Writer& rWrt,
2293 : const SvxUnderlineItem *pUItem,
2294 : const SvxOverlineItem *pOItem,
2295 : const SvxCrossedOutItem *pCOItem,
2296 : const SvxBlinkItem *pBItem )
2297 : {
2298 7 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2299 7 : bool bNone = false;
2300 :
2301 7 : const sal_Char *pUStr = 0;
2302 7 : if( pUItem )
2303 : {
2304 7 : switch( pUItem->GetLineStyle() )
2305 : {
2306 : case UNDERLINE_NONE:
2307 0 : bNone = true;
2308 0 : break;
2309 : case UNDERLINE_DONTKNOW:
2310 0 : break;
2311 : default:
2312 7 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2313 : {
2314 : // this also works in HTML does not need to be written as
2315 : // a STYLE-Options, and must not be written as Hint
2316 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2317 : "write underline as Hint?" );
2318 0 : pUStr = sCSS1_PV_underline;
2319 : }
2320 7 : break;
2321 : }
2322 : }
2323 :
2324 7 : const sal_Char *pOStr = 0;
2325 7 : if( pOItem )
2326 : {
2327 0 : switch( pOItem->GetLineStyle() )
2328 : {
2329 : case UNDERLINE_NONE:
2330 0 : bNone = true;
2331 0 : break;
2332 : case UNDERLINE_DONTKNOW:
2333 0 : break;
2334 : default:
2335 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2336 : {
2337 : // this also works in HTML does not need to be written as
2338 : // a STYLE-Options, and must not be written as Hint
2339 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2340 : "write overline as Hint?" );
2341 0 : pOStr = sCSS1_PV_overline;
2342 : }
2343 0 : break;
2344 : }
2345 : }
2346 :
2347 7 : const sal_Char *pCOStr = 0;
2348 7 : if( pCOItem )
2349 : {
2350 0 : switch( pCOItem->GetStrikeout() )
2351 : {
2352 : case STRIKEOUT_NONE:
2353 0 : bNone = true;
2354 0 : break;
2355 : case STRIKEOUT_DONTKNOW:
2356 0 : break;
2357 : default:
2358 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2359 : {
2360 : // this also works in HTML does not need to be written as
2361 : // a STYLE-Options, and must not be written as Hint
2362 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2363 : "write crossedOut as Hint?" );
2364 0 : pCOStr = sCSS1_PV_line_through;
2365 : }
2366 0 : break;
2367 : }
2368 : }
2369 :
2370 7 : const sal_Char *pBStr = 0;
2371 7 : if( pBItem )
2372 : {
2373 0 : if( !pBItem->GetValue() )
2374 : {
2375 0 : bNone = true;
2376 : }
2377 0 : else if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2378 : {
2379 : // this also works in HTML does not need to be written as
2380 : // a STYLE-Options, and must not be written as Hint
2381 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2382 : "write blink as Hint?" );
2383 0 : pBStr = sCSS1_PV_blink;
2384 : }
2385 : }
2386 :
2387 7 : OStringBuffer sOut;
2388 7 : if( pUStr )
2389 0 : sOut.append(pUStr);
2390 :
2391 7 : if( pOStr )
2392 : {
2393 0 : if (!sOut.isEmpty())
2394 0 : sOut.append(' ');
2395 0 : sOut.append(pOStr);
2396 : }
2397 :
2398 7 : if( pCOStr )
2399 : {
2400 0 : if (!sOut.isEmpty())
2401 0 : sOut.append(' ');
2402 0 : sOut.append(pCOStr);
2403 : }
2404 :
2405 7 : if( pBStr )
2406 : {
2407 0 : if (!sOut.isEmpty())
2408 0 : sOut.append(' ');
2409 0 : sOut.append(pBStr);
2410 : }
2411 :
2412 7 : if (!sOut.isEmpty())
2413 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sOut.makeStringAndClear() );
2414 7 : else if( bNone )
2415 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sCSS1_PV_none );
2416 :
2417 7 : return rWrt;
2418 : }
2419 :
2420 11 : static Writer& OutCSS1_SvxCaseMap( Writer& rWrt, const SfxPoolItem& rHt )
2421 : {
2422 11 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2423 :
2424 11 : switch( ((const SvxCaseMapItem&)rHt).GetCaseMap() )
2425 : {
2426 : case SVX_CASEMAP_NOT_MAPPED:
2427 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_variant, sCSS1_PV_normal );
2428 0 : break;
2429 : case SVX_CASEMAP_KAPITAELCHEN:
2430 11 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_variant, sCSS1_PV_small_caps );
2431 11 : break;
2432 : case SVX_CASEMAP_VERSALIEN:
2433 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_transform, sCSS1_PV_uppercase );
2434 0 : break;
2435 : case SVX_CASEMAP_GEMEINE:
2436 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_transform, sCSS1_PV_lowercase );
2437 0 : break;
2438 : case SVX_CASEMAP_TITEL:
2439 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_transform, sCSS1_PV_capitalize );
2440 0 : break;
2441 : default:
2442 : ;
2443 : }
2444 :
2445 11 : return rWrt;
2446 : }
2447 :
2448 17 : static Writer& OutCSS1_SvxColor( Writer& rWrt, const SfxPoolItem& rHt )
2449 : {
2450 17 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2451 :
2452 : // Colors do not need to be exported for Style-Option.
2453 31 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
2454 14 : !rHTMLWrt.bCfgPreferStyles )
2455 14 : return rWrt;
2456 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2457 : "write color as Hint?" );
2458 :
2459 3 : Color aColor( ((const SvxColorItem&)rHt).GetValue() );
2460 3 : if( COL_AUTO == aColor.GetColor() )
2461 0 : aColor.SetColor( COL_BLACK );
2462 :
2463 3 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_color, lclGetCSS1Color(aColor));
2464 :
2465 3 : return rWrt;
2466 : }
2467 :
2468 0 : static Writer& OutCSS1_SvxCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
2469 : {
2470 : // This function only exports Hints!
2471 : // Otherwise OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() is called directly.
2472 :
2473 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2474 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2475 0 : 0, 0, (const SvxCrossedOutItem *)&rHt, 0 );
2476 :
2477 0 : return rWrt;
2478 : }
2479 :
2480 611 : static Writer& OutCSS1_SvxFont( Writer& rWrt, const SfxPoolItem& rHt )
2481 : {
2482 611 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2483 :
2484 : // No need to export Fonts for the Style-Option.
2485 611 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2486 583 : return rWrt;
2487 :
2488 28 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2489 28 : switch( rHt.Which() )
2490 : {
2491 8 : case RES_CHRATR_CJK_FONT: nScript = CSS1_OUTMODE_CJK; break;
2492 12 : case RES_CHRATR_CTL_FONT: nScript = CSS1_OUTMODE_CTL; break;
2493 : }
2494 28 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2495 21 : return rWrt;
2496 :
2497 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2498 : "write Font as Hint?" );
2499 :
2500 7 : OUString sOut;
2501 : // MS IE3b1 has problems with single quotes
2502 7 : sal_uInt16 nMode = rHTMLWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_ON;
2503 7 : sal_Unicode cQuote = nMode == CSS1_OUTMODE_RULE_ON ? '\"' : '\'';
2504 : SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), sOut, cQuote,
2505 7 : sal_True );
2506 :
2507 7 : rHTMLWrt.OutCSS1_Property( sCSS1_P_font_family, sOut );
2508 :
2509 7 : return rWrt;
2510 : }
2511 :
2512 58 : static Writer& OutCSS1_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt )
2513 : {
2514 58 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2515 :
2516 : // Font-Height need not be exported in the Style-Option.
2517 : // For Drop-Caps another Font-Size is exported.
2518 99 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
2519 41 : rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_DROPCAP ) )
2520 17 : return rWrt;
2521 :
2522 41 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2523 41 : switch( rHt.Which() )
2524 : {
2525 12 : case RES_CHRATR_CJK_FONTSIZE: nScript = CSS1_OUTMODE_CJK; break;
2526 12 : case RES_CHRATR_CTL_FONTSIZE: nScript = CSS1_OUTMODE_CTL; break;
2527 : }
2528 41 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2529 27 : return rWrt;
2530 :
2531 14 : sal_uInt32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight();
2532 14 : OString sHeight(OString::number(nHeight/20) + OString(sCSS1_UNIT_pt));
2533 14 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_font_size, sHeight);
2534 :
2535 14 : return rWrt;
2536 : }
2537 :
2538 0 : static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt )
2539 : {
2540 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2541 :
2542 0 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2543 0 : switch( rHt.Which() )
2544 : {
2545 0 : case RES_CHRATR_CJK_POSTURE: nScript = CSS1_OUTMODE_CJK; break;
2546 0 : case RES_CHRATR_CTL_POSTURE: nScript = CSS1_OUTMODE_CTL; break;
2547 : }
2548 0 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2549 0 : return rWrt;
2550 :
2551 0 : const sal_Char *pStr = 0;
2552 0 : switch( ((const SvxPostureItem&)rHt).GetPosture() )
2553 : {
2554 0 : case ITALIC_NONE: pStr = sCSS1_PV_normal; break;
2555 0 : case ITALIC_OBLIQUE: pStr = sCSS1_PV_oblique; break;
2556 : case ITALIC_NORMAL:
2557 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2558 : {
2559 : // this also works in HTML does not need to be written as
2560 : // a STYLE-Options, and must not be written as Hint
2561 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2562 : "write italic as Hint?" );
2563 0 : pStr = sCSS1_PV_italic;
2564 : }
2565 0 : break;
2566 : default:
2567 : ;
2568 : }
2569 :
2570 0 : if( pStr )
2571 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_style, pStr );
2572 :
2573 0 : return rWrt;
2574 : }
2575 :
2576 0 : static Writer& OutCSS1_SvxKerning( Writer& rWrt, const SfxPoolItem& rHt )
2577 : {
2578 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2579 :
2580 : // Only export Kerning-Item, if the Style supports it fully
2581 0 : if( !rHTMLWrt.IsHTMLMode(HTMLMODE_FULL_STYLES) )
2582 0 : return rWrt;
2583 :
2584 0 : sal_Int16 nValue = ((const SvxKerningItem&)rHt).GetValue();
2585 0 : if( nValue )
2586 : {
2587 0 : OStringBuffer sOut;
2588 0 : if( nValue < 0 )
2589 : {
2590 0 : sOut.append('-');
2591 0 : nValue = -nValue;
2592 : }
2593 :
2594 : // Width as n.n pt
2595 0 : nValue = (nValue + 1) / 2; // 1/10pt
2596 0 : sOut.append(OString::number(nValue / 10) + "." + OString::number(nValue % 10) +
2597 0 : OString(sCSS1_UNIT_pt));
2598 :
2599 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_letter_spacing,
2600 0 : sOut.makeStringAndClear());
2601 : }
2602 : else
2603 : {
2604 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_letter_spacing,
2605 0 : sCSS1_PV_normal );
2606 : }
2607 :
2608 0 : return rWrt;
2609 : }
2610 :
2611 302 : static Writer& OutCSS1_SvxLanguage( Writer& rWrt, const SfxPoolItem& rHt )
2612 : {
2613 302 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2614 :
2615 : // Only export Language rules
2616 302 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2617 270 : return rWrt;
2618 :
2619 32 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2620 32 : switch( rHt.Which() )
2621 : {
2622 12 : case RES_CHRATR_CJK_LANGUAGE: nScript = CSS1_OUTMODE_CJK; break;
2623 8 : case RES_CHRATR_CTL_LANGUAGE: nScript = CSS1_OUTMODE_CTL; break;
2624 : }
2625 32 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2626 24 : return rWrt;
2627 :
2628 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2629 : "write Language as Hint?" );
2630 :
2631 8 : LanguageType eLang = ((const SvxLanguageItem &)rHt).GetLanguage();
2632 8 : if( LANGUAGE_DONTKNOW == eLang )
2633 0 : return rWrt;
2634 :
2635 8 : OUString sOut = LanguageTag::convertToBcp47( eLang );
2636 :
2637 8 : rHTMLWrt.OutCSS1_Property( sCSS1_P_so_language, sOut );
2638 :
2639 8 : return rWrt;
2640 : }
2641 :
2642 7 : static Writer& OutCSS1_SvxUnderline( Writer& rWrt, const SfxPoolItem& rHt )
2643 : {
2644 : // This function only exports Hints!
2645 : // Otherwise OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() is called directly.
2646 :
2647 7 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2648 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2649 0 : (const SvxUnderlineItem *)&rHt, 0, 0, 0 );
2650 :
2651 7 : return rWrt;
2652 : }
2653 :
2654 0 : static Writer& OutCSS1_SvxOverline( Writer& rWrt, const SfxPoolItem& rHt )
2655 : {
2656 : // This function only exports Hints!
2657 : // Otherwise OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() is called directly.
2658 :
2659 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2660 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2661 0 : 0, (const SvxOverlineItem *)&rHt, 0, 0 );
2662 :
2663 0 : return rWrt;
2664 : }
2665 :
2666 0 : static Writer& OutCSS1_SvxHidden( Writer& rWrt, const SfxPoolItem& rHt )
2667 : {
2668 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2669 :
2670 0 : if ( ((const SvxCharHiddenItem&)rHt).GetValue() )
2671 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_display, sCSS1_PV_none );
2672 :
2673 0 : return rWrt;
2674 : }
2675 :
2676 203 : static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt )
2677 : {
2678 203 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2679 :
2680 203 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2681 203 : switch( rHt.Which() )
2682 : {
2683 89 : case RES_CHRATR_CJK_WEIGHT: nScript = CSS1_OUTMODE_CJK; break;
2684 25 : case RES_CHRATR_CTL_WEIGHT: nScript = CSS1_OUTMODE_CTL; break;
2685 : }
2686 203 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2687 114 : return rWrt;
2688 :
2689 89 : const sal_Char *pStr = 0;
2690 89 : switch( ((const SvxWeightItem&)rHt).GetWeight() )
2691 : {
2692 0 : case WEIGHT_ULTRALIGHT: pStr = sCSS1_PV_extra_light; break;
2693 0 : case WEIGHT_LIGHT: pStr = sCSS1_PV_light; break;
2694 0 : case WEIGHT_SEMILIGHT: pStr = sCSS1_PV_demi_light; break;
2695 0 : case WEIGHT_NORMAL: pStr = sCSS1_PV_normal; break;
2696 0 : case WEIGHT_SEMIBOLD: pStr = sCSS1_PV_demi_bold; break;
2697 : case WEIGHT_BOLD:
2698 89 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2699 : {
2700 : // this also works in HTML does not need to be written as
2701 : // a STYLE-Options, and must not be written as Hint
2702 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2703 : "write bold as Hint?" );
2704 0 : pStr = sCSS1_PV_bold;
2705 : }
2706 89 : break;
2707 0 : case WEIGHT_ULTRABOLD: pStr = sCSS1_PV_extra_bold; break;
2708 : default:
2709 0 : pStr = sCSS1_PV_normal;;
2710 : }
2711 :
2712 89 : if( pStr )
2713 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_weight, pStr );
2714 :
2715 89 : return rWrt;
2716 : }
2717 :
2718 0 : static Writer& OutCSS1_SvxBlink( Writer& rWrt, const SfxPoolItem& rHt )
2719 : {
2720 : // This function only exports Hints!
2721 : // Otherwise OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() is called directly.
2722 :
2723 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2724 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2725 0 : 0, 0, 0, (const SvxBlinkItem *)&rHt );
2726 :
2727 0 : return rWrt;
2728 : }
2729 :
2730 265 : static Writer& OutCSS1_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt )
2731 : {
2732 265 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2733 :
2734 : // Netscape4 has big problems with cell heights if the line spacing is
2735 : // changed within a table and the width of the table is not calculated
2736 : // automatically (== if there is a WIDTH-Option)
2737 265 : if( rHTMLWrt.bOutTable && rHTMLWrt.bCfgNetscape4 )
2738 261 : return rWrt;
2739 :
2740 4 : const SvxLineSpacingItem& rLSItem = (const SvxLineSpacingItem&)rHt;
2741 :
2742 4 : sal_uInt16 nHeight = 0;
2743 4 : sal_uInt16 nPrcHeight = 0;
2744 4 : SvxLineSpace eLineSpace = rLSItem.GetLineSpaceRule();
2745 4 : switch( rLSItem.GetInterLineSpaceRule() )
2746 : {
2747 : case SVX_INTER_LINE_SPACE_OFF:
2748 : case SVX_INTER_LINE_SPACE_FIX:
2749 : {
2750 4 : switch( eLineSpace )
2751 : {
2752 : case SVX_LINE_SPACE_MIN:
2753 : case SVX_LINE_SPACE_FIX:
2754 0 : nHeight = rLSItem.GetLineHeight();
2755 0 : break;
2756 : case SVX_LINE_SPACE_AUTO:
2757 4 : nPrcHeight = 100;
2758 4 : break;
2759 : default:
2760 : ;
2761 : }
2762 : }
2763 4 : break;
2764 : case SVX_INTER_LINE_SPACE_PROP:
2765 0 : nPrcHeight = rLSItem.GetPropLineSpace();
2766 0 : break;
2767 :
2768 : default:
2769 : ;
2770 : }
2771 :
2772 4 : if( nHeight )
2773 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_line_height, (long)nHeight );
2774 4 : else if( nPrcHeight )
2775 : {
2776 4 : OString sHeight(OString::number(nPrcHeight) + "%");
2777 4 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_line_height, sHeight);
2778 : }
2779 :
2780 4 : return rWrt;
2781 : }
2782 :
2783 3 : static Writer& OutCSS1_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
2784 : {
2785 3 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2786 :
2787 : // Export Alignment in Style-Option only if the Tag does not allow ALIGN=xxx
2788 3 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
2789 0 : !rHTMLWrt.bNoAlign)
2790 0 : return rWrt;
2791 :
2792 3 : const sal_Char* pStr = 0;
2793 3 : switch( ((const SvxAdjustItem&)rHt).GetAdjust() )
2794 : {
2795 3 : case SVX_ADJUST_LEFT: pStr = sCSS1_PV_left; break;
2796 0 : case SVX_ADJUST_RIGHT: pStr = sCSS1_PV_right; break;
2797 0 : case SVX_ADJUST_BLOCK: pStr = sCSS1_PV_justify; break;
2798 0 : case SVX_ADJUST_CENTER: pStr = sCSS1_PV_center; break;
2799 : default:
2800 : ;
2801 : }
2802 :
2803 3 : if( pStr )
2804 3 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_align, pStr );
2805 :
2806 3 : return rWrt;
2807 : }
2808 :
2809 0 : static Writer& OutCSS1_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt )
2810 : {
2811 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2812 :
2813 0 : const sal_Char *pStr = ((const SvxFmtSplitItem&)rHt).GetValue()
2814 : ? sCSS1_PV_auto
2815 0 : : sCSS1_PV_avoid;
2816 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );
2817 :
2818 0 : return rWrt;
2819 : }
2820 :
2821 0 : static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt )
2822 : {
2823 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2824 :
2825 0 : const sal_Char *pStr = ((const SwFmtLayoutSplit&)rHt).GetValue()
2826 : ? sCSS1_PV_auto
2827 0 : : sCSS1_PV_avoid;
2828 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );
2829 :
2830 0 : return rWrt;
2831 : }
2832 :
2833 3 : static Writer& OutCSS1_SvxWidows( Writer& rWrt, const SfxPoolItem& rHt )
2834 : {
2835 3 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2836 :
2837 3 : OString aStr(OString::number(((const SvxWidowsItem&)rHt).GetValue()));
2838 3 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_widows, aStr );
2839 :
2840 3 : return rWrt;
2841 : }
2842 :
2843 3 : static Writer& OutCSS1_SvxOrphans( Writer& rWrt, const SfxPoolItem& rHt )
2844 : {
2845 3 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2846 :
2847 3 : OString aStr(OString::number(((const SvxOrphansItem&)rHt).GetValue()));
2848 3 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_orphans, aStr );
2849 :
2850 3 : return rWrt;
2851 : }
2852 :
2853 0 : static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
2854 : const SwFmtDrop& rDrop,
2855 : const SfxItemSet *pCharFmtItemSet )
2856 : {
2857 : // Text flows around on right side
2858 0 : rHWrt.OutCSS1_PropertyAscii( sCSS1_P_float, sCSS1_PV_left );
2859 :
2860 : // number of lines -> use % for Font-Height!
2861 0 : OString sOut(OString::number(rDrop.GetLines()*100) + "%");
2862 0 : rHWrt.OutCSS1_PropertyAscii(sCSS1_P_font_size, sOut);
2863 :
2864 : // distance to Text = right margin
2865 0 : sal_uInt16 nDistance = rDrop.GetDistance();
2866 0 : if( nDistance > 0 )
2867 0 : rHWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right, nDistance );
2868 :
2869 0 : const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
2870 0 : if( pCharFmtItemSet )
2871 0 : rHWrt.OutCSS1_SfxItemSet( *pCharFmtItemSet );
2872 0 : else if( pDCCharFmt )
2873 0 : rHWrt.OutCSS1_SfxItemSet( pDCCharFmt->GetAttrSet() );
2874 0 : else if( (rHWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_OFF) == CSS1_OUTMODE_RULE_OFF )
2875 0 : rHWrt.Strm().WriteCharPtr( sCSS1_rule_end );
2876 :
2877 0 : }
2878 :
2879 0 : static Writer& OutCSS1_SwFmtDrop( Writer& rWrt, const SfxPoolItem& rHt )
2880 : {
2881 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2882 :
2883 : // never export as an Option of a paragraph, but only as Hints
2884 0 : if( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
2885 0 : return rWrt;
2886 :
2887 0 : if( rHTMLWrt.bTagOn )
2888 : {
2889 : SwCSS1OutMode aMode( rHTMLWrt,
2890 : rHTMLWrt.nCSS1Script|CSS1_OUTMODE_SPAN_TAG1_ON|CSS1_OUTMODE_ENCODE|
2891 0 : CSS1_OUTMODE_DROPCAP );
2892 :
2893 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, (const SwFmtDrop&)rHt );
2894 : // A "> is already printed by the calling OutCSS1_HintAsSpanTag.
2895 : }
2896 : else
2897 : {
2898 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_span, false );
2899 : }
2900 :
2901 0 : return rWrt;
2902 : }
2903 :
2904 0 : static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
2905 : sal_uInt16 nMode )
2906 : {
2907 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2908 :
2909 0 : const SwFmtFrmSize& rFSItem = (const SwFmtFrmSize&)rHt;
2910 :
2911 0 : if( nMode & CSS1_FRMSIZE_WIDTH )
2912 : {
2913 0 : sal_uInt8 nPrcWidth = rFSItem.GetWidthPercent();
2914 0 : if( nPrcWidth )
2915 : {
2916 0 : OString sOut(OString::number(nPrcWidth) + "%");
2917 0 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_width, sOut);
2918 : }
2919 0 : else if( nMode & CSS1_FRMSIZE_PIXEL )
2920 : {
2921 : rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_width,
2922 0 : rFSItem.GetSize().Width(), sal_False );
2923 : }
2924 : else
2925 : {
2926 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_width,
2927 0 : rFSItem.GetSize().Width() );
2928 : }
2929 : }
2930 :
2931 0 : if( nMode & CSS1_FRMSIZE_ANYHEIGHT )
2932 : {
2933 0 : bool bOutHeight = false;
2934 0 : switch( rFSItem.GetHeightSizeType() )
2935 : {
2936 : case ATT_FIX_SIZE:
2937 0 : bOutHeight = (nMode & CSS1_FRMSIZE_FIXHEIGHT) != 0;
2938 0 : break;
2939 : case ATT_MIN_SIZE:
2940 0 : bOutHeight = (nMode & CSS1_FRMSIZE_MINHEIGHT) != 0;
2941 0 : break;
2942 : case ATT_VAR_SIZE:
2943 0 : bOutHeight = (nMode & CSS1_FRMSIZE_VARHEIGHT) != 0;
2944 0 : break;
2945 : default:
2946 : OSL_ENSURE( bOutHeight, "Hoehe wird nicht exportiert" );
2947 0 : break;
2948 : }
2949 :
2950 0 : if( bOutHeight )
2951 : {
2952 0 : sal_uInt8 nPrcHeight = rFSItem.GetHeightPercent();
2953 0 : if( nPrcHeight )
2954 : {
2955 0 : OString sOut(OString::number(nPrcHeight) + "%");
2956 0 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_height, sOut);
2957 : }
2958 0 : else if( nMode & CSS1_FRMSIZE_PIXEL )
2959 : {
2960 : rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_height,
2961 0 : rFSItem.GetSize().Height(),
2962 0 : sal_True );
2963 : }
2964 : else
2965 : {
2966 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_height,
2967 0 : rFSItem.GetSize().Height() );
2968 : }
2969 : }
2970 : }
2971 :
2972 0 : return rWrt;
2973 : }
2974 :
2975 1 : static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt )
2976 : {
2977 1 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2978 :
2979 1 : const SvxLRSpaceItem& rLRItem = (const SvxLRSpaceItem&)rHt;
2980 :
2981 : // No Export of a firm attribute is needed if the new values
2982 : // match that of the current template
2983 :
2984 : // A left margin can exist because of a list nearby
2985 1 : long nLeftMargin = (long)rLRItem.GetTxtLeft() - rHTMLWrt.nLeftMargin;
2986 1 : if( rHTMLWrt.nDfltLeftMargin != nLeftMargin )
2987 : {
2988 1 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLeftMargin );
2989 : }
2990 :
2991 1 : if( rHTMLWrt.nDfltRightMargin != rLRItem.GetRight() )
2992 : {
2993 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right,
2994 0 : (long)rLRItem.GetRight() );
2995 : }
2996 :
2997 : // The LineIndent of the first line might contain the room for numbering
2998 1 : long nFirstLineIndent = (long)rLRItem.GetTxtFirstLineOfst() -
2999 1 : rHTMLWrt.nFirstLineIndent;
3000 1 : if( rHTMLWrt.nDfltFirstLineIndent != nFirstLineIndent )
3001 : {
3002 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent,
3003 0 : nFirstLineIndent );
3004 : }
3005 :
3006 1 : return rWrt;
3007 : }
3008 :
3009 266 : static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt )
3010 : {
3011 266 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3012 :
3013 266 : const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)rHt;
3014 :
3015 266 : if( rHTMLWrt.nDfltTopMargin != rULItem.GetUpper() )
3016 : {
3017 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_top,
3018 210 : (long)rULItem.GetUpper() );
3019 : }
3020 :
3021 266 : if( rHTMLWrt.nDfltBottomMargin != rULItem.GetLower() )
3022 : {
3023 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_bottom,
3024 6 : (long)rULItem.GetLower() );
3025 : }
3026 :
3027 266 : return rWrt;
3028 : }
3029 :
3030 4 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
3031 : const SvxULSpaceItem *pULItem,
3032 : const SvxLRSpaceItem *pLRItem )
3033 : {
3034 4 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3035 :
3036 12 : if( pLRItem && pULItem &&
3037 8 : pLRItem->GetLeft() == pLRItem->GetRight() &&
3038 8 : pLRItem->GetLeft() == pULItem->GetUpper() &&
3039 8 : pLRItem->GetLeft() == pULItem->GetLower() &&
3040 8 : pLRItem->GetLeft() != rHTMLWrt.nDfltLeftMargin &&
3041 8 : pLRItem->GetRight() != rHTMLWrt.nDfltRightMargin &&
3042 12 : pULItem->GetUpper() != rHTMLWrt.nDfltTopMargin &&
3043 4 : pULItem->GetLower() != rHTMLWrt.nDfltBottomMargin )
3044 : {
3045 4 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin, (long)pLRItem->GetLeft() );
3046 : }
3047 : else
3048 : {
3049 0 : if( pLRItem )
3050 0 : OutCSS1_SvxLRSpace( rWrt, *pLRItem );
3051 0 : if( pULItem )
3052 0 : OutCSS1_SvxULSpace( rWrt, *pULItem );
3053 : }
3054 :
3055 4 : return rWrt;
3056 : }
3057 :
3058 5 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
3059 : const SfxItemSet& rItemSet,
3060 : sal_Bool bDeep )
3061 : {
3062 5 : const SvxULSpaceItem *pULSpace = 0;
3063 5 : const SvxLRSpaceItem *pLRSpace = 0;
3064 : const SfxPoolItem *pItem;
3065 5 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, bDeep, &pItem ) )
3066 4 : pLRSpace = (const SvxLRSpaceItem *)pItem;
3067 :
3068 5 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, bDeep, &pItem ) )
3069 4 : pULSpace = (const SvxULSpaceItem *)pItem;
3070 :
3071 5 : if( pLRSpace || pULSpace )
3072 4 : OutCSS1_SvxULSpace_SvxLRSpace( rWrt, pULSpace, pLRSpace );
3073 :
3074 5 : return rWrt;
3075 : }
3076 :
3077 1 : static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
3078 : const SvxFmtBreakItem *pBreakItem,
3079 : const SwFmtPageDesc *pPDescItem,
3080 : const SvxFmtKeepItem *pKeepItem )
3081 : {
3082 1 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3083 :
3084 1 : if( !rHTMLWrt.IsHTMLMode(HTMLMODE_PRINT_EXT) )
3085 0 : return rWrt;
3086 :
3087 1 : const sal_Char *pBreakBefore = 0;
3088 1 : const sal_Char *pBreakAfter = 0;
3089 :
3090 1 : if( pKeepItem )
3091 : {
3092 0 : pBreakAfter = pKeepItem->GetValue() ? sCSS1_PV_avoid : sCSS1_PV_auto;
3093 : }
3094 1 : if( pBreakItem )
3095 : {
3096 0 : switch( pBreakItem->GetBreak() )
3097 : {
3098 : case SVX_BREAK_NONE:
3099 0 : pBreakBefore = sCSS1_PV_auto;
3100 0 : if( !pBreakAfter )
3101 0 : pBreakAfter = sCSS1_PV_auto;
3102 0 : break;
3103 :
3104 : case SVX_BREAK_PAGE_BEFORE:
3105 0 : pBreakBefore = sCSS1_PV_always;
3106 0 : break;
3107 :
3108 : case SVX_BREAK_PAGE_AFTER:
3109 0 : pBreakAfter= sCSS1_PV_always;
3110 0 : break;
3111 :
3112 : default:
3113 : ;
3114 : }
3115 : }
3116 1 : if( pPDescItem )
3117 : {
3118 1 : const SwPageDesc *pPDesc = pPDescItem->GetPageDesc();
3119 1 : if( pPDesc )
3120 : {
3121 1 : switch( pPDesc->GetPoolFmtId() )
3122 : {
3123 0 : case RES_POOLPAGE_LEFT: pBreakBefore = sCSS1_PV_left; break;
3124 0 : case RES_POOLPAGE_RIGHT: pBreakBefore = sCSS1_PV_right; break;
3125 1 : default: pBreakBefore = sCSS1_PV_always; break;
3126 : }
3127 : }
3128 0 : else if( !pBreakBefore )
3129 : {
3130 0 : pBreakBefore = sCSS1_PV_auto;
3131 : }
3132 : }
3133 :
3134 1 : if( pBreakBefore )
3135 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_before,
3136 1 : pBreakBefore );
3137 1 : if( pBreakAfter )
3138 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_after,
3139 0 : pBreakAfter );
3140 :
3141 1 : return rWrt;
3142 : }
3143 :
3144 281 : static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
3145 : const SfxItemSet& rItemSet,
3146 : sal_Bool bDeep )
3147 : {
3148 281 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3149 : const SfxPoolItem *pItem;
3150 281 : const SvxFmtBreakItem *pBreakItem = 0;
3151 281 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BREAK, bDeep, &pItem ))
3152 0 : pBreakItem = (const SvxFmtBreakItem *)pItem;
3153 :
3154 281 : const SwFmtPageDesc *pPDescItem = 0;
3155 828 : if( ( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
3156 532 : !rHTMLWrt.bCSS1IgnoreFirstPageDesc ||
3157 266 : rHTMLWrt.pStartNdIdx->GetIndex() !=
3158 824 : rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex() ) &&
3159 277 : SFX_ITEM_SET==rItemSet.GetItemState( RES_PAGEDESC, bDeep, &pItem ))
3160 1 : pPDescItem = (const SwFmtPageDesc*)pItem;
3161 :
3162 281 : const SvxFmtKeepItem *pKeepItem = 0;
3163 281 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_KEEP, bDeep, &pItem ))
3164 0 : pKeepItem = (const SvxFmtKeepItem *)pItem;
3165 :
3166 281 : if( pBreakItem || pPDescItem || pKeepItem )
3167 : OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( rWrt, pBreakItem,
3168 1 : pPDescItem, pKeepItem );
3169 :
3170 281 : return rWrt;
3171 : }
3172 :
3173 : // Wrapper for OutCSS1_SfxItemSet etc.
3174 0 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt )
3175 : {
3176 0 : OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR );
3177 0 : return rWrt;
3178 : }
3179 :
3180 262 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
3181 : sal_uInt16 nMode)
3182 : {
3183 262 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3184 :
3185 : // The Character-Attribute is skipped, if we are about to
3186 : // exporting options
3187 262 : if( rHt.Which() < RES_CHRATR_END &&
3188 0 : rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
3189 0 : return rWrt;
3190 :
3191 : // start getting a few values
3192 : // const Brush &rBrush = ((const SvxBrushItem &)rHt).GetBrush();
3193 262 : const Color & rColor = ((const SvxBrushItem &)rHt).GetColor();
3194 262 : SvxGraphicPosition ePos = ((const SvxBrushItem &)rHt).GetGraphicPos();
3195 :
3196 : // get the color
3197 262 : bool bColor = false;
3198 : /// set <bTransparent> to sal_True, if color is "no fill"/"auto fill"
3199 262 : bool bTransparent = (rColor.GetColor() == COL_TRANSPARENT);
3200 262 : Color aColor;
3201 262 : if( !bTransparent )
3202 : {
3203 261 : aColor = rColor;
3204 261 : bColor = true;
3205 : }
3206 :
3207 : // and now the Graphic
3208 262 : OUString aGraphicInBase64;
3209 :
3210 : // Embedded Grafic -> export WriteEmbedded
3211 262 : const Graphic* pGrf = ((const SvxBrushItem &)rHt).GetGraphic();
3212 262 : if( pGrf )
3213 : {
3214 0 : sal_uLong nErr = XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64);
3215 0 : if( nErr )
3216 : {
3217 0 : rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
3218 : }
3219 : }
3220 :
3221 : // In tables we only export something if there is a Graphic
3222 262 : if( CSS1_BACKGROUND_TABLE==nMode && !pGrf )
3223 261 : return rWrt;
3224 :
3225 : // if necessary, add the orientation of the Graphic
3226 1 : const sal_Char *pRepeat = 0, *pHori = 0, *pVert = 0;
3227 1 : if( pGrf )
3228 : {
3229 0 : if( GPOS_TILED==ePos )
3230 : {
3231 0 : pRepeat = sCSS1_PV_repeat;
3232 : }
3233 : else
3234 : {
3235 0 : switch( ePos )
3236 : {
3237 : case GPOS_LT:
3238 : case GPOS_MT:
3239 : case GPOS_RT:
3240 0 : pHori = sCSS1_PV_top;
3241 0 : break;
3242 :
3243 : case GPOS_LM:
3244 : case GPOS_MM:
3245 : case GPOS_RM:
3246 0 : pHori = sCSS1_PV_middle;
3247 0 : break;
3248 :
3249 : case GPOS_LB:
3250 : case GPOS_MB:
3251 : case GPOS_RB:
3252 0 : pHori = sCSS1_PV_bottom;
3253 0 : break;
3254 :
3255 : default:
3256 : ;
3257 : }
3258 :
3259 0 : switch( ePos )
3260 : {
3261 : case GPOS_LT:
3262 : case GPOS_LM:
3263 : case GPOS_LB:
3264 0 : pVert = sCSS1_PV_left;
3265 0 : break;
3266 :
3267 : case GPOS_MT:
3268 : case GPOS_MM:
3269 : case GPOS_MB:
3270 0 : pVert = sCSS1_PV_center;
3271 0 : break;
3272 :
3273 : case GPOS_RT:
3274 : case GPOS_RM:
3275 : case GPOS_RB:
3276 0 : pVert = sCSS1_PV_right;
3277 0 : break;
3278 :
3279 : default:
3280 : ;
3281 : }
3282 :
3283 0 : if( pHori || pVert )
3284 0 : pRepeat = sCSS1_PV_no_repeat;
3285 : }
3286 : }
3287 :
3288 : // now build the string
3289 1 : OUString sOut;
3290 1 : if( !pGrf && !bColor )
3291 : {
3292 : // no color and no Link, but a transparent Brush
3293 2 : if( bTransparent && CSS1_BACKGROUND_FLY != nMode )
3294 1 : sOut += OStringToOUString(sCSS1_PV_transparent, RTL_TEXTENCODING_ASCII_US);
3295 : }
3296 : else
3297 : {
3298 0 : if( bColor )
3299 : {
3300 0 : OString sTmp(lclGetCSS1Color(aColor));
3301 0 : sOut += OStringToOUString(sTmp, RTL_TEXTENCODING_ASCII_US);
3302 : }
3303 :
3304 0 : if( pGrf )
3305 : {
3306 0 : if( bColor )
3307 0 : sOut += " ";
3308 :
3309 0 : sOut += OStringToOUString(sCSS1_url, RTL_TEXTENCODING_ASCII_US) +
3310 0 : "(\'" + OOO_STRING_SVTOOLS_HTML_O_data + ":" + aGraphicInBase64 + "\')";
3311 :
3312 0 : if( pRepeat )
3313 : {
3314 0 : sOut += " " + OStringToOUString(pRepeat, RTL_TEXTENCODING_ASCII_US);
3315 : }
3316 :
3317 0 : if( pHori )
3318 : {
3319 0 : sOut += " " + OStringToOUString(pHori, RTL_TEXTENCODING_ASCII_US);
3320 : }
3321 0 : if( pVert )
3322 : {
3323 0 : sOut += " " + OStringToOUString(pVert, RTL_TEXTENCODING_ASCII_US);
3324 : }
3325 :
3326 0 : sOut += " " + OStringToOUString(sCSS1_PV_scroll, RTL_TEXTENCODING_ASCII_US) + " ";
3327 : }
3328 : }
3329 :
3330 1 : if( !sOut.isEmpty() )
3331 1 : rHTMLWrt.OutCSS1_Property( sCSS1_P_background, sOut );
3332 :
3333 1 : return rWrt;
3334 : }
3335 :
3336 264 : static void OutCSS1_SvxBorderLine( SwHTMLWriter& rHTMLWrt,
3337 : const sal_Char *pProperty,
3338 : const SvxBorderLine *pLine )
3339 : {
3340 264 : if( !pLine || pLine->isEmpty() )
3341 : {
3342 0 : rHTMLWrt.OutCSS1_PropertyAscii( pProperty, sCSS1_PV_none );
3343 264 : return;
3344 : }
3345 :
3346 264 : sal_Int32 nWidth = pLine->GetWidth();
3347 :
3348 264 : OStringBuffer sOut;
3349 1056 : if( Application::GetDefaultDevice() &&
3350 264 : nWidth <= Application::GetDefaultDevice()->PixelToLogic(
3351 1056 : Size( 1, 1 ), MapMode( MAP_TWIP) ).Width() )
3352 : {
3353 : // If the width is smaller than one pixel, then export as 1px
3354 : // so that Netscape and IE show the line.
3355 260 : sOut.append("1px");
3356 : }
3357 : else
3358 : {
3359 4 : nWidth *= 5; // 1/100pt
3360 :
3361 : // width in n.nn pt
3362 8 : sOut.append(OString::number(nWidth / 100) + "." + OString::number((nWidth/10) % 10) +
3363 12 : OString::number(nWidth % 10) + OString(sCSS1_UNIT_pt));
3364 : }
3365 :
3366 : // Line-Style: solid or double
3367 264 : sOut.append(' ');
3368 264 : switch (pLine->GetBorderLineStyle())
3369 : {
3370 : case table::BorderLineStyle::SOLID:
3371 261 : sOut.append(sCSS1_PV_solid);
3372 261 : break;
3373 : case table::BorderLineStyle::DOTTED:
3374 1 : sOut.append(sCSS1_PV_dotted);
3375 1 : break;
3376 : case table::BorderLineStyle::DASHED:
3377 1 : sOut.append(sCSS1_PV_dashed);
3378 1 : break;
3379 : case table::BorderLineStyle::DOUBLE:
3380 : case table::BorderLineStyle::THINTHICK_SMALLGAP:
3381 : case table::BorderLineStyle::THINTHICK_MEDIUMGAP:
3382 : case table::BorderLineStyle::THINTHICK_LARGEGAP:
3383 : case table::BorderLineStyle::THICKTHIN_SMALLGAP:
3384 : case table::BorderLineStyle::THICKTHIN_MEDIUMGAP:
3385 : case table::BorderLineStyle::THICKTHIN_LARGEGAP:
3386 1 : sOut.append(sCSS1_PV_double);
3387 1 : break;
3388 : case table::BorderLineStyle::EMBOSSED:
3389 0 : sOut.append(sCSS1_PV_ridge);
3390 0 : break;
3391 : case table::BorderLineStyle::ENGRAVED:
3392 0 : sOut.append(sCSS1_PV_groove);
3393 0 : break;
3394 : case table::BorderLineStyle::INSET:
3395 0 : sOut.append(sCSS1_PV_inset);
3396 0 : break;
3397 : case table::BorderLineStyle::OUTSET:
3398 0 : sOut.append(sCSS1_PV_outset);
3399 0 : break;
3400 : default:
3401 0 : sOut.append(sCSS1_PV_none);
3402 : }
3403 264 : sOut.append(' ');
3404 :
3405 : // and also the color
3406 264 : sOut.append(lclGetCSS1Color(pLine->GetColor()));
3407 :
3408 264 : rHTMLWrt.OutCSS1_PropertyAscii(pProperty, sOut.makeStringAndClear());
3409 : }
3410 :
3411 262 : Writer& OutCSS1_SvxBox( Writer& rWrt, const SfxPoolItem& rHt )
3412 : {
3413 262 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3414 :
3415 : // Avoid interference between character and paragraph attributes
3416 264 : if( rHt.Which() < RES_CHRATR_END &&
3417 2 : rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
3418 0 : return rWrt;
3419 :
3420 262 : if( rHt.Which() == RES_CHRATR_BOX )
3421 : {
3422 2 : if( rHTMLWrt.bTagOn )
3423 : {
3424 : // Inline-block to make the line height changing correspond to the character border
3425 1 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_display, "inline-block");
3426 : }
3427 : else
3428 : {
3429 1 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_span, false );
3430 1 : return rWrt;
3431 : }
3432 : }
3433 :
3434 261 : const SvxBoxItem& rBoxItem = (const SvxBoxItem&)rHt;
3435 261 : const SvxBorderLine *pTop = rBoxItem.GetTop();
3436 261 : const SvxBorderLine *pBottom = rBoxItem.GetBottom();
3437 261 : const SvxBorderLine *pLeft = rBoxItem.GetLeft();
3438 261 : const SvxBorderLine *pRight = rBoxItem.GetRight();
3439 :
3440 783 : if( (pTop && pBottom && pLeft && pRight &&
3441 1042 : *pTop == *pBottom && *pTop == *pLeft && *pTop == *pRight) ||
3442 0 : (!pTop && !pBottom && !pLeft && !pRight) )
3443 : {
3444 : // all Lines are set and equal, or all Lines are not set
3445 : // => border : ...
3446 260 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border, pTop );
3447 : }
3448 : else
3449 : {
3450 : // otherwise export all Lines separately
3451 1 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_top, pTop );
3452 1 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_bottom, pBottom );
3453 1 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_left, pLeft );
3454 1 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_right, pRight );
3455 : }
3456 :
3457 261 : long nTopDist = pTop ? rBoxItem.GetDistance( BOX_LINE_TOP ) : 0;
3458 261 : long nBottomDist = pBottom ? rBoxItem.GetDistance( BOX_LINE_BOTTOM ) : 0;
3459 261 : long nLeftDist = pLeft ? rBoxItem.GetDistance( BOX_LINE_LEFT ) : 0;
3460 261 : long nRightDist = pRight ? rBoxItem.GetDistance( BOX_LINE_RIGHT ) : 0;
3461 :
3462 261 : if( nTopDist == nBottomDist && nLeftDist == nRightDist )
3463 : {
3464 0 : OStringBuffer sVal;
3465 0 : AddUnitPropertyValue(sVal, nTopDist, rHTMLWrt.GetCSS1Unit());
3466 0 : if( nTopDist != nLeftDist )
3467 : {
3468 0 : sVal.append(' ');
3469 0 : AddUnitPropertyValue(sVal, nLeftDist, rHTMLWrt.GetCSS1Unit());
3470 : }
3471 0 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_padding, sVal.makeStringAndClear());
3472 : }
3473 : else
3474 : {
3475 261 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_top, nTopDist );
3476 261 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_bottom, nBottomDist );
3477 261 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_left, nLeftDist );
3478 261 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_right, nRightDist );
3479 : }
3480 :
3481 261 : return rWrt;
3482 : }
3483 :
3484 3 : static Writer& OutCSS1_SvxFrameDirection( Writer& rWrt, const SfxPoolItem& rHt )
3485 : {
3486 3 : SwHTMLWriter& rHTMLWrt = static_cast< SwHTMLWriter& >( rWrt );
3487 :
3488 : // Language will be exported rules only
3489 3 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_TEMPLATE ) )
3490 0 : return rWrt;
3491 :
3492 : sal_uInt16 nDir =
3493 3 : static_cast< const SvxFrameDirectionItem& >( rHt ).GetValue();
3494 3 : const sal_Char* pStr = NULL;
3495 3 : switch( nDir )
3496 : {
3497 : case FRMDIR_HORI_LEFT_TOP:
3498 : case FRMDIR_VERT_TOP_LEFT:
3499 3 : pStr = sCSS1_PV_ltr;
3500 3 : break;
3501 : case FRMDIR_HORI_RIGHT_TOP:
3502 : case FRMDIR_VERT_TOP_RIGHT:
3503 0 : pStr = sCSS1_PV_rtl;
3504 0 : break;
3505 : case FRMDIR_ENVIRONMENT:
3506 0 : pStr = sCSS1_PV_inherit;
3507 0 : break;
3508 : }
3509 :
3510 3 : if( pStr )
3511 3 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_direction, pStr );
3512 :
3513 3 : return rWrt;
3514 : }
3515 :
3516 : /*
3517 : * Place here the table for the HTML-Function-Pointer to the
3518 : * Export-Functions.
3519 : * They are local structures, only needed within the HTML-DLL.
3520 : */
3521 :
3522 : SwAttrFnTab aCSS1AttrFnTab = {
3523 : /* RES_CHRATR_CASEMAP */ OutCSS1_SvxCaseMap,
3524 : /* RES_CHRATR_CHARSETCOLOR */ 0,
3525 : /* RES_CHRATR_COLOR */ OutCSS1_SvxColor,
3526 : /* RES_CHRATR_CONTOUR */ 0,
3527 : /* RES_CHRATR_CROSSEDOUT */ OutCSS1_SvxCrossedOut,
3528 : /* RES_CHRATR_ESCAPEMENT */ 0,
3529 : /* RES_CHRATR_FONT */ OutCSS1_SvxFont,
3530 : /* RES_CHRATR_FONTSIZE */ OutCSS1_SvxFontHeight,
3531 : /* RES_CHRATR_KERNING */ OutCSS1_SvxKerning,
3532 : /* RES_CHRATR_LANGUAGE */ OutCSS1_SvxLanguage,
3533 : /* RES_CHRATR_POSTURE */ OutCSS1_SvxPosture,
3534 : /* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
3535 : /* RES_CHRATR_SHADOWED */ 0,
3536 : /* RES_CHRATR_UNDERLINE */ OutCSS1_SvxUnderline,
3537 : /* RES_CHRATR_WEIGHT */ OutCSS1_SvxFontWeight,
3538 : /* RES_CHRATR_WORDLINEMODE */ 0,
3539 : /* RES_CHRATR_AUTOKERN */ 0,
3540 : /* RES_CHRATR_BLINK */ OutCSS1_SvxBlink,
3541 : /* RES_CHRATR_NOHYPHEN */ 0, // Neu: nicht trennen
3542 : /* RES_CHRATR_NOLINEBREAK */ 0, // Neu: nicht umbrechen
3543 : /* RES_CHRATR_BACKGROUND */ OutCSS1_SvxBrush, // Neu: Zeichenhintergrund
3544 : /* RES_CHRATR_CJK_FONT */ OutCSS1_SvxFont,
3545 : /* RES_CHRATR_CJK_FONTSIZE */ OutCSS1_SvxFontHeight,
3546 : /* RES_CHRATR_CJK_LANGUAGE */ OutCSS1_SvxLanguage,
3547 : /* RES_CHRATR_CJK_POSTURE */ OutCSS1_SvxPosture,
3548 : /* RES_CHRATR_CJK_WEIGHT */ OutCSS1_SvxFontWeight,
3549 : /* RES_CHRATR_CTL_FONT */ OutCSS1_SvxFont,
3550 : /* RES_CHRATR_CTL_FONTSIZE */ OutCSS1_SvxFontHeight,
3551 : /* RES_CHRATR_CTL_LANGUAGE */ OutCSS1_SvxLanguage,
3552 : /* RES_CHRATR_CTL_POSTURE */ OutCSS1_SvxPosture,
3553 : /* RES_CHRATR_CTL_WEIGHT */ OutCSS1_SvxFontWeight,
3554 : /* RES_CHRATR_ROTATE */ 0,
3555 : /* RES_CHRATR_EMPHASIS_MARK */ 0,
3556 : /* RES_CHRATR_TWO_LINES */ 0,
3557 : /* RES_CHRATR_SCALEW */ 0,
3558 : /* RES_CHRATR_RELIEF */ 0,
3559 : /* RES_CHRATR_HIDDEN */ OutCSS1_SvxHidden,
3560 : /* RES_CHRATR_OVERLINE */ OutCSS1_SvxOverline,
3561 : /* RES_CHRATR_RSID */ 0,
3562 : /* RES_CHRATR_BOX */ OutCSS1_SvxBox,
3563 : /* RES_CHRATR_SHADOW */ 0,
3564 : /* RES_CHRATR_HIGHLIGHT */ 0,
3565 : /* RES_CHRATR_GRABBAG */ 0,
3566 : /* RES_CHRATR_BIDIRTL */ 0,
3567 : /* RES_CHRATR_IDCTHINT */ 0,
3568 :
3569 : /* RES_TXTATR_REFMARK */ 0,
3570 : /* RES_TXTATR_TOXMARK */ 0,
3571 : /* RES_TXTATR_META */ 0,
3572 : /* RES_TXTATR_METAFIELD */ 0,
3573 : /* RES_TXTATR_AUTOFMT */ 0,
3574 : /* RES_TXTATR_INETFMT */ 0,
3575 : /* RES_TXTATR_CHARFMT */ 0,
3576 : /* RES_TXTATR_CJK_RUBY */ 0,
3577 : /* RES_TXTATR_UNKNOWN_CONTAINER */ 0,
3578 : /* RES_TXTATR_INPUTFIELD */ 0,
3579 :
3580 : /* RES_TXTATR_FIELD */ 0,
3581 : /* RES_TXTATR_FLYCNT */ 0,
3582 : /* RES_TXTATR_FTN */ 0,
3583 : /* RES_TXTATR_ANNOTATION */ 0,
3584 : /* RES_TXTATR_DUMMY3 */ 0,
3585 : /* RES_TXTATR_DUMMY1 */ 0, // Dummy:
3586 : /* RES_TXTATR_DUMMY2 */ 0, // Dummy:
3587 :
3588 : /* RES_PARATR_LINESPACING */ OutCSS1_SvxLineSpacing,
3589 : /* RES_PARATR_ADJUST */ OutCSS1_SvxAdjust,
3590 : /* RES_PARATR_SPLIT */ OutCSS1_SvxFmtSplit,
3591 : /* RES_PARATR_WIDOWS */ OutCSS1_SvxWidows,
3592 : /* RES_PARATR_ORPHANS */ OutCSS1_SvxOrphans,
3593 : /* RES_PARATR_TABSTOP */ 0,
3594 : /* RES_PARATR_HYPHENZONE*/ 0,
3595 : /* RES_PARATR_DROP */ OutCSS1_SwFmtDrop,
3596 : /* RES_PARATR_REGISTER */ 0, // neu: Registerhaltigkeit
3597 : /* RES_PARATR_NUMRULE */ 0,
3598 : /* RES_PARATR_SCRIPTSPACE */ 0,
3599 : /* RES_PARATR_HANGINGPUNCTUATION */ 0,
3600 : /* RES_PARATR_FORBIDDEN_RULES */ 0, // new
3601 : /* RES_PARATR_VERTALIGN */ 0, // new
3602 : /* RES_PARATR_SNAPTOGRID*/ 0, // new
3603 : /* RES_PARATR_CONNECT_TO_BORDER */ 0, // new
3604 : /* RES_PARATR_OUTLINELEVEL */ 0, // new since cws outlinelevel
3605 : /* RES_PARATR_RSID */ 0, // new
3606 : /* RES_PARATR_GRABBAG */ 0,
3607 :
3608 : /* RES_PARATR_LIST_ID */ 0, // new
3609 : /* RES_PARATR_LIST_LEVEL */ 0, // new
3610 : /* RES_PARATR_LIST_ISRESTART */ 0, // new
3611 : /* RES_PARATR_LIST_RESTARTVALUE */ 0, // new
3612 : /* RES_PARATR_LIST_ISCOUNTED */ 0, // new
3613 :
3614 : /* RES_FILL_ORDER */ 0,
3615 : /* RES_FRM_SIZE */ 0,
3616 : /* RES_PAPER_BIN */ 0,
3617 : /* RES_LR_SPACE */ OutCSS1_SvxLRSpace,
3618 : /* RES_UL_SPACE */ OutCSS1_SvxULSpace,
3619 : /* RES_PAGEDESC */ 0,
3620 : /* RES_BREAK */ 0,
3621 : /* RES_CNTNT */ 0,
3622 : /* RES_HEADER */ 0,
3623 : /* RES_FOOTER */ 0,
3624 : /* RES_PRINT */ 0,
3625 : /* RES_OPAQUE */ 0,
3626 : /* RES_PROTECT */ 0,
3627 : /* RES_SURROUND */ 0,
3628 : /* RES_VERT_ORIENT */ 0,
3629 : /* RES_HORI_ORIENT */ 0,
3630 : /* RES_ANCHOR */ 0,
3631 : /* RES_BACKGROUND */ OutCSS1_SvxBrush,
3632 : /* RES_BOX */ OutCSS1_SvxBox,
3633 : /* RES_SHADOW */ 0,
3634 : /* RES_FRMMACRO */ 0,
3635 : /* RES_COL */ 0,
3636 : /* RES_KEEP */ 0,
3637 : /* RES_URL */ 0,
3638 : /* RES_EDIT_IN_READONLY */ 0,
3639 : /* RES_LAYOUT_SPLIT */ 0,
3640 : /* RES_CHAIN */ 0,
3641 : /* RES_TEXTGRID */ 0,
3642 : /* RES_LINENUMBER */ 0,
3643 : /* RES_FTN_AT_TXTEND */ 0,
3644 : /* RES_END_AT_TXTEND */ 0,
3645 : /* RES_COLUMNBALANCE */ 0,
3646 : /* RES_FRAMEDIR */ OutCSS1_SvxFrameDirection,
3647 : /* RES_HEADER_FOOTER_EAT_SPACING */ 0,
3648 : /* RES_ROW_SPLIT */ 0,
3649 : /* RES_FOLLOW_TEXT_FLOW */ 0,
3650 : /* RES_COLLAPSING_BORDERS */ 0,
3651 : /* RES_WRAP_INFLUENCE_ON_OBJPOS */ 0,
3652 : /* RES_AUTO_STYLE */ 0,
3653 : /* RES_FRMATR_STYLE_NAME */ 0,
3654 : /* RES_FRMATR_CONDITIONAL_STYLE_NAME */ 0,
3655 : /* RES_FRMATR_GRABBAG */ 0,
3656 : /* RES_TEXT_VERT_ADJUST */ 0,
3657 :
3658 : /* RES_GRFATR_MIRRORGRF */ 0,
3659 : /* RES_GRFATR_CROPGRF */ 0,
3660 : /* RES_GRFATR_ROTATION */ 0,
3661 : /* RES_GRFATR_LUMINANCE */ 0,
3662 : /* RES_GRFATR_CONTRAST */ 0,
3663 : /* RES_GRFATR_CHANNELR */ 0,
3664 : /* RES_GRFATR_CHANNELG */ 0,
3665 : /* RES_GRFATR_CHANNELB */ 0,
3666 : /* RES_GRFATR_GAMMA */ 0,
3667 : /* RES_GRFATR_INVERT */ 0,
3668 : /* RES_GRFATR_TRANSPARENCY */ 0,
3669 : /* RES_GRFATR_DRWAMODE */ 0,
3670 : /* RES_GRFATR_DUMMY1 */ 0,
3671 : /* RES_GRFATR_DUMMY2 */ 0,
3672 : /* RES_GRFATR_DUMMY3 */ 0,
3673 : /* RES_GRFATR_DUMMY4 */ 0,
3674 : /* RES_GRFATR_DUMMY5 */ 0,
3675 :
3676 : /* RES_BOXATR_FORMAT */ 0,
3677 : /* RES_BOXATR_FORMULA */ 0,
3678 : /* RES_BOXATR_VALUE */ 0
3679 : };
3680 :
3681 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|