X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FExternalSupport.cpp;h=37c382a37f64cf6b8a4636c95f3b946a9024a7a7;hb=83074c431c97f5447ddbfd8394c97c1118c93693;hp=075313667e8ed1c1d12604d8b1950b981a4801ad;hpb=7c392af6eab5e06a4836146859cbd9f2c3764420;p=lyx.git diff --git a/src/insets/ExternalSupport.cpp b/src/insets/ExternalSupport.cpp index 075313667e..37c382a37f 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" @@ -30,7 +31,6 @@ #include "support/gettext.h" #include "support/lstrings.h" #include "support/lyxalgo.h" -#include "support/lyxlib.h" #include "support/os.h" #include "support/Package.h" @@ -51,8 +51,8 @@ Template const * getTemplatePtr(InsetExternalParams const & params) void editExternal(InsetExternalParams const & params, Buffer const & buffer) { - formats.edit(buffer, params.filename, - formats.getFormatFromFile(params.filename)); + formats.edit(buffer, params.filename, + formats.getFormatFromFile(params.filename)); } @@ -84,18 +84,32 @@ 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 = formats.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() : buffer.filePath(); string const filename = external_in_tmpdir ? - params.filename.mangledFilename() : - params.filename.outputFilename(parentpath); + params.filename.mangledFileName() : + params.filename.outputFileName(parentpath); string const basename = changeExtension( - onlyFilename(filename), string()); - string const absname = makeAbsPath(filename, parentpath).absFilename(); + 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); @@ -131,7 +145,7 @@ string const doSubstitution(InsetExternalParams const & params, relToParentPath, use_latex_path, PROTECT_EXTENSION, ESCAPE_DOTS); - if (absolutePath(filename)) { + if (FileName::isAbsolute(filename)) { result = subst_path(result, "$$AbsOrRelPathMaster", abspath, use_latex_path, PROTECT_EXTENSION, @@ -161,9 +175,9 @@ string const doSubstitution(InsetExternalParams const & params, PROTECT_EXTENSION, ESCAPE_DOTS); result = subst_path(result, "$$Extension", '.' + getExtension(filename), use_latex_path); - result = subst_path(result, "$$Tempname", params.tempname().absFilename(), use_latex_path); + result = subst_path(result, "$$Tempname", params.tempname().absFileName(), use_latex_path); result = subst_path(result, "$$Sysdir", - package().system_support().absFilename(), use_latex_path); + package().system_support().absFileName(), use_latex_path); // Handle the $$Contents(filename) syntax if (contains(result, "$$Contents(\"")) { @@ -186,7 +200,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; @@ -236,7 +250,8 @@ void updateExternal(InsetExternalParams const & params, 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 @@ -246,10 +261,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(), + 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(); @@ -297,14 +313,17 @@ void updateExternal(InsetExternalParams const & params, ALL_BUT_PATHS); // if file is a relative name, it is interpreted // relative to the master document. - exportdata.addExternalFile(rit->first, source, file); + if (makeAbsPath(file, masterBuffer->filePath()) != + params.filename.absFileName()) + exportdata.addExternalFile(rit->first, source, file); } } } // 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) + // 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? @@ -332,23 +351,23 @@ string const substituteOptions(InsetExternalParams const & params, } // namespace anon -int writeExternal(InsetExternalParams const & params, - string const & format, - Buffer const & buffer, odocstream & os, - ExportData & exportdata, - bool external_in_tmpdir, - bool dryrun) +void 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; 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; } if (!dryrun || contains(cit->second.product, "$$Contents")) @@ -360,20 +379,29 @@ int writeExternal(InsetExternalParams const & params, use_latex_path, external_in_tmpdir); string const absname = makeAbsPath( - params.filename.outputFilename(buffer.filePath()), buffer.filePath()).absFilename(); - - if (!external_in_tmpdir && !isValidLaTeXFilename(absname)) { - lyx::frontend::Alert::warning(_("Invalid filename"), - _("The following filename is likely to cause trouble " - "when running the exported file through LaTeX: ") + - from_utf8(absname)); + params.filename.outputFileName(buffer.filePath()), buffer.filePath()).absFileName(); + + 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)); + } + 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); + } } str = substituteCommands(params, str, format); str = substituteOptions(params, str, format); // FIXME UNICODE os << from_utf8(str); - return int(count(str.begin(), str.end(),'\n')); + return; } namespace { @@ -407,7 +435,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 = @@ -446,7 +474,7 @@ string const substituteIt(string const & input, break; } - if (!ptr.get()) + if (!ptr) return input; return subst(input, ptr->placeholder(), ptr->option());