bool KoDocumentInfo::saveOasisAboutInfo(KoXmlWriter &xmlWriter) { saveParameters(); foreach(const QString & tag, m_aboutTags) { if (!aboutInfo(tag).isEmpty() || tag == "title") { if (tag == "keyword") { foreach(const QString & tmp, aboutInfo("keyword").split(';')) { xmlWriter.startElement("meta:keyword"); xmlWriter.addTextNode(tmp); xmlWriter.endElement(); } } else if (tag == "title" || tag == "description" || tag == "subject" || tag == "date") { QByteArray elementName(QString("dc:" + tag).toLatin1()); xmlWriter.startElement(elementName); xmlWriter.addTextNode(aboutInfo(tag)); xmlWriter.endElement(); } else { QByteArray elementName(QString("meta:" + tag).toLatin1()); xmlWriter.startElement(elementName); xmlWriter.addTextNode(aboutInfo(tag)); xmlWriter.endElement(); } }
void KoInlineNote::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); QTextDocument *document = new QTextDocument(); KoTextDocument textDocument(document); Q_ASSERT(!d->styleManager.isNull()); textDocument.setStyleManager(d->styleManager.data()); QTextCursor cursor(document); cursor.insertFragment(d->text); if (d->type == Footnote || d->type == Endnote) { writer->startElement("text:note", false); if (d->type == Footnote) writer->addAttribute("text:note-class", "footnote"); else writer->addAttribute("text:note-class", "endnote"); writer->addAttribute("text:id", d->id); writer->startElement("text:note-citation", false); if (!autoNumbering()) writer->addAttribute("text:label", d->label); writer->addTextNode(d->label); writer->endElement(); writer->startElement("text:note-body", false); KoTextWriter textWriter(context); textWriter.write(document, 0); writer->endElement(); writer->endElement(); } else if (d->type == Annotation) { writer->startElement("office:annotation"); if (!d->author.isEmpty()) { writer->startElement("dc:creator"); writer->addTextNode(d->author); writer->endElement(); } if (d->date.isValid()) { writer->startElement("dc:date"); writer->addTextSpan(d->date.toString(Qt::ISODate)); writer->endElement(); } KoTextWriter textWriter(context); textWriter.write(document, 0); writer->endElement(); } delete document; }
void DateVariable::saveOdf(KoShapeSavingContext & context) { // TODO support data-style-name KoXmlWriter *writer = &context.xmlWriter(); if (m_displayType == Time) { writer->startElement("text:time", false); } else { writer->startElement("text:date", false); } if (!m_definition.isEmpty()) { QString styleName = KoOdfNumberStyles::saveOdfDateStyle(context.mainStyles(), m_definition, false); writer->addAttribute("style:data-style-name", styleName); } if (m_type == Fixed) { writer->addAttribute("text:fixed", "true"); // only write as much information as we read: just date/time or datetime if (m_displayType == Time) { const QString timeValue = (m_valueType == DateTime) ? m_datetime.toString(Qt::ISODate) : m_datetime.time().toString(Qt::ISODate); writer->addAttribute("text:time-value", timeValue); } else { const QString dateValue = (m_valueType == DateTime) ? m_datetime.toString(Qt::ISODate) : m_datetime.date().toString(Qt::ISODate); writer->addAttribute("text:date-value", dateValue); } } else { writer->addAttribute("text:fixed", "false"); } writer->addTextNode(value()); writer->endElement(); }
bool KoDocumentInfo::saveOasis(KoStore *store) { updateParametersAndBumpNumCycles(); KoStoreDevice dev(store); KoXmlWriter* xmlWriter = KoOdfWriteStore::createOasisXmlWriter(&dev, "office:document-meta"); xmlWriter->startElement("office:meta"); xmlWriter->startElement("meta:generator"); xmlWriter->addTextNode(QString("Calligra/%1") .arg(CALLIGRA_VERSION_STRING)); xmlWriter->endElement(); if (!saveOasisAboutInfo(*xmlWriter)) return false; if (!saveOasisAuthorInfo(*xmlWriter)) return false; xmlWriter->endElement(); xmlWriter->endElement(); // root element xmlWriter->endDocument(); delete xmlWriter; return true; }
bool KoDocumentInfo::saveOasisAuthorInfo(KoXmlWriter &xmlWriter) { foreach(const QString & tag, m_authorTags) { if (!authorInfo(tag).isEmpty() && tag == "creator") { xmlWriter.startElement("dc:creator"); xmlWriter.addTextNode(authorInfo("creator")); xmlWriter.endElement(); } else if (!authorInfo(tag).isEmpty()) { xmlWriter.startElement("meta:user-defined"); xmlWriter.addAttribute("meta:name", tag); xmlWriter.addTextNode(authorInfo(tag)); xmlWriter.endElement(); } } return true; }
void PageVariable::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); switch (m_type) { case PageCount: // <text:page-count>3</text:page-count> writer->startElement("text:page-count", false); writer->addTextNode(value()); writer->endElement(); break; case PageNumber: // <text:page-number text:select-page="current" text:page-adjust="2" text:fixed="true">3</text:page-number> writer->startElement("text:page-number", false); if (m_pageselect == KoTextPage::CurrentPage) writer->addAttribute("text:select-page", "current"); else if (m_pageselect == KoTextPage::PreviousPage) writer->addAttribute("text:select-page", "previous"); else if (m_pageselect == KoTextPage::NextPage) writer->addAttribute("text:select-page", "next"); if (m_pageadjust != 0) writer->addAttribute("text:page-adjust", QString::number(m_pageadjust)); m_numberFormat.saveOdf(writer); if (m_fixed) writer->addAttribute("text:fixed", "true"); writer->addTextNode(value()); writer->endElement(); break; case PageContinuation: // <text:page-continuation-string text:select-page="previous">The Text</text:page-continuation-string> writer->startElement("page-continuation-string", false); if (m_pageselect == KoTextPage::PreviousPage) writer->addAttribute("text:select-page", "previous"); else if (m_pageselect == KoTextPage::NextPage) writer->addAttribute("text:select-page", "next"); writer->addTextNode(m_continuation); writer->endElement(); break; } }
static void writePartGroup(KoXmlWriter& w, int id, PartGroup* group) { w.startElement("music:part-group"); w.addAttribute("type", "start"); w.addAttribute("number", id); if (!group->name().isNull()) { w.startElement("music:group-name"); w.addTextNode(group->name()); w.endElement(); // music:group-name } if (!group->shortName(false).isNull()) { w.startElement("music:group-abbreviation"); w.addTextNode(group->shortName()); w.endElement(); // music:group-abbreviation } if (group->symbol() != PartGroup::None) { w.startElement("music:group-symbol"); switch (group->symbol()) { case PartGroup::None: w.addTextNode("none"); break; case PartGroup::Brace: w.addTextNode("brace"); break; case PartGroup::Line: w.addTextNode("line"); break; case PartGroup::Bracket: w.addTextNode("bracket"); break; } w.endElement(); // music:group-symbol } w.startElement("music:group-barline"); w.addTextNode(group->commonBarLines() ? "yes" : "no"); w.endElement(); // music:group-barline w.endElement(); // music:part-group }
static void writePartDesc(KoXmlWriter& w, int id, Part* part) { w.startElement("music:score-part"); w.addAttribute("id", QString("P%1").arg(id)); w.startElement("music:part-name"); w.addTextNode(part->name()); w.endElement(); // music:part-name QString abbr = part->shortName(false); if (!abbr.isNull()) { w.startElement("music:part-abbreviation"); w.addTextNode(abbr); w.endElement(); // music:part-abbreviation } w.endElement(); // music:score-part }
bool PictureBase::saveAsBase64(KoXmlWriter& writer) const { QBuffer buffer; buffer.open(QIODevice::ReadWrite); if (!save(&buffer)) return false; QByteArray encoded = buffer.buffer().toBase64(); writer.addTextNode(encoded); return true; }
bool KoDocumentInfoAbout::saveOasis( KoXmlWriter &xmlWriter ) { saveParameters(); if ( !m_title.isEmpty() ) { xmlWriter.startElement( "dc:title" ); xmlWriter.addTextNode( m_title ); xmlWriter.endElement(); } if ( !m_abstract.isEmpty() ) { xmlWriter.startElement( "dc:description" ); xmlWriter.addTextNode( m_abstract ); xmlWriter.endElement(); } if ( !m_keywords.isEmpty() ) { xmlWriter.startElement( "meta:keyword" ); xmlWriter.addTextNode( m_keywords ); xmlWriter.endElement(); } if ( !m_subject.isEmpty() ) { xmlWriter.startElement( "dc:subject" ); xmlWriter.addTextNode( m_subject ); xmlWriter.endElement(); } if ( !m_initialCreator.isEmpty() ) { xmlWriter.startElement( "meta:initial-creator" ); xmlWriter.addTextNode( m_initialCreator ); xmlWriter.endElement(); } xmlWriter.startElement( "meta:editing-cycles" ); xmlWriter.addTextNode( QString::number( m_editingCycles ) ); xmlWriter.endElement(); if ( m_creationDate.isValid() ) { xmlWriter.startElement( "meta:creation-date" ); xmlWriter.addTextNode( m_creationDate.toString( Qt::ISODate ) ); xmlWriter.endElement(); } if ( m_modificationDate.isValid() ) { xmlWriter.startElement( "dc:date" ); xmlWriter.addTextNode( m_modificationDate.toString( Qt::ISODate ) ); xmlWriter.endElement(); } return true; }
static void writeClef(KoXmlWriter& w, Clef* clef, Part* part) { w.startElement("music:clef"); if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = clef->staff(); w.addAttribute("number", QString::number(part->indexOfStaff(s) + 1)); } w.startElement("music:sign"); switch (clef->shape()) { case Clef::GClef: w.addTextNode("G"); break; case Clef::FClef: w.addTextNode("F"); break; case Clef::CClef: w.addTextNode("C"); break; } w.endElement(); // music:sign w.endElement(); // music:clef }
static void writeTimeSignature(KoXmlWriter& w, TimeSignature* ts, Part* part) { w.startElement("music:time"); if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = ts->staff(); w.addAttribute("number", QString::number(part->indexOfStaff(s) + 1)); } w.startElement("music:beats"); w.addTextNode(QString::number(ts->beats())); w.endElement(); // music:beats w.startElement("music:beat-type"); w.addTextNode(QString::number(ts->beat())); w.endElement(); // music:beat-type w.endElement(); // music:time }
void GenValidationStyles::writeStyle(KoXmlWriter& writer) { if (m_styles.count() > 0) { writer.startElement("table:content-validations"); StyleMap::Iterator it; for (it = m_styles.begin(); it != m_styles.end(); ++it) { writer.startElement("table:content-validation"); writer.addAttribute("table:name", it.value()); writer.addAttribute("table:allow-empty-cell", it.key().allowEmptyCell); writer.addAttribute("table:condition", it.key().condition); writer.startElement("table:help-message"); writer.addAttribute("table:title", it.key().title); writer.addAttribute("table:display", it.key().displayValidationInformation); QStringList text = it.key().messageInfo.split('\n', QString::SkipEmptyParts); for (QStringList::Iterator it2 = text.begin(); it2 != text.end(); ++it2) { writer.startElement("text:p"); writer.addTextNode(*it2); writer.endElement(); } writer.endElement(); writer.startElement("table:error-message"); writer.addAttribute("table:message-type", it.key().messageType); writer.addAttribute("table:title", it.key().titleInfo); writer.addAttribute("table:display", it.key().displayMessage); text = it.key().message.split('\n', QString::SkipEmptyParts); for (QStringList::Iterator it3 = text.begin(); it3 != text.end(); ++it3) { writer.startElement("text:p"); writer.addTextNode(*it3); writer.endElement(); } writer.endElement(); writer.endElement(); } writer.endElement();//close sheet:content-validation } }
bool KoDocumentInfoUserMetadata::saveOasis( KoXmlWriter &xmlWriter ) { QMap<QString, QString>::iterator it; for ( it = m_metaList.begin(); it != m_metaList.end(); ++it ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", it.key() ); xmlWriter.addTextNode( it.data() ); xmlWriter.endElement(); } return true; }
void KoInlineNote::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); writer->startElement("text:note", false); if (d->type == Footnote) writer->addAttribute("text:note-class", "footnote"); else writer->addAttribute("text:note-class", "endnote"); writer->addAttribute("text:id", d->id); writer->startElement("text:note-citation", false); if (!autoNumbering()) writer->addAttribute("text:label", d->label); writer->addTextNode(d->label); writer->endElement(); writer->startElement("text:note-body", false); writer->startElement("text:p"); writer->addTextNode(d->text); writer->endElement(); writer->endElement(); writer->endElement(); }
QByteArray HancomWordImport::Private::createContent() { KoXmlWriter* contentWriter; QByteArray contentData; QBuffer contentBuffer( &contentData ); contentBuffer.open( QIODevice::WriteOnly ); contentWriter = new KoXmlWriter( &contentBuffer ); contentWriter->startDocument( "office:document-content" ); contentWriter->startElement( "office:document-content" ); contentWriter->addAttribute( "xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ); contentWriter->addAttribute( "xmlns:style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0" ); contentWriter->addAttribute( "xmlns:text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" ); contentWriter->addAttribute( "xmlns:table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0" ); contentWriter->addAttribute( "xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" ); contentWriter->addAttribute( "xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" ); contentWriter->addAttribute( "xmlns:svg","urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" ); contentWriter->addAttribute( "office:version","1.0" ); contentWriter->startElement( "office:automatic-styles" ); contentWriter->endElement(); // office:automatic-style // office:body contentWriter->startElement( "office:body" ); contentWriter->startElement( "office:text" ); contentWriter->startElement( "text:sequence-decls" ); contentWriter->endElement(); // text:sequence-decls for( int i = 0; i < paragraphs.count(); i++ ) { QString text = paragraphs[i]; text.replace( '\r', ' ' ); contentWriter->startElement( "text:p" ); contentWriter->addTextNode( text ); contentWriter->endElement(); // text:p } contentWriter->endElement(); //office:text contentWriter->endElement(); // office:body contentWriter->endElement(); // office:document-content contentWriter->endDocument(); delete contentWriter; return contentData; }
void InfoVariable::saveOdf(KoShapeSavingContext & context) { KoXmlWriter *writer = &context.xmlWriter(); if (!s_saveInfo.exists() ) { for (unsigned int i = 0; i < numPropertyData; ++i) { s_saveInfo->insert(propertyData[i].property, propertyData[i].saveTag); } } const char *nodeName = s_saveInfo->value(m_type, 0); if (nodeName) { writer->startElement(nodeName, false); writer->addTextNode(value()); writer->endElement(); } }
static void writeKeySignature(KoXmlWriter& w, KeySignature* ks, Part* part) { w.startElement("music:key"); if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = ks->staff(); w.addAttribute("number", QString::number(part->indexOfStaff(s) + 1)); } w.startElement("music:fifths"); w.addTextNode(QString::number(ks->accidentals())); w.endElement(); // music:fifths w.endElement(); // music:key }
void saveOdfLabel(KoShape *label, KoXmlWriter &bodyWriter, KoGenStyles &mainStyles, LabelType labelType) { // Don't save hidden labels, as that's the way of removing them // from a chart. if (!label->isVisible()) return; TextLabelData *labelData = qobject_cast<TextLabelData*>(label->userData()); if (!labelData) return; if (labelType == FooterLabelType) bodyWriter.startElement("chart:footer"); else if (labelType == SubTitleLabelType) bodyWriter.startElement("chart:subtitle"); else // if (labelType == TitleLabelType) bodyWriter.startElement("chart:title"); bodyWriter.addAttributePt("svg:x", label->position().x()); bodyWriter.addAttributePt("svg:y", label->position().y()); bodyWriter.addAttributePt("svg:width", label->size().width()); bodyWriter.addAttributePt("svg:height", label->size().height()); // TODO: Save text label color QTextCursor cursor(labelData->document()); QFont labelFont = cursor.charFormat().font(); KoGenStyle autoStyle(KoGenStyle::ChartAutoStyle, "chart", 0); autoStyle.addPropertyPt("style:rotation-angle", 360 - label->rotation()); saveOdfFont(autoStyle, labelFont, QColor()); bodyWriter.addAttribute("chart:style-name", mainStyles.insert(autoStyle, "ch")); bodyWriter.startElement("text:p"); bodyWriter.addTextNode(labelData->document()->toPlainText()); bodyWriter.endElement(); // text:p bodyWriter.endElement(); // chart:title/subtitle/footer }
bool KoDocumentInfo::saveOasis( KoStore* store ) { KoStoreDevice dev( store ); KoXmlWriter* xmlWriter = KoDocument::createOasisXmlWriter( &dev, "office:document-meta" ); xmlWriter->startElement( "office:meta" ); xmlWriter->startElement( "meta:generator"); xmlWriter->addTextNode( QString( "KOffice/%1" ).arg( KOFFICE_VERSION_STRING ) ); xmlWriter->endElement(); QStringList lst = pages(); QStringList::ConstIterator it = lst.begin(); for( ; it != lst.end(); ++it ) { KoDocumentInfoPage* p = page( *it ); Q_ASSERT( p ); if ( !p->saveOasis( *xmlWriter ) ) return false; } xmlWriter->endElement(); xmlWriter->endElement(); // root element xmlWriter->endDocument(); delete xmlWriter; return true; }
bool KoDocumentInfoAuthor::saveOasis( KoXmlWriter &xmlWriter ) { if ( !m_fullName.isEmpty() ) { xmlWriter.startElement( "dc:creator"); xmlWriter.addTextNode( m_fullName ); xmlWriter.endElement(); } if ( !m_initial.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "initial" ); xmlWriter.addTextNode( m_initial ); xmlWriter.endElement(); } if ( !m_title.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "author-title" ); xmlWriter.addTextNode( m_title ); xmlWriter.endElement(); } if ( !m_company.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "company" ); xmlWriter.addTextNode( m_company ); xmlWriter.endElement(); } if ( !m_email.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "email" ); xmlWriter.addTextNode( m_email ); xmlWriter.endElement(); } if ( !m_telephoneHome.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "telephone" ); xmlWriter.addTextNode( m_telephoneHome ); xmlWriter.endElement(); } if ( !m_telephoneWork.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "telephone-work" ); xmlWriter.addTextNode( m_telephoneWork ); xmlWriter.endElement(); } if ( !m_fax.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "fax" ); xmlWriter.addTextNode( m_fax ); xmlWriter.endElement(); } if ( !m_country.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "country" ); xmlWriter.addTextNode( m_country ); xmlWriter.endElement(); } if ( !m_postalCode.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "postal-code" ); xmlWriter.addTextNode( m_postalCode ); xmlWriter.endElement(); } if ( !m_city.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "city" ); xmlWriter.addTextNode( m_city ); xmlWriter.endElement(); } if ( !m_street.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "street" ); xmlWriter.addTextNode( m_street ); xmlWriter.endElement(); } if ( !m_position.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "position" ); xmlWriter.addTextNode( m_position ); xmlWriter.endElement(); } return true; }
static void writePart(KoXmlWriter& w, int id, Part* part) { w.startElement("music:part"); w.addAttribute("id", QString("P%1").arg(id)); for (int i = 0; i < part->sheet()->barCount(); i++) { Bar* bar = part->sheet()->bar(i); w.startElement("music:measure"); w.addAttribute("number", i+1); bool inAttributes = false; if (i == 0) { w.startElement("music:attributes"); w.startElement("music:divisions"); w.addTextNode(QString::number(QuarterLength)); w.endElement(); // music:divisions inAttributes = true; } for (int st = 0; st < part->staffCount(); st++) { Staff* staff = part->staff(st); for (int e = 0; e < bar->staffElementCount(staff); e++) { StaffElement* se = bar->staffElement(staff, e); KeySignature* ks = dynamic_cast<KeySignature*>(se); if (ks) { if (!inAttributes) { w.startElement("music:attributes"); inAttributes = true; } writeKeySignature(w, ks, part); } } } for (int st = 0; st < part->staffCount(); st++) { Staff* staff = part->staff(st); for (int e = 0; e < bar->staffElementCount(staff); e++) { StaffElement* se = bar->staffElement(staff, e); TimeSignature* ts = dynamic_cast<TimeSignature*>(se); if (ts) { if (!inAttributes) { w.startElement("music:attributes"); inAttributes = true; } writeTimeSignature(w, ts, part); } } } if (i == 0 && part->staffCount() != 1) { w.startElement("music:staves"); w.addTextNode(QString::number(part->staffCount())); w.endElement(); // music:staves } for (int st = 0; st < part->staffCount(); st++) { Staff* staff = part->staff(st); for (int e = 0; e < bar->staffElementCount(staff); e++) { StaffElement* se = bar->staffElement(staff, e); Clef* c = dynamic_cast<Clef*>(se); if (c) { if (!inAttributes) { w.startElement("music:attributes"); inAttributes = true; } writeClef(w, c, part); } } } if (inAttributes) { w.endElement(); // music:attributes } int curTime = 0; for (int voice = 0; voice < part->voiceCount(); voice++) { if (curTime != 0) { w.startElement("music:backup"); w.startElement("music:duration"); w.addTextNode(QString::number(curTime)); w.endElement(); // music:duration w.endElement(); // music:backup } Voice* v = part->voice(voice); VoiceBar* vb = part->sheet()->bar(i)->voice(v); for (int e = 0; e < vb->elementCount(); e++) { VoiceElement* ve = vb->element(e); curTime += ve->length(); Chord* c = dynamic_cast<Chord*>(ve); if(c) writeChord(w, c, v, part, i); } } w.endElement(); // music:measure } w.endElement(); // music:part }
KoFilter::ConversionStatus AsciiImport::convert(const QByteArray& from, const QByteArray& to) { // check for proper conversion if (to != "application/vnd.oasis.opendocument.text" || from != "text/plain") { return KoFilter::NotImplemented; } QFile in(m_chain->inputFile()); if (!in.open(QIODevice::ReadOnly)) { kError(30502) << "Unable to open input file!" << endl; in.close(); return KoFilter::FileNotFound; } #ifdef OUTPUT_AS_ODT_FILE #else KoDocument* document = m_chain->outputDocument(); if (!document) return KoFilter::StupidError; KWDocument *outputDoc = qobject_cast<KWDocument*>(document); outputDoc->setOutputMimeType(to); //outputDoc->setSaveInBatchMode(true); QPointer<KoUpdater> loadUpdater = outputDoc->progressUpdater()->startSubtask(2, "load"); loadUpdater->setRange(0, in.size()); QPointer<KoUpdater> layoutUpdater = outputDoc->progressUpdater()->startSubtask(3, "layout"); #endif // try to read 100000 bytes so we can be quite sure the guessed encoding is correct. // this code is inspired by the kate encoding guessing first try UTF-8 QByteArray data = in.read(100000); in.seek(0); QTextCodec *codec = QTextCodec::codecForName("UTF-8"); if (!checkEncoding(codec, data)) { KEncodingProber prober(KEncodingProber::Universal); prober.feed(data); kDebug(30502) << "guessed" << prober.encoding() << prober.confidence(); if (prober.confidence() > 0.5) codec = QTextCodec::codecForName(prober.encoding()); if (!codec || !checkEncoding(codec, data )) { codec = QTextCodec::codecForName("ISO 8859-15"); if (!checkEncoding(codec, data)) codec = QTextCodec::codecForName("UTF-8"); } } int paragraphStrategy = 0; if (!m_chain->manager()->getBatchMode()) { QPointer<AsciiImportDialog> dialog = new AsciiImportDialog(codec->name(), QApplication::activeWindow()); if (!dialog) { in.close(); return KoFilter::StupidError; } if (!dialog->exec()) { in.close(); return KoFilter::UserCancelled; } codec = dialog->getCodec(); paragraphStrategy = dialog->getParagraphStrategy(); } if (!codec) return KoFilter::StupidError; kDebug(30502) << "Charset used:" << codec->name(); #ifdef OUTPUT_AS_ODT_FILE KoStore *store = KoStore::createStore(m_chain->outputFile(), KoStore::Write, to, KoStore::Zip); if (!store || store->bad()) { kWarning(30502) << "Unable to open output file!"; delete store; return KoFilter::FileNotFound; } store->disallowNameExpansion(); kDebug(30502) << "created store."; KoOdfWriteStore odfStore(store); odfStore.manifestWriter(to); KoXmlWriter* contentWriter = odfStore.contentWriter(); if (!contentWriter) { delete store; return KoFilter::CreationError; } KoGenStyles mainStyles; KoXmlWriter *bodyWriter = odfStore.bodyWriter(); bodyWriter->startElement("office:body"); bodyWriter->startElement("office:text"); QString styleName("txt"); KoGenStyle style(KoGenStyle::ParagraphStyle, "paragraph"); style.addAttribute("style:display-name", styleName); style.addProperty("fo:font-family", "dejavu sans mono", KoGenStyle::TextType); style.addProperty("fo:font-family-generic", "modern", KoGenStyle::TextType); style.addProperty("fo:font-size", "10pt", KoGenStyle::TextType); style.addProperty("fo:font-weight", "normal", KoGenStyle::TextType); QString name(QString(QUrl::toPercentEncoding(styleName, "", " ")).replace('%', '_')); name = mainStyles.insert(style, name, KoGenStyles::DontAddNumberToName); #else KoStyleManager *styleManager = outputDoc->resourceManager()->resource(KoText::StyleManager).value<KoStyleManager*>(); KoParagraphStyle *p = styleManager->defaultParagraphStyle(); p->setFontFamily("dejavu sans mono"); p->setFontPointSize(10); p->setFontStyleHint(QFont::TypeWriter); outputDoc->appendPage(); QTextDocument *doc = outputDoc->mainFrameSet()->document(); //doc->setDefaultFont(p->font()); KoTextDocumentLayout *lay = dynamic_cast<KoTextDocumentLayout*>(doc->documentLayout()); Q_ASSERT(lay); lay->setBlockLayout(true); connect(lay, SIGNAL(layoutProgressChanged(int)), layoutUpdater, SLOT(setProgress(int))); QTextCursor cursor(doc); cursor.beginEditBlock(); QTextCharFormat charFormat; ((KoCharacterStyle*)p)->applyStyle(charFormat); cursor.setCharFormat(charFormat); #endif QTextStream stream(&in); Q_ASSERT(codec); stream.setCodec(codec); switch (paragraphStrategy) { case 1: { // Sentence: Line-break at the end of a sentence. QString stoppingPunctuation(".!?"); QString skippingEnd(" \"')"); while (!stream.atEnd()) { QString paragraph; for (;;) { const QString line = stream.readLine(); if (line.isEmpty()) break; paragraph += line + ' '; int lastPos = line.length() - 1; int maxCheck = lastPos >= 10 ? 10: lastPos + 1; QChar lastChar; // Skip a maximum of 10 quotes (or similar) at the end of the line for (int i = 0; i < maxCheck; ++i, --lastPos) { lastChar = line[lastPos]; if (lastPos == 0 || lastChar.isNull() || skippingEnd.indexOf(lastChar) == -1) break; } lastChar = line[lastPos]; if (lastChar.isNull()) continue; if (stoppingPunctuation.indexOf(lastChar) != -1) break; } if (!paragraph.isNull()) { QString s = paragraph.simplified(); #ifdef OUTPUT_AS_ODT_FILE bodyWriter->startElement("text:p"); bodyWriter->addAttribute("text:style-name", styleName); if (!s.isEmpty()) bodyWriter->addTextSpan(s); bodyWriter->endElement(); #else if (!s.isEmpty()) cursor.insertText(s /*, charFormat*/); cursor.insertBlock(); loadUpdater->setValue(stream.device()->pos()); #endif } } } break; case 2: { // Empty Line: Line-break if the line is empty. while (!stream.atEnd()) { QString paragraph; do { const QString line = stream.readLine(); if (line.isEmpty()) break; paragraph.append(line + ' '); } while(true); if (!paragraph.isNull()) { QString s = paragraph.simplified(); #ifdef OUTPUT_AS_ODT_FILE bodyWriter->startElement("text:p"); bodyWriter->addAttribute("text:style-name", styleName); if (!s.isEmpty()) bodyWriter->addTextSpan(s); bodyWriter->endElement(); #else if (!s.isEmpty()) { cursor.insertText(s /*, charFormat*/); cursor.insertBlock(); loadUpdater->setValue(stream.device()->pos()); } #endif } } } break; default: { // As Is: Line-break at the end of line. while (!stream.atEnd()) { QString s = stream.readLine(); #ifdef OUTPUT_AS_ODT_FILE bodyWriter->startElement("text:p"); bodyWriter->addAttribute("text:style-name", styleName); if (!s.isEmpty()) bodyWriter->addTextSpan(s); bodyWriter->endElement(); #else if (!s.isEmpty()) cursor.insertText(s /*, charFormat*/); cursor.insertBlock(); loadUpdater->setValue(stream.device()->pos()); #endif } } break; } #ifdef OUTPUT_AS_ODT_FILE bodyWriter->endElement(); // office:text bodyWriter->endElement(); // office:body mainStyles.saveOdfStyles(KoGenStyles::DocumentAutomaticStyles, contentWriter); odfStore.closeContentWriter(); odfStore.manifestWriter()->addManifestEntry("content.xml", "text/xml"); if (!mainStyles.saveOdfStylesDotXml(odfStore.store(), odfStore.manifestWriter())) { delete store; return KoFilter::CreationError; } if (store->open("meta.xml")) { KoStoreDevice dev(store); KoXmlWriter* xmlWriter = KoOdfWriteStore::createOasisXmlWriter(&dev, "office:document-meta"); xmlWriter->startElement("office:meta"); xmlWriter->startElement("meta:generator"); xmlWriter->addTextNode(QString("Calligra %1").arg(CALLIGRA_VERSION_STRING)); xmlWriter->endElement(); xmlWriter->startElement("meta:creation-date"); xmlWriter->addTextNode(QDateTime::currentDateTime().toString(Qt::ISODate)); xmlWriter->endElement(); xmlWriter->endElement(); // office:meta xmlWriter->endElement(); // root element xmlWriter->endDocument(); delete xmlWriter; if (store->close()) odfStore.manifestWriter()->addManifestEntry("meta.xml", "text/xml" ); } if (!odfStore.closeManifestWriter()) { kWarning() << "Error while trying to write 'META-INF/manifest.xml'. Partition full?"; delete store; return KoFilter::CreationError; } delete store; #else cursor.endEditBlock(); lay->setBlockLayout(false); lay->layout(); #endif return KoFilter::OK; }
static void writeChord(KoXmlWriter& w, Chord* chord, Voice* voice, Part* part, int bar) { if (!chord->noteCount()) { w.startElement("music:note"); w.startElement("music:rest"); w.endElement(); // music:rest w.startElement("music:duration"); w.addTextNode(QString::number(chord->length())); w.endElement(); // music:duration w.startElement("music:voice"); w.addTextNode(QString::number(part->indexOfVoice(voice) + 1)); w.endElement(); // music:voice w.startElement("music:type"); w.addTextNode(durationToString(chord->duration())); w.endElement(); // music:type for (int i = 0; i < chord->dots(); i++) { w.startElement("music:dot"); w.endElement(); // music:dot } if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = chord->staff(); w.startElement("music:staff"); w.addTextNode(QString::number(part->indexOfStaff(s) + 1)); w.endElement(); //music:staff } w.endElement(); // music:note } else for (int n = 0; n < chord->noteCount(); n++) { Staff* staff = chord->note(n)->staff(); w.startElement("music:note"); if (n > 0) { w.startElement("music:chord"); w.endElement(); // music:chord } w.startElement("music:pitch"); w.startElement("music:step"); int pitch = chord->note(n)->pitch(); char note = 'A' + ((((pitch + 2) % 7) + 7) % 7); w.addTextNode(QString(note)); w.endElement(); // music:step if (chord->note(n)->accidentals()) { w.startElement("music:alter"); w.addTextNode(QString::number(chord->note(n)->accidentals())); w.endElement(); // music:alter } w.startElement("music:octave"); w.addTextNode(QString::number((pitch + 4*7) / 7)); // first add, than divide to get proper rounding w.endElement(); // music:octave w.endElement(); // music:pitch w.startElement("music:duration"); w.addTextNode(QString::number(chord->length())); w.endElement(); // music:duration w.startElement("music:voice"); w.addTextNode(QString::number(part->indexOfVoice(voice) + 1)); w.endElement(); // music:voice w.startElement("music:type"); w.addTextNode(durationToString(chord->duration())); w.endElement(); // music:type for (int i = 0; i < chord->dots(); i++) { w.startElement("music:dot"); w.endElement(); // music:dot } int activeAccidentals = 0; KeySignature* ks = staff->lastKeySignatureChange(bar); if (ks) activeAccidentals = ks->accidentals(chord->note(n)->pitch()); VoiceBar* vb = chord->voiceBar(); // next check the bar for the last previous note in the same voice with the same pitch for (int e = 0; e < vb->elementCount(); e++) { Chord* c = dynamic_cast<Chord*>(vb->element(e)); if (!c) continue; if (c == chord) break; for (int nid = 0; nid < c->noteCount(); nid++) { Note* note = c->note(nid); if (note->staff() != staff) continue; if (note->pitch() == chord->note(n)->pitch()) { activeAccidentals = note->accidentals(); } } } if (chord->note(n)->accidentals() != activeAccidentals) { w.startElement("music:accidental"); switch (chord->note(n)->accidentals()) { case -2: w.addTextNode("flat-flat"); break; case -1: w.addTextNode("flat"); break; case 0: w.addTextNode("natural"); break; case 1: w.addTextNode("sharp"); break; case 2: w.addTextNode("double-sharp"); break; } w.endElement(); // music:accidental } if (part->staffCount() > 1) { // only write staff info when more than one staff exists Staff* s = chord->note(n)->staff(); w.startElement("music:staff"); w.addTextNode(QString::number(part->indexOfStaff(s) + 1)); w.endElement(); //music:staff } w.endElement(); // music:note } }