update credits
[LibreOffice.git] / sw / source / core / text / xmldump.cxx
blob79edaedffff21a63b5e0351b0994d818b0a61c93
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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 */
10 #include "frame.hxx"
11 #include "frmfmt.hxx"
12 #include "sectfrm.hxx"
13 #include "tabfrm.hxx"
14 #include "txtfrm.hxx"
15 #include "hffrm.hxx"
16 #include "porlin.hxx"
17 #include "porlay.hxx"
18 #include "portxt.hxx"
19 #include "sortedobjs.hxx"
20 #include <anchoredobject.hxx>
21 #include <libxml/xmlwriter.h>
22 #include <SwPortionHandler.hxx>
24 class XmlPortionDumper:public SwPortionHandler
26 private:
27 xmlTextWriterPtr writer;
28 sal_uInt16 ofs;
30 const char* getTypeName( sal_uInt16 nType )
32 switch ( nType )
34 case POR_LIN: return "POR_LIN";
35 case POR_FLYCNT: return "POR_FLYCNT";
37 case POR_HOLE: return "POR_HOLE";
38 case POR_TMPEND: return "POR_TMPEND";
39 case POR_BRK: return "POR_BRK";
40 case POR_KERN: return "POR_KERN";
41 case POR_ARROW: return "POR_ARROW";
42 case POR_MULTI: return "POR_MULTI";
43 case POR_HIDDEN_TXT: return "POR_HIDDEN_TXT";
44 case POR_CONTROLCHAR: return "POR_CONTROLCHAR";
46 case POR_TXT: return "POR_TXT";
47 case POR_LAY: return "POR_LAY";
48 case POR_PARA: return "POR_PARA";
49 case POR_URL: return "POR_URL";
50 case POR_HNG: return "POR_HNG";
52 case POR_DROP: return "POR_DROP";
53 case POR_TOX: return "POR_TOX";
54 case POR_ISOTOX: return "POR_ISOTOX";
55 case POR_REF: return "POR_REF";
56 case POR_ISOREF: return "POR_ISOREF";
57 case POR_META: return "POR_META";
59 case POR_EXP: return "POR_EXP";
60 case POR_BLANK: return "POR_BLANK";
61 case POR_POSTITS: return "POR_POSTITS";
63 case POR_HYPH: return "POR_HYPH";
64 case POR_HYPHSTR: return "POR_HYPHSTR";
65 case POR_SOFTHYPH: return "POR_SOFTHYPH";
66 case POR_SOFTHYPHSTR: return "POR_SOFTHYPHSTR";
67 case POR_SOFTHYPH_COMP: return "POR_SOFTHYPH_COMP";
69 case POR_FLD: return "POR_FLD";
70 case POR_HIDDEN: return "POR_HIDDEN";
71 case POR_QUOVADIS: return "POR_QUOVADIS";
72 case POR_ERGOSUM: return "POR_ERGOSUM";
73 case POR_COMBINED: return "POR_COMBINED";
74 case POR_FTN: return "POR_FTN";
76 case POR_FTNNUM: return "POR_FTNNUM";
77 case POR_NUMBER: return "POR_NUMBER";
78 case POR_BULLET: return "POR_BULLET";
79 case POR_GRFNUM: return "POR_GRFNUM";
81 case POR_GLUE: return "POR_GLUE";
83 case POR_MARGIN: return "POR_MARGIN";
85 case POR_FIX: return "POR_FIX";
86 case POR_FLY: return "POR_FLY";
88 case POR_TAB: return "POR_TAB";
90 case POR_TABRIGHT: return "POR_TABRIGHT";
91 case POR_TABCENTER: return "POR_TABCENTER";
92 case POR_TABDECIMAL: return "POR_TABDECIMAL";
94 case POR_TABLEFT: return "POR_TABLEFT";
95 default:
96 return "Unknown";
100 public:
102 XmlPortionDumper( xmlTextWriterPtr some_writer ):writer( some_writer ), ofs( 0 )
106 virtual ~ XmlPortionDumper( )
111 @param nLength
112 length of this portion in the model string
113 @param rText
114 text which is painted on-screen
116 virtual void Text( sal_uInt16 nLength,
117 sal_uInt16 nType,
118 sal_Int32 nHeight,
119 sal_Int32 nWidth)
121 ofs += nLength;
122 xmlTextWriterStartElement( writer, BAD_CAST( "Text" ) );
123 xmlTextWriterWriteFormatAttribute( writer,
124 BAD_CAST( "nLength" ),
125 "%i", ( int ) nLength );
126 xmlTextWriterWriteFormatAttribute( writer,
127 BAD_CAST( "nType" ),
128 "%s", getTypeName( nType ) );
129 if (nHeight > 0)
130 xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nHeight"), "%i", (int)nHeight);
131 if (nWidth > 0)
132 xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nWidth"), "%i", (int)nWidth);
134 xmlTextWriterEndElement( writer );
138 @param nLength
139 length of this portion in the model string
140 @param rText
141 text which is painted on-screen
142 @param nType
143 type of this portion
144 @param nHeight
145 font size of the painted text
147 virtual void Special( sal_uInt16 nLength,
148 const String & rText,
149 sal_uInt16 nType,
150 sal_Int32 nHeight,
151 sal_Int32 nWidth )
153 xmlTextWriterStartElement( writer, BAD_CAST( "Special" ) );
154 xmlTextWriterWriteFormatAttribute( writer,
155 BAD_CAST( "nLength" ),
156 "%i", ( int ) nLength );
157 xmlTextWriterWriteFormatAttribute( writer,
158 BAD_CAST( "nType" ),
159 "%s", getTypeName( nType ) );
160 OUString sText( rText );
161 OString sText8 =OUStringToOString( sText,
162 RTL_TEXTENCODING_UTF8 );
163 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "rText" ),
164 "%s", sText8.getStr( ) );
166 if (nHeight > 0)
167 xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nHeight"), "%i", (int)nHeight);
169 if (nWidth > 0)
170 xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nWidth"), "%i", (int)nWidth);
172 xmlTextWriterEndElement( writer );
173 ofs += nLength;
176 virtual void LineBreak( KSHORT nWidth )
178 xmlTextWriterStartElement( writer, BAD_CAST( "LineBreak" ) );
179 if (nWidth > 0)
180 xmlTextWriterWriteFormatAttribute( writer,
181 BAD_CAST( "nWidth" ),
182 "%i", ( int ) nWidth );
183 xmlTextWriterEndElement( writer );
187 * @param nLength
188 * number of 'model string' characters to be skipped
190 virtual void Skip( sal_uInt16 nLength )
192 xmlTextWriterStartElement( writer, BAD_CAST( "Skip" ) );
193 xmlTextWriterWriteFormatAttribute( writer,
194 BAD_CAST( "nLength" ),
195 "%i", ( int ) nLength );
196 xmlTextWriterEndElement( writer );
197 ofs += nLength;
200 virtual void Finish( )
202 xmlTextWriterStartElement( writer, BAD_CAST( "Finish" ) );
203 xmlTextWriterEndElement( writer );
208 namespace
210 xmlTextWriterPtr lcl_createDefaultWriter()
212 xmlTextWriterPtr writer = xmlNewTextWriterFilename( "layout.xml", 0 );
213 xmlTextWriterStartDocument( writer, NULL, NULL, NULL );
214 return writer;
217 void lcl_freeWriter( xmlTextWriterPtr writer )
219 xmlTextWriterEndDocument( writer );
220 xmlFreeTextWriter( writer );
224 void SwFrm::dumpAsXml( xmlTextWriterPtr writer )
226 bool bCreateWriter = ( NULL == writer );
227 if ( bCreateWriter )
228 writer = lcl_createDefaultWriter();
230 const char *name = NULL;
232 switch ( GetType( ) )
234 case FRM_ROOT:
235 name = "root";
236 break;
237 case FRM_PAGE:
238 name = "page";
239 break;
240 case FRM_COLUMN:
241 name = "column";
242 break;
243 case FRM_HEADER:
244 name = "header";
245 break;
246 case FRM_FOOTER:
247 name = "footer";
248 break;
249 case FRM_FTNCONT:
250 name = "ftncont";
251 break;
252 case FRM_FTN:
253 name = "ftn";
254 break;
255 case FRM_BODY:
256 name = "body";
257 break;
258 case FRM_FLY:
259 name = "fly";
260 break;
261 case FRM_SECTION:
262 name = "section";
263 break;
264 case FRM_UNUSED:
265 name = "unused";
266 break;
267 case FRM_TAB:
268 name = "tab";
269 break;
270 case FRM_ROW:
271 name = "row";
272 break;
273 case FRM_CELL:
274 name = "cell";
275 break;
276 case FRM_TXT:
277 name = "txt";
278 break;
279 case FRM_NOTXT:
280 name = "notxt";
281 break;
284 if ( name != NULL )
286 xmlTextWriterStartElement( writer, ( const xmlChar * ) name );
288 dumpAsXmlAttributes( writer );
290 xmlTextWriterStartElement( writer, BAD_CAST( "infos" ) );
291 dumpInfosAsXml( writer );
292 xmlTextWriterEndElement( writer );
294 // Dump Anchored objects if any
295 SwSortedObjs* pAnchored = GetDrawObjs();
296 if ( pAnchored && pAnchored->Count( ) > 0 )
298 xmlTextWriterStartElement( writer, BAD_CAST( "anchored" ) );
300 for ( sal_uInt32 i = 0, len = pAnchored->Count(); i < len; i++ )
302 SwAnchoredObject* pObject = (*pAnchored)[i];
303 pObject->dumpAsXml( writer );
306 xmlTextWriterEndElement( writer );
309 // Dump the children
310 if ( IsTxtFrm( ) )
312 SwTxtFrm *pTxtFrm = ( SwTxtFrm * ) this;
313 OUString aTxt = pTxtFrm->GetTxt( );
314 for ( int i = 0; i < 32; i++ )
316 aTxt = aTxt.replace( i, '*' );
318 OString aTxt8 =OUStringToOString( aTxt,
319 RTL_TEXTENCODING_UTF8 );
320 xmlTextWriterWriteString( writer,
321 ( const xmlChar * ) aTxt8.getStr( ) );
322 XmlPortionDumper pdumper( writer );
323 pTxtFrm->VisitPortions( pdumper );
326 else
328 dumpChildrenAsXml( writer );
330 xmlTextWriterEndElement( writer );
333 if ( bCreateWriter )
334 lcl_freeWriter( writer );
337 void SwFrm::dumpInfosAsXml( xmlTextWriterPtr writer )
339 // output the Frm
340 xmlTextWriterStartElement( writer, BAD_CAST( "bounds" ) );
341 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "left" ), "%ld", Frm().Left() );
342 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "top" ), "%ld", Frm().Top() );
343 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "width" ), "%ld", Frm().Width() );
344 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "height" ), "%ld", Frm().Height() );
345 xmlTextWriterEndElement( writer );
348 void SwFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
350 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "ptr" ), "%p", this );
351 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "id" ), "%" SAL_PRIuUINT32, GetFrmId() );
352 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "symbol" ), "%s", BAD_CAST( typeid( *this ).name( ) ) );
353 if ( GetNext( ) )
354 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "next" ), "%" SAL_PRIuUINT32, GetNext()->GetFrmId() );
355 if ( GetPrev( ) )
356 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "prev" ), "%" SAL_PRIuUINT32, GetPrev()->GetFrmId() );
357 if ( GetUpper( ) )
358 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "upper" ), "%" SAL_PRIuUINT32, GetUpper()->GetFrmId() );
359 if ( GetLower( ) )
360 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "lower" ), "%" SAL_PRIuUINT32, GetLower()->GetFrmId() );
361 if ( IsTxtFrm( ) )
363 SwTxtFrm *pTxtFrm = ( SwTxtFrm * ) this;
364 SwTxtNode *pTxtNode = pTxtFrm->GetTxtNode();
365 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "txtNodeIndex" ), "%lu", pTxtNode->GetIndex() );
367 if (IsHeaderFrm() || IsFooterFrm())
369 SwHeadFootFrm *pHeadFootFrm = (SwHeadFootFrm*)this;
370 OUString aFmtName = pHeadFootFrm->GetFmt()->GetName();
371 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "fmtName" ), "%s", BAD_CAST(OUStringToOString(aFmtName, RTL_TEXTENCODING_UTF8).getStr()));
372 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "fmtPtr" ), "%p", pHeadFootFrm->GetFmt());
376 void SwFrm::dumpChildrenAsXml( xmlTextWriterPtr writer )
378 SwFrm *pFrm = GetLower( );
379 for ( ; pFrm != NULL; pFrm = pFrm->GetNext( ) )
381 pFrm->dumpAsXml( writer );
385 void SwAnchoredObject::dumpAsXml( xmlTextWriterPtr writer )
387 bool bCreateWriter = ( NULL == writer );
388 if ( bCreateWriter )
389 writer = lcl_createDefaultWriter();
391 xmlTextWriterStartElement( writer, BAD_CAST( getElementName() ) );
392 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "ptr" ), "%p", this );
393 xmlTextWriterEndElement( writer );
395 if ( bCreateWriter )
396 lcl_freeWriter( writer );
399 void SwTxtFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
401 SwFrm::dumpAsXmlAttributes( writer );
402 if ( HasFollow() )
403 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%" SAL_PRIuUINT32, GetFollow()->GetFrmId() );
405 if (m_pPrecede != NULL)
406 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%" SAL_PRIuUINT32, static_cast<SwTxtFrm*>(m_pPrecede)->GetFrmId() );
409 void SwSectionFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
411 SwFrm::dumpAsXmlAttributes( writer );
412 if ( HasFollow() )
413 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%" SAL_PRIuUINT32, GetFollow()->GetFrmId() );
415 if (m_pPrecede != NULL)
416 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%" SAL_PRIuUINT32, static_cast<SwSectionFrm*>( m_pPrecede )->GetFrmId() );
419 void SwTabFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
421 SwFrm::dumpAsXmlAttributes( writer );
422 if ( HasFollow() )
423 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%" SAL_PRIuUINT32, GetFollow()->GetFrmId() );
425 if (m_pPrecede != NULL)
426 xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%" SAL_PRIuUINT32, static_cast<SwTabFrm*>( m_pPrecede )->GetFrmId() );
429 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */