X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=exports.cpp;fp=exports.cpp;h=0000000000000000000000000000000000000000;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=4542441a4221dcf2c427735e1aaea6bbb41d8160;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/exports.cpp b/exports.cpp deleted file mode 100644 index 4542441..0000000 --- a/exports.cpp +++ /dev/null @@ -1,1402 +0,0 @@ -#include "exports.h" - -#include - -#include -#include -#include - -#include "branchitem.h" -#include "file.h" -#include "linkablemapobj.h" -#include "misc.h" -#include "mainwindow.h" -#include "warningdialog.h" -#include "xsltproc.h" -#include "vymprocess.h" - - -extern Main *mainWindow; -extern QDir vymBaseDir; -extern QString flagsPath; -extern QString vymName; -extern QString vymVersion; -extern QString vymHome; -extern Settings settings; -extern QDir lastExportDir; - -ExportBase::ExportBase() -{ - init(); -} - -ExportBase::ExportBase(VymModel *m) -{ - model=m; - init(); -} - -ExportBase::~ExportBase() -{ - // Cleanup tmpdir - removeDir (tmpDir); - - // Remember current directory - lastExportDir = QDir(dirPath); -} - -void ExportBase::init() -{ - indentPerDepth = " "; - exportName = "unnamed"; - lastCommand = ""; - bool ok; - tmpDir.setPath (makeTmpDir(ok,"vym-export")); - if (!tmpDir.exists() || !ok) - QMessageBox::critical( 0, QObject::tr( "Error" ), - QObject::tr("Couldn't access temporary directory\n")); - cancelFlag = false; - defaultDirPath = lastExportDir.absolutePath(); - dirPath = defaultDirPath; -} - -void ExportBase::setDirPath (const QString &s) -{ - if (!s.isEmpty()) - dirPath=s; - // Otherwise lastExportDir is used, which defaults to current dir -} - -QString ExportBase::getDirPath() -{ - return dirPath; -} - -void ExportBase::setFilePath (const QString &s) -{ - if(!s.isEmpty()) - { - filePath=s; - if (!filePath.contains("/")) - // Absolute path - filePath=lastExportDir.absolutePath() + "/" + filePath; - } -} - -QString ExportBase::getFilePath () -{ - if (!filePath.isEmpty()) - return filePath; - else - return dirPath + "/" + model->getMapName() + extension; -} - -QString ExportBase::getMapName () -{ - QString fn=basename(filePath); - return fn.left(fn.lastIndexOf(".")); -} - -void ExportBase::setModel(VymModel *m) -{ - model=m; -} - -void ExportBase::setWindowTitle (const QString &s) -{ - caption = s; -} - -void ExportBase::setName (const QString &s) -{ - exportName = s; -} - -QString ExportBase::getName () -{ - return exportName; -} - -void ExportBase::addFilter(const QString &s) -{ - filter=s; -} - -void ExportBase::setListTasks(bool b) -{ - listTasks = b; -} - -bool ExportBase::execDialog() -{ - QString fn=QFileDialog::getSaveFileName( - NULL, - caption, - dirPath, - filter, - NULL, - QFileDialog::DontConfirmOverwrite); - - if (!fn.isEmpty() ) - { - if (QFile (fn).exists() ) - { - WarningDialog dia; - dia.showCancelButton (true); - dia.setCaption(QObject::tr("Warning: Overwriting file")); - dia.setText(QObject::tr("Exporting to %1 will overwrite the existing file:\n%2").arg(exportName).arg(fn)); - dia.setShowAgainName("/exports/overwrite/" + exportName); - if (!(dia.exec()==QDialog::Accepted)) - { - cancelFlag=true; - return false; - } - } - dirPath=fn.left(fn.lastIndexOf ("/")); - filePath=fn; - return true; - } - return false; -} - -bool ExportBase::canceled() -{ - return cancelFlag; -} - -void ExportBase::setLastCommand( const QString &s) -{ - lastCommand = s; -} - -void ExportBase::completeExport(QString args) -{ - QString command; - if (args.isEmpty()) - // Add at least filepath as argument. exportName is added anyway - command = QString("export%1(\"%2\")").arg(exportName).arg(filePath); - // new syntax: command = QString("vym.currentMap().exportMap(\"%1\",\"%2\")").arg(exportName).arg(filePath); - else - command = QString("export%1(%2)").arg(exportName).arg(args); - // new syntax: command = QString("vym.currentMap().exportMap(\"%1\",%2)").arg(exportName).arg(args); - - settings.setLocalValue ( model->getFilePath(), "/export/last/exportPath", filePath); - settings.setLocalValue ( model->getFilePath(), "/export/last/command", command); - settings.setLocalValue ( model->getFilePath(), "/export/last/description", exportName); - - // Trigger saving of export command if it has changed - if (model && (lastCommand != command) ) model->setChanged(); - - mainWindow->statusMessage(QString("Exported as %1: %2").arg(exportName).arg(filePath)); -} - -QString ExportBase::getSectionString(TreeItem *start) -{ - // Make prefix like "2.5.3" for "bo:2,bo:5,bo:3" - QString r; - TreeItem *ti=start; - int depth=ti->depth(); - while (depth>0) - { - r=QString("%1").arg(1+ti->num(),0,10)+"." + r; - ti=ti->parent(); - depth=ti->depth(); - } - if (r.isEmpty()) - return r; - else - return r + " "; -} - -QString ExportBase::indent (const int &n, bool useBullet) -{ - QString s; - for (int i=0; i= 2 && bulletPoints.count() > n) - s.replace( s.length() - 2, 1, bulletPoints.at(n) ); - return s; -} - -//////////////////////////////////////////////////////////////////////// -ExportAO::ExportAO() -{ - exportName="AO"; - filter="TXT (*.txt);;All (* *.*)"; - caption=vymName+ " -" +QObject::tr("Export as ASCII")+" "+QObject::tr("(still experimental)"); - indentPerDepth=" "; - bulletPoints.clear(); - for (int i=0; i<10; i++) - bulletPoints << "-"; -} - -void ExportAO::doExport() -{ - QFile file (filePath); - if ( !file.open( QIODevice::WriteOnly ) ) - { - QMessageBox::critical (0, QObject::tr("Critical Export Error"), QObject::tr("Could not export as AO to %1").arg(filePath)); - mainWindow->statusMessage(QString(QObject::tr("Export failed."))); - return; - } - - settings.setLocalValue ( model->getFilePath(), "/export/last/command","exportAO"); - settings.setLocalValue ( model->getFilePath(), "/export/last/description","A&O report"); - - QTextStream ts( &file ); - ts.setCodec("UTF-8"); - - // Main loop over all branches - QString s; - QString curIndent; - QString dashIndent; - - int i; - BranchItem *cur=NULL; - BranchItem *prev=NULL; - - model->nextBranch (cur,prev); - while (cur) - { - QString line; - QString colString=""; - QString noColString; - QString statusString =""; - QColor col; - - if (cur->getType()==TreeItem::Branch || cur->getType()==TreeItem::MapCenter) - { - // Make indentstring - curIndent=indent(cur->depth()-4,true); - - if (!cur->hasHiddenExportParent() ) - { - col=cur->getHeadingColor(); - if (col==QColor (255,0,0)) - colString="[R] "; - else if (col==QColor (217,81,0)) - colString="[O] "; - else if (col==QColor (0,85,0)) - colString="[G] "; - else if (cur->depth()==4) - colString=" * "; - else - colString=" "; - - noColString=QString(" ").repeated(colString.length() ); - - dashIndent=""; - switch (cur->depth()) - { - case 0: break; // Mapcenter (Ignored) - case 1: break; // Mainbranch "Archive" (Ignored) - case 2: // Title: "Current week number..." - ts << "\n"; - ts << underline ( cur->getHeadingPlain(), QString("=") ); - ts << "\n"; - break; - case 3: // Headings: "Achievement", "Bonus", "Objective", ... - ts << "\n"; - ts << underline ( cur->getHeadingPlain(), "-"); - ts << "\n"; - break; - default: // depth 4 and higher are the items we need to know - Task *task=cur->getTask(); - if (task) - { - // Task status overrides other flags - switch ( task->getStatus() ) - { - case Task::NotStarted: - statusString="[NOT STARTED]"; - break; - case Task::WIP: - statusString="[WIP]"; - break; - case Task::Finished: - statusString="[DONE]"; - break; - } - } else - { - if (cur->hasActiveStandardFlag ("hook-green") ) - statusString="[DONE]"; - else if (cur->hasActiveStandardFlag ("wip")) - statusString="[WIP]"; - else if (cur->hasActiveStandardFlag ("cross-red")) - statusString="[NOT STARTED]"; - } - - line += colString; - line += curIndent; - if (cur->depth() >3) - line += cur->getHeadingPlain(); - - // Pad line width before status - i = 80 - line.length() - statusString.length() -1; - for (int j=0; jgetURL().isEmpty()) - ts << noColString << indent(cur->depth()-4, false) + cur->getURL() + "\n"; - - // If necessary, write note - if (!cur->isNoteEmpty()) - { - curIndent = noColString + indent(cur->depth()-4,false) + "| "; - s=cur->getNoteASCII( curIndent, 80); - ts << s + "\n"; - } - break; - } - } - } - model->nextBranch(cur,prev); - } - file.close(); - completeExport(); -} - -QString ExportAO::underline (const QString &text, const QString &line) -{ - QString r=text + "\n"; - for (int j=0;jstatusMessage(QString(QObject::tr("Export failed."))); - return; - } - QTextStream ts( &file ); - ts.setCodec("UTF-8"); - - // Main loop over all branches - QString s; - QString curIndent; - QString dashIndent; - int i; - BranchItem *cur=NULL; - BranchItem *prev=NULL; - - int lastDepth=0; - - QStringList tasks; - - model->nextBranch (cur,prev); - while (cur) - { - if (cur->getType()==TreeItem::Branch || cur->getType()==TreeItem::MapCenter) - { - // Insert newline after previous list - if ( cur->depth() < lastDepth ) ts << "\n"; - - // Make indentstring - curIndent=""; - for (i=1;idepth()-1;i++) curIndent+= indentPerDepth; - - if (!cur->hasHiddenExportParent() ) - { - //qDebug() << "ExportASCII:: "<getHeadingPlain().toStdString(); - - dashIndent=""; - switch (cur->depth()) - { - case 0: - ts << underline (cur->getHeadingPlain(),QString("=")); - ts << "\n"; - break; - case 1: - ts << "\n"; - ts << (underline (getSectionString(cur) + cur->getHeadingPlain(), QString("-") ) ); - ts << "\n"; - break; - case 2: - ts << "\n"; - ts << (curIndent + "* " + cur->getHeadingPlain()); - ts << "\n"; - dashIndent=" "; - break; - case 3: - ts << (curIndent + "- " + cur->getHeadingPlain()); - ts << "\n"; - dashIndent=" "; - break; - default: - ts << (curIndent + "- " + cur->getHeadingPlain()); - ts << "\n"; - dashIndent=" "; - break; - } - - // If there is a task, save it for potential later display - if (listTasks && cur->getTask() ) - { - tasks.append( QString("[%1]: %2").arg(cur->getTask()->getStatusString()).arg(cur->getHeadingPlain() ) ); - } - - // If necessary, write URL - if (!cur->getURL().isEmpty()) - ts << (curIndent + dashIndent + cur->getURL()) +"\n"; - - // If necessary, write vymlink - if (!cur->getVymLink().isEmpty()) - ts << (curIndent + dashIndent + cur->getVymLink()) +" (vym mindmap)\n"; - - // If necessary, write note - if (!cur->isNoteEmpty()) - { - // curIndent +=" | "; - // Only indent for bullet points - if (cur->depth() > 2) curIndent +=" "; - ts << '\n' + cur->getNoteASCII(curIndent, 80) ; - } - lastDepth = cur->depth(); - } - } - model->nextBranch(cur,prev); - } - - if (listTasks) - { - ts << "\n\nTasks\n-----\n\n"; - - - foreach (QString t, tasks) - { - ts << " - " << t << "\n"; - } - } - file.close(); - - QString listTasksString = listTasks ? "true" : "false"; - completeExport( QString("\"%1\",%2").arg(filePath).arg(listTasksString) ); -} - -QString ExportASCII::underline (const QString &text, const QString &line) -{ - QString r=text + "\n"; - for (int j=0;jstatusMessage(QString(QObject::tr("Export failed."))); - return; - } - QTextStream ts( &file ); - ts.setCodec("UTF-8"); - - // Write header - ts << "\"Note\"" <nextBranch (cur,prev); - while (cur) - { - if (!cur->hasHiddenExportParent() ) - { - // If necessary, write note - if (!cur->isNoteEmpty()) - { - s =cur->getNoteASCII(); - s=s.replace ("\n","\n"+curIndent); - ts << ("\""+s+"\","); - } else - ts <<"\"\","; - - // Make indentstring - for (i=0;idepth();i++) curIndent+= "\"\","; - - // Write heading - ts << curIndent << "\"" << cur->getHeadingPlain()<<"\""<nextBranch(cur,prev); - curIndent=""; - } - file.close(); - completeExport(); -} - -//////////////////////////////////////////////////////////////////////// -void ExportKDE4Bookmarks::doExport() -{ - WarningDialog dia; - dia.showCancelButton (true); - dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("KDE 4")); - dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("KDE")); - dia.setShowAgainName("/exports/overwrite/KDE4Bookmarks"); - if (dia.exec()==QDialog::Accepted) - { - model->exportXML("",tmpDir.path(),false); - - XSLTProc p; - p.setInputFile (tmpDir.path()+"/"+model->getMapName()+".xml"); - p.setOutputFile (tmpDir.home().path()+"/.kde4/share/apps/konqueror/bookmarks.xml"); - p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl"); - p.process(); - - QString ub=vymBaseDir.path()+"/scripts/update-bookmarks"; - QProcess *proc= new QProcess ; - proc->start( ub); - if (!proc->waitForStarted()) - { - QMessageBox::warning(0, - QObject::tr("Warning"), - QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub)); - } - } -} - -//////////////////////////////////////////////////////////////////////// -void ExportFirefoxBookmarks::doExport() -{ - WarningDialog dia; - dia.showCancelButton (true); - dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("Firefox")); - dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("Firefox")); - dia.setShowAgainName("/vym/warnings/overwriteImportBookmarks"); - if (dia.exec()==QDialog::Accepted) - { - model->exportXML("",tmpDir.path(),false); - - /* - XSLTProc p; - p.setInputFile (tmpDir.path()+"/"+me->getMapName()+".xml"); - p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml"); - p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl"); - p.process(); - - QString ub=vymBaseDir.path()+"/scripts/update-bookmarks"; - QProcess *proc = new QProcess( ); - proc->addArgument(ub); - - if ( !proc->start() ) - { - QMessageBox::warning(0, - QObject::tr("Warning"), - QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub)); - } - -*/ - } -} - -//////////////////////////////////////////////////////////////////////// -ExportHTML::ExportHTML():ExportBase() -{ - init(); -} - -ExportHTML::ExportHTML(VymModel *m):ExportBase(m) -{ - init(); -} - -void ExportHTML::init() -{ - exportName="HTML"; - extension=".html"; - frameURLs=true; -} - -QString ExportHTML::getBranchText(BranchItem *current) -{ - if (current) - { - bool vis = false; - QRectF hr; - LinkableMapObj *lmo = current->getLMO(); - if (lmo) - { - hr = ((BranchObj*)lmo)->getBBoxHeading(); - vis = lmo->isVisibleObj(); - } - QString col; - QString id = model->getSelectString(current); - if (dia.useTextColor) - col = QString("style='color:%1'").arg(current->getHeadingColor().name()); - QString s = QString("") - .arg(current->depth()) - .arg(col) - .arg(id); - QString url = current->getURL(); - QString heading = quotemeta(current->getHeadingPlain()); - - // Task flags - QString taskFlags; - if (dia.useTaskFlags) - { - Task *task = current->getTask(); - if (task) - { - QString taskName = task->getIconString(); - taskFlags += QString("\"%2\"") - .arg(taskName) - .arg(QObject::tr("Flag: %1","Alt tag in HTML export").arg(taskName)); - } - } - - // User flags - QString userFlags; - if (dia.useUserFlags) - { - foreach (QString flag, current->activeStandardFlagNames()) - userFlags += QString("\"%2\"") - .arg(flag) - .arg(QObject::tr("Flag: %1","Alt tag in HTML export").arg(flag)); - } - - // Numbering - QString number; - if (dia.useNumbering) number = getSectionString(current) + " "; - - // URL - if (!url.isEmpty()) - { - s += QString ("%2\"%3\"") - .arg(url) - .arg(number + taskFlags + heading + userFlags) - .arg(QObject::tr("Flag: url","Alt tag in HTML export")); - - QRectF fbox = current->getBBoxURLFlag (); - if (vis) - imageMap += QString(" %6\n") - .arg(fbox.left() - offset.x()) - .arg(fbox.top() - offset.y()) - .arg(fbox.right() - offset.x()) - .arg(fbox.bottom() - offset.y()) - .arg(url) - .arg(QObject::tr("External link: %1","Alt tag in HTML export").arg(heading)); - } else - s += number + taskFlags + heading + userFlags; - - s += ""; - - // Create imagemap - if (vis && dia.includeMapImage) - imageMap += QString(" %6\n") - .arg(hr.left() - offset.x()) - .arg(hr.top() - offset.y()) - .arg(hr.right() - offset.x()) - .arg(hr.bottom() - offset.y()) - .arg(id) - .arg(heading); - - // Include images experimental - if (dia.includeImages) - { - int imageCount = current->imageCount(); - ImageItem *image; - QString imagePath; - for (int i=0; i< imageCount; i++) - { - image = current->getImageNum(i); - imagePath = "image-" + image->getUuid().toString() + ".png"; - image->save( dirPath + "/" + imagePath, "PNG"); - s += "
\""getOriginalFilename()); - s += "\">
"; - } - } - - // Include note - if (!current->isNoteEmpty()) - { - VymNote note = current->getNote(); - QString n; - if (note.isRichText()) - { - n = note.getText(); - QRegExp re(""); - re.setMinimal (true); - if (current->getNote().getFontHint() == "fixed") - n.replace(re,"

