X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FFormat.cpp;h=a6727a2d8128a8c67e670912ad559b0d66b901f8;hb=c57d04908f9746a3923c36c0f41e1e23c6043550;hp=3b3a10da527d713dfb792a1a5d3fa133536b4a51;hpb=6cffd468e0b6421643007dc9086bc499c6d7cdad;p=lyx.git diff --git a/src/Format.cpp b/src/Format.cpp index 3b3a10da52..a6727a2d81 100644 --- a/src/Format.cpp +++ b/src/Format.cpp @@ -19,11 +19,12 @@ #include "frontends/alert.h" //to be removed? #include "support/debug.h" +#include "support/docstream.h" #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" +#include "support/lyxmagic.h" #include "support/mutex.h" -#include "support/docstream.h" #include "support/os.h" #include "support/PathChanger.h" #include "support/Systemcall.h" @@ -39,10 +40,6 @@ #include "support/linkback/LinkBackProxy.h" #endif -#ifdef HAVE_MAGIC_H -#include -#endif - using namespace std; using namespace lyx::support; @@ -340,6 +337,9 @@ string guessFormatFromContents(FileName const & fn) // autodetect pdf format for graphics inclusion format = "pdf6"; + else if (contains(str, " EMF")) + format = "emf"; + else if (contains(str, "PNG")) format = "png"; @@ -407,52 +407,37 @@ string Formats::getFormatFromFile(FileName const & filename) const string psformat; string format; -#ifdef HAVE_MAGIC_H if (filename.exists()) { - magic_t magic_cookie = magic_open(MAGIC_MIME); - if (magic_cookie) { - if (magic_load(magic_cookie, NULL) != 0) { - LYXERR(Debug::GRAPHICS, "Formats::getFormatFromFile\n" - << "\tCouldn't load magic database - " - << magic_error(magic_cookie)); - } else { - char const * result = magic_file(magic_cookie, - filename.toFilesystemEncoding().c_str()); - string mime; - if (result) - mime = token(result, ';', 0); - else { - LYXERR(Debug::GRAPHICS, "Formats::getFormatFromFile\n" - << "\tCouldn't query magic database - " - << magic_error(magic_cookie)); - } - // our own detection is better for binary files (can be anything) - // and different plain text formats - if (!mime.empty() && mime != "application/octet-stream" && - mime != "text/plain") { - Formats::const_iterator cit = - find_if(formatlist_.begin(), formatlist_.end(), - FormatMimeEqual(mime)); - if (cit != formatlist_.end()) { - LYXERR(Debug::GRAPHICS, "\tgot format from MIME type: " - << mime << " -> " << cit->name()); - // See special eps/ps handling below - if (mime == "application/postscript") - psformat = cit->name(); - else - format = cit->name(); - } - } + // one instance of Magic that will be reused for next calls + // This avoids to read the magic file everytime + // If libmagic is not available, Magic::file returns an empty string. + static Magic magic; + string const result = magic.file(filename.toFilesystemEncoding()); + string const mime = token(result, ';', 0); + // our own detection is better for binary files (can be anything) + // and different plain text formats + if (!mime.empty() && mime != "application/octet-stream" && + mime != "text/plain") { + Formats::const_iterator cit = + find_if(formatlist_.begin(), formatlist_.end(), + FormatMimeEqual(mime)); + if (cit != formatlist_.end()) { + LYXERR(Debug::GRAPHICS, "\tgot format from MIME type: " + << mime << " -> " << cit->name()); + // See special eps/ps handling below + if (mime == "application/postscript") + psformat = cit->name(); + else + format = cit->name(); } - magic_close(magic_cookie); - // libmagic recognizes as latex also some formats of ours - // such as pstex and pdftex. Therefore we have to perform - // additional checks in this case (bug 9244). - if (!format.empty() && format != "latex") - return format; } + + // libmagic recognizes as latex also some formats of ours + // such as pstex and pdftex. Therefore we have to perform + // additional checks in this case (bug 9244). + if (!format.empty() && format != "latex") + return format; } -#endif string const ext = getExtension(filename.absFileName()); if (format.empty()) { @@ -697,6 +682,28 @@ bool Formats::view(Buffer const & buffer, FileName const & filename, string command = format->viewer(); + // Escape backslashes if not already in double or single quotes. + // We cannot simply quote the whole command as there may be arguments. + if (contains(command, '\\')) { + bool inquote1 = false; + bool inquote2 = false; + string::iterator cit = command.begin(); + for (; cit != command.end(); ++cit) { + switch (*cit) { + case '"': + inquote1 = !inquote1; + break; + case '\'': + inquote2 = !inquote2; + break; + case '\\': + if (!inquote1 && !inquote2) + cit = ++command.insert(cit, '\\'); + break; + } + } + } + if (format_name == "dvi" && !lyxrc.view_dvi_paper_option.empty()) { string paper_size = buffer.params().paperSizeName(BufferParams::XDVI);