void OdtWriter::writeBody(const QTextDocument* document) { m_xml.writeStartElement(QString::fromLatin1("office:body")); m_xml.writeStartElement(QString::fromLatin1("office:text")); for (QTextBlock block = document->begin(); block.isValid(); block = block.next()) { int heading = block.blockFormat().property(QTextFormat::UserProperty).toInt(); if (!heading) { m_xml.writeStartElement(QString::fromLatin1("text:p")); } else { m_xml.writeStartElement(QString::fromLatin1("text:h")); m_xml.writeAttribute(QString::fromLatin1("text:outline-level"), QString::number(heading)); } m_xml.writeAttribute(QString::fromLatin1("text:style-name"), m_styles.value(block.blockFormatIndex())); m_xml.setAutoFormatting(false); for (QTextBlock::iterator iter = block.begin(); !(iter.atEnd()); ++iter) { QTextFragment fragment = iter.fragment(); QString style = m_styles.value(fragment.charFormatIndex()); if (!style.isEmpty()) { m_xml.writeStartElement(QString::fromLatin1("text:span")); m_xml.writeAttribute(QString::fromLatin1("text:style-name"), style); } QString text = fragment.text(); int start = 0; int spaces = -1; for (int i = 0; i < text.length(); ++i) { QChar c = text.at(i); if (c.unicode() == 0x0009) { m_xml.writeCharacters(text.mid(start, i - start)); m_xml.writeEmptyElement(QString::fromLatin1("text:tab")); start = i + 1; } else if (c.unicode() == 0x2028) { m_xml.writeCharacters(text.mid(start, i - start)); m_xml.writeEmptyElement(QString::fromLatin1("text:line-break")); start = i + 1; } else if (c.unicode() == 0x0020) { ++spaces; } else if (spaces > 0) { m_xml.writeCharacters(text.mid(start, i - spaces - start)); m_xml.writeEmptyElement(QString::fromLatin1("text:s")); m_xml.writeAttribute(QString::fromLatin1("text:c"), QString::number(spaces)); spaces = -1; start = i; } else { spaces = -1; } } if (spaces > 0) { m_xml.writeCharacters(text.mid(start, text.length() - spaces - start)); m_xml.writeEmptyElement(QString::fromLatin1("text:s")); m_xml.writeAttribute(QString::fromLatin1("text:c"), QString::number(spaces)); } else { m_xml.writeCharacters(text.mid(start)); } if (!style.isEmpty()) { m_xml.writeEndElement(); } } m_xml.writeEndElement(); m_xml.setAutoFormatting(true); } m_xml.writeEndElement(); m_xml.writeEndElement(); }