X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fexporter.C;h=d3ff74a95ef7e4e2df0315353e267d19c2e17312;hb=cd4033aef3a3f1efdb5a676b8bab3d367f53a830;hp=154ef8cb125043c999ce0f73d58a744745d3c0ff;hpb=fc7f2d980528b0d2379be21298bc8a461a1e3712;p=lyx.git diff --git a/src/exporter.C b/src/exporter.C index 154ef8cb12..d3ff74a95e 100644 --- a/src/exporter.C +++ b/src/exporter.C @@ -36,21 +36,26 @@ #include -using lyx::support::AddName; -using lyx::support::bformat; -using lyx::support::ChangeExtension; -using lyx::support::contains; -using lyx::support::MakeAbsPath; -using lyx::support::MakeDisplayPath; -using lyx::support::OnlyFilename; -using lyx::support::OnlyPath; -using lyx::support::package; -using lyx::support::prefixIs; + +namespace lyx { + +using support::addName; +using support::bformat; +using support::changeExtension; +using support::contains; +using support::FileName; +using support::makeAbsPath; +using support::makeDisplayPath; +using support::onlyFilename; +using support::onlyPath; +using support::package; +using support::prefixIs; using std::find; using std::string; using std::vector; +namespace Alert = frontend::Alert; namespace fs = boost::filesystem; namespace { @@ -59,7 +64,7 @@ vector const Backends(Buffer const & buffer) { vector v; if (buffer.params().getLyXTextClass().isTeXClassAvailable()) { - v.push_back(BufferFormat(buffer)); + v.push_back(bufferFormat(buffer)); // FIXME: Don't hardcode format names here, but use a flag if (v.back() == "latex") v.push_back("pdflatex"); @@ -71,16 +76,16 @@ vector const Backends(Buffer const & buffer) /// ask the user what to do if a file already exists -int checkOverwrite(string const & filename) +int checkOverwrite(FileName const & filename) { - 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)); + if (fs::exists(filename.toFilesystemEncoding())) { + docstring text = bformat(_("The file %1$s already exists.\n\n" + "Do you want to over-write that file?"), + makeDisplayPath(filename.absFilename())); return Alert::prompt(_("Over-write file?"), - text, 0, 2, - _("&Over-write"), _("Over-write &all"), - _("&Cancel export")); + text, 0, 2, + _("&Over-write"), _("Over-write &all"), + _("&Cancel export")); } return 0; } @@ -102,8 +107,8 @@ enum CopyStatus { * - CANCEL if the export should be cancelled */ CopyStatus copyFile(string const & format, - string const & sourceFile, string const & destFile, - string const & latexFile, bool force) + FileName const & sourceFile, FileName const & destFile, + string const & latexFile, bool force) { CopyStatus ret = force ? FORCE : SUCCESS; @@ -111,7 +116,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), package().temp_dir())) + if (!prefixIs(onlyPath(sourceFile.absFilename()), package().temp_dir())) return ret; if (!force) { @@ -127,12 +132,12 @@ CopyStatus copyFile(string const & format, } } - Mover const & mover = movers(format); + Mover const & mover = getMover(format); if (!mover.copy(sourceFile, destFile, latexFile)) Alert::error(_("Couldn't copy file"), - bformat(_("Copying %1$s to %2$s failed."), - MakeDisplayPath(sourceFile), - MakeDisplayPath(destFile))); + bformat(_("Copying %1$s to %2$s failed."), + makeDisplayPath(sourceFile.absFilename()), + makeDisplayPath(destFile.absFilename()))); return ret; } @@ -146,28 +151,22 @@ bool Exporter::Export(Buffer * buffer, string const & format, string backend_format; OutputParams runparams; runparams.flavor = OutputParams::LATEX; - runparams.linelen = lyxrc.ascii_linelen; + runparams.linelen = lyxrc.plaintext_linelen; vector backends = Backends(*buffer); - // 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 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()) { + if (find(backends.begin(), backends.end(), format) == backends.end()) { + // Get shortest path to format + Graph::EdgePath path; for (vector::const_iterator it = backends.begin(); it != backends.end(); ++it) { - Graph::EdgePath p = converters.getPath(*it, format); - if (!p.empty()) { - runparams.flavor = converters.getFlavor(p); + Graph::EdgePath p = theConverters().getPath(*it, format); + if (!p.empty() && (path.empty() || p.size() < path.size())) { backend_format = *it; - break; + path = p; } } - if (backend_format.empty()) { + if (!path.empty()) + runparams.flavor = theConverters().getFlavor(path); + else { Alert::error(_("Couldn't export file"), bformat(_("No information for exporting the format %1$s."), formats.prettyName(format))); @@ -181,30 +180,26 @@ bool Exporter::Export(Buffer * buffer, string const & format, } string filename = buffer->getLatexName(false); - filename = AddName(buffer->temppath(), filename); - filename = ChangeExtension(filename, + filename = addName(buffer->temppath(), filename); + filename = changeExtension(filename, formats.extension(backend_format)); - // Ascii backend + // Plain text backend if (backend_format == "text") - writeFileAscii(*buffer, filename, runparams); + writePlaintextFile(*buffer, FileName(filename), runparams); // no backend else if (backend_format == "lyx") - buffer->writeFile(filename); - // Linuxdoc backend - else if (buffer->isLinuxDoc()) { - runparams.nice = !put_in_tempdir; - buffer->makeLinuxDocFile(filename, runparams); - } + buffer->writeFile(FileName(filename)); // Docbook backend else if (buffer->isDocBook()) { runparams.nice = !put_in_tempdir; - buffer->makeDocBookFile(filename, runparams); + buffer->makeDocBookFile(FileName(filename), runparams); } // LaTeX backend else if (backend_format == format) { runparams.nice = true; - buffer->makeLaTeXFile(filename, string(), runparams); + if (!buffer->makeLaTeXFile(FileName(filename), string(), runparams)) + return false; } else if (!lyxrc.tex_allows_spaces && contains(buffer->filePath(), ' ')) { Alert::error(_("File name error"), @@ -212,46 +207,55 @@ bool Exporter::Export(Buffer * buffer, string const & format, return false; } else { runparams.nice = false; - buffer->makeLaTeXFile(filename, buffer->filePath(), runparams); + if (!buffer->makeLaTeXFile(FileName(filename), buffer->filePath(), runparams)) + return false; } - if (!converters.convert(buffer, filename, filename, - backend_format, format, result_file)) + string const error_type = (format == "program")? "Build" : bufferFormat(*buffer); + string const ext = formats.extension(format); + FileName const tmp_result_file(changeExtension(filename, ext)); + bool const success = theConverters().convert(buffer, FileName(filename), + tmp_result_file, FileName(buffer->fileName()), backend_format, format, + buffer->errorList(error_type)); + // Emit the signal to show the error list. + if (format != backend_format) + buffer->errors(error_type); + if (!success) return false; - if (!put_in_tempdir) { - string const tmp_result_file = result_file; - result_file = ChangeExtension(buffer->fileName(), - formats.extension(format)); + if (put_in_tempdir) + result_file = tmp_result_file.absFilename(); + else { + result_file = changeExtension(buffer->fileName(), ext); // We need to copy referenced files (e. g. included graphics // if format == "dvi") to the result dir. vector const files = runparams.exportdata->externalFiles(format); - string const dest = OnlyPath(result_file); + string const dest = onlyPath(result_file); CopyStatus status = SUCCESS; for (vector::const_iterator it = files.begin(); it != files.end() && status != CANCEL; ++it) { string const fmt = formats.getFormatFromFile(it->sourceName); status = copyFile(fmt, it->sourceName, - MakeAbsPath(it->exportName, dest), - it->exportName, status == FORCE); + makeAbsPath(it->exportName, dest), + it->exportName, status == FORCE); } if (status == CANCEL) { buffer->message(_("Document export cancelled.")); - } else if (fs::exists(tmp_result_file)) { + } else if (fs::exists(tmp_result_file.toFilesystemEncoding())) { // Finally copy the main file status = copyFile(format, tmp_result_file, - result_file, result_file, - status == FORCE); + FileName(result_file), result_file, + status == FORCE); buffer->message(bformat(_("Document exported as %1$s " - "to file `%2$s'"), - formats.prettyName(format), - MakeDisplayPath(result_file))); + "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))); + formats.prettyName(format))); } } @@ -267,43 +271,43 @@ bool Exporter::Export(Buffer * buffer, string const & format, } -bool Exporter::Preview(Buffer * buffer, string const & format) +bool Exporter::preview(Buffer * buffer, string const & format) { string result_file; if (!Export(buffer, format, true, result_file)) return false; - return formats.view(*buffer, result_file, format); + return formats.view(*buffer, FileName(result_file), format); } -bool Exporter::IsExportable(Buffer const & buffer, string const & format) +bool Exporter::isExportable(Buffer const & buffer, string const & format) { vector backends = Backends(buffer); for (vector::const_iterator it = backends.begin(); it != backends.end(); ++it) - if (converters.isReachable(*it, format)) + if (theConverters().isReachable(*it, format)) return true; return false; } vector const -Exporter::GetExportableFormats(Buffer const & buffer, bool only_viewable) +Exporter::getExportableFormats(Buffer const & buffer, bool only_viewable) { vector backends = Backends(buffer); vector result = - converters.getReachable(backends[0], only_viewable, true); + theConverters().getReachable(backends[0], only_viewable, true); for (vector::const_iterator it = backends.begin() + 1; it != backends.end(); ++it) { vector r = - converters.getReachable(*it, only_viewable, false); + theConverters().getReachable(*it, only_viewable, false); result.insert(result.end(), r.begin(), r.end()); } return result; } -ExportedFile::ExportedFile(string const & s, string const & e) : +ExportedFile::ExportedFile(FileName const & s, string const & e) : sourceName(s), exportName(e) {} @@ -316,11 +320,9 @@ bool operator==(ExportedFile const & f1, ExportedFile const & f2) void ExportData::addExternalFile(string const & format, - string const & sourceName, + FileName const & sourceName, string const & exportName) { - BOOST_ASSERT(lyx::support::AbsolutePath(sourceName)); - // Make sure that we have every file only once, otherwise copyFile() // would ask several times if it should overwrite a file. vector & files = externalfiles[format]; @@ -331,9 +333,9 @@ void ExportData::addExternalFile(string const & format, void ExportData::addExternalFile(string const & format, - string const & sourceName) + FileName const & sourceName) { - addExternalFile(format, sourceName, OnlyFilename(sourceName)); + addExternalFile(format, sourceName, onlyFilename(sourceName.absFilename())); } @@ -345,3 +347,6 @@ ExportData::externalFiles(string const & format) const return cit->second; return vector(); } + + +} // namespace lyx