]> git.lyx.org Git - lyx.git/blobdiff - src/insets/ExternalSupport.cpp
Fix text direction issue for InsetInfo in RTL context
[lyx.git] / src / insets / ExternalSupport.cpp
index b5afc0c1d913294b8c24fb9dbf274bafb1e9ffe6..3d7936abc77f68b22adc4b2f2e9a3ceb26d40f9c 100644 (file)
@@ -22,6 +22,7 @@
 #include "Exporter.h"
 #include "Format.h"
 #include "Mover.h"
+#include "texstream.h"
 
 #include "frontends/alert.h"
 
@@ -50,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));
+       theFormats().edit(buffer, params.filename,
+               theFormats().getFormatFromFile(params.filename));
 }
 
 
@@ -74,7 +75,7 @@ string const subst_path(string const & input,
        return subst(input, placeholder, path2);
 }
 
-} // namespace anon
+} // namespace
 
 
 string const doSubstitution(InsetExternalParams const & params,
@@ -88,7 +89,7 @@ string const doSubstitution(InsetExternalParams const & params,
                // 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);
+               string format = theFormats().getFormatFromFile(params.filename);
                if (format == "jpg")
                        result = subst(result, "$$pngOrjpg", "jpg");
                else
@@ -199,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;
@@ -212,7 +213,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,
@@ -221,38 +222,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 = 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
@@ -260,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(),
                                     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();
 
@@ -272,7 +274,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;
                        }
                }
        }
@@ -320,22 +322,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;
 }
 
 
@@ -345,10 +353,10 @@ string const substituteCommands(InsetExternalParams const & params,
 string const substituteOptions(InsetExternalParams const & params,
                               string const & input, string const & format);
 
-} // namespace anon
+} // namespace
 
 
-void writeExternal(InsetExternalParams const & params,
+RetVal writeExternal(InsetExternalParams const & params,
                   string const & format,
                   Buffer const & buffer, otexstream & os,
                   ExportData & exportdata,
@@ -357,19 +365,23 @@ void writeExternal(InsetExternalParams const & params,
 {
        Template const * const et_ptr = getTemplatePtr(params);
        if (!et_ptr)
-               return;
+               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;
+               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,
@@ -381,16 +393,16 @@ void 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);
                }
        }
 
@@ -398,7 +410,7 @@ void writeExternal(InsetExternalParams const & params,
        str = substituteOptions(params, str, format);
        // FIXME UNICODE
        os << from_utf8(str);
-       return;
+       return SUCCESS;
 }
 
 namespace {
@@ -432,7 +444,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 =
@@ -471,7 +483,7 @@ string const substituteIt<TransformOption>(string const & input,
                break;
        }
 
-       if (!ptr.get())
+       if (!ptr)
                return input;
 
        return subst(input, ptr->placeholder(), ptr->option());
@@ -550,7 +562,7 @@ string const substituteOptions(InsetExternalParams const & params,
        return output;
 }
 
-} // namespace anon
+} // namespace
 
 } // namespace external