1 /* This file is part of the wvWare 2 project
2 Copyright (C) 2002-2003 Werner Trobin <trobin@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation.
7
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details.
12
13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 Boston, MA 02111-1307, USA.
17 */
18
19 #include <parser.h>
20 #include <handlers.h>
21 #include <parserfactory.h>
22 #include <word97_generated.h>
23 #include <paragraphproperties.h>
24 #include <lists.h>
25 #include <ustring.h>
26 #include <fields.h>
27
28 #include <iostream>
29 #include <string>
30
31
32 class InlineReplacementTest : public wvWare::InlineReplacementHandler
33 {
34 public:
35 virtual wvWare::U8 tab();
36 virtual wvWare::U8 hardLineBreak();
37 virtual wvWare::U8 columnBreak();
38 virtual wvWare::U8 nonBreakingHyphen();
39 virtual wvWare::U8 nonRequiredHyphen();
40 virtual wvWare::U8 nonBreakingSpace();
41 };
42
43
44 class SubDocumentTest : public wvWare::SubDocumentHandler
45 {
46 public:
47 virtual void bodyStart();
48 virtual void bodyEnd();
49
50 virtual void footnoteStart();
51 virtual void footnoteEnd();
52
53 virtual void headersStart();
54 virtual void headersEnd();
55 virtual void headerStart( wvWare::HeaderData::Type type );
56 virtual void headerEnd();
57 };
58
59
60 class TableTest : public wvWare::TableHandler
61 {
62 public:
63 virtual void tableRowStart( wvWare::SharedPtr<const wvWare::Word97::TAP> tap );
64 virtual void tableRowEnd();
65 virtual void tableCellStart();
66 virtual void tableCellEnd();
67 };
68
69
70 class PictureTest : public wvWare::PictureHandler
71 {
72 public:
73 virtual void bitmapData( wvWare::OLEImageReader& reader, wvWare::SharedPtr<const wvWare::Word97::PICF> picf );
74 virtual void wmfData( wvWare::OLEImageReader& reader, wvWare::SharedPtr<const wvWare::Word97::PICF> picf );
75 virtual void externalImage( const wvWare::UString& name, wvWare::SharedPtr<const wvWare::Word97::PICF> picf );
76 };
77
78
79 class TextTest : public wvWare::TextHandler
80 {
81 public:
82 virtual void sectionStart( wvWare::SharedPtr<const wvWare::Word97::SEP> sep );
83 virtual void sectionEnd();
84 virtual void pageBreak();
85
86 virtual void headersFound( const wvWare::HeaderFunctor& parseHeaders );
87
88 virtual void paragraphStart( wvWare::SharedPtr<const wvWare::ParagraphProperties> paragraphProperties );
89 virtual void paragraphEnd();
90
91 virtual void runOfText( const wvWare::UString& text, wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
92
93 virtual void specialCharacter( SpecialCharacter character, wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
94
95 virtual void footnoteFound( wvWare::FootnoteData::Type type, wvWare::UChar character,
96 wvWare::SharedPtr<const wvWare::Word97::CHP> chp, const wvWare::FootnoteFunctor& parseFootnote );
97 virtual void footnoteAutoNumber( wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
98
99 virtual void fieldStart( const wvWare::FLD* fld, wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
100 virtual void fieldSeparator( const wvWare::FLD* fld, wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
101 virtual void fieldEnd( const wvWare::FLD* fld, wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
102
103 virtual void tableRowFound( const wvWare::TableRowFunctor& tableRow, wvWare::SharedPtr<const wvWare::Word97::TAP> tap );
104
105 virtual void pictureFound( const wvWare::PictureFunctor& picture, wvWare::SharedPtr<const wvWare::Word97::PICF> picf,
106 wvWare::SharedPtr<const wvWare::Word97::CHP> chp );
107 };
108
109
110 using namespace wvWare;
111 std::string indent;
112
tab()113 U8 InlineReplacementTest::tab()
114 {
115 std::cout << indent << "INLINE: tab" << std::endl;
116 return InlineReplacementHandler::tab();
117 }
118
hardLineBreak()119 U8 InlineReplacementTest::hardLineBreak()
120 {
121 std::cout << indent << "INLINE: hard line break" << std::endl;
122 return InlineReplacementHandler::hardLineBreak();
123 }
124
columnBreak()125 U8 InlineReplacementTest::columnBreak()
126 {
127 std::cout << indent << "INLINE: column break" << std::endl;
128 return InlineReplacementHandler::columnBreak();
129 }
130
nonBreakingHyphen()131 U8 InlineReplacementTest::nonBreakingHyphen()
132 {
133 std::cout << indent << "INLINE: non breaking hyphen" << std::endl;
134 return InlineReplacementHandler::nonBreakingHyphen();
135 }
136
nonRequiredHyphen()137 U8 InlineReplacementTest::nonRequiredHyphen()
138 {
139 std::cout << indent << "INLINE: non required hyphen" << std::endl;
140 return InlineReplacementHandler::nonRequiredHyphen();
141 }
142
nonBreakingSpace()143 U8 InlineReplacementTest::nonBreakingSpace()
144 {
145 std::cout << indent << "INLINE: non breaking space" << std::endl;
146 return InlineReplacementHandler::nonBreakingSpace();
147 }
148
149
bodyStart()150 void SubDocumentTest::bodyStart()
151 {
152 std::cout << indent << "SUBDOCUMENT: body start" << std::endl;
153 indent.push_back( ' ' );
154 SubDocumentHandler::bodyStart();
155 }
156
bodyEnd()157 void SubDocumentTest::bodyEnd()
158 {
159 std::cout << indent << "SUBDOCUMENT: body end" << std::endl;
160 indent.erase( indent.size() - 1 );
161 SubDocumentHandler::bodyEnd();
162 }
163
footnoteStart()164 void SubDocumentTest::footnoteStart()
165 {
166 std::cout << indent << "SUBDOCUMENT: footnote start" << std::endl;
167 indent.push_back( ' ' );
168 SubDocumentHandler::footnoteStart();
169 }
170
footnoteEnd()171 void SubDocumentTest::footnoteEnd()
172 {
173 std::cout << indent << "SUBDOCUMENT: footnote end" << std::endl;
174 indent.erase( indent.size() - 1 );
175 SubDocumentHandler::footnoteEnd();
176 }
177
headersStart()178 void SubDocumentTest::headersStart()
179 {
180 std::cout << indent << "SUBDOCUMENT: headers start" << std::endl;
181 indent.push_back( ' ' );
182 SubDocumentHandler::headersStart();
183 }
184
headersEnd()185 void SubDocumentTest::headersEnd()
186 {
187 std::cout << indent << "SUBDOCUMENT: headers end" << std::endl;
188 indent.erase( indent.size() - 1 );
189 SubDocumentHandler::headersEnd();
190 }
191
headerStart(HeaderData::Type type)192 void SubDocumentTest::headerStart( HeaderData::Type type )
193 {
194 std::cout << indent << "SUBDOCUMENT: header start " << static_cast<int>( type ) << std::endl;
195 indent.push_back( ' ' );
196 SubDocumentHandler::headerStart( type );
197 }
198
headerEnd()199 void SubDocumentTest::headerEnd()
200 {
201 std::cout << indent << "SUBDOCUMENT: header end" << std::endl;
202 indent.erase( indent.size() - 1 );
203 SubDocumentHandler::headerEnd();
204 }
205
206
tableRowStart(SharedPtr<const Word97::TAP> tap)207 void TableTest::tableRowStart( SharedPtr<const Word97::TAP> tap )
208 {
209 std::cout << indent << "TABLE: table row start" << std::endl;
210 indent.push_back( ' ' );
211 tap->dump();
212 TableHandler::tableRowStart( tap );
213 }
214
tableRowEnd()215 void TableTest::tableRowEnd()
216 {
217 std::cout << indent << "TABLE: table row end" << std::endl;
218 indent.erase( indent.size() - 1 );
219 TableHandler::tableRowEnd();
220 }
221
tableCellStart()222 void TableTest::tableCellStart()
223 {
224 std::cout << indent << "TABLE: table cell start" << std::endl;
225 indent.push_back( ' ' );
226 TableHandler::tableCellStart();
227 }
228
tableCellEnd()229 void TableTest::tableCellEnd()
230 {
231 std::cout << indent << "TABLE: table cell end" << std::endl;
232 indent.erase( indent.size() - 1 );
233 TableHandler::tableCellEnd();
234 }
235
236
bitmapData(wvWare::OLEImageReader &,wvWare::SharedPtr<const wvWare::Word97::PICF>)237 void PictureTest::bitmapData( wvWare::OLEImageReader& /*reader*/, wvWare::SharedPtr<const wvWare::Word97::PICF> /*picf*/ )
238 {
239 // ###### TODO
240 std::cout << indent << "PICTURE: bitmapData" << std::endl;
241 }
242
wmfData(wvWare::OLEImageReader &,wvWare::SharedPtr<const wvWare::Word97::PICF>)243 void PictureTest::wmfData( wvWare::OLEImageReader& /*reader*/, wvWare::SharedPtr<const wvWare::Word97::PICF> /*picf*/ )
244 {
245 // ###### TODO
246 std::cout << indent << "PICTURE: wmfData" << std::endl;
247 }
248
externalImage(const wvWare::UString & name,wvWare::SharedPtr<const wvWare::Word97::PICF>)249 void PictureTest::externalImage( const wvWare::UString& name, wvWare::SharedPtr<const wvWare::Word97::PICF> /*picf*/ )
250 {
251 // ###### TODO
252 std::cout << indent << "PICTURE: externalImage: " << name.ascii() << std::endl;
253 }
254
255
sectionStart(SharedPtr<const Word97::SEP> sep)256 void TextTest::sectionStart( SharedPtr<const Word97::SEP> sep )
257 {
258 std::cout << indent << "TEXT: section start" << std::endl;
259 indent.push_back( ' ' );
260 sep->dump();
261 TextHandler::sectionStart( sep );
262 }
263
sectionEnd()264 void TextTest::sectionEnd()
265 {
266 std::cout << indent << "TEXT: section end" << std::endl;
267 indent.erase( indent.size() - 1 );
268 TextHandler::sectionEnd();
269 }
270
pageBreak()271 void TextTest::pageBreak()
272 {
273 std::cout << indent << "TEXT: page break" << std::endl;
274 TextHandler::pageBreak();
275 }
276
headersFound(const HeaderFunctor & parseHeaders)277 void TextTest::headersFound( const HeaderFunctor& parseHeaders )
278 {
279 std::cout << indent << "TEXT: headers found" << std::endl;
280 TextHandler::headersFound( parseHeaders );
281 }
282
paragraphStart(SharedPtr<const ParagraphProperties> paragraphProperties)283 void TextTest::paragraphStart( SharedPtr<const ParagraphProperties> paragraphProperties )
284 {
285 std::cout << indent << "TEXT: paragraph start" << std::endl;
286 indent.push_back( ' ' );
287 paragraphProperties->pap().dump();
288 if ( paragraphProperties->listInfo() )
289 paragraphProperties->listInfo()->dump();
290 TextHandler::paragraphStart( paragraphProperties );
291 }
292
paragraphEnd()293 void TextTest::paragraphEnd()
294 {
295 std::cout << indent << "TEXT: paragraph end" << std::endl;
296 indent.erase( indent.size() - 1 );
297 TextHandler::paragraphEnd();
298 }
299
runOfText(const UString & text,SharedPtr<const Word97::CHP> chp)300 void TextTest::runOfText( const UString& text, SharedPtr<const Word97::CHP> chp )
301 {
302 std::cout << indent << "TEXT: run of text" << std::endl;
303 chp->dump();
304 std::cout << "TEXT: [";
305 for ( int i = 0; i < text.length(); ++i )
306 std::cout << "<" << text[ i ].unicode() << "|" << text[ i ].low() << ">";
307 std::cout << "]" << std::endl;
308 TextHandler::runOfText( text, chp );
309 }
310
specialCharacter(SpecialCharacter character,SharedPtr<const Word97::CHP> chp)311 void TextTest::specialCharacter( SpecialCharacter character, SharedPtr<const Word97::CHP> chp )
312 {
313 std::cout << indent << "TEXT: special character " << static_cast<int>( character ) << std::endl;
314 chp->dump();
315 TextHandler::specialCharacter( character, chp );
316 }
317
footnoteFound(FootnoteData::Type type,UChar character,SharedPtr<const Word97::CHP> chp,const FootnoteFunctor & parseFootnote)318 void TextTest::footnoteFound( FootnoteData::Type type, UChar character,
319 SharedPtr<const Word97::CHP> chp, const FootnoteFunctor& parseFootnote )
320 {
321 std::cout << indent << "TEXT: footnote found " << static_cast<int>( type )
322 << " character " << character.unicode() << std::endl;
323 chp->dump();
324 TextHandler::footnoteFound( type, character, chp, parseFootnote );
325 }
326
footnoteAutoNumber(SharedPtr<const Word97::CHP> chp)327 void TextTest::footnoteAutoNumber( SharedPtr<const Word97::CHP> chp )
328 {
329 std::cout << indent << "TEXT: footnote auto-number" << std::endl;
330 chp->dump();
331 TextHandler::footnoteAutoNumber( chp );
332 }
333
fieldStart(const FLD * fld,SharedPtr<const Word97::CHP> chp)334 void TextTest::fieldStart( const FLD* fld, SharedPtr<const Word97::CHP> chp )
335 {
336 std::cout << indent << "TEXT: field start " << static_cast<int>( fld->ch ) << std::endl;
337 indent.push_back( ' ' );
338 chp->dump();
339 TextHandler::fieldStart( fld, chp );
340 }
341
fieldSeparator(const FLD * fld,SharedPtr<const Word97::CHP> chp)342 void TextTest::fieldSeparator( const FLD* fld, SharedPtr<const Word97::CHP> chp )
343 {
344 std::cout << indent << "TEXT: field separator " << static_cast<int>( fld->ch ) << std::endl;
345 chp->dump();
346 TextHandler::fieldSeparator( fld, chp );
347 }
348
fieldEnd(const FLD * fld,SharedPtr<const Word97::CHP> chp)349 void TextTest::fieldEnd( const FLD* fld, SharedPtr<const Word97::CHP> chp )
350 {
351 std::cout << indent << "TEXT: field end " << static_cast<int>( fld->ch ) << std::endl;
352 chp->dump();
353 indent.erase( indent.size() - 1 );
354 TextHandler::fieldEnd( fld, chp );
355 }
356
tableRowFound(const wvWare::TableRowFunctor & tableRow,wvWare::SharedPtr<const wvWare::Word97::TAP> tap)357 void TextTest::tableRowFound( const wvWare::TableRowFunctor& tableRow, wvWare::SharedPtr<const wvWare::Word97::TAP> tap )
358 {
359 std::cout << indent << "TEXT: table row found" << std::endl;
360 tap->dump();
361 TextHandler::tableRowFound( tableRow, tap );
362 }
363
pictureFound(const wvWare::PictureFunctor & picture,wvWare::SharedPtr<const wvWare::Word97::PICF> picf,wvWare::SharedPtr<const wvWare::Word97::CHP> chp)364 void TextTest::pictureFound( const wvWare::PictureFunctor& picture, wvWare::SharedPtr<const wvWare::Word97::PICF> picf,
365 wvWare::SharedPtr<const wvWare::Word97::CHP> chp )
366 {
367 std::cout << indent << "TEXT: picture found" << std::endl;
368 picf->dump();
369 chp->dump();
370 TextHandler::pictureFound( picture, picf, chp );
371 }
372
373
main(int argc,char ** argv)374 int main( int argc, char** argv )
375 {
376 if ( argc != 2 ) {
377 std::cerr << "Usage: handlertest foo.doc" << std::endl;
378 ::exit( 1 );
379 }
380
381 std::string document( argv[ 1 ] );
382 SharedPtr<Parser> parser( ParserFactory::createParser( document ) );
383 if ( !parser || !parser->isOk() ) {
384 std::cerr << "Error: Couldn't create a parser for this document" << std::endl;
385 ::exit( 2 );
386 }
387
388 TextTest* textTest( new TextTest );
389 parser->setTextHandler( textTest );
390 InlineReplacementTest* replacementTest( new InlineReplacementTest );
391 parser->setInlineReplacementHandler( replacementTest );
392
393 if ( !parser->parse() ) {
394 std::cerr << "Error: The parser failed" << std::endl;
395 delete replacementTest;
396 delete textTest;
397 ::exit( 3 );
398 }
399 std::cout << "Done." << std::endl;
400
401 delete replacementTest;
402 delete textTest;
403 return 0;
404 }
405