X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FExporter.cpp;h=073842f2806213c9deeec12add2b61ba351a7c6f;hb=79cf3f5ec1088e7de988e889247ec300d42fb70b;hp=f8bd191af8cdf9e2c1a2db9fd3683f00916e9ad9;hpb=138b23fac84930cdbfada0067c61480989041113;p=lyx.git diff --git a/src/Exporter.cpp b/src/Exporter.cpp index f8bd191af8..073842f280 100644 --- a/src/Exporter.cpp +++ b/src/Exporter.cpp @@ -5,11 +5,11 @@ * * \author unknown * \author Alfredo Braunstein - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * \author Jean Marc Lasgouttes * \author Angus Leeming * \author John Levon - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ @@ -18,88 +18,44 @@ #include "Exporter.h" -#include "Buffer.h" -#include "buffer_funcs.h" -#include "BufferParams.h" -#include "Converter.h" -#include "Format.h" -#include "gettext.h" -#include "LyXRC.h" #include "Mover.h" -#include "output_plaintext.h" -#include "OutputParams.h" -#include "frontends/Alert.h" + +#include "frontends/alert.h" #include "support/filetools.h" -#include "support/lyxlib.h" +#include "support/gettext.h" +#include "support/lstrings.h" #include "support/Package.h" -#include +#include +using namespace std; +using namespace lyx::support; 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 { -vector const Backends(Buffer const & buffer) +/// Ask the user what to do if a file already exists +static int checkOverwrite(FileName const & filename) { - vector v; - if (buffer.params().getLyXTextClass().isTeXClassAvailable()) { - v.push_back(bufferFormat(buffer)); - // FIXME: Don't hardcode format names here, but use a flag - if (v.back() == "latex") - v.push_back("pdflatex"); - } - v.push_back("text"); - v.push_back("lyx"); - return v; + if (!filename.exists()) + return 1; + + docstring text = bformat(_("The file %1$s already exists.\n\n" + "Do you want to overwrite that file?"), + makeDisplayPath(filename.absFileName())); + return Alert::prompt(_("Overwrite file?"), + text, 0, 3, + _("&Keep file"), _("&Overwrite"), + _("Overwrite &all"), _("&Cancel export")); } -/// ask the user what to do if a file already exists -int checkOverwrite(FileName const & 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")); - } - return 0; -} - - -enum CopyStatus { - SUCCESS, - FORCE, - CANCEL -}; - - /** copy file \p sourceFile to \p destFile. If \p force is false, the user - * will be asked before existing files are overwritten. + * will be asked before existing files are overwritten. If \p only_tmp + * is true, then only copy files that are in our tmp dir (to avoid other files + * overwriting themselves). * \return * - SUCCESS if this file got copied * - FORCE if subsequent calls should not ask for confirmation before @@ -108,23 +64,27 @@ enum CopyStatus { */ CopyStatus copyFile(string const & format, FileName const & sourceFile, FileName const & destFile, - string const & latexFile, bool force) + string const & latexFile, bool force, bool only_tmp) { CopyStatus ret = force ? FORCE : SUCCESS; - // Only copy files that are in our tmp dir, all other files would - // overwrite themselves. This check could be changed to + // 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.absFilename()), package().temp_dir().absFilename())) + // Also don't overwrite files that already exist and are identical + // to the source files. + if ((only_tmp && !prefixIs(onlyPath(sourceFile.absFileName()), package().temp_dir().absFileName())) + || sourceFile.checksum() == destFile.checksum()) return ret; if (!force) { switch(checkOverwrite(destFile)) { case 0: + return SUCCESS; + case 1: ret = SUCCESS; break; - case 1: + case 2: ret = FORCE; break; default: @@ -136,179 +96,16 @@ CopyStatus copyFile(string const & format, if (!mover.copy(sourceFile, destFile, latexFile)) Alert::error(_("Couldn't copy file"), bformat(_("Copying %1$s to %2$s failed."), - makeDisplayPath(sourceFile.absFilename()), - makeDisplayPath(destFile.absFilename()))); + makeDisplayPath(sourceFile.absFileName()), + makeDisplayPath(destFile.absFileName()))); return ret; } -} //namespace anon - - -bool Exporter::Export(Buffer * buffer, string const & format, - bool put_in_tempdir, string & result_file) -{ - string backend_format; - OutputParams runparams(&buffer->params().encoding()); - runparams.flavor = OutputParams::LATEX; - runparams.linelen = lyxrc.plaintext_linelen; - vector backends = Backends(*buffer); - 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 = theConverters().getPath(*it, format); - if (!p.empty() && (path.empty() || p.size() < path.size())) { - backend_format = *it; - path = p; - } - } - 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))); - return false; - } - } else { - backend_format = format; - // FIXME: Don't hardcode format names here, but use a flag - if (backend_format == "pdflatex") - runparams.flavor = OutputParams::PDFLATEX; - } - - string filename = buffer->getLatexName(false); - filename = addName(buffer->temppath(), filename); - filename = changeExtension(filename, - formats.extension(backend_format)); - - // Plain text backend - if (backend_format == "text") - writePlaintextFile(*buffer, FileName(filename), runparams); - // no backend - else if (backend_format == "lyx") - buffer->writeFile(FileName(filename)); - // Docbook backend - else if (buffer->isDocBook()) { - runparams.nice = !put_in_tempdir; - buffer->makeDocBookFile(FileName(filename), runparams); - } - // LaTeX backend - else if (backend_format == format) { - runparams.nice = true; - if (!buffer->makeLaTeXFile(FileName(filename), string(), runparams)) - return false; - } 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; - } else { - runparams.nice = false; - if (!buffer->makeLaTeXFile(FileName(filename), buffer->filePath(), runparams)) - return false; - } - - 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) - 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); - 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); - } - if (status == CANCEL) { - buffer->message(_("Document export cancelled.")); - } else if (fs::exists(tmp_result_file.toFilesystemEncoding())) { - // Finally copy the main file - status = copyFile(format, tmp_result_file, - 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))); - } else { - // This must be a dummy converter like fax (bug 1888) - buffer->message(bformat(_("Document exported as %1$s"), - formats.prettyName(format))); - } - } - - return true; -} - - -bool Exporter::Export(Buffer * buffer, string const & format, - bool put_in_tempdir) -{ - string result_file; - return Export(buffer, format, put_in_tempdir, result_file); -} - - -bool Exporter::preview(Buffer * buffer, string const & format) -{ - string result_file; - if (!Export(buffer, format, true, result_file)) - return false; - return formats.view(*buffer, FileName(result_file), 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 (theConverters().isReachable(*it, format)) - return true; - return false; -} - - -vector const -Exporter::getExportableFormats(Buffer const & buffer, bool only_viewable) -{ - vector backends = Backends(buffer); - vector result = - theConverters().getReachable(backends[0], only_viewable, true); - for (vector::const_iterator it = backends.begin() + 1; - it != backends.end(); ++it) { - vector r = - theConverters().getReachable(*it, only_viewable, false); - result.insert(result.end(), r.begin(), r.end()); - } - return result; -} - -ExportedFile::ExportedFile(FileName const & s, string const & e) : - sourceName(s), exportName(e) {} +ExportedFile::ExportedFile(FileName const & s, string const & e) + : sourceName(s), exportName(e) +{} bool operator==(ExportedFile const & f1, ExportedFile const & f2) @@ -325,7 +122,7 @@ void ExportData::addExternalFile(string const & format, { // 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]; + vector & files = externalfiles_[format]; ExportedFile file(sourceName, exportName); if (find(files.begin(), files.end(), file) == files.end()) files.push_back(file); @@ -335,15 +132,15 @@ void ExportData::addExternalFile(string const & format, void ExportData::addExternalFile(string const & format, FileName const & sourceName) { - addExternalFile(format, sourceName, onlyFilename(sourceName.absFilename())); + addExternalFile(format, sourceName, onlyFileName(sourceName.absFileName())); } vector const ExportData::externalFiles(string const & format) const { - FileMap::const_iterator cit = externalfiles.find(format); - if (cit != externalfiles.end()) + FileMap::const_iterator cit = externalfiles_.find(format); + if (cit != externalfiles_.end()) return cit->second; return vector(); }