Beispiel #1
0
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);
}
Beispiel #2
0
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;
}