"); - else - n.replace(re,"

"); - - re.setPattern(""); - n.replace(re,""); - - re.setPattern(""); - n.replace(re,""); - - re.setPattern(""); - n.replace(re,""); - - re.setPattern(""); - n.replace(re,""); - - re.setPattern(".*"); - n.replace(re,""); - - //re.setPattern(""); - //n.replace(re,""); - } - else - { - n = current->getNoteASCII().replace ("<","<").replace (">",">"); - n.replace("\n","
"); - if (current->getNote().getFontHint()=="fixed") - n = "

" + n + "
"; - } - s += "\n
\n\n" + n + "\n
\n"; - } - return s; - } - return QString(); -} - -QString ExportHTML::buildList (BranchItem *current) -{ - QString r; - - uint i = 0; - uint visChilds = 0; - - BranchItem *bi = current->getFirstBranch(); - - QString ind = "\n" + indent(current->depth() + 1, false); - - QString sectionBegin; - QString sectionEnd; - QString itemBegin; - QString itemEnd; - - switch (current->depth() + 1) - { - case 0: - sectionBegin = ""; - sectionEnd = ""; - itemBegin = "

"; - itemEnd = "

"; - break; - case 1: - sectionBegin = ""; - sectionEnd = ""; - itemBegin = "

"; - itemEnd = "

