]> git.lyx.org Git - lyx.git/blobdiff - src/insets/ExternalSupport.cpp
Enable InsetQuote in verbatim and Hebrew
[lyx.git] / src / insets / ExternalSupport.cpp
index 79d98712bd279983ef22aa8b706bda79d8c82868..37c382a37f64cf6b8a4636c95f3b946a9024a7a7 100644 (file)
@@ -22,6 +22,7 @@
 #include "Exporter.h"
 #include "Format.h"
 #include "Mover.h"
+#include "texstream.h"
 
 #include "frontends/alert.h"
 
@@ -83,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);
@@ -160,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(\"")) {
@@ -185,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;
@@ -235,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
 
@@ -245,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();
 
@@ -296,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?
@@ -331,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"))
@@ -359,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 {
@@ -406,7 +435,7 @@ string const substituteIt<TransformCommand>(string const & input,
        else if (id == Resize)
                ptr = store.getCommandTransformer(params.resizedata);
 
-       if (!ptr.get())
+       if (!ptr)
                return input;
 
        string result =
@@ -445,7 +474,7 @@ string const substituteIt<TransformOption>(string const & input,
                break;
        }
 
-       if (!ptr.get())
+       if (!ptr)
                return input;
 
        return subst(input, ptr->placeholder(), ptr->option());