]> git.lyx.org Git - lyx.git/blobdiff - src/Format.cpp
Merge branch 'master' of git.lyx.org:lyx
[lyx.git] / src / Format.cpp
index 4b6e134941d012cec2b4e09b4c05266fb0edfdfe..485715b6e3b23911d622c31897856467f748bd0e 100644 (file)
@@ -23,7 +23,7 @@
 #include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/os.h"
-#include "support/Path.h"
+#include "support/PathChanger.h"
 #include "support/Systemcall.h"
 #include "support/textutils.h"
 #include "support/Translator.h"
@@ -59,7 +59,8 @@ string const token_socket_format("$$a");
 class FormatNamesEqual : public unary_function<Format, bool> {
 public:
        FormatNamesEqual(string const & name)
-               : name_(name) {}
+               : name_(name)
+       {}
        bool operator()(Format const & f) const
        {
                return f.name() == name_;
@@ -72,7 +73,8 @@ private:
 class FormatExtensionsEqual : public unary_function<Format, bool> {
 public:
        FormatExtensionsEqual(string const & extension)
-               : extension_(extension) {}
+               : extension_(extension)
+       {}
        bool operator()(Format const & f) const
        {
                return f.hasExtension(extension_);
@@ -85,7 +87,8 @@ private:
 class FormatMimeEqual : public unary_function<Format, bool> {
 public:
        FormatMimeEqual(string const & mime)
-               : mime_(mime) {}
+               : mime_(mime)
+       {}
        bool operator()(Format const & f) const
        {
                // The test for empty mime strings is needed since we allow
@@ -100,7 +103,8 @@ private:
 class FormatPrettyNameEqual : public unary_function<Format, bool> {
 public:
        FormatPrettyNameEqual(string const & prettyname)
-               : prettyname_(prettyname) {}
+               : prettyname_(prettyname)
+       {}
        bool operator()(Format const & f) const
        {
                return f.prettyname() == prettyname_;
@@ -111,6 +115,10 @@ private:
 
 } //namespace anon
 
+bool Format::formatSorter(Format const * lhs, Format const * rhs)
+{
+       return _(lhs->prettyname()) < _(rhs->prettyname());
+}
 
 bool operator<(Format const & a, Format const & b)
 {
@@ -245,12 +253,11 @@ string guessFormatFromContents(FileName const & fn)
        string str;
        string format;
        bool firstLine = true;
+       bool backslash = false;
+       int dollars = 0;
        while ((count++ < max_count) && format.empty()) {
-               if (ifs.eof()) {
-                       LYXERR(Debug::GRAPHICS, "filetools(getFormatFromContents)\n"
-                               << "\tFile type not recognised before EOF!");
+               if (ifs.eof())
                        break;
-               }
 
                getline(ifs, str);
                string const stamp = str.substr(0, 2);
@@ -332,7 +339,8 @@ string guessFormatFromContents(FileName const & fn)
                        format = "jpg";
 
                else if (contains(str, "%PDF"))
-                       format = "pdf";
+                       // autodetect pdf format for graphics inclusion
+                       format = "pdf6";
 
                else if (contains(str, "PNG"))
                        format = "png";
@@ -354,9 +362,32 @@ string guessFormatFromContents(FileName const & fn)
 
                else if (contains(str, "BITPIX"))
                        format = "fits";
+
+               else if (contains(str, "\\documentclass") ||
+                        contains(str, "\\chapter") ||
+                        contains(str, "\\section") ||
+                        contains(str, "\\begin") ||
+                        contains(str, "\\end") ||
+                        contains(str, "$$") ||
+                        contains(str, "\\[") ||
+                        contains(str, "\\]"))
+                       format = "latex";
+               else {
+                       if (contains(str, '\\'))
+                               backslash = true;
+                       dollars += count_char(str, '$');
+               }
        }
 
-       if (!format.empty()) {
+       if (format.empty() && backslash && dollars > 1)
+               // inline equation
+               format = "latex";
+
+       if (format.empty()) {
+               if (ifs.eof())
+                       LYXERR(Debug::GRAPHICS, "filetools(getFormatFromContents)\n"
+                              "\tFile type not recognised before EOF!");
+       } else {
                LYXERR(Debug::GRAPHICS, "Recognised Fileformat: " << format);
                return format;
        }
@@ -388,7 +419,7 @@ string Formats::getFormatFromFile(FileName const & filename) const
                                        filename.toFilesystemEncoding().c_str());
                                mime = token(mime, ';', 0);
                                // we need our own ps/eps detection
-                               if (mime != "application/postscript") {
+                               if ((mime != "application/postscript") && (mime != "text/plain")) {
                                        Formats::const_iterator cit =
                                                find_if(formatlist.begin(), formatlist.end(),
                                                        FormatMimeEqual(mime));
@@ -476,7 +507,7 @@ bool Formats::isZippedFile(support::FileName const & filename) const {
                return it->second.zipped;
        string const & format = getFormatFromFile(filename);
        bool zipped = (format == "gzip" || format == "zip");
-       zipped_.insert(pair<string, ZippedInfo>(fname, ZippedInfo(zipped, timestamp)));
+       zipped_.insert(make_pair(fname, ZippedInfo(zipped, timestamp)));
        return zipped;
 }
 
@@ -677,7 +708,7 @@ bool Formats::edit(Buffer const & buffer, FileName const & filename,
 
        // LinkBack files look like PDF, but have the .linkback extension
        string const ext = getExtension(filename.absFileName());
-       if (format_name == "pdf" && ext == "linkback") {
+       if (format_name == "pdf6" && ext == "linkback") {
 #ifdef USE_MACOSX_PACKAGING
                return editLinkBackFile(filename.absFileName().c_str());
 #else
@@ -763,8 +794,10 @@ string const Formats::extensions(string const & name) const
 
 
 namespace {
+
 typedef Translator<OutputParams::FLAVOR, string> FlavorTranslator;
 
+
 FlavorTranslator initFlavorTranslator()
 {
        FlavorTranslator f(OutputParams::LATEX, "latex");
@@ -784,6 +817,7 @@ FlavorTranslator const & flavorTranslator()
        static FlavorTranslator translator = initFlavorTranslator();
        return translator;
 }
+
 }