"; - break; - default: - sectionBegin = "
    depth() + 1) +">"; - sectionEnd = "
"; - itemBegin = "
  • "; - itemEnd = "
  • "; - break; - } - - if (bi && !bi->hasHiddenExportParent() && !bi->isHidden() ) - { - r += ind + sectionBegin; - while (bi) - { - if (!bi->hasHiddenExportParent() && !bi->isHidden()) - { - visChilds++; - r += ind + itemBegin; - r += getBranchText (bi); - - if (itemBegin.startsWith("getBranchNum(i); - } - r += ind + sectionEnd; - } - - return r; -} - -QString ExportHTML::createTOC() -{ - QString toc; - QString number; - toc += "\n"; - toc += "\n"; - toc += "\n"; - toc += "
    \n"; - toc += QObject::tr("Contents:","Used in HTML export"); - toc += "\n"; - toc += "
    \n"; - BranchItem *cur = NULL; - BranchItem *prev = NULL; - model->nextBranch(cur, prev); - while (cur) - { - if (!cur->hasHiddenExportParent() && !cur->hasScrolledParent() ) - { - if (dia.useNumbering) number = getSectionString(cur); - toc += QString("
    ").arg(cur->depth()); - toc += QString(" %2 %3
    \n") - .arg(model->getSelectString(cur)) - .arg(number) - .arg(quotemeta( cur->getHeadingPlain() )); - toc += "
    "; - } - model->nextBranch(cur,prev); - } - toc += "
    \n"; - return toc; -} - -void ExportHTML::doExport(bool useDialog) -{ - // Setup dialog and read settings - dia.setMapName (model->getMapName()); - dia.setFilePath (model->getFilePath()); - dia.readSettings(); - - if (dirPath != defaultDirPath) - dia.setDirectory(dirPath); - - if (useDialog) - { - if (dia.exec()!=QDialog::Accepted) return; - model->setChanged(); - } - - // Check, if warnings should be used before overwriting - // the output directory - if (dia.getDir().exists() && dia.getDir().count()>0) - { - WarningDialog warn; - warn.showCancelButton (true); - warn.setText(QString( - "The directory %1 is not empty.\n" - "Do you risk to overwrite some of its contents?").arg(dia.getDir().absolutePath() )); - warn.setCaption("Warning: Directory not empty"); - warn.setShowAgainName("mainwindow/export-XML-overwrite-dir"); - - if (warn.exec()!=QDialog::Accepted) - { - mainWindow->statusMessage(QString(QObject::tr("Export aborted."))); - return; - } - } - - dirPath=dia.getDir().absolutePath(); - filePath=getFilePath(); - - // Copy CSS file - if (dia.css_copy) - { - cssSrc=dia.getCssSrc(); - cssDst=dirPath + "/" + basename(dia.getCssDst()); - if (cssSrc.isEmpty() ) - { - QMessageBox::critical( 0, - QObject:: tr( "Critical" ), - QObject::tr("Could not find stylesheet %1").arg(cssSrc)); - return; - } - QFile src(cssSrc); - QFile dst(cssDst); - if (dst.exists() ) dst.remove(); - - if (!src.copy(cssDst)) - { - QMessageBox::critical (0, - QObject::tr( "Error","ExportHTML" ), - QObject::tr("Could not copy\n%1 to\n%2","ExportHTML").arg(cssSrc).arg(cssDst)); - return; - } - } - - // Copy flags - QDir flagsDst(dia.getDir().absolutePath() + "/flags"); - if (!flagsDst.exists()) - { - if (!dia.getDir().mkdir("flags")) - { - QMessageBox::critical( 0, - QObject::tr( "Critical" ), - QObject::tr("Trying to create directory for flags:") + "\n\n" + - QObject::tr("Could not create %1").arg(flagsDst.absolutePath())); - return; - } - } - - QDir flagsSrc(flagsPath); // FIXME-3 don't use flagsPath as source anymore, but copy required flags directly from memory - if (!copyDir(flagsSrc, flagsDst, true)) - { - QMessageBox::critical( 0, - QObject::tr( "Critical" ), - QObject::tr("Could not copy %1 to %2").arg(flagsSrc.absolutePath()).arg(flagsDst.absolutePath())); - return; - } - - // Open file for writing - QFile file (filePath); - if ( !file.open( QIODevice::WriteOnly ) ) - { - QMessageBox::critical (0, - QObject::tr("Critical Export Error"), - QObject::tr("Trying to save HTML file:") + "\n\n"+ - QObject::tr("Could not write %1").arg(filePath)); - mainWindow->statusMessage(QString(QObject::tr("Export failed."))); - return; - } - QTextStream ts( &file ); - ts.setCodec("UTF-8"); - - // Hide stuff during export - model->setExportMode (true); - - // Write header - ts << ""; - ts << "\n "; - ts << "\n"; - ts << "\ngetAuthor()) + "\"> "; - ts << "\ngetComment()) + "\"> "; - ts << "\n\n"; - QString title=model->getTitle(); - if (title.isEmpty()) title=model->getMapName(); - ts << "\n" + quotemeta(title) + ""; - ts << "\n\n"; - - // Include image - // (be careful: this resets Export mode, so call before exporting branches) - if (dia.includeMapImage) - { - QString mapName = getMapName(); - ts << "
    \n"; - offset = model->exportImage (dirPath + "/" + mapName + ".png", false, "PNG"); - } - - // Include table of contents - if (dia.useTOC) ts << createTOC(); - - // Main loop over all mapcenters - ts << buildList(model->getRootItem()) << "\n"; - - // Imagemap - ts << "\n" + imageMap + "\n"; - - // Write footer - ts << "
    \n"; - ts << " \n\ - \n\ - \n\ - \n\ - \n\ - \n \ -
    " + filePath + "" + model->getDate() + " vym " + vymVersion + "
    \n"; - ts << ""; - file.close(); - - if (!dia.postscript.isEmpty()) - { - VymProcess p; - p.runScript (dia.postscript,dirPath + "/" + filePath); - } - - completeExport( QString("\"%1\",\"%2\"").arg(dirPath).arg(filePath)); - - dia.saveSettings(); - model->setExportMode (false); -} - -//////////////////////////////////////////////////////////////////////// -void ExportTaskjuggler::doExport() -{ - model->exportXML("",tmpDir.path(),false); - - XSLTProc p; - p.setInputFile (tmpDir.path()+"/"+model->getMapName()+".xml"); - p.setOutputFile (filePath); - p.setXSLFile (vymBaseDir.path()+"/styles/vym2taskjuggler.xsl"); - p.process(); - - completeExport(); -} - -//////////////////////////////////////////////////////////////////////// -ExportOrgMode::ExportOrgMode() -{ - exportName="OrgMode"; - filter="org-mode (*.org);;All (* *.*)"; -} - -void ExportOrgMode::doExport() -{ - // Exports a map to an org-mode file. - // This file needs to be read - // by EMACS into an org mode buffer - QFile file (filePath); - if ( !file.open( QIODevice::WriteOnly ) ) - { - QMessageBox::critical (0, QObject::tr("Critical Export Error"), QObject::tr("Could not export as OrgMode to %1").arg(filePath)); - mainWindow->statusMessage(QString(QObject::tr("Export failed."))); - return; - } - QTextStream ts( &file ); - ts.setCodec("UTF-8"); - - // Main loop over all branches - QString s; - int i; - BranchItem *cur=NULL; - BranchItem *prev=NULL; - model->nextBranch(cur,prev); - while (cur) - { - if (!cur->hasHiddenExportParent() ) - { - for(i=0;i<=cur->depth();i++) - ts << ("*"); - ts << (" " + cur->getHeadingPlain()+ "\n"); - // If necessary, write note - if (!cur->isNoteEmpty()) - { - ts << (cur->getNoteASCII()); - ts << ("\n"); - } - } - model->nextBranch(cur,prev); - } - file.close(); - - completeExport(); -} - -//////////////////////////////////////////////////////////////////////// -ExportLaTeX::ExportLaTeX() -{ - exportName="LaTeX"; - filter="LaTeX files (*.tex);;All (* *.*)"; - - // Note: key in hash on left side is the regular expression, which - // will be replaced by string on right side - // E.g. a literal $ will be replaced by \$ - esc["\\$"]="\\$"; - esc["\\^"]="\\^"; - esc["%"]="\\%"; - esc["&"]="\\&"; - esc["~"]="\\~"; - esc["_"]="\\_"; - esc["\\\\"]="\\"; - esc["\\{"]="\\{"; - esc["\\}"]="\\}"; -} - -QString ExportLaTeX::escapeLaTeX(const QString &s) -{ - QString r=s; - - QRegExp rx; - rx.setMinimal(true); - - foreach (QString p,esc.keys() ) - { - rx.setPattern (p); - r.replace (rx, esc[p] ); - } - return r; -} - -void ExportLaTeX::doExport() -{ - // Exports a map to a LaTex file. - // This file needs to be included - // or inported into a LaTex document - // it will not add a preamble, or anything - // that makes a full LaTex document. - QFile file (filePath); - if ( !file.open( QIODevice::WriteOnly ) ) { - QMessageBox::critical ( - 0, - QObject::tr("Critical Export Error"), - QObject::tr("Could not export as LaTeX to %1").arg(filePath)); - mainWindow->statusMessage(QString(QObject::tr("Export failed."))); - return; - } - QTextStream ts( &file ); - ts.setCodec("UTF-8"); - - // Read default section names - QStringList sectionNames; - sectionNames << "" - << "chapter" - << "section" - << "subsection" - << "subsubsection" - << "paragraph"; - - for (int i=0; i<6; i++) - sectionNames.replace(i,settings.value( - QString("/export/latex/sectionName-%1").arg(i),sectionNames.at(i)).toString() ); - - // Main loop over all branches - QString s; - BranchItem *cur=NULL; - BranchItem *prev=NULL; - model->nextBranch(cur,prev); - while (cur) - { - if (!cur->hasHiddenExportParent() ) - { - int d=cur->depth(); - s=escapeLaTeX (cur->getHeadingPlain() ); - if ( sectionNames.at(d).isEmpty() || d>=sectionNames.count() ) - ts << s << endl; - else - ts << endl - << "\\" - << sectionNames.at(d) - << "{" - << s - << "}" - << endl; - - // If necessary, write note - if (!cur->isNoteEmpty()) { - ts << (cur->getNoteASCII()); - ts << endl; - } - } - model->nextBranch(cur,prev); - } - - file.close(); - completeExport(); -} - -//////////////////////////////////////////////////////////////////////// -ExportOO::ExportOO() -{ - exportName="Impress"; - filter="LibreOffice Impress (*.odp);;All (* *.*)"; - caption=vymName+ " -" +QObject::tr("Export as LibreOffice Impress presentation"); - useSections=false; -} - -ExportOO::~ExportOO() -{ -} - -QString ExportOO::buildList (TreeItem *current) -{ - QString r; - - uint i=0; - BranchItem *bi=current->getFirstBranch(); - if (bi) - { - // Start list - r+="\n"; - while (bi) - { - if (!bi->hasHiddenExportParent() ) - { - r += ""; - r += quotemeta(bi->getHeadingPlain()); - // If necessary, write note - if (! bi->isNoteEmpty()) - r += "" + bi->getNoteASCII(); - r += ""; - r += buildList (bi); // recursivly add deeper branches - r += "\n"; - } - i++; - bi = current->getBranchNum(i); - } - r += "\n"; - } - return r; -} - - -void ExportOO::exportPresentation() -{ - QString allPages; - - BranchItem *firstMCO=(BranchItem*)(model->getRootItem()->getFirstBranch()); - if (!firstMCO) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("No objects in map!")); - return; - } - - // Insert new content - // FIXME add extra title in mapinfo for vym 1.13.x - content.replace ("",quotemeta(firstMCO->getHeadingPlain())); - content.replace ("",quotemeta(model->getAuthor())); - - QString onePage; - QString list; - - BranchItem *sectionBI; - int i=0; - BranchItem *pagesBI; - int j=0; - - int mapcenters=model->getRootItem()->branchCount(); - - // useSections already has been set in setConfigFile - if (mapcenters>1) - sectionBI=firstMCO; - else - sectionBI=firstMCO->getFirstBranch(); - - // Walk sections - while (sectionBI && !sectionBI->hasHiddenExportParent() ) - { - if (useSections) - { - // Add page with section title - onePage=sectionTemplate; - onePage.replace ("", quotemeta(sectionBI->getHeadingPlain() ) ); - allPages+=onePage; - pagesBI=sectionBI->getFirstBranch(); - } else - { - //i=-2; // only use inner loop to - // turn mainbranches into pages - //sectionBI=firstMCO; - pagesBI=sectionBI; - } - - j=0; - while (pagesBI && !pagesBI->hasHiddenExportParent() ) - { - // Add page with list of items - onePage=pageTemplate; - onePage.replace ("", quotemeta (pagesBI->getHeadingPlain() ) ); - list=buildList (pagesBI); - onePage.replace ("", list); - allPages+=onePage; - if (pagesBI!=sectionBI) - { - j++; - pagesBI=((BranchItem*)pagesBI->parent())->getBranchNum(j); - } else - pagesBI=NULL; // We are already iterating over the sectionBIs - } - i++; - if (mapcenters>1 ) - sectionBI=model->getRootItem()->getBranchNum (i); - else - sectionBI=firstMCO->getBranchNum (i); - } - - content.replace ("",allPages); - - // Write modified content - QFile f (contentFile); - if ( !f.open( QIODevice::WriteOnly ) ) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not write %1").arg(contentFile)); - mainWindow->statusMessage(QString(QObject::tr("Export failed."))); - return; - } - - QTextStream t( &f ); - t.setCodec("UTF-8"); - t << content; - f.close(); - - // zip tmpdir to destination - zipDir (tmpDir,filePath); - - completeExport(QString("\"%1\", \"%2\"").arg(filePath).arg(configFile) ); -} - -bool ExportOO::setConfigFile (const QString &cf) -{ - configFile=cf; - int i=cf.lastIndexOf ("/"); - if (i>=0) configDir=cf.left(i); - SimpleSettings set; - - if (!set.readSettings(configFile)) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Couldn't read settings from \"%1\"").arg(configFile)); - return false; - } - - // set paths - templateDir=configDir+"/"+set.value ("Template"); - - QDir d (templateDir); - if (!d.exists()) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Check \"%1\" in\n%2").arg("Template="+set.value ("Template")).arg(configFile)); - return false; - - } - - contentTemplateFile = templateDir + "content-template.xml"; - pageTemplateFile = templateDir + "page-template.xml"; - sectionTemplateFile = templateDir + "section-template.xml"; - contentFile = tmpDir.path() + "/content.xml"; - - if (set.value("useSections").contains("yes")) - useSections=true; - - // Copy template to tmpdir - copyDir (templateDir,tmpDir); - - // Read content-template - if (!loadStringFromDisk (contentTemplateFile,content)) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not read %1").arg(contentTemplateFile)); - return false; - } - - // Read page-template - if (!loadStringFromDisk (pageTemplateFile,pageTemplate)) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not read %1").arg(pageTemplateFile)); - return false; - } - - // Read section-template - if (useSections && !loadStringFromDisk (sectionTemplateFile,sectionTemplate)) - { - QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not read %1").arg(sectionTemplateFile)); - return false; - } - return true; -} -