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