]> git.lyx.org Git - lyx.git/blobdiff - src/Format.cpp
Revert "Objective-C compililation support with cmake and C++11"
[lyx.git] / src / Format.cpp
index 3364f7b9df0a1d1d7a3fb5e3172af90d07ae70bb..c9e1381992ffd80cb232ad7b179d5bea7910a232 100644 (file)
@@ -100,21 +100,12 @@ private:
 };
 
 
-class FormatPrettyNameEqual : public unary_function<Format, bool> {
-public:
-       FormatPrettyNameEqual(string const & prettyname)
-               : prettyname_(prettyname)
-       {}
-       bool operator()(Format const & f) const
-       {
-               return f.prettyname() == prettyname_;
-       }
-private:
-       string prettyname_;
-};
-
 } //namespace anon
 
+bool Format::formatSorter(Format const * lhs, Format const * rhs)
+{
+       return _(lhs->prettyname()) < _(rhs->prettyname());
+}
 
 bool operator<(Format const & a, Format const & b)
 {
@@ -202,7 +193,7 @@ string guessFormatFromContents(FileName const & fn)
        // FIG  #FIG...
        // FITS ...BITPIX...
        // GIF  GIF...
-       // JPG  JFIF
+       // JPG  \377\330...     (0xFFD8)
        // PDF  %PDF-...
        // PNG  .PNG...
        // PBM  P1... or P4     (B/W)
@@ -249,12 +240,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);
@@ -277,6 +267,9 @@ string guessFormatFromContents(FileName const & fn)
                        } else if (stamp == "BM") {
                                format =  "bmp";
 
+                       } else if (stamp == "\377\330") {
+                               format =  "jpg";
+
                        } else if (stamp == "\001\332") {
                                format =  "sgi";
 
@@ -332,11 +325,9 @@ string guessFormatFromContents(FileName const & fn)
                else if (contains(str, "Grace"))
                        format = "agr";
 
-               else if (contains(str, "JFIF"))
-                       format = "jpg";
-
                else if (contains(str, "%PDF"))
-                       format = "pdf";
+                       // autodetect pdf format for graphics inclusion
+                       format = "pdf6";
 
                else if (contains(str, "PNG"))
                        format = "png";
@@ -358,9 +349,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,11 +402,19 @@ string Formats::getFormatFromFile(FileName const & filename) const
                                        << "\tCouldn't load magic database - "
                                        << magic_error(magic_cookie));
                        } else {
-                               string mime = magic_file(magic_cookie,
+                               char const * result = magic_file(magic_cookie,
                                        filename.toFilesystemEncoding().c_str());
-                               mime = token(mime, ';', 0);
+                               string mime;
+                               if (result)
+                                       mime = token(result, ';', 0);
+                               else {
+                                       LYXERR(Debug::GRAPHICS, "Formats::getFormatFromFile\n"
+                                               << "\tCouldn't query magic database - "
+                                               << magic_error(magic_cookie));
+                               }
                                // we need our own ps/eps detection
-                               if ((mime != "application/postscript") && (mime != "text/plain")) {
+                               if (!mime.empty() && mime != "application/postscript" &&
+                                   mime != "text/plain") {
                                        Formats::const_iterator cit =
                                                find_if(formatlist.begin(), formatlist.end(),
                                                        FormatMimeEqual(mime));
@@ -446,19 +468,6 @@ string Formats::getFormatFromExtension(string const & ext) const
 }
 
 
-string Formats::getFormatFromPrettyName(string const & prettyname) const
-{
-       if (!prettyname.empty()) {
-               Formats::const_iterator cit =
-                       find_if(formatlist.begin(), formatlist.end(),
-                               FormatPrettyNameEqual(prettyname));
-               if (cit != formats.end())
-                       return cit->name();
-       }
-       return string();
-}
-
-
 /// Used to store last timestamp of file and whether it is (was) zipped
 struct ZippedInfo {
        bool zipped;
@@ -468,6 +477,7 @@ struct ZippedInfo {
 };
 
 
+// FIXME THREAD
 /// Mapping absolute pathnames of files to their ZippedInfo metadata.
 static std::map<std::string, ZippedInfo> zipped_;
 
@@ -681,7 +691,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
@@ -787,7 +797,7 @@ FlavorTranslator initFlavorTranslator()
 
 FlavorTranslator const & flavorTranslator()
 {
-       static FlavorTranslator translator = initFlavorTranslator();
+       static FlavorTranslator const translator = initFlavorTranslator();
        return translator;
 }