From f4eae12d60af89eb9f4d6840578075a69215ab28 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Fri, 12 Apr 2013 22:31:48 +0200 Subject: [PATCH] Improve LaTeX format detection libmime is a bit lacking here. --- src/Format.cpp | 32 +++++++++++++++++++++++++++----- src/support/lstrings.cpp | 12 ++++++++++++ src/support/lstrings.h | 3 +++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/Format.cpp b/src/Format.cpp index 8e31a1e96b..485715b6e3 100644 --- a/src/Format.cpp +++ b/src/Format.cpp @@ -253,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); @@ -363,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; } diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp index 651dbc1e1d..339318989f 100644 --- a/src/support/lstrings.cpp +++ b/src/support/lstrings.cpp @@ -882,6 +882,18 @@ docstring const subst(docstring const & a, } +int count_char(string const & str, char chr) +{ + int count = 0; + string::const_iterator lit = str.begin(); + string::const_iterator end = str.end(); + for (; lit != end; ++lit) + if ((*lit) == chr) + count++; + return count; +} + + /// Count all occurences of char \a chr inside \a str int count_char(docstring const & str, docstring::value_type chr) { diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 4845bc6120..2606546fa0 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -188,6 +188,9 @@ std::string const subst(std::string const & a, docstring const subst(docstring const & a, docstring const & oldstr, docstring const & newstr); +/// Count all occurences of char \a chr inside \a str +int count_char(std::string const & str, char chr); + /// Count all occurences of char \a chr inside \a str int count_char(docstring const & str, docstring::value_type chr);