X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FExternalSupport.cpp;h=33c14d38be935a6a0b957346bd8e320faaf49e24;hb=8124e6c02ea1fd6779bb6c47ffe2bca2c8bd2d97;hp=d21c3d84abc4ac0f3832da2e10258acc45a851a5;hpb=0838992dcd5a120d2b422ec734ebd52b0fdd3c7c;p=lyx.git diff --git a/src/insets/ExternalSupport.cpp b/src/insets/ExternalSupport.cpp index d21c3d84ab..33c14d38be 100644 --- a/src/insets/ExternalSupport.cpp +++ b/src/insets/ExternalSupport.cpp @@ -22,6 +22,7 @@ #include "Exporter.h" #include "Format.h" #include "Mover.h" +#include "texstream.h" #include "frontends/alert.h" @@ -29,7 +30,6 @@ #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" -#include "support/lyxalgo.h" #include "support/os.h" #include "support/Package.h" @@ -50,8 +50,8 @@ Template const * getTemplatePtr(InsetExternalParams const & params) void editExternal(InsetExternalParams const & params, Buffer const & buffer) { - formats.edit(buffer, params.filename, - formats.getFormatFromFile(params.filename)); + theFormats().edit(buffer, params.filename, + theFormats().getFormatFromFile(params.filename)); } @@ -74,7 +74,7 @@ string const subst_path(string const & input, return subst(input, placeholder, path2); } -} // namespace anon +} // namespace string const doSubstitution(InsetExternalParams const & params, @@ -83,6 +83,21 @@ string const doSubstitution(InsetExternalParams const & params, bool external_in_tmpdir, Substitute what) { + string result = s; + if (what != PATHS && contains(result, "$$pngOrjpg")) { + // This is for raster images and pdflatex: + // Since pdflatex supports both jpg and png, we choose the best format: + // jpg if the original file is jpg to retain the compression, else png. + string format = theFormats().getFormatFromFile(params.filename); + if (format == "jpg") + result = subst(result, "$$pngOrjpg", "jpg"); + else + result = subst(result, "$$pngOrjpg", "png"); + } + + if (what == FORMATS) + return result; + Buffer const * masterBuffer = buffer.masterBuffer(); string const parentpath = external_in_tmpdir ? masterBuffer->temppath() : @@ -94,7 +109,6 @@ string const doSubstitution(InsetExternalParams const & params, onlyFileName(filename), string()); string const absname = makeAbsPath(filename, parentpath).absFileName(); - string result = s; if (what != ALL_BUT_PATHS) { string const filepath = onlyPath(filename); string const abspath = onlyPath(absname); @@ -185,7 +199,7 @@ string const doSubstitution(InsetExternalParams const & params, size_t const pos = result.find("$$Contents(\""); size_t const end = result.find("\")", pos); - result.replace(pos, end + 2, contents); + result.replace(pos, end + 2- pos, contents); } return result; @@ -198,7 +212,7 @@ namespace { If \p external_in_tmpdir == true, then the generated file is placed in the buffer's temporary directory. */ -void updateExternal(InsetExternalParams const & params, +RetVal updateExternal(InsetExternalParams const & params, string const & format, Buffer const & buffer, ExportData & exportdata, @@ -207,37 +221,38 @@ void updateExternal(InsetExternalParams const & params, { Template const * const et_ptr = getTemplatePtr(params); if (!et_ptr) - return; // FAILURE + return FAILURE; Template const & et = *et_ptr; if (!et.automaticProduction) - return; // NOT_NEEDED + return NOT_NEEDED; Template::Formats::const_iterator cit = et.formats.find(format); if (cit == et.formats.end()) - return; // FAILURE + return FAILURE; Template::Format const & outputFormat = cit->second; if (outputFormat.updateResult.empty()) - return; // NOT_NEEDED + return NOT_NEEDED; string from_format = et.inputFormat; if (from_format.empty()) - return; // NOT_NEEDED + return NOT_NEEDED; if (from_format == "*") { if (params.filename.empty()) - return; // NOT_NEEDED + return NOT_NEEDED; // Try and ascertain the file format from its contents. - from_format = formats.getFormatFromFile(params.filename); + from_format = theFormats().getFormatFromFile(params.filename); if (from_format.empty()) - return; // FAILURE + return FAILURE; } - string const to_format = outputFormat.updateFormat; + string const to_format = doSubstitution(params, buffer, + outputFormat.updateFormat, false, external_in_tmpdir, FORMATS); if (to_format.empty()) - return; // NOT_NEEDED + return NOT_NEEDED; // The master buffer. This is useful when there are multiple levels // of include files @@ -245,10 +260,11 @@ void updateExternal(InsetExternalParams const & params, // We copy the source file to the temp dir and do the conversion // there if necessary + bool const isDir = params.filename.isDirectory(); FileName const temp_file( makeAbsPath(params.filename.mangledFileName(), masterBuffer->temppath())); - if (!params.filename.empty() && !params.filename.isDirectory()) { + if (!params.filename.empty() && !isDir) { unsigned long const from_checksum = params.filename.checksum(); unsigned long const temp_checksum = temp_file.checksum(); @@ -257,7 +273,7 @@ void updateExternal(InsetExternalParams const & params, if (!mover.copy(params.filename, temp_file)) { LYXERR(Debug::EXTERNAL, "external::updateExternal. " << "Unable to copy " << params.filename << " to " << temp_file); - return; // FAILURE + return FAILURE; } } } @@ -305,22 +321,28 @@ void updateExternal(InsetExternalParams const & params, // Do we need to perform the conversion? // Yes if to_file does not exist or if from_file is newer than to_file - if (compare_timestamps(temp_file, abs_to_file) < 0) - return; // SUCCESS + // or if from_file is a directory (bug 9925) + if (!isDir && compare_timestamps(temp_file, abs_to_file) < 0) + return SUCCESS; // FIXME (Abdel 12/08/06): Is there a need to show these errors? ErrorList el; - bool const success = + Converters::RetVal const success = theConverters().convert(&buffer, temp_file, abs_to_file, params.filename, from_format, to_format, el, Converters::try_default | Converters::try_cache); - - if (!success) { + switch (success) { + case Converters::SUCCESS: + return SUCCESS; + case Converters::FAILURE: LYXERR(Debug::EXTERNAL, "external::updateExternal. " << "Unable to convert from " << from_format << " to " << to_format); + return FAILURE; + case Converters::KILLED: + return KILLED; } - - // return success + // squash warning + return SUCCESS; } @@ -330,31 +352,35 @@ string const substituteCommands(InsetExternalParams const & params, string const substituteOptions(InsetExternalParams const & params, string const & input, string const & format); -} // namespace anon +} // namespace -int writeExternal(InsetExternalParams const & params, - string const & format, - Buffer const & buffer, odocstream & os, - ExportData & exportdata, - bool external_in_tmpdir, - bool dryrun) +RetVal writeExternal(InsetExternalParams const & params, + string const & format, + Buffer const & buffer, otexstream & os, + ExportData & exportdata, + bool external_in_tmpdir, + bool dryrun) { Template const * const et_ptr = getTemplatePtr(params); if (!et_ptr) - return 0; + return FAILURE; Template const & et = *et_ptr; Template::Formats::const_iterator cit = et.formats.find(format); if (cit == et.formats.end()) { LYXERR(Debug::EXTERNAL, "External template format '" << format << "' not specified in template " << params.templatename()); - return 0; + return FAILURE; } - if (!dryrun || contains(cit->second.product, "$$Contents")) - updateExternal(params, format, buffer, exportdata, - external_in_tmpdir, dryrun); + if (!dryrun || contains(cit->second.product, "$$Contents")) { + RetVal const success = + updateExternal(params, format, buffer, exportdata, + external_in_tmpdir, dryrun); + if (success == FAILURE || success == KILLED) + return success; + } bool const use_latex_path = format == "LaTeX"; string str = doSubstitution(params, buffer, cit->second.product, @@ -366,35 +392,24 @@ int writeExternal(InsetExternalParams const & params, if (!dryrun && !external_in_tmpdir) { if (!isValidLaTeXFileName(absname)) { lyx::frontend::Alert::warning(_("Invalid filename"), - _("The following filename will cause troubles " - "when running the exported file through LaTeX: ") + - from_utf8(absname)); + _("The following filename will cause troubles " + "when running the exported file through LaTeX: ") + + from_utf8(absname)); } if (!isValidDVIFileName(absname)) { lyx::frontend::Alert::warning(_("Problematic filename for DVI"), - _("The following filename can cause troubles " - "when running the exported file through LaTeX " - "and opening the resulting DVI: ") + - from_utf8(absname), true); + _("The following filename can cause troubles " + "when running the exported file through LaTeX " + "and opening the resulting DVI: ") + + from_utf8(absname), true); } } str = substituteCommands(params, str, format); str = substituteOptions(params, str, format); - // If the template is a date, we must remove the newline at the end to - // avoid LaTeX errors like the one described in bug #4398 - if (params.templatename() == "Date") { - // depending on the OS we have either \r\n or only \n - size_t pos = str.rfind('\r'); - if (pos != string::npos) - str.erase(pos); - pos = str.rfind('\n'); - if (pos != string::npos) - str.erase(pos); - } // FIXME UNICODE os << from_utf8(str); - return int(count(str.begin(), str.end(),'\n')); + return SUCCESS; } namespace { @@ -428,7 +443,7 @@ string const substituteIt(string const & input, else if (id == Resize) ptr = store.getCommandTransformer(params.resizedata); - if (!ptr.get()) + if (!ptr) return input; string result = @@ -465,9 +480,11 @@ string const substituteIt(string const & input, case Resize: ptr = store.getOptionTransformer(params.resizedata); break; + case None: + break; } - if (!ptr.get()) + if (!ptr) return input; return subst(input, ptr->placeholder(), ptr->option()); @@ -546,7 +563,7 @@ string const substituteOptions(InsetExternalParams const & params, return output; } -} // namespace anon +} // namespace } // namespace external