src/eric7/QScintilla/TypingCompleters/__init__.py

branch
eric7
changeset 10199
2cd5ff8e0e0f
parent 9653
e67609152c5e
child 10201
5beaa25bdfbe
diff -r 94ab7a21c3ad -r 2cd5ff8e0e0f src/eric7/QScintilla/TypingCompleters/__init__.py
--- 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