xref: /AOO41X/main/sw/source/filter/html/htmlfld.cxx (revision 3b32dd21b48084cc91e8cdf23382ce990aee2296)
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 
29 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
30 #include <com/sun/star/document/XDocumentProperties.hpp>
31 
32 #include "docsh.hxx"
33 #include <svtools/htmltokn.h>
34 #include <svl/zformat.hxx>
35 #include <unotools/useroptions.hxx>
36 #include <fmtfld.hxx>
37 #include <ndtxt.hxx>
38 #include <doc.hxx>
39 #include <fldbas.hxx>
40 #include <docufld.hxx>
41 #include <flddat.hxx>
42 #include <htmlfld.hxx>
43 #include <swhtml.hxx>
44 
45 using namespace nsSwDocInfoSubType;
46 using namespace ::com::sun::star;
47 
48 struct HTMLNumFmtTblEntry
49 {
50     const sal_Char *pName;
51     NfIndexTableOffset eFmt;
52 };
53 
54 static HTMLOptionEnum __FAR_DATA aHTMLFldTypeTable[] =
55 {
56     { OOO_STRING_SW_HTML_FT_author, RES_AUTHORFLD       },
57     { OOO_STRING_SW_HTML_FT_sender, RES_EXTUSERFLD      },
58     { "DATE",    RES_DATEFLD            },
59     { "TIME",    RES_TIMEFLD            },
60     { OOO_STRING_SW_HTML_FT_datetime,RES_DATETIMEFLD        },
61     { OOO_STRING_SW_HTML_FT_page,   RES_PAGENUMBERFLD   },
62     { OOO_STRING_SW_HTML_FT_docinfo, RES_DOCINFOFLD     },
63     { OOO_STRING_SW_HTML_FT_docstat, RES_DOCSTATFLD     },
64     { OOO_STRING_SW_HTML_FT_filename,RES_FILENAMEFLD        },
65     { 0,                0                   }
66 };
67 
68 static HTMLNumFmtTblEntry __FAR_DATA aHTMLDateFldFmtTable[] =
69 {
70     { "SSYS",       NF_DATE_SYSTEM_SHORT    },
71     { "LSYS",       NF_DATE_SYSTEM_LONG     },
72     { "DMY",        NF_DATE_SYS_DDMMYY,     },
73     { "DMYY",       NF_DATE_SYS_DDMMYYYY,   },
74     { "DMMY",       NF_DATE_SYS_DMMMYY,     },
75     { "DMMYY",      NF_DATE_SYS_DMMMYYYY,   },
76     { "DMMMY",      NF_DATE_DIN_DMMMMYYYY   },
77     { "DMMMYY",         NF_DATE_DIN_DMMMMYYYY   },
78     { "DDMMY",      NF_DATE_SYS_NNDMMMYY    },
79     { "DDMMMY",         NF_DATE_SYS_NNDMMMMYYYY },
80     { "DDMMMYY",    NF_DATE_SYS_NNDMMMMYYYY },
81     { "DDDMMMY",    NF_DATE_SYS_NNNNDMMMMYYYY },
82     { "DDDMMMYY",   NF_DATE_SYS_NNNNDMMMMYYYY },
83     { "MY",             NF_DATE_SYS_MMYY        },
84     { "MD",             NF_DATE_DIN_MMDD        },
85     { "YMD",        NF_DATE_DIN_YYMMDD      },
86     { "YYMD",       NF_DATE_DIN_YYYYMMDD    },
87     { 0,                    NF_NUMERIC_START }
88 };
89 
90 static HTMLNumFmtTblEntry __FAR_DATA aHTMLTimeFldFmtTable[] =
91 {
92     { "SYS",     NF_TIME_HHMMSS },
93     { "SSMM24",      NF_TIME_HHMM },
94     { "SSMM12",      NF_TIME_HHMMAMPM },
95     { 0,                 NF_NUMERIC_START }
96 };
97 
98 static HTMLOptionEnum __FAR_DATA aHTMLPageNumFldFmtTable[] =
99 {
100     { OOO_STRING_SW_HTML_FF_uletter,     SVX_NUM_CHARS_UPPER_LETTER },
101     { OOO_STRING_SW_HTML_FF_lletter,     SVX_NUM_CHARS_LOWER_LETTER },
102     { OOO_STRING_SW_HTML_FF_uroman,          SVX_NUM_ROMAN_UPPER },
103     { OOO_STRING_SW_HTML_FF_lroman,          SVX_NUM_ROMAN_LOWER },
104     { OOO_STRING_SW_HTML_FF_arabic,      SVX_NUM_ARABIC },
105     { OOO_STRING_SW_HTML_FF_none,        SVX_NUM_NUMBER_NONE },
106     { OOO_STRING_SW_HTML_FF_char,        SVX_NUM_CHAR_SPECIAL },
107     { OOO_STRING_SW_HTML_FF_page,        SVX_NUM_PAGEDESC },
108     { OOO_STRING_SW_HTML_FF_ulettern,    SVX_NUM_CHARS_UPPER_LETTER_N },
109     { OOO_STRING_SW_HTML_FF_llettern,    SVX_NUM_CHARS_LOWER_LETTER_N },
110     { 0,                     0 }
111 };
112 
113 
114 static HTMLOptionEnum __FAR_DATA aHTMLExtUsrFldSubTable[] =
115 {
116     { OOO_STRING_SW_HTML_FS_company,         EU_COMPANY },
117     { OOO_STRING_SW_HTML_FS_firstname,   EU_FIRSTNAME },
118     { OOO_STRING_SW_HTML_FS_name,        EU_NAME },
119     { OOO_STRING_SW_HTML_FS_shortcut,    EU_SHORTCUT },
120     { OOO_STRING_SW_HTML_FS_street,      EU_STREET },
121     { OOO_STRING_SW_HTML_FS_country,      EU_COUNTRY },
122     { OOO_STRING_SW_HTML_FS_zip,          EU_ZIP },
123     { OOO_STRING_SW_HTML_FS_city,         EU_CITY },
124     { OOO_STRING_SW_HTML_FS_title,        EU_TITLE },
125     { OOO_STRING_SW_HTML_FS_position,     EU_POSITION },
126     { OOO_STRING_SW_HTML_FS_pphone,       EU_PHONE_PRIVATE },
127     { OOO_STRING_SW_HTML_FS_cphone,       EU_PHONE_COMPANY },
128     { OOO_STRING_SW_HTML_FS_fax,          EU_FAX },
129     { OOO_STRING_SW_HTML_FS_email,        EU_EMAIL },
130     { OOO_STRING_SW_HTML_FS_state,        EU_STATE },
131     { 0,                     0 }
132 };
133 
134 static HTMLOptionEnum __FAR_DATA aHTMLAuthorFldFmtTable[] =
135 {
136     { OOO_STRING_SW_HTML_FF_name,        AF_NAME },
137     { OOO_STRING_SW_HTML_FF_shortcut,    AF_SHORTCUT },
138     { 0,                     0 }
139 };
140 
141 static HTMLOptionEnum __FAR_DATA aHTMLPageNumFldSubTable[] =
142 {
143     { OOO_STRING_SW_HTML_FS_random,      PG_RANDOM },
144     { OOO_STRING_SW_HTML_FS_next,        PG_NEXT },
145     { OOO_STRING_SW_HTML_FS_prev,        PG_PREV },
146     { 0,                     0  }
147 };
148 
149 // UGLY: these are extensions of nsSwDocInfoSubType (in inc/docufld.hxx)
150 //       these are necessary for importing document info fields written by
151 //       older versions of OOo (< 3.0) which did not have DI_CUSTOM fields
152     const SwDocInfoSubType DI_INFO1         =  DI_SUBTYPE_END + 1;
153     const SwDocInfoSubType DI_INFO2         =  DI_SUBTYPE_END + 2;
154     const SwDocInfoSubType DI_INFO3         =  DI_SUBTYPE_END + 3;
155     const SwDocInfoSubType DI_INFO4         =  DI_SUBTYPE_END + 4;
156 
157 static HTMLOptionEnum __FAR_DATA aHTMLDocInfoFldSubTable[] =
158 {
159     { OOO_STRING_SW_HTML_FS_title,   DI_TITEL },
160     { OOO_STRING_SW_HTML_FS_theme,   DI_THEMA },
161     { OOO_STRING_SW_HTML_FS_keys,    DI_KEYS },
162     { OOO_STRING_SW_HTML_FS_comment,  DI_COMMENT },
163     { "INFO1",   DI_INFO1 },
164     { "INFO2",   DI_INFO2 },
165     { "INFO3",   DI_INFO3 },
166     { "INFO4",   DI_INFO4 },
167     { OOO_STRING_SW_HTML_FS_custom,      DI_CUSTOM },
168     { OOO_STRING_SW_HTML_FS_create,      DI_CREATE },
169     { OOO_STRING_SW_HTML_FS_change,      DI_CHANGE },
170     { 0,                 0 }
171 };
172 
173 static HTMLOptionEnum __FAR_DATA aHTMLDocInfoFldFmtTable[] =
174 {
175     { OOO_STRING_SW_HTML_FF_author,      DI_SUB_AUTHOR },
176     { OOO_STRING_SW_HTML_FF_time,    DI_SUB_TIME },
177     { OOO_STRING_SW_HTML_FF_date,    DI_SUB_DATE },
178     { 0,                 0 }
179 };
180 
181 static HTMLOptionEnum __FAR_DATA aHTMLDocStatFldSubTable[] =
182 {
183     { OOO_STRING_SW_HTML_FS_page,    DS_PAGE },
184     { OOO_STRING_SW_HTML_FS_para,    DS_PARA },
185     { OOO_STRING_SW_HTML_FS_word,    DS_WORD },
186     { OOO_STRING_SW_HTML_FS_char,    DS_CHAR },
187     { OOO_STRING_SW_HTML_FS_tbl,     DS_TBL },
188     { OOO_STRING_SW_HTML_FS_grf,     DS_GRF },
189     { OOO_STRING_SW_HTML_FS_ole,     DS_OLE },
190     { 0,                 0 }
191 };
192 
193 static HTMLOptionEnum __FAR_DATA aHTMLFileNameFldFmtTable[] =
194 {
195     { OOO_STRING_SW_HTML_FF_name,       FF_NAME },
196     { OOO_STRING_SW_HTML_FF_pathname,   FF_PATHNAME },
197     { OOO_STRING_SW_HTML_FF_path,       FF_PATH },
198     { OOO_STRING_SW_HTML_FF_name_noext, FF_NAME_NOEXT },
199     { 0,                    0 }
200 };
201 
202 /*  */
203 
GetNumType(const String & rStr,sal_uInt16 nDfltType)204 sal_uInt16 SwHTMLParser::GetNumType( const String& rStr, sal_uInt16 nDfltType )
205 {
206     sal_uInt16 nType = nDfltType;
207     const HTMLOptionEnum *pOptEnums = aHTMLPageNumFldFmtTable;
208     while( pOptEnums->pName )
209         if( !rStr.EqualsIgnoreCaseAscii( pOptEnums->pName ) )
210             pOptEnums++;
211         else
212             break;
213 
214     if( pOptEnums->pName )
215         nType = pOptEnums->nValue;
216 
217     return nType;
218 }
219 
220 
NewField()221 void SwHTMLParser::NewField()
222 {
223     sal_Bool bKnownType = sal_False, bFixed = sal_False,
224          bHasNumFmt = sal_False, bHasNumValue = sal_False;
225     sal_uInt16 nType = 0;
226     String aValue, aNumFmt, aNumValue, aName;
227     const HTMLOption *pSubOption=0, *pFmtOption=0;
228 
229     const HTMLOptions *pHTMLOptions = GetOptions();
230     sal_uInt16 i;
231 
232     for( i = pHTMLOptions->Count(); i; )
233     {
234         const HTMLOption *pOption = (*pHTMLOptions)[--i];
235         switch( pOption->GetToken() )
236         {
237         case HTML_O_TYPE:
238             bKnownType = pOption->GetEnum( nType, aHTMLFldTypeTable );
239             break;
240         case HTML_O_SUBTYPE:
241             pSubOption = pOption;
242             break;
243         case HTML_O_FORMAT:
244             pFmtOption = pOption;
245             break;
246         case HTML_O_NAME:
247             aName = pOption->GetString();
248             break;
249         case HTML_O_VALUE:
250             aValue = pOption->GetString();
251             break;
252         case HTML_O_SDNUM:
253             aNumFmt = pOption->GetString();
254             bHasNumFmt = sal_True;
255             break;
256         case HTML_O_SDVAL:
257             aNumValue = pOption->GetString();
258             bHasNumValue = sal_True;
259             break;
260         case HTML_O_SDFIXED:
261             bFixed = sal_True;
262             break;
263         }
264     }
265 
266     if( !bKnownType )
267         return;
268 
269     // Autor und Absender werden nur als als variables Feld eingefuegt,
270     // wenn man das Dok selbst als letztes geaendert hat oder es noch
271     // niemend geandert hat und man das Dok erstellt hat. Sonst
272     // wird ein Fixed-Feld daraus gemacht.
273     if( !bFixed &&
274         (RES_EXTUSERFLD == (RES_FIELDS)nType ||
275          RES_AUTHORFLD == (RES_FIELDS)nType) )
276     {
277         SvtUserOptions aOpt;
278         const String& rUser = aOpt.GetFullName();
279         SwDocShell *pDocShell(pDoc->GetDocShell());
280         DBG_ASSERT(pDocShell, "no SwDocShell");
281         if (pDocShell) {
282             uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
283                 pDocShell->GetModel(), uno::UNO_QUERY_THROW);
284             uno::Reference<document::XDocumentProperties> xDocProps(
285                 xDPS->getDocumentProperties());
286             DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties");
287             const String& rChanged = xDocProps->getModifiedBy();
288             const String& rCreated = xDocProps->getAuthor();
289             if( !rUser.Len() ||
290                 (rChanged.Len() ? rUser != rChanged : rUser != rCreated) )
291                 bFixed = sal_True;
292         }
293     }
294 
295     sal_uInt16 nWhich = nType;
296     if( RES_DATEFLD==nType || RES_TIMEFLD==nType )
297         nWhich = RES_DATETIMEFLD;
298 
299     SwFieldType* pType = pDoc->GetSysFldType( nWhich );
300     SwField *pFld = 0;
301     sal_Bool bInsOnEndTag = sal_False;
302 
303     switch( (RES_FIELDS)nType )
304     {
305     case RES_EXTUSERFLD:
306         if( pSubOption )
307         {
308             sal_uInt16 nSub;
309             sal_uLong nFmt = 0;
310             if( bFixed )
311             {
312                 nFmt |= AF_FIXED;
313                 bInsOnEndTag = sal_True;
314             }
315             if( pSubOption->GetEnum( nSub, aHTMLExtUsrFldSubTable ) )
316                 pFld = new SwExtUserField( (SwExtUserFieldType*)pType,
317                                            nSub, nFmt );
318         }
319         break;
320 
321     case RES_AUTHORFLD:
322         {
323             sal_uInt16 nFmt = AF_NAME;
324             if( pFmtOption )
325                 pFmtOption->GetEnum( nFmt, aHTMLAuthorFldFmtTable );
326             if( bFixed )
327             {
328                 nFmt |= AF_FIXED;
329                 bInsOnEndTag = sal_True;
330             }
331 
332             pFld = new SwAuthorField( (SwAuthorFieldType *)pType, nFmt );
333         }
334         break;
335 
336     case RES_DATEFLD:
337     case RES_TIMEFLD:
338         {
339             sal_uLong nNumFmt = 0;
340             sal_uLong nTime = Time().GetTime(), nDate = Date().GetDate();
341             sal_uInt16 nSub = 0;
342             sal_Bool bValidFmt = sal_False;
343             HTMLNumFmtTblEntry * pFmtTbl;
344 
345             if( RES_DATEFLD==nType )
346             {
347                 nSub = DATEFLD;
348                 pFmtTbl = aHTMLDateFldFmtTable;
349                 if( aValue.Len() )
350                     nDate = (sal_uLong)aValue.ToInt32();
351             }
352             else
353             {
354                 nSub = TIMEFLD;
355                 pFmtTbl = aHTMLTimeFldFmtTable;
356                 if( aValue.Len() )
357                     nTime = (sal_uLong)aValue.ToInt32();
358             }
359             if( aValue.Len() )
360                 nSub |= FIXEDFLD;
361 
362             SvNumberFormatter *pFormatter = pDoc->GetNumberFormatter();
363             if( pFmtOption )
364             {
365                 const String& rFmt = pFmtOption->GetString();
366                 for( sal_uInt16 k = 0; pFmtTbl[k].pName; k++ )
367                 {
368                     if( rFmt.EqualsIgnoreCaseAscii( pFmtTbl[k].pName ) )
369                     {
370                         nNumFmt = pFormatter->GetFormatIndex(
371                                         pFmtTbl[k].eFmt, LANGUAGE_SYSTEM);
372                         bValidFmt = sal_True;
373                         break;
374                     }
375                 }
376             }
377             if( !bValidFmt )
378                 nNumFmt = pFormatter->GetFormatIndex( pFmtTbl[i].eFmt,
379                                                       LANGUAGE_SYSTEM);
380 
381             pFld = new SwDateTimeField( (SwDateTimeFieldType *)pType,
382                                           nSub, nNumFmt );
383 
384             if (nSub & FIXEDFLD)
385                 ((SwDateTimeField *)pFld)->SetDateTime( DateTime(Date(nDate), Time(nTime)) );
386         }
387         break;
388 
389     case RES_DATETIMEFLD:
390         if( bHasNumFmt )
391         {
392             sal_uInt16 nSub = 0;
393 
394             SvNumberFormatter *pFormatter = pDoc->GetNumberFormatter();
395             sal_uInt32 nNumFmt;
396             LanguageType eLang;
397             double dValue = GetTableDataOptionsValNum(
398                                 nNumFmt, eLang, aNumValue, aNumFmt,
399                                 *pDoc->GetNumberFormatter() );
400             short nFmtType = pFormatter->GetType( nNumFmt );
401             switch( nFmtType )
402             {
403             case NUMBERFORMAT_DATE: nSub = DATEFLD; break;
404             case NUMBERFORMAT_TIME: nSub = TIMEFLD; break;
405             }
406 
407             if( nSub )
408             {
409                 if( bHasNumValue )
410                     nSub |= FIXEDFLD;
411 
412                 pFld = new SwDateTimeField( (SwDateTimeFieldType *)pType,
413                                                   nSub, nNumFmt );
414                 if( bHasNumValue )
415                     ((SwDateTimeField *)pFld)->SetValue( dValue );
416             }
417         }
418         break;
419 
420     case RES_PAGENUMBERFLD:
421         if( pSubOption )
422         {
423             sal_uInt16 nSub;
424             if( pSubOption->GetEnum( nSub, aHTMLPageNumFldSubTable ) )
425             {
426                 sal_uInt16 nFmt = SVX_NUM_PAGEDESC;
427                 if( pFmtOption )
428                     pFmtOption->GetEnum( nFmt, aHTMLPageNumFldFmtTable );
429 
430                 short nOff = 0;
431 
432                 if( (SvxExtNumType)nFmt!=SVX_NUM_CHAR_SPECIAL && aValue.Len() )
433                     nOff = (short)aValue.ToInt32();
434                 else if( (SwPageNumSubType)nSub == PG_NEXT  )
435                     nOff = 1;
436                 else if( (SwPageNumSubType)nSub == PG_PREV  )
437                     nOff = -1;
438 
439                 if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL &&
440                     (SwPageNumSubType)nSub==PG_RANDOM )
441                     nFmt = SVX_NUM_PAGEDESC;
442 
443                 pFld = new SwPageNumberField( (SwPageNumberFieldType *)pType, nSub, nFmt, nOff );
444                 if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL )
445                     ((SwPageNumberField *)pFld)->SetUserString( aValue );
446             }
447         }
448         break;
449 
450     case RES_DOCINFOFLD:
451         if( pSubOption )
452         {
453             sal_uInt16 nSub;
454             if( pSubOption->GetEnum( nSub, aHTMLDocInfoFldSubTable ) )
455             {
456                 sal_uInt16 nExtSub = 0;
457                 if( DI_CREATE==(SwDocInfoSubType)nSub ||
458                     DI_CHANGE==(SwDocInfoSubType)nSub )
459                 {
460                     nExtSub = DI_SUB_AUTHOR;
461                     if( pFmtOption )
462                         pFmtOption->GetEnum( nExtSub, aHTMLDocInfoFldFmtTable );
463                     nSub |= nExtSub;
464                 }
465 
466                 sal_uInt32 nNumFmt = 0;
467                 double dValue = 0;
468                 if( bHasNumFmt && (DI_SUB_DATE==nExtSub || DI_SUB_TIME==nExtSub) )
469                 {
470                     LanguageType eLang;
471                     dValue = GetTableDataOptionsValNum(
472                                     nNumFmt, eLang, aNumValue, aNumFmt,
473                                     *pDoc->GetNumberFormatter() );
474                     bFixed &= bHasNumValue;
475                 }
476                 else
477                     bHasNumValue = sal_False;
478 
479                 if( nSub >= DI_INFO1 && nSub <= DI_INFO4 && aName.Len() == 0 )
480                 {
481                     // backward compatibility for OOo 2:
482                     // map to names stored in AddMetaUserDefined
483                     aName = m_InfoNames[nSub - DI_INFO1];
484                     nSub = DI_CUSTOM;
485                 }
486 
487                 if( bFixed )
488                 {
489                     nSub |= DI_SUB_FIXED;
490                     bInsOnEndTag = sal_True;
491                 }
492 
493                 pFld = new SwDocInfoField( (SwDocInfoFieldType *)pType,
494                                              nSub, aName, nNumFmt );
495                 if( bHasNumValue )
496                     ((SwDocInfoField*)pFld)->SetValue( dValue );
497             }
498         }
499         break;
500 
501     case RES_DOCSTATFLD:
502         if( pSubOption )
503         {
504             sal_uInt16 nSub;
505             if( pSubOption->GetEnum( nSub, aHTMLDocStatFldSubTable ) )
506             {
507                 sal_uInt16 nFmt = SVX_NUM_ARABIC;
508                 if( pFmtOption )
509                     pFmtOption->GetEnum( nFmt, aHTMLPageNumFldFmtTable );
510                 pFld = new SwDocStatField( (SwDocStatFieldType *)pType,
511                                              nSub, nFmt );
512                 bUpdateDocStat |= (DS_PAGE != nFmt);
513             }
514         }
515         break;
516 
517     case RES_FILENAMEFLD:
518         {
519             sal_uInt16 nFmt = FF_NAME;
520             if( pFmtOption )
521                 pFmtOption->GetEnum( nFmt, aHTMLFileNameFldFmtTable );
522             if( bFixed )
523             {
524                 nFmt |= FF_FIXED;
525                 bInsOnEndTag = sal_True;
526             }
527 
528             pFld = new SwFileNameField( (SwFileNameFieldType *)pType, nFmt );
529         }
530         break;
531     default:
532         ;
533     }
534 
535     if( pFld )
536     {
537         if( bInsOnEndTag )
538         {
539             pField = pFld;
540         }
541         else
542         {
543             pDoc->InsertPoolItem( *pPam, SwFmtFld(*pFld), 0 );
544             delete pFld;
545         }
546         bInField = sal_True;
547     }
548 }
549 
EndField()550 void SwHTMLParser::EndField()
551 {
552     if( pField )
553     {
554         switch( pField->Which() )
555         {
556         case RES_DOCINFOFLD:
557             ASSERT( ((SwDocInfoField*)pField)->IsFixed(),
558                     "DokInfo-Feld haette nicht gemerkt werden muessen" );
559             ((SwDocInfoField*)pField)->SetExpansion( aContents );
560             break;
561 
562         case RES_EXTUSERFLD:
563             ASSERT( ((SwExtUserField*)pField)->IsFixed(),
564                     "ExtUser-Feld haette nicht gemerkt werden muessen" );
565             ((SwExtUserField*)pField)->SetExpansion( aContents );
566             break;
567 
568         case RES_AUTHORFLD:
569             ASSERT( ((SwAuthorField*)pField)->IsFixed(),
570                     "Author-Feld haette nicht gemerkt werden muessen" );
571             ((SwAuthorField*)pField)->SetExpansion( aContents );
572             break;
573 
574         case RES_FILENAMEFLD:
575             ASSERT( ((SwFileNameField*)pField)->IsFixed(),
576                     "FileName-Feld haette nicht gemerkt werden muessen" );
577             ((SwFileNameField*)pField)->SetExpansion( aContents );
578             break;
579         }
580 
581         pDoc->InsertPoolItem( *pPam, SwFmtFld(*pField), 0 );
582         delete pField;
583         pField = 0;
584     }
585 
586     bInField = sal_False;
587     aContents.Erase();
588 }
589 
InsertFieldText()590 void SwHTMLParser::InsertFieldText()
591 {
592     if( pField )
593     {
594         // das aktuelle Textstueck an den Text anhaengen
595         aContents += aToken;
596     }
597 }
598 
InsertCommentText(const sal_Char * pTag)599 void SwHTMLParser::InsertCommentText( const sal_Char *pTag )
600 {
601     sal_Bool bEmpty = aContents.Len() == 0;
602     if( !bEmpty )
603         aContents += '\n';
604 
605     aContents += aToken;
606     if( bEmpty && pTag )
607     {
608         String aTmp( aContents );
609         aContents.AssignAscii( "HTML: <" );
610         aContents.AppendAscii( pTag );
611         aContents.Append( '>' );
612         aContents.Append( aTmp );
613     }
614 }
615 
InsertComment(const String & rComment,const sal_Char * pTag)616 void SwHTMLParser::InsertComment( const String& rComment, const sal_Char *pTag )
617 {
618     String aComment( rComment );
619     if( pTag )
620     {
621         aComment.AppendAscii( "</" );
622         aComment.AppendAscii( pTag );
623         aComment.Append( '>' );
624     }
625 
626     // MIB 24.06.97: Wenn ein PostIt nach einen Space eingefuegt
627     // werden soll, fuegen wir es vor dem Space ein. Dann gibt es
628     // weniger Probleme beim Formatieren (bug #40483#)
629     xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();
630     SwTxtNode *pTxtNd = pPam->GetNode()->GetTxtNode();
631     sal_Bool bMoveFwd = sal_False;
632     if( nPos>0 && pTxtNd && ' '==pTxtNd->GetTxt().GetChar(nPos-1) )
633     {
634         bMoveFwd = sal_True;
635 
636         sal_uLong nNodeIdx = pPam->GetPoint()->nNode.GetIndex();
637         xub_StrLen nIdx = pPam->GetPoint()->nContent.GetIndex();
638         for( sal_uInt16 i = aSetAttrTab.Count(); i > 0; )
639         {
640             _HTMLAttr *pAttr = aSetAttrTab[--i];
641             if( pAttr->GetSttParaIdx() != nNodeIdx ||
642                 pAttr->GetSttCnt() != nIdx )
643                 break;
644 
645             if( RES_TXTATR_FIELD == pAttr->pItem->Which() &&
646                 RES_SCRIPTFLD == ((const SwFmtFld *)pAttr->pItem)->GetField()->GetTyp()->Which() )
647             {
648                 bMoveFwd = sal_False;
649                 break;
650             }
651         }
652 
653         if( bMoveFwd )
654             pPam->Move( fnMoveBackward );
655     }
656 
657     SwPostItField aPostItFld(
658         (SwPostItFieldType*)pDoc->GetSysFldType( RES_POSTITFLD ),
659         aComment,
660         aEmptyStr,
661         aEmptyStr,
662         aEmptyStr,
663         DateTime() );
664     InsertAttr( SwFmtFld( aPostItFld ) );
665 
666     if( bMoveFwd )
667         pPam->Move( fnMoveForward );
668 }
669 
670