X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FFormat.cpp;h=485715b6e3b23911d622c31897856467f748bd0e;hb=26910d5ec49395d1372dd5b9259f1bf6ed23de0a;hp=c20ac9ed43fbb7896aae91156cc7e9dbee3ac7ee;hpb=de6e4a2937859d1a8375dbf24e8096c615a1a317;p=lyx.git diff --git a/src/Format.cpp b/src/Format.cpp index c20ac9ed43..485715b6e3 100644 --- a/src/Format.cpp +++ b/src/Format.cpp @@ -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 { 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 { 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 { 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 { 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; } @@ -375,32 +406,34 @@ string Formats::getFormatFromFile(FileName const & filename) const return string(); #ifdef HAVE_MAGIC_H - magic_t magic_cookie = magic_open(MAGIC_MIME); - if (magic_cookie) { - string format; - if (magic_load(magic_cookie, NULL) != 0) { - LYXERR(Debug::GRAPHICS, "Formats::getFormatFromFile\n" - << "\tCouldn't load magic database - " - << magic_error(magic_cookie)); - } else { - string mime = magic_file(magic_cookie, - filename.toFilesystemEncoding().c_str()); - mime = token(mime, ';', 0); - // we need our own ps/eps detection - if (mime != "application/postscript") { - Formats::const_iterator cit = - find_if(formatlist.begin(), formatlist.end(), - FormatMimeEqual(mime)); - if (cit != formats.end()) { - LYXERR(Debug::GRAPHICS, "\tgot format from MIME type: " - << mime << " -> " << cit->name()); - format = cit->name(); + if (filename.exists()) { + magic_t magic_cookie = magic_open(MAGIC_MIME); + if (magic_cookie) { + string format; + if (magic_load(magic_cookie, NULL) != 0) { + LYXERR(Debug::GRAPHICS, "Formats::getFormatFromFile\n" + << "\tCouldn't load magic database - " + << magic_error(magic_cookie)); + } else { + string mime = magic_file(magic_cookie, + filename.toFilesystemEncoding().c_str()); + mime = token(mime, ';', 0); + // we need our own ps/eps detection + if ((mime != "application/postscript") && (mime != "text/plain")) { + Formats::const_iterator cit = + find_if(formatlist.begin(), formatlist.end(), + FormatMimeEqual(mime)); + if (cit != formats.end()) { + LYXERR(Debug::GRAPHICS, "\tgot format from MIME type: " + << mime << " -> " << cit->name()); + format = cit->name(); + } } } + magic_close(magic_cookie); + if (!format.empty()) + return format; } - magic_close(magic_cookie); - if (!format.empty()) - return format; } #endif @@ -474,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(fname, ZippedInfo(zipped, timestamp))); + zipped_.insert(make_pair(fname, ZippedInfo(zipped, timestamp))); return zipped; } @@ -675,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 @@ -761,8 +794,10 @@ string const Formats::extensions(string const & name) const namespace { + typedef Translator FlavorTranslator; + FlavorTranslator initFlavorTranslator() { FlavorTranslator f(OutputParams::LATEX, "latex"); @@ -782,6 +817,7 @@ FlavorTranslator const & flavorTranslator() static FlavorTranslator translator = initFlavorTranslator(); return translator; } + }