23#include <tqvaluestack.h>
30 unsigned tableRow, tableCol;
31 WMLFormat currentFormat;
32 WMLFormatList formatList;
33 WMLLayout currentLayout;
35 WMLParseState(
const WMLParseState& );
36 WMLParseState& operator=(
const WMLParseState& );
37 void assign(
const WMLParseState& );
40WMLParseState::WMLParseState()
42 tableRow = tableCol = 0;
45WMLParseState::WMLParseState(
const WMLParseState& state )
50WMLParseState& WMLParseState::operator=(
const WMLParseState& state )
56void WMLParseState::assign(
const WMLParseState& state )
58 tableRow = state.tableRow;
59 tableCol = state.tableCol;
60 currentFormat = state.currentFormat;
61 formatList = state.formatList;
62 currentLayout = state.currentLayout;
66class WMLHandler:
public TQXmlDefaultHandler
70 WMLHandler( WMLParser *parser ){ m_parser = parser; }
73 bool startElement(
const TQString&,
const TQString&,
const TQString& ,
74 const TQXmlAttributes& );
75 bool endElement(
const TQString&,
const TQString&,
const TQString& );
76 bool characters(
const TQString& ch );
89 WMLParseState m_state;
90 TQValueStack<WMLParseState> m_stateStack;
92 bool flushParagraph();
97bool WMLHandler::startDocument()
108bool WMLHandler::startElement(
const TQString&,
const TQString&,
109 const TQString& qName,
110 const TQXmlAttributes& attr )
112 TQString tag = qName.lower();
115 return m_parser->doOpenDocument();
119 m_state = WMLParseState();
120 TQString card_id = attr.value(
"id");
121 TQString card_title = attr.value(
"title");
122 return m_parser->doOpenCard( card_id, card_title );
127 m_state.currentLayout = WMLLayout();
129 if( m_state.currentFormat.bold ||
130 m_state.currentFormat.italic ||
131 m_state.currentFormat.underline ||
132 (m_state.currentFormat.fontsize != WMLFormat::Normal) )
133 m_state.formatList.append( m_state.currentFormat );
135 TQString align = attr.value(
"align").lower();
136 if( align ==
"right" )
137 m_state.currentLayout.align = WMLLayout::Right;
138 if( align ==
"center" )
139 m_state.currentLayout.align = WMLLayout::Center;
144 if(( tag ==
"b" ) || (tag ==
"strong") )
146 m_state.currentFormat.bold =
true;
147 m_state.currentFormat.pos = m_text.length();
148 m_state.formatList.append( m_state.currentFormat );
152 if(( tag ==
"i" ) || (tag ==
"em") )
154 m_state.currentFormat.italic =
true;
155 m_state.currentFormat.pos = m_text.length();
156 m_state.formatList.append( m_state.currentFormat );
162 m_state.currentFormat.underline =
true;
163 m_state.currentFormat.pos = m_text.length();
164 m_state.formatList.append( m_state.currentFormat );
170 m_state.currentFormat.fontsize = WMLFormat::Big;
171 m_state.currentFormat.pos = m_text.length();
172 m_state.formatList.append( m_state.currentFormat );
178 m_state.currentFormat.fontsize = WMLFormat::Small;
179 m_state.currentFormat.pos = m_text.length();
180 m_state.formatList.append( m_state.currentFormat );
186 TQString href = attr.value(
"href");
187 if( !href.isEmpty() )
191 m_state.currentFormat.link =
"";
192 m_state.currentFormat.href = href;
193 m_state.currentFormat.pos = m_text.length();
194 m_state.currentFormat.len = 1;
195 m_text.append(
"#" );
204 return m_parser->doBeginTable();
218 m_state.currentLayout = WMLLayout();
220 m_state.formatList.append( m_state.currentFormat );
221 return m_parser->doTableCell( m_state.tableRow, m_state.tableCol );
228bool WMLHandler::endElement(
const TQString&,
const TQString&,
229 const TQString& qName )
231 TQString tag = qName.lower();
234 return m_parser->doCloseDocument();
240 if( !m_text.isEmpty() )
242 return m_parser->doCloseCard();
248 return flushParagraph();
251 if(( tag ==
"b" ) || (tag ==
"strong") )
253 m_state.currentFormat.bold =
false;
254 m_state.currentFormat.pos = m_text.length();
255 m_state.formatList.append( m_state.currentFormat );
259 if(( tag ==
"i" ) || (tag ==
"em") )
261 m_state.currentFormat.italic =
false;
262 m_state.currentFormat.pos = m_text.length();
263 m_state.formatList.append( m_state.currentFormat );
269 m_state.currentFormat.underline =
false;
270 m_state.currentFormat.pos = m_text.length();
271 m_state.formatList.append( m_state.currentFormat );
277 m_state.currentFormat.fontsize = WMLFormat::Normal;
278 m_state.currentFormat.pos = m_text.length();
279 m_state.formatList.append( m_state.currentFormat );
285 m_state.currentFormat.fontsize = WMLFormat::Normal;
286 m_state.currentFormat.pos = m_text.length();
287 m_state.formatList.append( m_state.currentFormat );
295 m_state.formatList.append( m_state.currentFormat );
303 return m_parser->doEndTable();
314 return flushParagraph();
321bool WMLHandler::characters(
const TQString& ch )
327 m_state.currentFormat.link.append( ch );
332bool WMLHandler::flushParagraph()
335 for(
unsigned i=0; i<m_state.formatList.count(); i++ )
338 WMLFormat& format = m_state.formatList[i];
339 if( i < m_state.formatList.count()-1 )
341 WMLFormat& nextformat = m_state.formatList[i+1];
342 nextpos = nextformat.pos;
344 else nextpos = m_text.length();
345 if( format.len <= 0 )
346 format.len = nextpos - format.pos;
349 bool result = m_parser->doParagraph( m_text, m_state.formatList, m_state.currentLayout );
353 m_state.formatList.clear();
354 m_state.currentLayout = WMLLayout();
362void WMLHandler::pushState()
364 m_stateStack.push( m_state );
367void WMLHandler::popState()
369 if( !m_stateStack.isEmpty() )
370 m_state = m_stateStack.pop();
374WMLFormat::WMLFormat()
378 bold = italic = underline =
false;
383void WMLFormat::assign(
const WMLFormat& f )
389 underline = f.underline;
390 fontsize = f.fontsize;
395WMLFormat::WMLFormat(
const WMLFormat& f )
400WMLFormat& WMLFormat::operator=(
const WMLFormat& f )
407WMLLayout::WMLLayout()
412void WMLLayout::assign(
const WMLLayout& l )
417WMLLayout::WMLLayout(
const WMLLayout& l )
422WMLLayout& WMLLayout::operator=(
const WMLLayout& l )
429void WMLParser::parse(
const char* filename )
431 TQFile f( filename );
432 TQXmlInputSource source( &f );
433 TQXmlSimpleReader reader;
434 WMLHandler handler(
this );
435 reader.setContentHandler( &handler );
436 reader.parse( source );
439bool WMLParser::doOpenDocument()
444bool WMLParser::doCloseDocument()
449bool WMLParser::doOpenCard( TQString, TQString )
454bool WMLParser::doCloseCard()
459bool WMLParser::doParagraph( TQString, WMLFormatList, WMLLayout )
464bool WMLParser::doBeginTable()
469bool WMLParser::doEndTable()
474bool WMLParser::doTableCell(
unsigned,
unsigned )