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