void Document::_processParagraphLines(TokenPtr inTokenContainer) { token::Container *tokens=dynamic_cast<token::Container*>(inTokenContainer.get()); assert(tokens!=0); bool noPara=tokens->inhibitParagraphs(); for (TokenGroup::const_iterator ii=tokens->subTokens().begin(), iie=tokens->subTokens().end(); ii!=iie; ++ii) if ((*ii)->isContainer()) _processParagraphLines(*ii); TokenGroup processed; std::string paragraphText; TokenGroup paragraphTokens; for (TokenGroup::const_iterator ii=tokens->subTokens().begin(), iie=tokens->subTokens().end(); ii!=iie; ++ii) { if ((*ii)->text() && (*ii)->canContainMarkup() && !(*ii)->inhibitParagraphs()) { static const boost::regex cExpression("^(.*) $"); if (!paragraphText.empty()) paragraphText+=" "; boost::smatch m; if (boost::regex_match(*(*ii)->text(), m, cExpression)) { paragraphText += m[1]; flushParagraph(paragraphText, paragraphTokens, processed, noPara); processed.push_back(TokenPtr(new markdown::token::HtmlTag("br/"))); } else paragraphText += *(*ii)->text(); } else { flushParagraph(paragraphText, paragraphTokens, processed, noPara); processed.push_back(*ii); } } // Make sure the last paragraph is properly flushed too. flushParagraph(paragraphText, paragraphTokens, processed, noPara); tokens->swapSubtokens(processed); }
bool WMLHandler::endElement(const QString&, const QString&, const QString& qName) { QString tag = qName.lower(); if (tag == "wml") return m_parser->doCloseDocument(); if (tag == "card") { // forget </p> before </card> ? m_inBlock = false; if (!m_text.isEmpty()) flushParagraph(); return m_parser->doCloseCard(); } if (tag == "p") { m_inBlock = false; return flushParagraph(); } if ((tag == "b") || (tag == "strong")) { m_state.currentFormat.bold = false; m_state.currentFormat.pos = m_text.length(); m_state.formatList.append(m_state.currentFormat); return true; } if ((tag == "i") || (tag == "em")) { m_state.currentFormat.italic = false; m_state.currentFormat.pos = m_text.length(); m_state.formatList.append(m_state.currentFormat); return true; } if (tag == "u") { m_state.currentFormat.underline = false; m_state.currentFormat.pos = m_text.length(); m_state.formatList.append(m_state.currentFormat); return true; } if (tag == "big") { m_state.currentFormat.fontsize = WMLFormat::Normal; m_state.currentFormat.pos = m_text.length(); m_state.formatList.append(m_state.currentFormat); return true; } if (tag == "small") { m_state.currentFormat.fontsize = WMLFormat::Normal; m_state.currentFormat.pos = m_text.length(); m_state.formatList.append(m_state.currentFormat); return true; } if (tag == "a") { m_inBlock = true; m_inLink = false; m_state.formatList.append(m_state.currentFormat); return true; } // close table if (tag == "table") { popState(); return m_parser->doEndTable(); } // close table row if (tag == "tr") return true; //skip // close table cell, like </p> if (tag == "td") { m_inBlock = false; return flushParagraph(); } // unhandled return true; }