log: Allow to assign several extension to a given file format (#4798). Additionnal extensions are separated by commas (,). Spaces are ignored. Preference (lyxrc) file format incremented to 2.
A lot of the diff is renaming extension -> extensions See issues http://www.lyx.org/trac/ticket/4798 http://www.lyx.org/trac/ticket/6340 Comments welcome! Regards, Julien
diff --git a/lib/configure.py b/lib/configure.py index 908c211..d4ceebb 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -476,7 +476,7 @@ def checkFormatEntries(dtl_tools): 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 "" "%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" "" @@ -487,7 +487,7 @@ def checkFormatEntries(dtl_tools): 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 "" "%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" "" @@ -497,7 +497,7 @@ def checkFormatEntries(dtl_tools): \Format xpm xpm XPM "" "%s" "%s" ""''']) addToRC(r'''\Format bmp bmp BMP "" "%s" "%s" "" \Format gif gif GIF "" "%s" "%s" "" -\Format jpg jpg JPEG "" "%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" "" @@ -571,7 +571,7 @@ def checkFormatEntries(dtl_tools): addToRC(r'\Format dvi2 dvi DraftDVI "" "" "" "vector"') # checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'], - rc_entry = [r'\Format html html HTML H "%%" "" "document,menu=export"']) + rc_entry = [r'\Format html "html, htm" HTML H "%%" "" "document,menu=export"']) # checkViewerEditor('Noteedit', ['noteedit'], rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"']) @@ -605,7 +605,7 @@ def checkFormatEntries(dtl_tools): \Format pstex pstex_t PSTEX "" "" "" "" \Format wmf wmf "Windows Metafile" "" "" "" "vector" \Format emf emf "Enhanced Metafile" "" "" "" "vector" -\Format wordhtml html "HTML (MS Word)" "" "" "" "document" +\Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document" ''') diff --git a/lib/scripts/prefs2prefs_prefs.py b/lib/scripts/prefs2prefs_prefs.py index 7a2cdd6..47ec155 100644 --- a/lib/scripts/prefs2prefs_prefs.py +++ b/lib/scripts/prefs2prefs_prefs.py @@ -108,4 +108,5 @@ conversions = [ language_use_babel, language_package ] # end conversions for format 0 + ,[] ] diff --git a/src/Format.cpp b/src/Format.cpp index cd2d238..c7bd65f 100644 --- a/src/Format.cpp +++ b/src/Format.cpp @@ -69,6 +69,7 @@ public: : extension_(extension) {} bool operator()(Format const & f) const { + // FIXME: loop through f.extensions() return f.extension() == extension_; } private: @@ -90,9 +91,14 @@ bool operator<(Format const & a, Format const & b) Format::Format(string const & n, string const & e, string const & p, string const & s, string const & v, string const & ed, int flags) - : name_(n), extension_(e), prettyname_(p), shortcut_(s), viewer_(v), + : name_(n), extensions_(e), prettyname_(p), shortcut_(s), viewer_(v), editor_(ed), flags_(flags) -{} +{ + string e1; + split(e, e1, ','); + extension_ = e1; + extensions_ = e; +} bool Format::dummy() const @@ -115,6 +121,15 @@ string const Format::parentFormat() const } +void Format::setExtensions(string const & e) +{ + string e1; + split(e, e1, ','); + extension_ = e1; + extensions_ = e; +} + + // This method should return a reference, and throw an exception // if the format named name cannot be found (Lgb) Format const * Formats::getFormat(string const & name) const @@ -207,7 +222,7 @@ void Formats::add(string const & name) } -void Formats::add(string const & name, string const & extension, +void Formats::add(string const & name, string const & extensions, string const & prettyname, string const & shortcut, string const & viewer, string const & editor, int flags) @@ -216,10 +231,10 @@ void Formats::add(string const & name, string const & extension, find_if(formatlist.begin(), formatlist.end(), FormatNamesEqual(name)); if (it == formatlist.end()) - formatlist.push_back(Format(name, extension, prettyname, + formatlist.push_back(Format(name, extensions, prettyname, shortcut, viewer, editor, flags)); else - *it = Format(name, extension, prettyname, shortcut, viewer, + *it = Format(name, extensions, prettyname, shortcut, viewer, editor, flags); } @@ -416,6 +431,16 @@ string const Formats::extension(string const & name) const } +string const Formats::extensions(string const & name) const +{ + Format const * format = getFormat(name); + if (format) + return format->extensions(); + else + return name; +} + + namespace { typedef Translator<OutputParams::FLAVOR, string> FlavorTranslator; diff --git a/src/Format.h b/src/Format.h index 682f8c5..fc04cfe 100644 --- a/src/Format.h +++ b/src/Format.h @@ -57,7 +57,14 @@ public: /// std::string const & extension() const { return extension_; } /// - void setExtension(std::string const & v) { extension_ = v; } + std::string const & extensions() const { return extensions_; } + /// + void setExtension(std::string const & v) { + extension_ = v; + extensions_ = v; + } + /// + void setExtensions(std::string const & v); /// std::string const & prettyname() const { return prettyname_; } /// @@ -85,8 +92,10 @@ public: private: /// Internal name. Needs to be unique. std::string name_; - /// Filename extension + /// Default filename extension std::string extension_; + /// All filename extensions + std::string extensions_; /// Name presented to the user. Needs to be unique. std::string prettyname_; /// Keyboard shortcut for the View and Export menu. @@ -137,7 +146,7 @@ public: /// void add(std::string const & name); /// - void add(std::string const & name, std::string const & extension, + 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); @@ -160,6 +169,8 @@ public: /// std::string const extension(std::string const & name) const; /// + std::string const extensions(std::string const & name) const; + /// const_iterator begin() const { return formatlist.begin(); } /// const_iterator end() const { return formatlist.end(); } diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp index 4211685..ffe1aff 100644 --- a/src/LyXRC.cpp +++ b/src/LyXRC.cpp @@ -55,7 +55,7 @@ namespace os = support::os; namespace { -static unsigned int const LYXRC_FILEFORMAT = 1; +static unsigned int const LYXRC_FILEFORMAT = 2; // when adding something to this array keep it sorted! LexerKeyword lyxrcTags[] = { @@ -1088,8 +1088,8 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format) break; } case RC_FILEFORMAT: { - string format, extension, prettyname, shortcut; - lexrc >> format >> extension >> prettyname >> shortcut; + string format, extensions, prettyname, shortcut; + lexrc >> format >> extensions >> prettyname >> shortcut; string viewer, editor; if (lexrc.next(true)) viewer = lexrc.getString(); @@ -1131,7 +1131,7 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format) else formats.erase(format); } else { - formats.add(format, extension, prettyname, + formats.add(format, extensions, prettyname, shortcut, viewer, editor, flgs); } break; @@ -2731,7 +2731,7 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c Format const * format = system_formats.getFormat(cit->name()); if (!format || - format->extension() != cit->extension() || + format->extensions() != cit->extensions() || format->prettyname() != cit->prettyname() || format->shortcut() != cit->shortcut() || format->viewer() != cit->viewer() || @@ -2740,7 +2740,7 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c format->vectorFormat() != cit->vectorFormat() || format->inExportMenu() != cit->inExportMenu()) { os << "\\format \"" << cit->name() << "\" \"" - << cit->extension() << "\" \"" + << cit->extensions() << "\" \"" << cit->prettyname() << "\" \"" << cit->shortcut() << "\" \"" << escapeCommand(cit->viewer()) << "\" \"" diff --git a/src/frontends/qt4/GuiPrefs.cpp b/src/frontends/qt4/GuiPrefs.cpp index 16be7bc..86b7963 100644 --- a/src/frontends/qt4/GuiPrefs.cpp +++ b/src/frontends/qt4/GuiPrefs.cpp @@ -1953,7 +1953,7 @@ void PrefFileformats::on_formatsCB_currentIndexChanged(int i) formatED->setText(toqstr(f.name())); copierED->setText(toqstr(form_->movers().command(f.name()))); - extensionED->setText(toqstr(f.extension())); + extensionsED->setText(toqstr(f.extensions())); shortcutED->setText( toqstr(l10n_shortcut(f.prettyname(), f.shortcut()))); documentCB->setChecked((f.documentFormat())); @@ -1988,12 +1988,13 @@ void PrefFileformats::on_copierED_textEdited(const QString & s) } -void PrefFileformats::on_extensionED_textEdited(const QString & s) +void PrefFileformats::on_extensionsED_textEdited(const QString & s) { - currentFormat().setExtension(fromqstr(s)); + currentFormat().setExtensions(fromqstr(s)); changed(); } + void PrefFileformats::on_viewerED_textEdited(const QString & s) { currentFormat().setViewer(fromqstr(s)); diff --git a/src/frontends/qt4/GuiPrefs.h b/src/frontends/qt4/GuiPrefs.h index d567ca6..571cb9c 100644 --- a/src/frontends/qt4/GuiPrefs.h +++ b/src/frontends/qt4/GuiPrefs.h @@ -360,7 +360,7 @@ Q_SIGNALS: private Q_SLOTS: void on_copierED_textEdited(const QString & s); - void on_extensionED_textEdited(const QString &); + void on_extensionsED_textEdited(const QString &); void on_viewerED_textEdited(const QString &); void on_editorED_textEdited(const QString &); void on_shortcutED_textEdited(const QString &); diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index fee9f9c..34d2169 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -897,6 +897,7 @@ void GuiView::dropEvent(QDropEvent * event) = theConverters().importableFormats(); vector<const Format *>::const_iterator it = import_formats.begin(); for (; it != import_formats.end(); ++it) + // FIXME: loop through extensions if ((*it)->extension() == ext) found_formats.push_back(*it); @@ -2066,10 +2067,10 @@ void GuiView::importDocument(string const & argument) toqstr(addPath(package().system_support().absFileName(), "examples"))); docstring filter = formats.prettyName(format); - filter += " (*."; + filter += " (*.{"; // FIXME UNICODE - filter += from_utf8(formats.extension(format)); - filter += ')'; + filter += from_utf8(formats.extensions(format)); + filter += "})"; FileDialog::Result result = dlg.open(toqstr(initpath), fileFilters(toqstr(filter))); diff --git a/src/frontends/qt4/qt_helpers.cpp b/src/frontends/qt4/qt_helpers.cpp index 076681c..d4a93da 100644 --- a/src/frontends/qt4/qt_helpers.cpp +++ b/src/frontends/qt4/qt_helpers.cpp @@ -348,9 +348,9 @@ static string const convert_brace_glob(string const & glob) { // Matches " *.{abc,def,ghi}", storing "*." as group 1 and // "abc,def,ghi" as group 2. - static lyx::regex const glob_re(" *([^ {]*)\\{([^ }]+)\\}"); + static lyx::regex const glob_re(" *([^ {]*)\\{([^}]+)\\}"); // Matches "abc" and "abc,", storing "abc" as group 1. - static lyx::regex const block_re("([^,}]+),?"); + static lyx::regex const block_re(" *([^,}]+) *,? *"); string pattern; @@ -423,7 +423,7 @@ QString Filter::toString() const { QString s; - bool const has_description = desc_.empty(); + bool const has_description = !desc_.empty(); if (has_description) { s += toqstr(desc_); diff --git a/src/frontends/qt4/ui/PrefFileformatsUi.ui b/src/frontends/qt4/ui/PrefFileformatsUi.ui index f62dcdf..a63c150 100644 --- a/src/frontends/qt4/ui/PrefFileformatsUi.ui +++ b/src/frontends/qt4/ui/PrefFileformatsUi.ui @@ -91,17 +91,17 @@ <widget class="QLineEdit" name="formatED" /> </item> <item row="5" column="0" > - <widget class="QLabel" name="extensionLA" > + <widget class="QLabel" name="extensionsLA" > <property name="text" > - <string>E&xtension:</string> + <string>E&xtensions:</string> </property> <property name="buddy" > - <cstring>extensionED</cstring> + <cstring>extensionsED</cstring> </property> </widget> </item> <item row="5" column="1" colspan="2" > - <widget class="QLineEdit" name="extensionED" /> + <widget class="QLineEdit" name="extensionsED" /> </item> <item row="7" column="0" > <widget class="QLabel" name="shortcutLA" > @@ -232,7 +232,7 @@ <tabstop>documentCB</tabstop> <tabstop>vectorCB</tabstop> <tabstop>formatED</tabstop> - <tabstop>extensionED</tabstop> + <tabstop>extensionsED</tabstop> <tabstop>shortcutED</tabstop> <tabstop>editorED</tabstop> <tabstop>viewerED</tabstop>