Sat, 09 Sep 2023 17:17:11 +0200
Extended the Typing Completers infrastructure to allow the addition of completers via plugins.
--- a/src/eric7/APIs/Python3/eric7.api Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/APIs/Python3/eric7.api Sat Sep 09 17:17:11 2023 +0200 @@ -9488,6 +9488,8 @@ eric7.QScintilla.TypingCompleters.CompleterPython.CompleterPython.readSettings?4() eric7.QScintilla.TypingCompleters.CompleterPython.CompleterPython?1(editor, parent=None) eric7.QScintilla.TypingCompleters.CompleterPython.createCompleter?4(editor, parent=None) +eric7.QScintilla.TypingCompleters.CompleterRegistry?7 +eric7.QScintilla.TypingCompleters.CompleterRegistryItem?7 eric7.QScintilla.TypingCompleters.CompleterRuby.CompleterRuby.charAdded?4(charNumber) eric7.QScintilla.TypingCompleters.CompleterRuby.CompleterRuby.readSettings?4() eric7.QScintilla.TypingCompleters.CompleterRuby.CompleterRuby?1(editor, parent=None) @@ -9497,6 +9499,8 @@ eric7.QScintilla.TypingCompleters.CompleterYaml.CompleterYaml?1(editor, parent=None) eric7.QScintilla.TypingCompleters.CompleterYaml.createCompleter?4(editor, parent=None) eric7.QScintilla.TypingCompleters.getCompleter?4(language, editor, parent=None) +eric7.QScintilla.TypingCompleters.registerCompleter?4(language, createCompleterFunction, createConfigPageFunction) +eric7.QScintilla.TypingCompleters.unregisterTypingCompleter?4(language) eric7.QScintilla.ZoomDialog.ZoomDialog.getZoomSize?4() eric7.QScintilla.ZoomDialog.ZoomDialog?1(zoom, parent, name=None, modal=False) eric7.QtHelpInterface.HelpDocsInstaller.HelpDocsInstaller.docsInstalled?7
--- a/src/eric7/APIs/Python3/eric7.bas Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/APIs/Python3/eric7.bas Sat Sep 09 17:17:11 2023 +0200 @@ -232,7 +232,7 @@ EricClickableLabel QLabel EricClickableLed EricLed EricComboPathPicker EricPathPickerBase -EricComboSelectionDialog QDialog Ui_E5ComboSelectionDialog +EricComboSelectionDialog QDialog Ui_EricComboSelectionDialog EricDirCompleter QCompleter EricDirFileDialog QFileDialog EricDnDTabBar EricWheelTabBar
--- a/src/eric7/Documentation/Help/source.qhp Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/Documentation/Help/source.qhp Sat Sep 09 17:17:11 2023 +0200 @@ -20319,6 +20319,7 @@ <keyword name="readmodule_ex" id="readmodule_ex" ref="eric7.Utilities.ClassBrowsers.rbclbr.html#readmodule_ex" /> <keyword name="rebase (Module)" id="rebase (Module)" ref="eric7.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.html" /> <keyword name="registerClassBrowser" id="registerClassBrowser" ref="eric7.Utilities.ClassBrowsers.__init__.html#registerClassBrowser" /> + <keyword name="registerCompleter" id="registerCompleter" ref="eric7.QScintilla.TypingCompleters.__init__.html#registerCompleter" /> <keyword name="registerLexer" id="registerLexer" ref="eric7.QScintilla.Lexers.__init__.html#registerLexer" /> <keyword name="registerPlugin" id="registerPlugin" ref="eric7.PluginManager.PluginRepositoryDialog.html#registerPlugin" /> <keyword name="registerView" id="registerView" ref="eric7.WebBrowser.WebInspector.html#registerView" /> @@ -20490,6 +20491,7 @@ <keyword name="unparse" id="unparse" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.ast_unparse.html#unparse" /> <keyword name="unregisterClassBrowser" id="unregisterClassBrowser" ref="eric7.Utilities.ClassBrowsers.__init__.html#unregisterClassBrowser" /> <keyword name="unregisterLexer" id="unregisterLexer" ref="eric7.QScintilla.Lexers.__init__.html#unregisterLexer" /> + <keyword name="unregisterTypingCompleter" id="unregisterTypingCompleter" ref="eric7.QScintilla.TypingCompleters.__init__.html#unregisterTypingCompleter" /> <keyword name="unregisterView" id="unregisterView" ref="eric7.WebBrowser.WebInspector.html#unregisterView" /> <keyword name="updateTypeMap" id="updateTypeMap" ref="eric7.DebugClients.Python.DebugVariables.html#updateTypeMap" /> <keyword name="update_counts" id="update_counts" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#update_counts" />
--- a/src/eric7/Documentation/Source/eric7.QScintilla.TypingCompleters.__init__.html Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/Documentation/Source/eric7.QScintilla.TypingCompleters.__init__.html Sat Sep 09 17:17:11 2023 +0200 @@ -9,12 +9,12 @@ <h1>eric7.QScintilla.TypingCompleters.__init__</h1> <p> -Package implementing lexers for the various supported programming languages. +Package implementing typing completers for the various supported programming languages. </p> <h3>Global Attributes</h3> <table> -<tr><td>None</td></tr> +<tr><td>CompleterRegistry</td></tr><tr><td>CompleterRegistryItem</td></tr> </table> <h3>Classes</h3> @@ -29,6 +29,14 @@ <td><a href="#getCompleter">getCompleter</a></td> <td>Module function to instantiate a lexer object for a given language.</td> </tr> +<tr> +<td><a href="#registerCompleter">registerCompleter</a></td> +<td>Function to register a typing completer for a lexer language.</td> +</tr> +<tr> +<td><a href="#unregisterTypingCompleter">unregisterTypingCompleter</a></td> +<td>Function to unregister a previously registered typing completer.</td> +</tr> </table> <hr /> <hr /> @@ -41,23 +49,80 @@ </p> <dl> -<dt><i>language</i></dt> +<dt><i>language</i> (str)</dt> <dd> -language of the lexer (string) +language of the lexer </dd> -<dt><i>editor</i></dt> +<dt><i>editor</i> (QScintilla.Editor)</dt> <dd> -reference to the editor object (QScintilla.Editor) +reference to the editor object </dd> -<dt><i>parent</i></dt> +<dt><i>parent</i> (QObject (optional))</dt> <dd> -reference to the parent object (QObject) +reference to the parent object (defaults to None) </dd> </dl> <dl> <dt>Return:</dt> <dd> -reference to the instanciated lexer object (QsciLexer) +reference to the instantiated typing completer object +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +CompleterBase +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> +<a NAME="registerCompleter" ID="registerCompleter"></a> +<h2>registerCompleter</h2> +<b>registerCompleter</b>(<i>language, createCompleterFunction, createConfigPageFunction</i>) + +<p> + Function to register a typing completer for a lexer language. +</p> +<dl> + +<dt><i>language</i> (str)</dt> +<dd> +lexer language of the typing completer +</dd> +<dt><i>createCompleterFunction</i> (function)</dt> +<dd> +reference to a function to instantiate a + typing completer object +</dd> +<dt><i>createConfigPageFunction</i> (function)</dt> +<dd> +reference to a function returning a ready + populated configuration widget +</dd> +</dl> +<dl> + +<dt>Raises <b>KeyError</b>:</dt> +<dd> +raised when the given name is already in use +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> +<a NAME="unregisterTypingCompleter" ID="unregisterTypingCompleter"></a> +<h2>unregisterTypingCompleter</h2> +<b>unregisterTypingCompleter</b>(<i>language</i>) + +<p> + Function to unregister a previously registered typing completer. +</p> +<dl> + +<dt><i>language</i> (str)</dt> +<dd> +lexer language of the typing completer </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/src/eric7/Documentation/Source/index-eric7.QScintilla.TypingCompleters.html Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/Documentation/Source/index-eric7.QScintilla.TypingCompleters.html Sat Sep 09 17:17:11 2023 +0200 @@ -8,7 +8,7 @@ <h1>eric7.QScintilla.TypingCompleters</h1> <p> -Package implementing lexers for the various supported programming languages. +Package implementing typing completers for the various supported programming languages. </p> @@ -33,7 +33,7 @@ </tr> <tr> <td><a href="eric7.QScintilla.TypingCompleters.__init__.html">TypingCompleters</a></td> -<td>Package implementing lexers for the various supported programming languages.</td> +<td>Package implementing typing completers for the various supported programming languages.</td> </tr> </table> </body></html> \ No newline at end of file
--- a/src/eric7/Documentation/Source/index-eric7.QScintilla.html Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/Documentation/Source/index-eric7.QScintilla.html Sat Sep 09 17:17:11 2023 +0200 @@ -43,7 +43,7 @@ </tr> <tr> <td><a href="index-eric7.QScintilla.TypingCompleters.html">TypingCompleters</a></td> -<td>Package implementing lexers for the various supported programming languages.</td> +<td>Package implementing typing completers for the various supported programming languages.</td> </tr> </table>
--- a/src/eric7/Preferences/ConfigurationPages/EditorTypingPage.py Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/Preferences/ConfigurationPages/EditorTypingPage.py Sat Sep 09 17:17:11 2023 +0200 @@ -10,6 +10,7 @@ from PyQt6.QtCore import pyqtSlot from eric7 import Preferences +from eric7.QScintilla.TypingCompleters import CompleterRegistry from .ConfigurationPageBase import ConfigurationPageBase from .Ui_EditorTypingPage import Ui_EditorTypingPage @@ -28,17 +29,25 @@ self.setupUi(self) self.setObjectName("EditorTypingPage") - # set initial values - self.pageIds = { + self.__pageIds = { " ": self.stackedWidget.indexOf(self.emptyPage), "Python": self.stackedWidget.indexOf(self.pythonPage), "Ruby": self.stackedWidget.indexOf(self.rubyPage), "YAML": self.stackedWidget.indexOf(self.yamlPage), } - languages = sorted(self.pageIds.keys()) - for language in languages: - self.languageCombo.addItem(language, self.pageIds[language]) + self.__extensionPages = {} + for language in CompleterRegistry: + page = CompleterRegistry[language].createConfigPage() + if page is not None: + language = language.replace("Pygments|", "") # more readable + self.__extensionPages[language] = page + self.__pageIds[language] = self.stackedWidget.addWidget(page) + + for language in sorted(self.__pageIds.keys()): + self.languageCombo.addItem(language, self.__pageIds[language]) + + # set initial values # Python self.pythonGroup.setChecked( Preferences.getEditorTyping("Python/EnabledTypingAids") @@ -240,6 +249,9 @@ "Yaml/InsertBlankComma", self.yamlInsertBlankCommaCheckBox.isChecked() ) + for page in self.__extensionPages.values(): + page.save() + @pyqtSlot(int) def on_languageCombo_activated(self, index): """ @@ -250,9 +262,9 @@ """ language = self.languageCombo.itemText(index) try: - index = self.pageIds[language] + index = self.__pageIds[language] except KeyError: - index = self.pageIds[" "] + index = self.__pageIds[" "] self.stackedWidget.setCurrentIndex(index)
--- a/src/eric7/QScintilla/TypingCompleters/__init__.py Fri Sep 08 10:16:05 2023 +0200 +++ b/src/eric7/QScintilla/TypingCompleters/__init__.py Sat Sep 09 17:17:11 2023 +0200 @@ -4,20 +4,81 @@ # """ -Package implementing lexers for the various supported programming languages. +Package implementing typing completers for the various supported programming languages. """ +import collections +import contextlib import importlib +# Typing Completer Registry Item +# Each item contains two function references. +# createCompleter: A function that must accept two arguments, a reference to the editor +# and a reference to the parent object. It must return an instantiated +# typing completer object. +# createConfigPage: A function that must return a fully populated configuration widget +# to be added to the Editor / Typing configuration page. This widget +# must have a method "save" to save the entered values. +CompleterRegistryItem = collections.namedtuple( + "CompleterRegistryItem", ["createCompleter", "createConfigPage"] +) + +# The Typing Completer Registry +# Dictionary with the language name as key. Each entry contains a reference to a +# 'CompleterRegistryItem' object. +CompleterRegistry = {} + + +def registerCompleter(language, createCompleterFunction, createConfigPageFunction): + """ + Function to register a typing completer for a lexer language. + + @param language lexer language of the typing completer + @type str + @param createCompleterFunction reference to a function to instantiate a + typing completer object + @type function + @param createConfigPageFunction reference to a function returning a ready + populated configuration widget + @type function + @exception KeyError raised when the given name is already in use + """ + global CompleterRegistry + + if language in CompleterRegistry: + raise KeyError('Typing completer "{0}" already registered.'.format(language)) + else: + CompleterRegistry[language] = CompleterRegistryItem( + createCompleter=createCompleterFunction, + createConfigPage=createConfigPageFunction, + ) + + +def unregisterTypingCompleter(language): + """ + Function to unregister a previously registered typing completer. + + @param language lexer language of the typing completer + @type str + """ + global CompleterRegistry + + with contextlib.suppress(KeyError): + del CompleterRegistry[language] + def getCompleter(language, editor, parent=None): """ Module function to instantiate a lexer object for a given language. - @param language language of the lexer (string) - @param editor reference to the editor object (QScintilla.Editor) - @param parent reference to the parent object (QObject) - @return reference to the instanciated lexer object (QsciLexer) + @param language language of the lexer + @type str + @param editor reference to the editor object + @type QScintilla.Editor + @param parent reference to the parent object (defaults to None) + @type QObject (optional) + @return reference to the instantiated typing completer object + @rtype CompleterBase """ languageCompleterMapping = { "Python": ".CompleterPython", @@ -33,4 +94,7 @@ if mod: return mod.createCompleter(editor, parent) + elif language in CompleterRegistry: + return CompleterRegistry[language].createCompleter(editor, parent) + return None