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