Extended the Typing Completers infrastructure to allow the addition of completers via plugins. eric7

Sat, 09 Sep 2023 17:17:11 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 09 Sep 2023 17:17:11 +0200
branch
eric7
changeset 10199
2cd5ff8e0e0f
parent 10198
94ab7a21c3ad
child 10200
7c282bf19646

Extended the Typing Completers infrastructure to allow the addition of completers via plugins.

src/eric7/APIs/Python3/eric7.api file | annotate | diff | comparison | revisions
src/eric7/APIs/Python3/eric7.bas file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.QScintilla.TypingCompleters.__init__.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/index-eric7.QScintilla.TypingCompleters.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/index-eric7.QScintilla.html file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorTypingPage.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/TypingCompleters/__init__.py file | annotate | diff | comparison | revisions
--- 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
Binary file src/eric7/Documentation/Help/source.qch has changed
--- 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

eric ide

mercurial