xref: /AOO41X/main/sw/source/filter/html/htmlfldw.cxx (revision 8e8ee8fefdac26d905672cc573c35fd0ae1f9356)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include <com/sun/star/i18n/ScriptType.hpp>
29 #include <tools/string.hxx>
30 #include <svtools/htmlkywd.hxx>
31 #include <svtools/htmlout.hxx>
32 #include <svtools/htmltokn.h>
33 #include <fmtfld.hxx>
34 #include <doc.hxx>
35 #include <breakit.hxx>
36 #include <ndtxt.hxx>
37 #include <txtfld.hxx>
38 #include "fldbas.hxx"
39 #include "docufld.hxx"
40 #include "flddat.hxx"
41 #include "htmlfld.hxx"
42 #include "wrthtml.hxx"
43 
44 using namespace nsSwDocInfoSubType;
45 
GetNumFormat(sal_uInt16 nFmt)46 const sal_Char *SwHTMLWriter::GetNumFormat( sal_uInt16 nFmt )
47 {
48     const sal_Char *pFmtStr = 0;
49 
50     switch( (SvxExtNumType)nFmt )
51     {
52     case SVX_NUM_CHARS_UPPER_LETTER:    pFmtStr = OOO_STRING_SW_HTML_FF_uletter;    break;
53     case SVX_NUM_CHARS_LOWER_LETTER:    pFmtStr = OOO_STRING_SW_HTML_FF_lletter;    break;
54     case SVX_NUM_ROMAN_UPPER:           pFmtStr = OOO_STRING_SW_HTML_FF_uroman;         break;
55     case SVX_NUM_ROMAN_LOWER:           pFmtStr = OOO_STRING_SW_HTML_FF_lroman;         break;
56     case SVX_NUM_ARABIC:                pFmtStr = OOO_STRING_SW_HTML_FF_arabic;     break;
57     case SVX_NUM_NUMBER_NONE:           pFmtStr = OOO_STRING_SW_HTML_FF_none;       break;
58     case SVX_NUM_CHAR_SPECIAL:          pFmtStr = OOO_STRING_SW_HTML_FF_char;       break;
59     case SVX_NUM_PAGEDESC:              pFmtStr = OOO_STRING_SW_HTML_FF_page;       break;
60     case SVX_NUM_CHARS_UPPER_LETTER_N:  pFmtStr = OOO_STRING_SW_HTML_FF_ulettern;   break;
61     case SVX_NUM_CHARS_LOWER_LETTER_N:  pFmtStr = OOO_STRING_SW_HTML_FF_llettern;   break;
62     default:
63         ;
64     }
65 
66     return pFmtStr;
67 }
68 
69 extern sal_Bool lcl_css1atr_equalFontItems( const SfxPoolItem& r1, const SfxPoolItem& r2 );
OutHTML_SwField(Writer & rWrt,const SwField * pFld,const SwTxtNode & rTxtNd,xub_StrLen nFldPos)70 static Writer& OutHTML_SwField( Writer& rWrt, const SwField* pFld,
71                                 const SwTxtNode& rTxtNd, xub_StrLen nFldPos )
72 {
73     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
74 
75     const SwFieldType* pFldTyp = pFld->GetTyp();
76     sal_uInt16 nField = pFldTyp->Which();
77     sal_uLong nFmt = pFld->GetFormat();
78 
79     const sal_Char *pTypeStr=0, // TYPE
80                    *pSubStr=0,  // SUBTYPE
81                    *pFmtStr=0;  // FORMAT (SW)
82     String aValue;              // VALUE (SW)
83     sal_Bool bNumFmt=sal_False;         // SDNUM (Number-Formatter-Format)
84     sal_Bool bNumValue=sal_False;       // SDVAL (Number-Formatter-Value)
85     double dNumValue = 0.0;     // SDVAL (Number-Formatter-Value)
86     sal_Bool bFixed=sal_False;          // SDFIXED
87     String aName;               // NAME (CUSTOM)
88 
89     switch( nField )
90     {
91         case RES_EXTUSERFLD:
92             pTypeStr = OOO_STRING_SW_HTML_FT_sender;
93             switch( (SwExtUserSubType)pFld->GetSubType() )
94             {
95                 case EU_COMPANY:    pSubStr = OOO_STRING_SW_HTML_FS_company;        break;
96                 case EU_FIRSTNAME:  pSubStr = OOO_STRING_SW_HTML_FS_firstname;  break;
97                 case EU_NAME:       pSubStr = OOO_STRING_SW_HTML_FS_name;       break;
98                 case EU_SHORTCUT:   pSubStr = OOO_STRING_SW_HTML_FS_shortcut;   break;
99                 case EU_STREET:     pSubStr = OOO_STRING_SW_HTML_FS_street;     break;
100                 case EU_COUNTRY:    pSubStr = OOO_STRING_SW_HTML_FS_country;     break;
101                 case EU_ZIP:        pSubStr = OOO_STRING_SW_HTML_FS_zip;         break;
102                 case EU_CITY:       pSubStr = OOO_STRING_SW_HTML_FS_city;        break;
103                 case EU_TITLE:      pSubStr = OOO_STRING_SW_HTML_FS_title;       break;
104                 case EU_POSITION:   pSubStr = OOO_STRING_SW_HTML_FS_position;    break;
105                 case EU_PHONE_PRIVATE:  pSubStr = OOO_STRING_SW_HTML_FS_pphone;      break;
106                 case EU_PHONE_COMPANY:  pSubStr = OOO_STRING_SW_HTML_FS_cphone;      break;
107                 case EU_FAX:        pSubStr = OOO_STRING_SW_HTML_FS_fax;         break;
108                 case EU_EMAIL:      pSubStr = OOO_STRING_SW_HTML_FS_email;       break;
109                 case EU_STATE:      pSubStr = OOO_STRING_SW_HTML_FS_state;       break;
110                 default:
111                     ;
112             }
113             ASSERT( pSubStr, "ubekannter Subtyp fuer SwExtUserField" );
114             bFixed = ((const SwExtUserField*)pFld)->IsFixed();
115             break;
116 
117         case RES_AUTHORFLD:
118             pTypeStr = OOO_STRING_SW_HTML_FT_author;
119             switch( (SwAuthorFormat)nFmt & 0xff)
120             {
121                 case AF_NAME:     pFmtStr = OOO_STRING_SW_HTML_FF_name;     break;
122                 case AF_SHORTCUT:  pFmtStr = OOO_STRING_SW_HTML_FF_shortcut;    break;
123             }
124             ASSERT( pFmtStr, "ubekanntes Format fuer SwAuthorField" );
125             bFixed = ((const SwAuthorField*)pFld)->IsFixed();
126             break;
127 
128         case RES_DATETIMEFLD:
129             pTypeStr = OOO_STRING_SW_HTML_FT_datetime;
130             bNumFmt = sal_True;
131             if( ((SwDateTimeField*)pFld)->IsFixed() )
132             {
133                 bNumValue = sal_True;
134                 dNumValue = ((SwDateTimeField*)pFld)->GetValue();
135             }
136             break;
137 
138         case RES_PAGENUMBERFLD:
139             {
140                 pTypeStr = OOO_STRING_SW_HTML_FT_page;
141                 SwPageNumSubType eSubType = (SwPageNumSubType)pFld->GetSubType();
142                 switch( eSubType )
143                 {
144                     case PG_RANDOM:     pSubStr = OOO_STRING_SW_HTML_FS_random;     break;
145                     case PG_NEXT:       pSubStr = OOO_STRING_SW_HTML_FS_next;       break;
146                     case PG_PREV:       pSubStr = OOO_STRING_SW_HTML_FS_prev;       break;
147                 }
148                 ASSERT( pSubStr, "ubekannter Subtyp fuer SwPageNumberField" );
149                 pFmtStr = SwHTMLWriter::GetNumFormat( static_cast< sal_uInt16 >(nFmt) );
150 
151                 if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL )
152                 {
153                     aValue = ((const SwPageNumberField *)pFld)->GetUserString();
154                 }
155                 else
156                 {
157                     const String& rValue = pFld->GetPar2();
158                     short nValue = (short)rValue.ToInt32();
159                     if( (eSubType == PG_NEXT && nValue!=1) ||
160                         (eSubType == PG_PREV && nValue!=-1) ||
161                         (eSubType == PG_RANDOM && nValue!=0) )
162                     {
163                         aValue = rValue;
164                     }
165                 }
166             }
167             break;
168         case RES_DOCINFOFLD:
169             {
170                 sal_uInt16 nSubType = pFld->GetSubType();
171                 pTypeStr = OOO_STRING_SW_HTML_FT_docinfo;
172                 sal_uInt16 nExtSubType = nSubType & 0x0f00;
173                 nSubType &= 0x00ff;
174 
175                 switch( nSubType )
176                 {
177                     case DI_TITEL:      pSubStr = OOO_STRING_SW_HTML_FS_title;  break;
178                     case DI_THEMA:      pSubStr = OOO_STRING_SW_HTML_FS_theme;  break;
179                     case DI_KEYS:       pSubStr = OOO_STRING_SW_HTML_FS_keys;   break;
180                     case DI_COMMENT:    pSubStr = OOO_STRING_SW_HTML_FS_comment; break;
181                     case DI_CREATE:     pSubStr = OOO_STRING_SW_HTML_FS_create;     break;
182                     case DI_CHANGE:     pSubStr = OOO_STRING_SW_HTML_FS_change;     break;
183                     case DI_CUSTOM:     pSubStr = OOO_STRING_SW_HTML_FS_custom;     break;
184                     default:            pTypeStr = 0;               break;
185                 }
186 
187                 if( DI_CUSTOM == nSubType ) {
188                     aName = static_cast<const SwDocInfoField*>(pFld)->GetName();
189                 }
190 
191                 if( DI_CREATE == nSubType || DI_CHANGE == nSubType )
192                 {
193                     switch( nExtSubType )
194                     {
195                         case DI_SUB_AUTHOR:
196                             pFmtStr = OOO_STRING_SW_HTML_FF_author;
197                             break;
198                         case DI_SUB_TIME:
199                             pFmtStr = OOO_STRING_SW_HTML_FF_time;
200                             bNumFmt = sal_True;
201                             break;
202                         case DI_SUB_DATE:
203                             pFmtStr = OOO_STRING_SW_HTML_FF_date;
204                             bNumFmt = sal_True;
205                             break;
206                     }
207                 }
208                 bFixed = ((const SwDocInfoField*)pFld)->IsFixed();
209                 if( bNumFmt )
210                 {
211                     if( bFixed )
212                     {
213                         // Fuer ein fixes Feld och den Num-Value ausgeben.
214                         // Fixe Felder ohne Zahlenformate sollte es
215                         // eigentlich nicht geben. ASSERT ist unten.
216                         dNumValue = ((const SwDocInfoField*)pFld)->GetValue();
217                         bNumValue = sal_True;
218                     }
219                     else if( !nFmt  )
220                     {
221                         // Nicht fixe Felder muessen kein Zahlenformat haben,
222                         // wenn sie aus 4.0-Dokumenten stammen.
223                         bNumFmt = sal_False;
224                     }
225                 }
226             }
227             break;
228 
229         case RES_DOCSTATFLD:
230             {
231                 pTypeStr = OOO_STRING_SW_HTML_FT_docstat;
232                 sal_uInt16 nSubType = pFld->GetSubType();
233                 switch( nSubType )
234                 {
235                     case DS_PAGE:       pSubStr = OOO_STRING_SW_HTML_FS_page;   break;
236                     case DS_PARA:       pSubStr = OOO_STRING_SW_HTML_FS_para;   break;
237                     case DS_WORD:       pSubStr = OOO_STRING_SW_HTML_FS_word;   break;
238                     case DS_CHAR:       pSubStr = OOO_STRING_SW_HTML_FS_char;   break;
239                     case DS_TBL:        pSubStr = OOO_STRING_SW_HTML_FS_tbl;    break;
240                     case DS_GRF:        pSubStr = OOO_STRING_SW_HTML_FS_grf;    break;
241                     case DS_OLE:        pSubStr = OOO_STRING_SW_HTML_FS_ole;    break;
242                     default:            pTypeStr = 0;               break;
243                 }
244                 pFmtStr = SwHTMLWriter::GetNumFormat( static_cast< sal_uInt16 >(nFmt) );
245             }
246             break;
247 
248         case RES_FILENAMEFLD:
249             pTypeStr = OOO_STRING_SW_HTML_FT_filename;
250             switch( (SwFileNameFormat)(nFmt & ~FF_FIXED) )
251             {
252                 case FF_NAME:       pFmtStr = OOO_STRING_SW_HTML_FF_name;       break;
253                 case FF_PATHNAME:   pFmtStr = OOO_STRING_SW_HTML_FF_pathname;   break;
254                 case FF_PATH:       pFmtStr = OOO_STRING_SW_HTML_FF_path;       break;
255                 case FF_NAME_NOEXT: pFmtStr = OOO_STRING_SW_HTML_FF_name_noext; break;
256                 default:
257                     ;
258             }
259             bFixed = ((const SwFileNameField*)pFld)->IsFixed();
260             ASSERT( pFmtStr, "unbekanntes Format fuer SwFileNameField" );
261             break;
262     }
263 
264     // <SDFIELD>-Tag ausgeben
265     if( pTypeStr )
266     {
267         ByteString sOut( '<' );
268         ((((sOut += OOO_STRING_SVTOOLS_HTML_sdfield) += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += '=')
269             += pTypeStr;
270         if( pSubStr )
271             (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_subtype) += '=') += pSubStr;
272         if( pFmtStr )
273             (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_format) += '=') += pFmtStr;
274         if( aName.Len() )
275         {
276             (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"");
277             rWrt.Strm() << sOut.GetBuffer();
278             HTMLOutFuncs::Out_String( rWrt.Strm(), aName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
279             sOut = '\"';
280         }
281         if( aValue.Len() )
282         {
283             ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_value) += "=\"";
284             rWrt.Strm() << sOut.GetBuffer();
285             HTMLOutFuncs::Out_String( rWrt.Strm(), aValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
286             sOut = '\"';
287         }
288         if( bNumFmt )
289         {
290             ASSERT( nFmt, "Zahlenformat ist 0" );
291             sOut = HTMLOutFuncs::CreateTableDataOptionsValNum( sOut,
292                         bNumValue, dNumValue, nFmt,
293                         *rHTMLWrt.pDoc->GetNumberFormatter(),
294                         rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
295 
296         }
297         if( bFixed )
298             (sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_sdfixed;
299         sOut += '>';
300         rWrt.Strm() << sOut.GetBuffer();
301     }
302 
303     // Inhalt des Feldes ausgeben
304     String const sExpand( pFld->ExpandField(true) );
305     sal_Bool bNeedsCJKProcessing = sal_False;
306     if( sExpand.Len() )
307     {
308         sal_uInt16 nScriptType = pBreakIt->GetBreakIter()->getScriptType( sExpand, 0 );
309         xub_StrLen nPos = (xub_StrLen)pBreakIt->GetBreakIter()->endOfScript( sExpand, 0,
310                                                           nScriptType );
311 
312         sal_uInt16 nScript =
313             SwHTMLWriter::GetCSS1ScriptForScriptType( nScriptType );
314         if( nPos < sExpand.Len() || nScript != rHTMLWrt.nCSS1Script )
315         {
316             bNeedsCJKProcessing = sal_True;
317         }
318     }
319 
320     if( bNeedsCJKProcessing )
321     {
322         SfxItemSet aScriptItemSet( rWrt.pDoc->GetAttrPool(),
323                                    RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
324                                    RES_CHRATR_POSTURE, RES_CHRATR_POSTURE,
325                                    RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
326                                    RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
327                                    0 );
328         rTxtNd.GetAttr( aScriptItemSet, nFldPos, nFldPos+1 );
329 
330         sal_uInt16 aWesternWhichIds[4] =
331             { RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
332               RES_CHRATR_POSTURE, RES_CHRATR_WEIGHT };
333         sal_uInt16 aCJKWhichIds[4] =
334             { RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONTSIZE,
335               RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT };
336         sal_uInt16 aCTLWhichIds[4] =
337             { RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONTSIZE,
338               RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT };
339 
340         sal_uInt16 *pRefWhichIds = 0;
341         switch( rHTMLWrt.nCSS1Script )
342         {
343         case CSS1_OUTMODE_WESTERN:
344             pRefWhichIds = aWesternWhichIds;
345             break;
346         case CSS1_OUTMODE_CJK:
347             pRefWhichIds = aCJKWhichIds;
348             break;
349         case CSS1_OUTMODE_CTL:
350             pRefWhichIds = aCTLWhichIds;
351             break;
352         }
353 
354         xub_StrLen nPos = 0;
355         do
356         {
357             sal_uInt16 nScriptType = pBreakIt->GetBreakIter()->getScriptType( sExpand, nPos );
358             sal_uInt16 nScript =
359                 SwHTMLWriter::GetCSS1ScriptForScriptType( nScriptType );
360             xub_StrLen nEndPos = (xub_StrLen)pBreakIt->GetBreakIter()->endOfScript(
361                                     sExpand, nPos, nScriptType );
362             if( nScript != CSS1_OUTMODE_ANY_SCRIPT &&
363                 /* #108791# */ nScript != rHTMLWrt.nCSS1Script )
364             {
365                 sal_uInt16 *pWhichIds = 0;
366                 switch( nScript )
367                 {
368                 case CSS1_OUTMODE_WESTERN:  pWhichIds = aWesternWhichIds; break;
369                 case CSS1_OUTMODE_CJK:      pWhichIds = aCJKWhichIds; break;
370                 case CSS1_OUTMODE_CTL:      pWhichIds = aCTLWhichIds; break;
371                 }
372 
373                 rHTMLWrt.bTagOn = sal_True;
374                 const SfxPoolItem *aItems[5];
375                 sal_uInt16 nItems = 0;
376                 for( sal_uInt16 i=0; i<4; i++ )
377                 {
378                     const SfxPoolItem *pRefItem =
379                         aScriptItemSet.GetItem( pRefWhichIds[i] );
380                     const SfxPoolItem *pItem =
381                         aScriptItemSet.GetItem( pWhichIds[i] );
382                     if( pRefItem && pItem &&
383                         !(0==i ? lcl_css1atr_equalFontItems( *pRefItem, *pItem )
384                                : *pRefItem == *pItem) )
385                     {
386                         Out( aHTMLAttrFnTab, *pItem, rHTMLWrt );
387                         aItems[nItems++] = pItem;
388                     }
389                 }
390 
391                 HTMLOutFuncs::Out_String( rWrt.Strm(), sExpand.Copy( nPos, nEndPos ),
392                     rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
393 
394                 rHTMLWrt.bTagOn = sal_False;
395                 while( nItems )
396                     Out( aHTMLAttrFnTab, *aItems[--nItems], rHTMLWrt );
397 
398             }
399             else
400             {
401                 HTMLOutFuncs::Out_String( rWrt.Strm(), sExpand.Copy( nPos, nEndPos ),
402                     rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
403             }
404             nPos = nEndPos;
405         }
406         while( nPos < sExpand.Len() );
407     }
408     else
409     {
410         HTMLOutFuncs::Out_String( rWrt.Strm(), sExpand,
411               rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
412     }
413 
414     // Off-Tag ausgeben
415     if( pTypeStr )
416         HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_sdfield, sal_False );
417 
418     return rWrt;
419 }
420 
421 
OutHTML_SwFmtFld(Writer & rWrt,const SfxPoolItem & rHt)422 Writer& OutHTML_SwFmtFld( Writer& rWrt, const SfxPoolItem& rHt )
423 {
424     SwFmtFld & rFld = (SwFmtFld&)rHt;
425     const SwField* pFld = rFld.GetField();
426     const SwFieldType* pFldTyp = pFld->GetTyp();
427 
428     if( RES_SETEXPFLD == pFldTyp->Which() &&
429         (nsSwGetSetExpType::GSE_STRING & pFld->GetSubType()) )
430     {
431         int bOn = sal_False;
432         if( pFldTyp->GetName().EqualsAscii("HTML_ON" ) )
433             bOn = sal_True;
434         else if( !pFldTyp->GetName().EqualsAscii( "HTML_OFF" ) )
435             return rWrt;
436 
437         String rTxt( pFld->GetPar2() );
438         rTxt.EraseLeadingChars().EraseTrailingChars();
439         rWrt.Strm() << '<';
440         if( !bOn )
441             rWrt.Strm() << '/';
442         // TODO: HTML-Tags are written without entitities, that for, characters
443         // not contained in the destination encoding are lost!
444         ByteString sTmp( rTxt, ((SwHTMLWriter&)rWrt).eDestEnc );
445         rWrt.Strm() << sTmp.GetBuffer() << '>';
446     }
447     else if( RES_POSTITFLD == pFldTyp->Which() )
448     {
449         // Kommentare werden im ANSI-Zeichensetz, aber mit System-Zeilen-
450         // Umbruechen gesschrieben.
451         const String& rComment = pFld->GetPar2();
452         sal_Bool bWritten = sal_False;
453 
454         if( (rComment.Len() >= 6 && '<' == rComment.GetChar(0) &&
455             '>' == rComment.GetChar(rComment.Len()-1) &&
456             rComment.Copy( 1, 4 ).EqualsIgnoreCaseAscii(OOO_STRING_SVTOOLS_HTML_meta)) ||
457             (rComment.Len() >= 7 &&
458              rComment.Copy( 0, 4 ).EqualsAscii( "<!--" ) &&
459              rComment.Copy( rComment.Len()-3, 3 ).EqualsAscii( "-->" )) )
460         {
461             // META-Tags direkt ausgeben
462             String sComment( rComment );
463             sComment.ConvertLineEnd( GetSystemLineEnd() );
464             // TODO: HTML-Tags are written without entitities, that for,
465             // characters not contained in the destination encoding are lost!
466             ByteString sTmp( sComment, ((SwHTMLWriter&)rWrt).eDestEnc );
467             rWrt.Strm() << sTmp.GetBuffer();
468             bWritten = sal_True;
469         }
470         else if( rComment.Len() >= 7 &&
471                  '>' == rComment.GetChar(rComment.Len()-1) &&
472                  rComment.Copy(0,5).EqualsIgnoreCaseAscii("HTML:") )
473         {
474             String sComment( rComment.Copy(5) );
475             sComment.EraseLeadingChars();
476             if( '<' == sComment.GetChar(0) )
477             {
478                 sComment.ConvertLineEnd( GetSystemLineEnd() );
479                 // TODO: HTML-Tags are written without entitities, that for,
480                 // characters not contained in the destination encoding are
481                 // lost!
482                 ByteString sTmp( sComment, ((SwHTMLWriter&)rWrt).eDestEnc );
483                 rWrt.Strm() << sTmp.GetBuffer();
484                 bWritten = sal_True;
485             }
486 
487         }
488 
489         if( !bWritten )
490         {
491             ByteString sOut( '<' );
492 
493             String sComment( rComment );
494             sComment.ConvertLineEnd( GetSystemLineEnd() );
495             // TODO: ???
496             (((sOut += OOO_STRING_SVTOOLS_HTML_comment) += ' ')
497                 += ByteString( sComment, ((SwHTMLWriter&)rWrt).eDestEnc ))
498                 += " -->";
499             rWrt.Strm() << sOut.GetBuffer();
500         }
501     }
502     else if( RES_SCRIPTFLD == pFldTyp->Which() )
503     {
504         SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
505         if( rHTMLWrt.bLFPossible )
506             rHTMLWrt.OutNewLine( sal_True );
507 
508         sal_Bool bURL = ((const SwScriptField *)pFld)->IsCodeURL();
509         const String& rType = pFld->GetPar1();
510         String aContents, aURL;
511         if(bURL)
512             aURL = pFld->GetPar2();
513         else
514             aContents = pFld->GetPar2();
515 
516         // sonst ist es der Script-Inhalt selbst. Da nur noh JavaScript
517         // in Feldern landet, muss es sich um JavaSrript handeln ...:)
518         HTMLOutFuncs::OutScript( rWrt.Strm(), rWrt.GetBaseURL(), aContents, rType, JAVASCRIPT,
519                                  aURL, 0, 0, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
520 
521         if( rHTMLWrt.bLFPossible )
522             rHTMLWrt.OutNewLine( sal_True );
523     }
524     else
525     {
526         const SwTxtFld *pTxtFld = rFld.GetTxtFld();
527         ASSERT( pTxtFld, "Where is the txt fld?" );
528         if( pTxtFld )
529             OutHTML_SwField( rWrt, pFld, pTxtFld->GetTxtNode(),
530                              *pTxtFld->GetStart()  );
531     }
532     return rWrt;
533 }
534 
535 
536