21#include "kwordfilter.h"
24#include <tqfileinfo.h>
32static double WPUToPoint(
unsigned wpu )
34 return wpu * 72 / 1200;
41 bool bold, italic, underline, doubleunderline;
42 bool striked, superscript, subscript, redline;
43 bool color, highlight;
45 int bgred, bggreen, bgblue;
53KWordFormat::KWordFormat()
55 bold = italic = underline = doubleunderline =
false;
56 striked = superscript = subscript = redline =
false;
57 color = highlight =
false;
58 red = green = blue = 0;
59 bgred = bggreen = bgblue = 255;
64TQString KWordFormat::asXML()
68 if( bold ) result.append(
" <WEIGHT value=\"75\" />\n" );
69 if( italic ) result.append(
" <ITALIC value=\"1\" />\n" );
70 if( underline ) result.append(
" <UNDERLINE value=\"1\" />\n" );
71 if( doubleunderline ) result.append(
" <UNDERLINE value=\"double\" />\n" );
72 if( striked ) result.append(
" <STRIKEOUT value=\"1\" />\n" );
73 if( subscript ) result.append(
"<VERTALIGN value=\"1\" />\n" );
74 if( superscript ) result.append(
"<VERTALIGN value=\"2\" />\n" );
76 if( !fontface.isEmpty() )
77 result.append(
"<FONT name=\"" + fontface +
"\" />\n" );
80 result.append(
" <SIZE value=\"" + TQString::number(fontsize) +
"\" />\n" );
83 result.append(
" <COLOR red=\"" + TQString::number(red) +
84 "\" green=\"" + TQString::number(green) +
85 "\" blue=\"" + TQString::number(blue) +
"\" />\n" );
88 result.append(
" <TEXTBACKGROUNDCOLOR red=\"" + TQString::number(bgred) +
89 "\" green=\"" + TQString::number(bggreen) +
90 "\" blue=\"" + TQString::number(bgblue) +
"\" />\n" );
95static TQString mapAlign( Token::Align align )
99 case Token::Left:
return "left";
100 case Token::Right:
return "right";
101 case Token::Center:
return "center";
102 case Token::Full:
return "justify";
103 case Token::All:
return "justify";
110static TQString mapLinespace(
double linespace )
112 return TQString::number( linespace );
115KWordFilter::KWordFilter ():
Parser ()
120KWordFilter::parse (
const TQString & filename)
122 int frameLeftMargin = 36, frameRightMargin = 36;
124 if (!Parser::parse (filename))
128 tokens.append(
new Token( Token::HardReturn ) );
136 int BottomMargin = 36;
137 int LeftMarginAdjust = 0;
138 int RightMarginAdjust = 0;
140 Token::Align align = Token::Left;
141 double linespace = 1.0;
153 for (TQPtrListIterator < Token > it (tokens); it; ++it)
158 Token *t = it.current ();
159 Token::Type type = t->type ();
165 text.append( t->text() );
168 case Token::SoftSpace:
169 case Token::HardSpace:
173 case Token::SoftReturn:
179 case Token::FontColor:
180 case Token::FontSize:
181 case Token::FontFace:
182 case Token::HighlightOn:
183 case Token::HighlightOff:
185 if( type == Token::FontColor )
189 flag.green = t->green();
190 flag.blue= t->blue();
192 else if( type == Token::HighlightOn )
194 flag.highlight =
true;
195 flag.bgred = t->red();
196 flag.bggreen = t->green();
197 flag.bgblue = t->blue();
199 else if( type == Token::HighlightOff )
203 flag.highlight =
false;
204 flag.bgred ^= t->red();
205 flag.bggreen ^= t->green();
206 flag.bgblue ^= t->blue();
208 else if( type == Token::FontSize )
212 if( t->value() > 50 )
213 flag.fontsize = t->value()*72.0/3600;
215 else if( type == Token::FontFace )
217 flag.fontface = t->fontface();
222 if( attr == Token::Bold ) flag.bold = ( type == Token::AttrOn );
223 if( attr == Token::Italic ) flag.italic = ( type == Token::AttrOn );
224 if( attr == Token::Underline) flag.underline = ( type == Token::AttrOn );
225 if( attr == Token::DoubleUnderline ) flag.doubleunderline = ( type == Token::AttrOn );
226 if( attr == Token::StrikedOut ) flag.striked = ( type == Token::AttrOn );
227 if( attr == Token::Subscript ) flag.subscript = ( type == Token::AttrOn );
228 if( attr == Token::Superscript ) flag.superscript = ( type == Token::AttrOn );
229 if( attr == Token::Redline ) flag.redline = ( type == Token::AttrOn );
233 len = text.length() - format_pos;
234 formats.append (
"<FORMAT id=\"1\" pos=\"" + TQString::number( format_pos ) +
235 "\" len=\"" + TQString::number( len )+
"\">\n" );
236 formats.append( fmt );
237 formats.append (
"</FORMAT>\n" );
241 format_pos= text.length();
245 case Token::HardReturn:
246 case Token::DormantHardReturn:
250 len = text.length() - format_pos;
251 formats.append (
" <FORMAT id=\"1\" pos=\"" + TQString::number( format_pos ) +
252 "\" len=\"" + TQString::number( len )+
"\">\n" );
253 formats.append(
" " + fmt );
254 formats.append (
" </FORMAT>\n" );
257 layout.append(
"<LAYOUT>\n" );
258 layout.append(
" <NAME value=\"Standard\" />\n" );
259 layout.append(
" <FLOW align=\"" + mapAlign( align ) +
"\" />\n" );
260 layout.append(
" <LINESPACING value=\"" + mapLinespace( linespace) +
"\" />\n" );
261 layout.append(
" <LEFTBORDER width=\"0\" style=\"0\" />\n" );
262 layout.append(
" <RIGHTBORDER width=\"0\" style=\"0\" />\n" );
263 layout.append(
" <TOPBORDER width=\"0\" style=\"0\" />\n" );
264 layout.append(
" <BOTTOMBORDER width=\"0\" style=\"0\" />\n" );
265 lm = LeftMargin + LeftMarginAdjust - frameLeftMargin;
266 rm = RightMargin + RightMarginAdjust - frameRightMargin;
267 layout.append(
" <INDENTS left=\"" + TQString::number( TQMAX( 0, lm ) ) +
"\"" +
268 " right=\"" + TQString::number( TQMAX( 0 , rm ) ) +
"\"" +
269 " first=\"0\" />\n" );
270 layout.append(
" <OFFSETS />\n" );
271 layout.append(
" <PAGEBREAKING />\n" );
272 layout.append(
" <COUNTER />\n" );
273 layout.append(
" <FORMAT id=\"1\">\n" );
274 layout.append(
" <WEIGHT value=\"50\" />\n" );
275 layout.append(
" <ITALIC value=\"0\" />\n" );
276 layout.append(
" <UNDERLINE value=\"0\" />\n" );
277 layout.append(
" <STRIKEOUT value=\"0\" />\n" );
278 layout.append(
" <CHARSET value=\"0\" />\n" );
279 layout.append(
" <VERTALIGN value=\"0\" />\n" );
280 layout.append(
" </FORMAT>\n" );
281 layout.append(
"</LAYOUT>\n" );
285 text.replace( TQRegExp(
"&"),
"&" );
286 text.replace( TQRegExp(
"<"),
"<" );
287 text.replace( TQRegExp(
">"),
">" );
288 text.replace( TQRegExp(
"\""),
""" );
289 text.replace( TQRegExp(
"'"),
"'" );
292 root.append(
"<PARAGRAPH>\n" );
293 root.append(
"<TEXT>" + text +
"</TEXT>\n" );
294 root.append(
"<FORMATS>\n");
295 root.append( formats );
296 root.append(
"</FORMATS>\n");
297 root.append( layout );
298 root.append(
"</PARAGRAPH>\n" );
308 case Token::HardHyphen:
312 case Token::LeftMargin:
313 LeftMargin = (int) WPUToPoint( t->value() );
316 case Token::RightMargin:
317 RightMargin = (int) WPUToPoint( t->value() );
320 case Token::TopMargin:
321 TopMargin = (int) WPUToPoint( t->value() );
324 case Token::BottomMargin:
325 BottomMargin = (int) WPUToPoint( t->value() );
328 case Token::LeftMarginAdjust:
329 LeftMarginAdjust = (int)WPUToPoint( t->value() );
332 case Token::RightMarginAdjust:
333 RightMarginAdjust = (int)WPUToPoint( t->value() );
336 case Token::Justification:
340 case Token::Linespace:
343 linespace = t->value() * 12.0 / 65536;
347 ucode = Parser::ExtCharToUnicode (t->charset (), t->charcode ());
348 if (ucode == 0) ucode = 32;
349 text.append( TQChar (ucode) );
352 case Token::TabHardFlushRight:
364 TQString content = root;
366 root =
"<!DOCTYPE DOC>\n";
367 root.append(
"<DOC mime=\"application/x-kword\" syntaxVersion=\"2\" editor=\"KWord\">\n");
370 LeftMargin = RightMargin = 36;
373 root.append(
"<PAPER width=\"595\" height=\"841\" format=\"1\" fType=\"0\" orientation=\"0\" hType=\"0\" columns=\"1\">\n" );
374 root.append(
" <PAPERBORDERS left=\"" + TQString::number(frameLeftMargin) +
375 "\" right=\"" + TQString::number(frameRightMargin) +
376 "\" top=\"" + TQString::number(TopMargin) +
377 "\" bottom=\"" + TQString::number(BottomMargin) +
"\" />\n" );
378 root.append(
"</PAPER>\n" );
380 root.append(
"<ATTRIBUTES standardpage=\"1\" hasFooter=\"0\" hasHeader=\"0\" processing=\"0\" />\n" );
382 root.append(
"<FRAMESETS>\n" );
383 root.append(
"<FRAMESET removable=\"0\" frameType=\"1\" frameInfo=\"0\" autoCreateNewFrame=\"1\">\n" );
384 root.append(
"<FRAME right=\"567\" left=\"28\" top=\"42\" bottom=\"799\" />\n" );
385 root.append( content );
386 root.append(
"</FRAMESET>\n" );
387 root.append(
"</FRAMESETS>\n" );
389 root.append(
"</DOC>\n" );
394 if( docTitle.isEmpty() )
396 TQFileInfo info( filename );
397 docTitle = info.baseName();
401 documentInfo =
"<!DOCTYPE document-info>\n";
403 documentInfo +=
"<document-info>\n";
404 documentInfo +=
"<log><text></text></log>\n";
406 documentInfo +=
"<author>\n";
407 documentInfo +=
"<full-name>" + docAuthor +
"</full-name>\n";
408 documentInfo +=
"<title></title>\n";
409 documentInfo +=
"<company></company>\n";
410 documentInfo +=
"<email></email>\n";
411 documentInfo +=
"<telephone></telephone>\n";
412 documentInfo +=
"</author>\n";
414 documentInfo +=
"<about>\n";
415 documentInfo +=
"<abstract><![CDATA[" + docAbstract +
"]]></abstract>\n";
416 documentInfo +=
"<title>" + docTitle +
"</title>\n";
417 documentInfo +=
"</about>\n";
419 documentInfo +=
"</document-info>";
This class implements a functional parser for WordPerfect documents.
This class is an abstract encapsulation of a token to be use in the parser.