Some time ago we talked about the misdetection of zipped files. The
misdetection does not happen anymore, but the formats in question (.odg,
.dia etc.) are not really detected (the fallback "format name" ==
"extension" is used). To improve file format detection, an external library
should be used instead of the home grown code in LyX. This is done by the
attached path. The basic idea is to identify a file format by its mime type,
as used by freedekstop.org: http://freedesktop.org/wiki/Software/shared-
mime-info. Therefore, a LyX format specification needs an additional mime
entry.
Of course libmagic is not perfect, but by using the mime type as identifier
the underlying detection can easily be changed (e.g. to
http://cgit.freedesktop.org/xdg/xdgmime/). As a side effect, the patch also
removes the backward compatibilty code for the formats line in lyxrc, since
that is now handled by prefs2prefs (and the syntax is actually checked).
Open issues: I did not write cmake detection code, and I do not know whether
it is possible/how easy it is to build libmagic on windows.
OK to go in?
Georg
Index: src/graphics/epstools.cpp
===================================================================
--- src/graphics/epstools.cpp (revision 40779)
+++ src/graphics/epstools.cpp (working copy)
@@ -46,11 +46,11 @@ string const readBB_from_PSFile(FileName
// end of the file. Than we have in the header:
// %%BoundingBox: (atend)
// In this case we must check the end.
- bool zipped = file.isZippedFile();
+ bool const zipped = formats.isZippedFile(file);
FileName const file_ = zipped ? unzipFile(file) : file;
- string const format = file_.guessFormatFromContents();
+ string const format = formats.getFormatFromFile(file_);
- if (format != "eps" && format != "ps") {
+ if (!Formats::isPostScriptFileFormat(format)) {
LYXERR(Debug::GRAPHICS, "[readBB_from_PSFile] no(e)ps-format");
if (zipped)
file_.removeFile();
Index: src/Format.h
===================================================================
--- src/Format.h (revision 40779)
+++ src/Format.h (working copy)
@@ -43,7 +43,7 @@ public:
///
Format(std::string const & n, std::string const & e, std::string const & p,
std::string const & s, std::string const & v, std::string const & ed,
- int);
+ std::string const & m, int);
///
bool dummy() const;
/// Is \p ext a valid filename extension for this format?
@@ -83,6 +83,10 @@ public:
///
void setEditor(std::string const & v) { editor_ = v; }
///
+ std::string const & mime() const { return mime_; }
+ ///
+ void setMime(std::string const & m) { mime_ = m; }
+ ///
bool documentFormat() const { return flags_ & document; }
///
bool vectorFormat() const { return flags_ & vector; }
@@ -111,6 +115,14 @@ private:
std::string viewer_;
/// Editor for this format. \sa viewer_.
std::string editor_;
+ /*!
+ * Full MIME type, e.g. "text/x-tex".
+ * Only types listed by the shared MIME database of freedekstop.org
+ * should be added.
+ * This field may be empty, but it must be unique across all formats
+ * if it is set.
+ */
+ std::string mime_;
///
int flags_;
};
@@ -148,6 +160,10 @@ public:
** @note For natively zipped formats, such as dia/odg, this returns false.
**/
bool isZippedFile(support::FileName const & filename) const;
+ /// check for zipped file format
+ static bool isZippedFileFormat(std::string const & format);
+ /// check for PostScript file format
+ static bool isPostScriptFileFormat(std::string const & format);
/// Set editor and/or viewer to "auto" for formats that can be
/// opened by the OS.
void setAutoOpen();
@@ -159,7 +175,7 @@ public:
void add(std::string const & name, std::string const & extensions,
std::string const & prettyname, std::string const & shortcut,
std::string const & viewer, std::string const & editor,
- int flags);
+ std::string const & mime, int flags);
///
void erase(std::string const & name);
///
Index: src/frontends/qt4/GuiPrefs.cpp
===================================================================
--- src/frontends/qt4/GuiPrefs.cpp (revision 40779)
+++ src/frontends/qt4/GuiPrefs.cpp (working copy)
@@ -1983,6 +1983,7 @@ void PrefFileformats::on_formatsCB_curre
formatED->setText(toqstr(f.name()));
copierED->setText(toqstr(form_->movers().command(f.name())));
extensionsED->setText(toqstr(f.extensions()));
+ mimeED->setText(toqstr(f.mime()));
shortcutED->setText(
toqstr(l10n_shortcut(f.prettyname(), f.shortcut())));
documentCB->setChecked((f.documentFormat()));
@@ -2038,6 +2039,13 @@ void PrefFileformats::on_editorED_textEd
}
+void PrefFileformats::on_mimeED_textEdited(const QString & s)
+{
+ currentFormat().setMime(fromqstr(s));
+ changed();
+}
+
+
void PrefFileformats::on_shortcutED_textEdited(const QString & s)
{
string const new_shortcut = fromqstr(s);
@@ -2195,7 +2203,7 @@ Format & PrefFileformats::currentFormat(
void PrefFileformats::on_formatNewPB_clicked()
{
- form_->formats().add("", "", "", "", "", "", Format::none);
+ form_->formats().add("", "", "", "", "", "", "", Format::none);
updateView();
formatsCB->setCurrentIndex(0);
formatsCB->setFocus(Qt::OtherFocusReason);
Index: src/frontends/qt4/ui/PrefFileformatsUi.ui
===================================================================
--- src/frontends/qt4/ui/PrefFileformatsUi.ui (revision 40779)
+++ src/frontends/qt4/ui/PrefFileformatsUi.ui (working copy)
@@ -103,6 +103,19 @@
<item row="5" column="1" colspan="2" >
<widget class="QLineEdit" name="extensionsED" />
</item>
+ <item row="6" column="0" >
+ <widget class="QLabel" name="mimeLA" >
+ <property name="text" >
+ <string>&MIME:</string>
+ </property>
+ <property name="buddy" >
+ <cstring>mimeED</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" >
+ <widget class="QLineEdit" name="mimeED" />
+ </item>
<item row="7" column="0" >
<widget class="QLabel" name="shortcutLA" >
<property name="text" >
@@ -239,6 +252,7 @@
<tabstop>editorED</tabstop>
<tabstop>viewerCO</tabstop>
<tabstop>viewerED</tabstop>
+ <tabstop>mimeED</tabstop>
<tabstop>copierED</tabstop>
</tabstops>
<includes>
Index: src/frontends/qt4/GuiPrefs.h
===================================================================
--- src/frontends/qt4/GuiPrefs.h (revision 40779)
+++ src/frontends/qt4/GuiPrefs.h (working copy)
@@ -358,6 +358,7 @@ private Q_SLOTS:
void on_extensionsED_textEdited(const QString &);
void on_viewerED_textEdited(const QString &);
void on_editorED_textEdited(const QString &);
+ void on_mimeED_textEdited(const QString &);
void on_shortcutED_textEdited(const QString &);
void on_formatED_editingFinished();
void on_formatED_textChanged(const QString &);
Index: src/support/FileName.cpp
===================================================================
--- src/support/FileName.cpp (revision 40779)
+++ src/support/FileName.cpp (working copy)
@@ -948,13 +948,6 @@ string FileName::guessFormatFromContents
}
-bool FileName::isZippedFile() const
-{
- string const type = guessFormatFromContents();
- return contains("gzip zip compress", type) && !type.empty();
-}
-
-
docstring const FileName::relPath(string const & path) const
{
// FIXME UNICODE
Index: src/support/FileName.h
===================================================================
--- src/support/FileName.h (revision 40779)
+++ src/support/FileName.h (working copy)
@@ -175,9 +175,6 @@ public:
*/
std::string guessFormatFromContents() const;
- /// check for zipped file
- bool isZippedFile() const;
-
static FileName fromFilesystemEncoding(std::string const & name);
/// (securely) create a temporary file with the given mask.
/// \p mask must be in filesystem encoding, if it contains a
Index: src/Format.cpp
===================================================================
--- src/Format.cpp (revision 40779)
+++ src/Format.cpp (working copy)
@@ -37,6 +37,10 @@
#include "support/linkback/LinkBackProxy.h"
#endif
+#ifdef HAVE_MAGIC_H
+#include <magic.h>
+#endif
+
using namespace std;
using namespace lyx::support;
@@ -78,6 +82,19 @@ private:
};
+class FormatMimeEqual : public unary_function<Format, bool> {
+public:
+ FormatMimeEqual(string const & mime)
+ : mime_(mime) {}
+ bool operator()(Format const & f) const
+ {
+ return f.mime() == mime_ && mime_ != "";
+ }
+private:
+ string mime_;
+};
+
+
class FormatPrettyNameEqual : public unary_function<Format, bool> {
public:
FormatPrettyNameEqual(string const & prettyname)
@@ -101,9 +118,9 @@ bool operator<(Format const & a, Format
Format::Format(string const & n, string const & e, string const & p,
string const & s, string const & v, string const & ed,
- int flags)
+ string const & m, int flags)
: name_(n), prettyname_(p), shortcut_(s), viewer_(v),
- editor_(ed), flags_(flags)
+ editor_(ed), mime_(m), flags_(flags)
{
extension_list_ = getVectorFromString(e, ",");
LYXERR(Debug::GRAPHICS, "New Format: n=" << n << ", flags=" << flags);
@@ -168,10 +185,39 @@ string Formats::getFormatFromFile(FileNa
if (filename.empty())
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();
+ }
+ }
+ }
+ magic_close(magic_cookie);
+ if (!format.empty())
+ return format;
+ }
+#endif
+
string const format = filename.guessFormatFromContents();
string const ext = getExtension(filename.absFileName());
- if ((format == "gzip" || format == "zip" || format == "compress")
- && !ext.empty()) {
+ if (isZippedFileFormat(format) && !ext.empty()) {
string const & fmt_name = formats.getFormatFromExtension(ext);
if (!fmt_name.empty()) {
Format const * p_format = formats.getFormat(fmt_name);
@@ -244,6 +290,17 @@ bool Formats::isZippedFile(support::File
}
+bool Formats::isZippedFileFormat(string const & format)
+{
+ return contains("gzip zip compress", format) && !format.empty();
+}
+
+
+bool Formats::isPostScriptFileFormat(string const & format)
+{
+ return format == "ps" || format == "eps";
+}
+
static string fixCommand(string const & cmd, string const & ext,
os::auto_open_mode mode)
{
@@ -291,24 +348,24 @@ void Formats::add(string const & name)
{
if (!getFormat(name))
add(name, name, name, string(), string(), string(),
- Format::document);
+ string(), Format::document);
}
void Formats::add(string const & name, string const & extensions,
string const & prettyname, string const & shortcut,
string const & viewer, string const & editor,
- int flags)
+ string const & mime, int flags)
{
FormatList::iterator it =
find_if(formatlist.begin(), formatlist.end(),
FormatNamesEqual(name));
if (it == formatlist.end())
formatlist.push_back(Format(name, extensions, prettyname,
- shortcut, viewer, editor, flags));
+ shortcut, viewer, editor, mime, flags));
else
*it = Format(name, extensions, prettyname, shortcut, viewer,
- editor, flags);
+ editor, mime, flags);
}
Index: src/LyXRC.cpp
===================================================================
--- src/LyXRC.cpp (revision 40779)
+++ src/LyXRC.cpp (working copy)
@@ -55,7 +55,7 @@ namespace os = support::os;
namespace {
-static unsigned int const LYXRC_FILEFORMAT = 6; // younes: add use_qimage option
+static unsigned int const LYXRC_FILEFORMAT = 7; // gb: add mime types
// when adding something to this array keep it sorted!
LexerKeyword lyxrcTags[] = {
@@ -1085,28 +1085,29 @@ LyXRC::ReturnValues LyXRC::read(Lexer &
break;
}
case RC_FILEFORMAT: {
+ bool ok = true;
string format, extensions, prettyname, shortcut;
- lexrc >> format >> extensions >> prettyname >> shortcut;
+ if (!(lexrc >> format >> extensions))
+ ok = false;
+ if (ok && lexrc.next(true))
+ prettyname = lexrc.getString();
+ else
+ ok = false;
+ if (ok)
+ if(!(lexrc >> shortcut))
+ ok = false;
string viewer, editor;
- if (lexrc.next(true))
+ if (ok && lexrc.next(true))
viewer = lexrc.getString();
- if (lexrc.next(true))
+ else
+ ok = false;
+ if (ok && lexrc.next(true))
editor = lexrc.getString();
- string flags;
- // Hack to ensure compatibility with versions older
- // than 1.5.0
- int le = lexrc.lex();
- if (le != Lexer::LEX_FEOF && le != Lexer::LEX_UNDEF) {
- flags = lexrc.getString();
- if (le != Lexer::LEX_DATA) {
- // We have got a known token.
- // Therefore this is an old style
- // format definition without
- // flags.
- lexrc.pushToken(flags);
- flags.erase();
- }
- }
+ else
+ ok = false;
+ string flags, mime;
+ if (!(lexrc >> flags >> mime))
+ ok = false;
int flgs = Format::none;
while (!flags.empty()) {
string flag;
@@ -1124,14 +1125,16 @@ LyXRC::ReturnValues LyXRC::read(Lexer &
<< flag << "' for format `"
<< format << "'.");
}
- if (prettyname.empty()) {
+ if (!ok)
+ LYXERR0("Syntax error in format " << format);
+ else if (prettyname.empty()) {
if (theConverters().formatIsUsed(format))
LYXERR0("Can't delete format " << format);
else
formats.erase(format);
} else {
formats.add(format, extensions, prettyname,
- shortcut, viewer, editor, flgs);
+ shortcut, viewer, editor, mime, flgs);
}
break;
}
@@ -2711,7 +2714,8 @@ void LyXRC::write(ostream & os, bool ign
format->editor() != cit->editor() ||
format->documentFormat() != cit->documentFormat() ||
format->vectorFormat() != cit->vectorFormat() ||
- format->inExportMenu() != cit->inExportMenu()) {
+ format->inExportMenu() != cit->inExportMenu() ||
+ format->mime() != cit->mime()) {
os << "\\format \"" << cit->name() << "\" \""
<< cit->extensions() << "\" \""
<< cit->prettyname() << "\" \""
@@ -2729,7 +2733,7 @@ void LyXRC::write(ostream & os, bool ign
flags.push_back("menu=export");
os << getStringFromVector(flags);
- os << "\"\n";
+ os << "\" \"" << cit->mime() << "\"\n";
}
}
@@ -2738,7 +2742,7 @@ void LyXRC::write(ostream & os, bool ign
cit != system_formats.end(); ++cit)
if (!formats.getFormat(cit->name()))
os << "\\format \"" << cit->name()
- << "\" \"\" \"\" \"\" \"\" \"\" \"\"\n";
+ << "\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"\n";
if (tag != RC_LAST)
break;
case RC_VIEWER_ALTERNATIVES: {
Index: src/Buffer.cpp
===================================================================
--- src/Buffer.cpp (revision 40779)
+++ src/Buffer.cpp (working copy)
@@ -1002,7 +1002,7 @@ Buffer::ReadStatus Buffer::readFile(File
d->file_fully_loaded = true;
d->read_only = !d->filename.isWritable();
- params().compressed = d->filename.isZippedFile();
+ params().compressed = formats.isZippedFile(d->filename);
saveCheckSum();
return ReadSuccess;
}
Index: src/Lexer.cpp
===================================================================
--- src/Lexer.cpp (revision 40779)
+++ src/Lexer.cpp (working copy)
@@ -14,6 +14,7 @@
#include <config.h>
#include "Lexer.h"
+#include "Format.h"
#include "support/convert.h"
#include "support/debug.h"
@@ -237,10 +238,14 @@ void Lexer::Pimpl::popTable()
bool Lexer::Pimpl::setFile(FileName const & filename)
{
+#ifdef TEX2LYX
+ // tex2lyx does not read lyxrc and therefore can't really check for
+ // zipped formats.
+ if (false) {
+#else
// Check the format of the file.
- string const format = filename.guessFormatFromContents();
-
- if (format == "gzip" || format == "zip" || format == "compress") {
+ if (formats.isZippedFile(filename)) {
+#endif
LYXERR(Debug::LYXLEX, "lyxlex: compressed");
// The check only outputs a debug message, because it triggers
// a bug in compaq cxx 6.2, where is_open() returns 'true' for
Index: configure.ac
===================================================================
--- configure.ac (revision 40779)
+++ configure.ac (working copy)
@@ -115,6 +115,11 @@ AC_CHECK_HEADERS(zlib.h,
[AC_CHECK_LIB(z, gzopen, [LIBS="$LIBS -lz"], LYX_LIB_ERROR(libz,zlib))],
[LYX_LIB_ERROR(zlib.h,zlib)])
+### check for file magic support
+AC_CHECK_HEADERS(magic.h,
+ [AC_CHECK_LIB(magic, magic_open, [LIBS="$LIBS -lmagic"], LYX_LIB_ERROR(libmagic,libmagic))],
+ [LYX_LIB_ERROR(magic.h,libmagic)])
+
### check which frontend we want to use
Index: lib/scripts/prefs2prefs_prefs.py
===================================================================
--- lib/scripts/prefs2prefs_prefs.py (revision 40779)
+++ lib/scripts/prefs2prefs_prefs.py (working copy)
@@ -36,13 +36,41 @@
# Add use_qimage option.
# No conversion necessary.
-import re
+# Incremented to format 7, r40515 by gb
+# Add mime type to file format
+import re
###########################################################
#
# Conversion chain
+def get_format(line):
+ entries = []
+ i = 0
+ while i < len(line):
+ if line[i] == '"':
+ beg = i + 1
+ i = i + 1
+ while i < len(line) and line[i] != '"':
+ if line[i] == '\\' and i < len(line) - 1 and line[i+1] == '"':
+ # convert \" to "
+ i = i + 1
+ i = i + 1
+ end = i
+ entries.append(line[beg:end].replace('\\"', '"'))
+ elif line[i] == '#':
+ return entries
+ elif not line[i].isspace():
+ beg = i
+ while not line[i].isspace():
+ i = i + 1
+ end = i
+ entries.append(line[beg:end])
+ i = i + 1
+ return entries
+
+
def simple_renaming(line, old, new):
i = line.lower().find(old.lower())
if i == -1:
@@ -135,6 +163,59 @@ def remove_default_papersize(line):
return no_match
return (True, "")
+def add_mime_types(line):
+ if not line.lower().startswith("\\format"):
+ return no_match
+ entries = get_format(line)
+ converted = line
+ i = len(entries)
+ while i < 7:
+ converted = converted + ' ""'
+ i = i + 1
+ formats = {'tgif':'application/x-tgif', \
+ 'fig':'application/x-xfig', \
+ 'dia':'application/x-dia-diagram', \
+ 'odg':'application/vnd.oasis.opendocument.graphics', \
+ 'svg':'image/svg+xml', \
+ 'bmp':'image/x-bmp', \
+ 'gif':'image/gif', \
+ 'jpg':'image/jpeg', \
+ 'pbm':'image/x-portable-bitmap', \
+ 'pgm':'image/x-portable-graymap', \
+ 'png':'image/x-png', \
+ 'ppm':'image/x-portable-pixmap', \
+ 'tiff':'image/tiff', \
+ 'xbm':'image/x-xbitmap', \
+ 'xpm':'image/x-xpixmap', \
+ 'docbook-xml':'application/docbook+xml', \
+ 'dot':'text/vnd.graphviz', \
+ 'ly':'text/x-lilypond', \
+ 'latex':'text/x-tex', \
+ 'text':'text/plain', \
+ 'gnumeric':'application/x-gnumeric', \
+ 'excel':'application/vnd.ms-excel', \
+ 'oocalc':'application/vnd.oasis.opendocument.spreadsheet', \
+ 'xhtml':'application/xhtml+xml', \
+ 'bib':'text/x-bibtex', \
+ 'eps':'image/x-eps', \
+ 'ps':'application/postscript', \
+ 'pdf':'application/pdf', \
+ 'dvi':'application/x-dvi', \
+ 'html':'text/html', \
+ 'odt':'application/vnd.oasis.opendocument.text', \
+ 'sxw':'application/vnd.sun.xml.writer', \
+ 'rtf':'application/rtf', \
+ 'doc':'application/msword', \
+ 'csv':'text/csv', \
+ 'lyx':'application/x-lyx', \
+ 'wmf':'image/x-wmf', \
+ 'emf':'image/x-emf'}
+ if entries[1] in formats.keys():
+ converted = converted + ' "' + formats[entries[1]] + '"'
+ else:
+ converted = converted + ' ""'
+ return (True, converted)
+
########################
@@ -152,4 +233,5 @@ conversions = [
[ 4, [ remove_default_papersize ]],
[ 5, []],
[ 6, []],
+ [ 7, [add_mime_types]],
]
Index: lib/configure.py
===================================================================
--- lib/configure.py (revision 40779)
+++ lib/configure.py (working copy)
@@ -480,158 +480,158 @@ def checkModule(module):
def checkFormatEntries(dtl_tools):
''' Check all formats (\Format entries) '''
checkViewerEditor('a Tgif viewer and editor', ['tgif'],
- rc_entry = [r'\Format tgif obj Tgif "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format tgif "obj, tgo" Tgif "" "%%" "%%" "vector" "application/x-tgif"'])
#
checkViewerEditor('a FIG viewer and editor', ['xfig', 'jfig3-itext.jar', 'jfig3.jar'],
- rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector" "application/x-xfig"'])
#
checkViewerEditor('a Dia viewer and editor', ['dia'],
- rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector,zipped=native"'])
+ rc_entry = [r'\Format dia dia DIA "" "%%" "%%" "vector,zipped=native", "application/x-dia-diagram"'])
#
checkViewerEditor('an OpenOffice drawing viewer and editor', ['libreoffice', 'lodraw', 'ooffice', 'oodraw', 'soffice'],
- rc_entry = [r'\Format odg "odg, sxd" "OpenOffice drawing" "" "%%" "%%" "vector,zipped=native"'])
+ rc_entry = [r'\Format odg "odg, sxd" "OpenOffice drawing" "" "%%" "%%" "vector,zipped=native" "application/vnd.oasis.opendocument.graphics"'])
#
checkViewerEditor('a Grace viewer and editor', ['xmgrace'],
- rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "vector" ""'])
#
checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
- rc_entry = [r'\Format fen fen FEN "" "%%" "%%" ""'])
+ rc_entry = [r'\Format fen fen FEN "" "%%" "%%" "" ""'])
#
checkViewerEditor('a SVG viewer and editor', ['inkscape'],
- rc_entry = [r'\Format svg svg SVG "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format svg svg SVG "" "%%" "%%" "vector" "image/svg+xml"'])
#
path, iv = checkViewerNoRC('a raster image viewer', ['xv', 'kview', 'gimp-remote', 'gimp'],
- rc_entry = [r'''\Format bmp bmp BMP "" "%s" "%s" ""
-\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" ""
-\Format pbm pbm PBM "" "%s" "%s" ""
-\Format pgm pgm PGM "" "%s" "%s" ""
-\Format png png PNG "" "%s" "%s" ""
-\Format ppm ppm PPM "" "%s" "%s" ""
-\Format tiff tif TIFF "" "%s" "%s" ""
-\Format xbm xbm XBM "" "%s" "%s" ""
-\Format xpm xpm XPM "" "%s" "%s" ""'''])
+ rc_entry = [r'''\Format bmp bmp BMP "" "%s" "%s" "" "image/x-bmp"
+\Format gif gif GIF "" "%s" "%s" "" "image/gif"
+\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" "" "image/jpeg"
+\Format pbm pbm PBM "" "%s" "%s" "" "image/x-portable-bitmap"
+\Format pgm pgm PGM "" "%s" "%s" "" "image/x-portable-graymap"
+\Format png png PNG "" "%s" "%s" "" "image/x-png"
+\Format ppm ppm PPM "" "%s" "%s" "" "image/x-portable-pixmap"
+\Format tiff tif TIFF "" "%s" "%s" "" "image/tiff"
+\Format xbm xbm XBM "" "%s" "%s" "" "image/x-xbitmap"
+\Format xpm xpm XPM "" "%s" "%s" "" "image/x-xpixmap"'''])
path, ie = checkEditorNoRC('a raster image editor', ['gimp-remote', 'gimp'],
- rc_entry = [r'''\Format bmp bmp BMP "" "%s" "%s" ""
-\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" ""
-\Format pbm pbm PBM "" "%s" "%s" ""
-\Format pgm pgm PGM "" "%s" "%s" ""
-\Format png png PNG "" "%s" "%s" ""
-\Format ppm ppm PPM "" "%s" "%s" ""
-\Format tiff tif TIFF "" "%s" "%s" ""
-\Format xbm xbm XBM "" "%s" "%s" ""
-\Format xpm xpm XPM "" "%s" "%s" ""'''])
- addToRC(r'''\Format bmp bmp BMP "" "%s" "%s" ""
-\Format gif gif GIF "" "%s" "%s" ""
-\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" ""
-\Format pbm pbm PBM "" "%s" "%s" ""
-\Format pgm pgm PGM "" "%s" "%s" ""
-\Format png png PNG "" "%s" "%s" ""
-\Format ppm ppm PPM "" "%s" "%s" ""
-\Format tiff tif TIFF "" "%s" "%s" ""
-\Format xbm xbm XBM "" "%s" "%s" ""
-\Format xpm xpm XPM "" "%s" "%s" ""''' % \
+ rc_entry = [r'''\Format bmp bmp BMP "" "%s" "%s" "" "image/x-bmp"
+\Format gif gif GIF "" "%s" "%s" "" "image/gif"
+\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" "" "image/jpeg"
+\Format pbm pbm PBM "" "%s" "%s" "" "image/x-portable-bitmap"
+\Format pgm pgm PGM "" "%s" "%s" "" "image/x-portable-graymap"
+\Format png png PNG "" "%s" "%s" "" "image/x-png"
+\Format ppm ppm PPM "" "%s" "%s" "" "image/x-portable-pixmap"
+\Format tiff tif TIFF "" "%s" "%s" "" "image/tiff"
+\Format xbm xbm XBM "" "%s" "%s" "" "image/x-xbitmap"
+\Format xpm xpm XPM "" "%s" "%s" "" "image/x-xpixmap"'''])
+ addToRC(r'''\Format bmp bmp BMP "" "%s" "%s" "" "image/x-bmp"
+\Format gif gif GIF "" "%s" "%s" "" "image/gif"
+\Format jpg "jpg, jpeg" JPEG "" "%s" "%s" "" "image/jpeg"
+\Format pbm pbm PBM "" "%s" "%s" "" "image/x-portable-bitmap"
+\Format pgm pgm PGM "" "%s" "%s" "" "image/x-portable-graymap"
+\Format png png PNG "" "%s" "%s" "" "image/x-png"
+\Format ppm ppm PPM "" "%s" "%s" "" "image/x-portable-pixmap"
+\Format tiff tif TIFF "" "%s" "%s" "" "image/tiff"
+\Format xbm xbm XBM "" "%s" "%s" "" "image/x-xbitmap"
+\Format xpm xpm XPM "" "%s" "%s" "" "image/x-xpixmap"''' % \
(iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) )
#
checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
'nedit', 'gedit', 'notepad'],
- rc_entry = [r'''\Format asciichess asc "Plain text (chess output)" "" "" "%%" ""
-\Format asciiimage asc "Plain text (image)" "" "" "%%" ""
-\Format asciixfig asc "Plain text (Xfig output)" "" "" "%%" ""
-\Format dateout tmp "date (output)" "" "" "%%" ""
-\Format docbook sgml DocBook B "" "%%" "document,menu=export"
-\Format docbook-xml xml "DocBook (XML)" "" "" "%%" "document,menu=export"
-\Format dot dot "Graphviz Dot" "" "" "%%" "vector"
-\Format dviluatex tex "LaTeX (dviluatex)" "" "" "%%" "document,menu=export"
-\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export"
-\Format literate nw NoWeb N "" "%%" "document,menu=export"
-\Format sweave Rnw "Sweave" S "" "%%" "document,menu=export"
-\Format r R "R/S code" "" "" "%%" "document,menu=export"
-\Format knitr Rnw "Rnw (knitr)" "" "" "%%" "document,menu=export"
-\Format lilypond ly "LilyPond music" "" "" "%%" "vector"
-\Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document,menu=export"
-\Format latex tex "LaTeX (plain)" L "" "%%" "document,menu=export"
-\Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export"
-\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export"
-\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document,menu=export"
-\Format text txt "Plain text" a "" "%%" "document,menu=export"
-\Format text2 txt "Plain text (pstotext)" "" "" "%%" "document"
-\Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document"
-\Format text4 txt "Plain text (catdvi)" "" "" "%%" "document"
-\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document"''' ])
+ rc_entry = [r'''\Format asciichess asc "Plain text (chess output)" "" "" "%%" "" ""
+\Format asciiimage asc "Plain text (image)" "" "" "%%" "" ""
+\Format asciixfig asc "Plain text (Xfig output)" "" "" "%%" "" ""
+\Format dateout tmp "date (output)" "" "" "%%" "" ""
+\Format docbook sgml DocBook B "" "%%" "document,menu=export" ""
+\Format docbook-xml xml "DocBook (XML)" "" "" "%%" "document,menu=export" "application/docbook+xml"
+\Format dot dot "Graphviz Dot" "" "" "%%" "vector" "text/vnd.graphviz"
+\Format dviluatex tex "LaTeX (dviluatex)" "" "" "%%" "document,menu=export" ""
+\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export" ""
+\Format literate nw NoWeb N "" "%%" "document,menu=export" ""
+\Format sweave Rnw "Sweave" S "" "%%" "document,menu=export" ""
+\Format r R "R/S code" "" "" "%%" "document,menu=export" ""
+\Format knitr Rnw "Rnw (knitr)" "" "" "%%" "document,menu=export" ""
+\Format lilypond ly "LilyPond music" "" "" "%%" "vector" "text/x-lilypond"
+\Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document,menu=export" ""
+\Format latex tex "LaTeX (plain)" L "" "%%" "document,menu=export" "text/x-tex"
+\Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export" ""
+\Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export" ""
+\Format xetex tex "LaTeX (XeTeX)" "" "" "%%" "document,menu=export" ""
+\Format text txt "Plain text" a "" "%%" "document,menu=export" "text/plain"
+\Format text2 txt "Plain text (pstotext)" "" "" "%%" "document" ""
+\Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document" ""
+\Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" ""
+\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document" ""''' ])
#Spreadsheets using ssconvert from gnumeric
checkViewer('gnumeric spreadsheet software', ['gnumeric'],
- rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document"
-\Format excel xls "Excel spreadsheet" "" "" "%%" "document"
-\Format oocalc ods "OpenOffice spreadsheet" "" "" "%%" "document"'''])
+ rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric"
+\Format excel xls "Excel spreadsheet" "" "" "%%" "document" "application/vnd.ms-excel"
+\Format oocalc ods "OpenOffice spreadsheet" "" "" "%%" "document" "application/vnd.oasis.opendocument.spreadsheet"'''])
#
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
- rc_entry = [r'\Format xhtml xhtml "LyXHTML" y "%%" "" "document,menu=export"'])
+ rc_entry = [r'\Format xhtml xhtml "LyXHTML" y "%%" "" "document,menu=export" "application/xhtml+xml"'])
#
checkEditor('a BibTeX editor', ['jabref', 'JabRef', \
'pybliographic', 'bibdesk', 'gbib', 'kbib', \
'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \
'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
'nedit', 'gedit', 'notepad'],
- rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" ""''' ])
+ rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" "" "text/x-bibtex"''' ])
#
#checkProg('a Postscript interpreter', ['gs'],
# rc_entry = [ r'\ps_command "%%"' ])
checkViewer('a Postscript previewer', ['kghostview', 'okular', 'evince', 'gv', 'ghostview -swap'],
- rc_entry = [r'''\Format eps eps EPS "" "%%" "" "vector"
-\Format eps2 eps "EPS (uncropped)" "" "%%" "" "vector"
-\Format ps ps Postscript t "%%" "" "document,vector,menu=export"'''])
+ rc_entry = [r'''\Format eps eps EPS "" "%%" "" "vector" "image/x-eps"
+\Format eps2 eps "EPS (uncropped)" "" "%%" "" "vector" ""
+\Format ps ps Postscript t "%%" "" "document,vector,menu=export" "application/postscript"'''])
# for xdg-open issues look here: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg151818.html
checkViewer('a PDF previewer', ['kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
'gv', 'ghostview'],
- rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export"
-\Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector,menu=export"
-\Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector,menu=export"
-\Format pdf4 pdf "PDF (XeTeX)" X "%%" "" "document,vector,menu=export"
-\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export"'''])
+ rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export" "application/pdf"
+\Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector,menu=export" ""
+\Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector,menu=export" ""
+\Format pdf4 pdf "PDF (XeTeX)" X "%%" "" "document,vector,menu=export" ""
+\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export" ""'''])
#
checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', 'yap', 'dviout -Set=!m'],
- rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export"
-\Format dvi3 dvi "DVI (LuaTeX)" V "%%" "" "document,vector,menu=export"'''])
+ rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export" "application/x-dvi"
+\Format dvi3 dvi "DVI (LuaTeX)" V "%%" "" "document,vector,menu=export" ""'''])
if dtl_tools:
# Windows only: DraftDVI
- addToRC(r'\Format dvi2 dvi DraftDVI "" "" "" "vector"')
+ addToRC(r'\Format dvi2 dvi DraftDVI "" "" "" "vector" ""')
#
checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
- rc_entry = [r'\Format html "html, htm" HTML H "%%" "" "document,menu=export"'])
+ rc_entry = [r'\Format html "html, htm" HTML H "%%" "" "document,menu=export" "text/html"'])
#
checkViewerEditor('Noteedit', ['noteedit'],
- rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"'])
+ rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector" ""'])
#
checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'],
- rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export"
-\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector"'''])
+ rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text"
+\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector" "application/vnd.sun.xml.writer"'''])
#
checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'],
- rc_entry = [r'''\Format rtf rtf "Rich Text Format" "" "%%" "%%" "document,vector,menu=export"
-\Format word doc "MS Word" W "%%" "%%" "document,vector,menu=export"'''])
+ rc_entry = [r'''\Format rtf rtf "Rich Text Format" "" "%%" "%%" "document,vector,menu=export" "application/rtf"
+\Format word doc "MS Word" W "%%" "%%" "document,vector,menu=export" "application/msword"'''])
#
# entries that do not need checkProg
- addToRC(r'''\Format date "" "date command" "" "" "" ""
-\Format csv csv "Table (CSV)" "" "" "" "document"
-\Format fax "" Fax "" "" "" "document"
-\Format lyx lyx LyX "" "" "" ""
-\Format lyx13x 13.lyx "LyX 1.3.x" "" "" "" "document"
-\Format lyx14x 14.lyx "LyX 1.4.x" "" "" "" "document"
-\Format lyx15x 15.lyx "LyX 1.5.x" "" "" "" "document"
-\Format lyx16x 16.lyx "LyX 1.6.x" "" "" "" "document,menu=export"
-\Format lyx20x 20.lyx "LyX 2.0.x" "" "" "" "document,menu=export"
-\Format clyx cjklyx "CJK LyX 1.4.x (big5)" "" "" "" "document"
-\Format jlyx cjklyx "CJK LyX 1.4.x (euc-jp)" "" "" "" "document"
-\Format klyx cjklyx "CJK LyX 1.4.x (euc-kr)" "" "" "" "document"
-\Format lyxpreview lyxpreview "LyX Preview" "" "" "" ""
-\Format pdftex pdftex_t PDFTEX "" "" "" ""
-\Format program "" Program "" "" "" ""
-\Format pstex pstex_t PSTEX "" "" "" ""
-\Format wmf wmf "Windows Metafile" "" "" "" "vector"
-\Format emf emf "Enhanced Metafile" "" "" "" "vector"
-\Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document"
+ addToRC(r'''\Format date "" "date command" "" "" "" "" ""
+\Format csv csv "Table (CSV)" "" "" "" "document" "text/csv"
+\Format fax "" Fax "" "" "" "document" ""
+\Format lyx lyx LyX "" "" "" "" "application/x-lyx"
+\Format lyx13x 13.lyx "LyX 1.3.x" "" "" "" "document" ""
+\Format lyx14x 14.lyx "LyX 1.4.x" "" "" "" "document" ""
+\Format lyx15x 15.lyx "LyX 1.5.x" "" "" "" "document" ""
+\Format lyx16x 16.lyx "LyX 1.6.x" "" "" "" "document,menu=export" ""
+\Format lyx20x 20.lyx "LyX 2.0.x" "" "" "" "document,menu=export" ""
+\Format clyx cjklyx "CJK LyX 1.4.x (big5)" "" "" "" "document" ""
+\Format jlyx cjklyx "CJK LyX 1.4.x (euc-jp)" "" "" "" "document" ""
+\Format klyx cjklyx "CJK LyX 1.4.x (euc-kr)" "" "" "" "document" ""
+\Format lyxpreview lyxpreview "LyX Preview" "" "" "" "" ""
+\Format pdftex pdftex_t PDFTEX "" "" "" "" ""
+\Format program "" Program "" "" "" "" ""
+\Format pstex pstex_t PSTEX "" "" "" "" ""
+\Format wmf wmf "Windows Metafile" "" "" "" "vector" "image/x-wmf"
+\Format emf emf "Enhanced Metafile" "" "" "" "vector" "image/x-emf"
+\Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document" ""
''')
@@ -922,10 +922,10 @@ def checkConverterEntries():
# So, we configure the appropriate version according to the platform.
cmd = r'\converter lyx %s "python -tt $$s/scripts/lyxpak.py $$r/$$f" ""'
if os.name == 'nt':
- addToRC(r'\Format lyxzip zip "LyX Archive (zip)" "" "" "" "document,menu=export"')
+ addToRC(r'\Format lyxzip zip "LyX Archive (zip)" "" "" "" "document,menu=export" ""')
addToRC(cmd % "lyxzip")
else:
- addToRC(r'\Format lyxgz gz "LyX Archive (tar.gz)" "" "" "" "document,menu=export"')
+ addToRC(r'\Format lyxgz gz "LyX Archive (tar.gz)" "" "" "" "document,menu=export" ""')
addToRC(cmd % "lyxgz")
#
@@ -1334,7 +1334,7 @@ def removeTempFiles():
if __name__ == '__main__':
lyx_check_config = True
outfile = 'lyxrc.defaults'
- lyxrc_fileformat = 3
+ lyxrc_fileformat = 7
rc_entries = ''
lyx_keep_temps = False
version_suffix = ''