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 <osl/diagnose.h>
21 #include <svtools/htmlout.hxx>
22 #include <svtools/htmlkywd.hxx>
23 #include <rtl/strbuf.hxx>
24 #include <ndindex.hxx>
25 #include <fmtftn.hxx>
26 #include <txtftn.hxx>
27 #include <ftninfo.hxx>
28 #include <doc.hxx>
29 #include <ndtxt.hxx>
30 #include <charfmt.hxx>
31 
32 #include "swhtml.hxx"
33 #include "wrthtml.hxx"
34 
lcl_html_getNextPart(OUString & rPart,const OUString & rContent,sal_Int32 nPos)35 static sal_Int32 lcl_html_getNextPart( OUString& rPart, const OUString& rContent,
36                              sal_Int32 nPos )
37 {
38     rPart.clear();
39     sal_Int32 nLen = rContent.getLength();
40     if( nPos >= nLen )
41     {
42         nPos = -1;
43     }
44     else
45     {
46         bool bQuoted = false, bDone = false;
47         for( ; nPos < nLen && !bDone; nPos++ )
48         {
49             sal_Unicode c = rContent[nPos];
50             switch( c )
51             {
52             case '\\':
53                 if( bQuoted )
54                     rPart += OUStringChar( c );
55                 bQuoted = !bQuoted;
56                 break;
57 
58             case ';':
59                 if( bQuoted )
60                     rPart += OUStringChar( c );
61                 else
62                     bDone = true;
63                 bQuoted = false;
64                 break;
65 
66             default:
67                 rPart += OUStringChar( c );
68                 bQuoted = false;
69                 break;
70             }
71         }
72     }
73 
74     return nPos;
75 }
76 
lcl_html_getEndNoteInfo(SwEndNoteInfo & rInfo,const OUString & rContent,bool bEndNote)77 static sal_Int32 lcl_html_getEndNoteInfo( SwEndNoteInfo& rInfo,
78                                     const OUString& rContent,
79                                     bool bEndNote )
80 {
81     sal_Int32 nStrPos = 0;
82     for( int nPart = 0; nPart < 4; ++nPart )
83     {
84         OUString aPart;
85         if( -1 != nStrPos )
86             nStrPos = lcl_html_getNextPart( aPart, rContent, nStrPos );
87 
88         switch( nPart )
89         {
90         case 0:
91             rInfo.m_aFormat.SetNumberingType( bEndNote ? SVX_NUM_ROMAN_LOWER : SVX_NUM_ARABIC );
92             if( !aPart.isEmpty() )
93                 rInfo.m_aFormat.SetNumberingType(SwHTMLParser::GetNumType( aPart,
94                                                              rInfo.m_aFormat.GetNumberingType() ));
95             break;
96 
97         case 1:
98             rInfo.m_nFootnoteOffset = aPart.isEmpty() ? 0 : o3tl::narrowing<sal_uInt16>(aPart.toInt32());
99             break;
100 
101         case 2:
102             rInfo.SetPrefix( aPart );
103             break;
104 
105         case 3:
106             rInfo.SetSuffix( aPart );
107             break;
108         }
109     }
110 
111     return nStrPos;
112 }
113 
FillEndNoteInfo(const OUString & rContent)114 void SwHTMLParser::FillEndNoteInfo( const OUString& rContent )
115 {
116     SwEndNoteInfo aInfo( m_xDoc->GetEndNoteInfo() );
117     lcl_html_getEndNoteInfo( aInfo, rContent, true );
118     m_xDoc->SetEndNoteInfo( aInfo );
119 }
120 
FillFootNoteInfo(const OUString & rContent)121 void SwHTMLParser::FillFootNoteInfo( const OUString& rContent )
122 {
123     SwFootnoteInfo aInfo( m_xDoc->GetFootnoteInfo() );
124 
125     sal_Int32 nStrPos = lcl_html_getEndNoteInfo( aInfo, rContent, false );
126 
127     for( int nPart = 4; nPart < 8; ++nPart )
128     {
129         OUString aPart;
130         if( -1 != nStrPos )
131             nStrPos = lcl_html_getNextPart( aPart, rContent, nStrPos );
132 
133         switch( nPart )
134         {
135         case 4:
136             aInfo.m_eNum = FTNNUM_DOC;
137             if( !aPart.isEmpty() )
138             {
139                 switch( aPart[0] )
140                 {
141                 case 'D': aInfo.m_eNum = FTNNUM_DOC; break;
142                 case 'C': aInfo.m_eNum = FTNNUM_CHAPTER; break;
143                 case 'P': aInfo.m_eNum = FTNNUM_PAGE; break;
144                 }
145             }
146             break;
147 
148         case 5:
149             aInfo.m_ePos = FTNPOS_PAGE;
150             if( !aPart.isEmpty() )
151             {
152                 switch( aPart[0] )
153                 {
154                 case 'C': aInfo.m_ePos = FTNPOS_CHAPTER; break;
155                 case 'P': aInfo.m_ePos = FTNPOS_PAGE; break;
156                 }
157             }
158             break;
159 
160         case 6:
161             aInfo.m_aQuoVadis = aPart;
162             break;
163 
164         case 7:
165             aInfo.m_aErgoSum = aPart;
166             break;
167         }
168     }
169 
170     m_xDoc->SetFootnoteInfo( aInfo );
171 }
172 
InsertFootEndNote(const OUString & rName,bool bEndNote,bool bFixed)173 void SwHTMLParser::InsertFootEndNote( const OUString& rName, bool bEndNote,
174                                       bool bFixed )
175 {
176     if( !m_pFootEndNoteImpl )
177         m_pFootEndNoteImpl.reset(new SwHTMLFootEndNote_Impl);
178 
179     m_pFootEndNoteImpl->sName = rName;
180     if( m_pFootEndNoteImpl->sName.getLength() > 3 )
181         m_pFootEndNoteImpl->sName = m_pFootEndNoteImpl->sName.copy( 0, m_pFootEndNoteImpl->sName.getLength() - 3 );
182     m_pFootEndNoteImpl->sName = m_pFootEndNoteImpl->sName.toAsciiUpperCase();
183     m_pFootEndNoteImpl->bEndNote = bEndNote;
184     m_pFootEndNoteImpl->bFixed = bFixed;
185     m_pFootEndNoteImpl->sContent.clear();
186 }
187 
FinishFootEndNote()188 void SwHTMLParser::FinishFootEndNote()
189 {
190     if( !m_pFootEndNoteImpl )
191         return;
192 
193     SwFormatFootnote aFootnote( m_pFootEndNoteImpl->bEndNote );
194     if( m_pFootEndNoteImpl->bFixed )
195         aFootnote.SetNumStr( m_pFootEndNoteImpl->sContent );
196 
197     m_xDoc->getIDocumentContentOperations().InsertPoolItem( *m_pPam, aFootnote );
198     SwTextFootnote * const pTextFootnote = static_cast<SwTextFootnote *>(
199         m_pPam->GetNode().GetTextNode()->GetTextAttrForCharAt(
200             m_pPam->GetPoint()->nContent.GetIndex() - 1, RES_TXTATR_FTN ) );
201     // In header and footer no footnotes can be inserted.
202     if (pTextFootnote)
203         m_pFootEndNoteImpl->aTextFootnotes.push_back(SwHTMLTextFootnote(m_pFootEndNoteImpl->sName,pTextFootnote));
204     m_pFootEndNoteImpl->sName.clear();
205     m_pFootEndNoteImpl->sContent.clear();
206     m_pFootEndNoteImpl->bFixed = false;
207 }
208 
InsertFootEndNoteText()209 void SwHTMLParser::InsertFootEndNoteText()
210 {
211     if( m_pFootEndNoteImpl && m_pFootEndNoteImpl->bFixed )
212         m_pFootEndNoteImpl->sContent += aToken;
213 }
214 
GetFootEndNoteSection(const OUString & rName)215 SwNodeIndex *SwHTMLParser::GetFootEndNoteSection( const OUString& rName )
216 {
217     SwNodeIndex *pStartNodeIdx = nullptr;
218 
219     if (m_pFootEndNoteImpl)
220     {
221         OUString aName(rName.toAsciiUpperCase());
222 
223         size_t nCount = m_pFootEndNoteImpl->aTextFootnotes.size();
224         for(size_t i = 0; i < nCount; ++i)
225         {
226             if (m_pFootEndNoteImpl->aTextFootnotes[i].sName == aName)
227             {
228                 pStartNodeIdx = m_pFootEndNoteImpl->aTextFootnotes[i].pTextFootnote->GetStartNode();
229                 m_pFootEndNoteImpl->aTextFootnotes.erase( m_pFootEndNoteImpl->aTextFootnotes.begin() + i );
230                 if (m_pFootEndNoteImpl->aTextFootnotes.empty())
231                 {
232                     m_pFootEndNoteImpl.reset();
233                 }
234 
235                 break;
236             }
237         }
238     }
239 
240     return pStartNodeIdx;
241 }
242 
OutHTML_SwFormatFootnote(Writer & rWrt,const SfxPoolItem & rHt)243 Writer& OutHTML_SwFormatFootnote( Writer& rWrt, const SfxPoolItem& rHt )
244 {
245     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
246 
247     SwFormatFootnote& rFormatFootnote = const_cast<SwFormatFootnote&>(static_cast<const SwFormatFootnote&>(rHt));
248     SwTextFootnote *pTextFootnote = rFormatFootnote.GetTextFootnote();
249     if( !pTextFootnote )
250         return rWrt;
251 
252     OUString sFootnoteName, sClass;
253     size_t nPos;
254     if( rFormatFootnote.IsEndNote() )
255     {
256         nPos = rHTMLWrt.m_xFootEndNotes ? rHTMLWrt.m_xFootEndNotes->size() : 0;
257         OSL_ENSURE( nPos == static_cast<size_t>(rHTMLWrt.m_nFootNote + rHTMLWrt.m_nEndNote),
258                 "OutHTML_SwFormatFootnote: wrong position" );
259         sClass = OOO_STRING_SVTOOLS_HTML_sdendnote_anc;
260         sFootnoteName = OOO_STRING_SVTOOLS_HTML_sdendnote + OUString::number( static_cast<sal_Int32>(++rHTMLWrt.m_nEndNote) );
261     }
262     else
263     {
264         nPos = rHTMLWrt.m_nFootNote;
265         sClass = OOO_STRING_SVTOOLS_HTML_sdfootnote_anc;
266         sFootnoteName = OOO_STRING_SVTOOLS_HTML_sdfootnote + OUString::number( static_cast<sal_Int32>(++rHTMLWrt.m_nFootNote));
267     }
268 
269     if( !rHTMLWrt.m_xFootEndNotes )
270         rHTMLWrt.m_xFootEndNotes.emplace();
271     rHTMLWrt.m_xFootEndNotes->insert( rHTMLWrt.m_xFootEndNotes->begin() + nPos, pTextFootnote );
272 
273     OStringBuffer sOut;
274     OString aTag = rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_anchor;
275     sOut.append("<" + aTag + " " OOO_STRING_SVTOOLS_HTML_O_class "=\"");
276     rWrt.Strm().WriteOString( sOut.makeStringAndClear() );
277     HTMLOutFuncs::Out_String( rWrt.Strm(), sClass, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
278     sOut.append("\" " OOO_STRING_SVTOOLS_HTML_O_name "=\"");
279     rWrt.Strm().WriteOString( sOut.makeStringAndClear() );
280     HTMLOutFuncs::Out_String( rWrt.Strm(), sFootnoteName, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
281     sOut.append(OOO_STRING_SVTOOLS_HTML_FTN_anchor "\" "
282                 OOO_STRING_SVTOOLS_HTML_O_href "=\"#");
283     rWrt.Strm().WriteOString( sOut.makeStringAndClear() );
284     HTMLOutFuncs::Out_String( rWrt.Strm(), sFootnoteName, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
285     sOut.append(OOO_STRING_SVTOOLS_HTML_FTN_symbol "\"");
286     if( !rFormatFootnote.GetNumStr().isEmpty() )
287         sOut.append(" " OOO_STRING_SVTOOLS_HTML_O_sdfixed);
288     sOut.append(">");
289     rWrt.Strm().WriteOString( sOut.makeStringAndClear() );
290     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OString(rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_superscript ));
291 
292     HTMLOutFuncs::Out_String( rWrt.Strm(), rFormatFootnote.GetViewNumStr(*rWrt.m_pDoc, nullptr),
293                                  rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
294     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OString(rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_superscript), false );
295     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OString(rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_anchor), false );
296 
297     return rWrt;
298 }
299 
OutFootEndNotes()300 void SwHTMLWriter::OutFootEndNotes()
301 {
302     OSL_ENSURE( m_xFootEndNotes,
303             "SwHTMLWriter::OutFootEndNotes(): unnecessary call" );
304     if( !m_xFootEndNotes )
305         return;
306 
307 #if OSL_DEBUG_LEVEL > 0
308     sal_uInt16 nFootnote = m_nFootNote, nEn = m_nEndNote;
309 #endif
310     m_nFootNote = 0;
311     m_nEndNote = 0;
312 
313     for( auto *pTextFootnote : *m_xFootEndNotes )
314     {
315         m_pFormatFootnote = &pTextFootnote->GetFootnote();
316 
317         OUString sFootnoteName;
318         if( m_pFormatFootnote->IsEndNote() )
319         {
320             sFootnoteName = OOO_STRING_SVTOOLS_HTML_sdendnote + OUString::number(static_cast<sal_Int32>(++m_nEndNote));
321         }
322         else
323         {
324             sFootnoteName = OOO_STRING_SVTOOLS_HTML_sdfootnote + OUString::number(static_cast<sal_Int32>(++m_nFootNote));
325         }
326 
327         if( m_bLFPossible )
328             OutNewLine();
329         OString sOut =
330             "<" + GetNamespace() + OOO_STRING_SVTOOLS_HTML_division
331             " " OOO_STRING_SVTOOLS_HTML_O_id "=\"";
332         Strm().WriteOString( sOut );
333         HTMLOutFuncs::Out_String( Strm(), sFootnoteName, m_eDestEnc, &m_aNonConvertableCharacters );
334         Strm().WriteCharPtr( "\">" );
335 
336         m_bLFPossible = true;
337         IncIndentLevel();   // indent content of <DIV>
338 
339         OSL_ENSURE( pTextFootnote, "SwHTMLWriter::OutFootEndNotes: SwTextFootnote is missing" );
340         SwNodeIndex *pSttNdIdx = pTextFootnote->GetStartNode();
341         OSL_ENSURE( pSttNdIdx,
342                 "SwHTMLWriter::OutFootEndNotes: StartNode-Index is missing" );
343         if( pSttNdIdx )
344         {
345             HTMLSaveData aSaveData( *this, pSttNdIdx->GetIndex()+1,
346                 pSttNdIdx->GetNode().EndOfSectionIndex(), false );
347             Out_SwDoc( m_pCurrentPam.get() );
348         }
349 
350         DecIndentLevel();   // indent content of <DIV>
351         if( m_bLFPossible )
352             OutNewLine();
353         HTMLOutFuncs::Out_AsciiTag( Strm(), OString(GetNamespace() + OOO_STRING_SVTOOLS_HTML_division), false );
354         m_bLFPossible = true;
355 
356         OSL_ENSURE( !m_pFormatFootnote,
357                 "SwHTMLWriter::OutFootEndNotes: Footnote was not output" );
358         if( m_pFormatFootnote )
359         {
360             if( m_pFormatFootnote->IsEndNote() )
361                 m_nEndNote++;
362             else
363                 m_nFootNote++;
364 
365             m_pFormatFootnote = nullptr;
366         }
367     }
368 
369 #if OSL_DEBUG_LEVEL > 0
370     OSL_ENSURE( nFootnote == m_nFootNote,
371             "SwHTMLWriter::OutFootEndNotes: Number of footnotes does not match" );
372     OSL_ENSURE( nEn == m_nEndNote,
373             "SwHTMLWriter::OutFootEndNotes: Number of endnotes does not match" );
374 #endif
375 
376     m_xFootEndNotes.reset();
377     m_nFootNote = m_nEndNote = 0;
378 }
379 
GetFootEndNoteSym(const SwFormatFootnote & rFormatFootnote)380 OUString SwHTMLWriter::GetFootEndNoteSym( const SwFormatFootnote& rFormatFootnote )
381 {
382     const SwEndNoteInfo * pInfo = nullptr;
383     if( rFormatFootnote.GetNumStr().isEmpty() )
384         pInfo = rFormatFootnote.IsEndNote() ? &m_pDoc->GetEndNoteInfo()
385                                     : &m_pDoc->GetFootnoteInfo();
386 
387     OUString sRet;
388     if( pInfo )
389         sRet = pInfo->GetPrefix();
390     sRet += rFormatFootnote.GetViewNumStr(*m_pDoc, nullptr);
391     if( pInfo )
392         sRet += pInfo->GetSuffix();
393 
394     return sRet;
395 }
396 
OutFootEndNoteSym(const SwFormatFootnote & rFormatFootnote,const OUString & rNum,sal_uInt16 nScript)397 void SwHTMLWriter::OutFootEndNoteSym( const SwFormatFootnote& rFormatFootnote,
398                                          const OUString& rNum,
399                                          sal_uInt16 nScript )
400 {
401     const SwEndNoteInfo *pInfo;
402 
403     OUString sFootnoteName, sClass;
404     if( rFormatFootnote.IsEndNote() )
405     {
406         sClass = OOO_STRING_SVTOOLS_HTML_sdendnote_sym;
407         sFootnoteName = OOO_STRING_SVTOOLS_HTML_sdendnote +
408             OUString::number(static_cast<sal_Int32>(m_nEndNote));
409         pInfo = &m_pDoc->GetEndNoteInfo();
410     }
411     else
412     {
413         sClass = OOO_STRING_SVTOOLS_HTML_sdfootnote_sym;
414         sFootnoteName = OOO_STRING_SVTOOLS_HTML_sdfootnote +
415             OUString::number(static_cast<sal_Int32>(m_nFootNote));
416         pInfo = &m_pDoc->GetFootnoteInfo();
417     }
418 
419     const SwCharFormat *pSymCharFormat = pInfo->GetCharFormat( *m_pDoc );
420     if( pSymCharFormat && 0 != m_aScriptTextStyles.count( pSymCharFormat->GetName() ) )
421     {
422         switch( nScript )
423         {
424         case CSS1_OUTMODE_WESTERN:
425             sClass += "-western";
426             break;
427         case CSS1_OUTMODE_CJK:
428             sClass += "-cjk";
429             break;
430         case CSS1_OUTMODE_CTL:
431             sClass += "-ctl";
432             break;
433         }
434     }
435 
436     OStringBuffer sOut;
437     sOut.append("<" + GetNamespace() + OOO_STRING_SVTOOLS_HTML_anchor " "
438             OOO_STRING_SVTOOLS_HTML_O_class "=\"");
439     Strm().WriteOString( sOut.makeStringAndClear() );
440     HTMLOutFuncs::Out_String( Strm(), sClass, m_eDestEnc, &m_aNonConvertableCharacters );
441     sOut.append("\" " OOO_STRING_SVTOOLS_HTML_O_name "=\"");
442     Strm().WriteOString( sOut.makeStringAndClear() );
443     HTMLOutFuncs::Out_String( Strm(), sFootnoteName, m_eDestEnc, &m_aNonConvertableCharacters );
444     sOut.append(OOO_STRING_SVTOOLS_HTML_FTN_symbol "\" "
445             OOO_STRING_SVTOOLS_HTML_O_href "=\"#");
446     Strm().WriteOString( sOut.makeStringAndClear() );
447     HTMLOutFuncs::Out_String( Strm(), sFootnoteName, m_eDestEnc, &m_aNonConvertableCharacters );
448     sOut.append(OOO_STRING_SVTOOLS_HTML_FTN_anchor "\">");
449     Strm().WriteOString( sOut.makeStringAndClear() );
450 
451     HTMLOutFuncs::Out_String( Strm(), rNum, m_eDestEnc, &m_aNonConvertableCharacters );
452     HTMLOutFuncs::Out_AsciiTag( Strm(), OString(GetNamespace() + OOO_STRING_SVTOOLS_HTML_anchor), false );
453 }
454 
lcl_html_fillEndNoteInfo(const SwEndNoteInfo & rInfo,OUString * pParts,bool bEndNote)455 static int lcl_html_fillEndNoteInfo( const SwEndNoteInfo& rInfo,
456                                  OUString *pParts,
457                                  bool bEndNote  )
458 {
459     int nParts = 0;
460     sal_Int16 eFormat = rInfo.m_aFormat.GetNumberingType();
461     if( (bEndNote ? SVX_NUM_ROMAN_LOWER : SVX_NUM_ARABIC) != eFormat )
462     {
463         const char *pStr = SwHTMLWriter::GetNumFormat( eFormat );
464         if( pStr )
465         {
466             pParts[0] = OUString::createFromAscii( pStr );
467             nParts = 1;
468         }
469     }
470     if( rInfo.m_nFootnoteOffset > 0 )
471     {
472         pParts[1] = OUString::number(rInfo.m_nFootnoteOffset);
473         nParts = 2;
474     }
475     if( !rInfo.GetPrefix().isEmpty() )
476     {
477         pParts[2] = rInfo.GetPrefix();
478         nParts = 3;
479     }
480     if( !rInfo.GetSuffix().isEmpty() )
481     {
482         pParts[3] = rInfo.GetSuffix();
483         nParts = 4;
484     }
485 
486     return nParts;
487 }
488 
lcl_html_outFootEndNoteInfo(Writer & rWrt,OUString const * pParts,int nParts,const char * pName)489 static void lcl_html_outFootEndNoteInfo( Writer& rWrt, OUString const *pParts,
490                                   int nParts, const char *pName )
491 {
492     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
493 
494     OUStringBuffer aContent;
495     for( int i=0; i<nParts; ++i )
496     {
497         OUString aTmp( pParts[i] );
498         aTmp = aTmp.replaceAll( "\\", "\\\\" );
499         aTmp = aTmp.replaceAll( ";", "\\;" );
500         if( i > 0 )
501             aContent.append(";");
502         aContent.append(aTmp);
503     }
504 
505     rHTMLWrt.OutNewLine();
506     OString sOut =
507         "<" + rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_meta " "
508         OOO_STRING_SVTOOLS_HTML_O_name "=\"" + pName +
509         "\" " OOO_STRING_SVTOOLS_HTML_O_content "=\"";
510     rWrt.Strm().WriteOString( sOut );
511     HTMLOutFuncs::Out_String( rWrt.Strm(), aContent.makeStringAndClear(), rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
512     rWrt.Strm().WriteCharPtr( "\">" );
513 }
514 
OutFootEndNoteInfo()515 void SwHTMLWriter::OutFootEndNoteInfo()
516 {
517     // Number type (1 or i)
518     // Offset (0)
519     // Before it
520     // Behind it
521     // Doc/Page/Chap (D)
522     // Position (S)
523     // Next page
524     // Beginning
525 
526     {
527         const SwFootnoteInfo& rInfo = m_pDoc->GetFootnoteInfo();
528         OUString aParts[8];
529         int nParts = lcl_html_fillEndNoteInfo( rInfo, aParts, false );
530         if( rInfo.m_eNum != FTNNUM_DOC )
531         {
532             aParts[4] = rInfo.m_eNum == FTNNUM_CHAPTER ? OUStringLiteral( u"C" ) : OUStringLiteral( u"P" );
533             nParts = 5;
534         }
535         if( rInfo.m_ePos != FTNPOS_PAGE)
536         {
537             aParts[5] = "C";
538             nParts = 6;
539         }
540         if( !rInfo.m_aQuoVadis.isEmpty() )
541         {
542             aParts[6] = rInfo.m_aQuoVadis;
543             nParts = 7;
544         }
545         if( !rInfo.m_aErgoSum.isEmpty() )
546         {
547             aParts[7] = rInfo.m_aErgoSum;
548             nParts = 8;
549         }
550         if( nParts > 0 )
551             lcl_html_outFootEndNoteInfo( *this, aParts, nParts,
552                                          OOO_STRING_SVTOOLS_HTML_META_sdfootnote );
553     }
554 
555     {
556         const SwEndNoteInfo& rInfo = m_pDoc->GetEndNoteInfo();
557         OUString aParts[4];
558         const int nParts = lcl_html_fillEndNoteInfo( rInfo, aParts, true );
559         if( nParts > 0 )
560             lcl_html_outFootEndNoteInfo( *this, aParts, nParts,
561                                          OOO_STRING_SVTOOLS_HTML_META_sdendnote );
562     }
563 }
564 
565 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
566