]> git.lyx.org Git - lyx.git/blobdiff - src/exporter.C
bug 2298: cursorTop/Bottom/Home/End does not redraw after dEPM
[lyx.git] / src / exporter.C
index 1c12aa2d2fd723ace7bbdba4828bd9f537a48ebc..57aca837ea5ad1d5852b592dc8c69e07af9fb089 100644 (file)
 #include "outputparams.h"
 #include "frontends/Alert.h"
 
-#include "support/FileInfo.h"
 #include "support/filetools.h"
 #include "support/lyxlib.h"
-#include "support/os.h"
+#include "support/package.h"
+
+#include <boost/filesystem/operations.hpp>
 
 using lyx::support::AddName;
 using lyx::support::bformat;
 using lyx::support::ChangeExtension;
 using lyx::support::contains;
-using lyx::support::getFormatFromContents;
 using lyx::support::MakeAbsPath;
 using lyx::support::MakeDisplayPath;
 using lyx::support::OnlyFilename;
 using lyx::support::OnlyPath;
+using lyx::support::package;
 using lyx::support::prefixIs;
 
 using std::find;
 using std::string;
 using std::vector;
 
+namespace fs = boost::filesystem;
 
 namespace {
 
@@ -59,6 +61,7 @@ vector<string> const Backends(Buffer const & buffer)
        if (buffer.params().getLyXTextClass().isTeXClassAvailable())
                v.push_back(BufferFormat(buffer));
        v.push_back("text");
+       v.push_back("lyx");
        return v;
 }
 
@@ -66,7 +69,7 @@ vector<string> const Backends(Buffer const & buffer)
 /// ask the user what to do if a file already exists
 int checkOverwrite(string const & filename)
 {
-       if (lyx::support::FileInfo(filename, true).exist()) {
+       if (fs::exists(filename)) {
                string text = bformat(_("The file %1$s already exists.\n\n"
                                        "Do you want to over-write that file?"),
                                      MakeDisplayPath(filename));
@@ -104,7 +107,7 @@ CopyStatus copyFile(string const & format,
        // overwrite themselves. This check could be changed to
        // boost::filesystem::equivalent(sourceFile, destFile) if export to
        // other directories than the document directory is desired.
-       if (!prefixIs(OnlyPath(sourceFile), lyx::support::os::getTmpDir()))
+       if (!prefixIs(OnlyPath(sourceFile), package().temp_dir()))
                return ret;
 
        if (!force) {
@@ -141,11 +144,19 @@ bool Exporter::Export(Buffer * buffer, string const & format,
        runparams.flavor = OutputParams::LATEX;
        runparams.linelen = lyxrc.ascii_linelen;
        vector<string> backends = Backends(*buffer);
-       if (find(backends.begin(), backends.end(), format) == backends.end()) {
+       // FIXME: Without this test export to lyx13 would be through
+       // latex -> lyx -> lyx13, because the first backend below with a
+       // working conversion path is used. We should replace this test and
+       // the explicit loop below with a method
+       // getShortestPath(vector<string> const & from, string const & to)
+       // which returns the shortest path from one of the formats in 'from'
+       // to 'to'.
+       if (format == "lyx13x" && !converters.getPath("lyx", format).empty())
+               backend_format = "lyx";
+       else if (find(backends.begin(), backends.end(), format) == backends.end()) {
                for (vector<string>::const_iterator it = backends.begin();
                     it != backends.end(); ++it) {
-                       Graph::EdgePath p =
-                               converters.getPath(*it, format);
+                       Graph::EdgePath p = converters.getPath(*it, format);
                        if (!p.empty()) {
                                runparams.flavor = converters.getFlavor(p);
                                backend_format = *it;
@@ -169,6 +180,9 @@ bool Exporter::Export(Buffer * buffer, string const & format,
        // Ascii backend
        if (backend_format == "text")
                writeFileAscii(*buffer, filename, runparams);
+       // no backend
+       else if (backend_format == "lyx")
+               buffer->writeFile(filename);
        // Linuxdoc backend
        else if (buffer->isLinuxDoc()) {
                runparams.nice = !put_in_tempdir;
@@ -183,7 +197,8 @@ bool Exporter::Export(Buffer * buffer, string const & format,
        else if (backend_format == format) {
                runparams.nice = true;
                buffer->makeLaTeXFile(filename, string(), runparams);
-       } else if (contains(buffer->filePath(), ' ')) {
+       } else if (!lyxrc.tex_allows_spaces
+                  && contains(buffer->filePath(), ' ')) {
                Alert::error(_("File name error"),
                           _("The directory path to the document cannot contain spaces."));
                return false;
@@ -208,22 +223,27 @@ bool Exporter::Export(Buffer * buffer, string const & format,
                CopyStatus status = SUCCESS;
                for (vector<ExportedFile>::const_iterator it = files.begin();
                                it != files.end() && status != CANCEL; ++it) {
-                       string const fmt = getFormatFromContents(it->sourceName);
+                       string const fmt =
+                               formats.getFormatFromFile(it->sourceName);
                        status = copyFile(fmt, it->sourceName,
                                          MakeAbsPath(it->exportName, dest),
                                          it->exportName, status == FORCE);
                }
                if (status == CANCEL) {
                        buffer->message(_("Document export cancelled."));
-               } else {
+               } else if (fs::exists(tmp_result_file)) {
                        // Finally copy the main file
                        status = copyFile(format, tmp_result_file,
                                          result_file, result_file,
                                          status == FORCE);
-                       buffer->message(bformat(_("Document exported as %1$s"
+                       buffer->message(bformat(_("Document exported as %1$s "
                                                  "to file `%2$s'"),
                                                formats.prettyName(format),
                                                MakeDisplayPath(result_file)));
+               } else {
+                       // This must be a dummy converter like fax (bug 1888)
+                       buffer->message(bformat(_("Document exported as %1$s"),
+                                               formats.prettyName(format)));
                }
        }