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