[Libreoffice-commits] core.git: wizards/source

Jean-Pierre Ledure (via logerrit) logerrit at kemper.freedesktop.org
Sat Apr 24 12:55:24 UTC 2021


 wizards/source/scriptforge/python/scriptforge.py |   49 +++++++++++++++++------
 1 file changed, 37 insertions(+), 12 deletions(-)

New commits:
commit deb51a303d15957daae5c12ccd2337960f67343b
Author:     Jean-Pierre Ledure <jp at ledure.be>
AuthorDate: Fri Apr 23 16:52:06 2021 +0200
Commit:     Jean-Pierre Ledure <jp at ledure.be>
CommitDate: Sat Apr 24 14:54:43 2021 +0200

    ScriptForge - (scriptforge.py) SF_Exception.PythonShell() method
    
    The PythonShell() method invokes the console() method
    of the APSO extension.
    It accepts 1 argument, which is a dictionary of variables
    that the user wants transferred to the console to become part
    of the Python context there.
    
    Typical usage:
        exc.PythonShell( {**globals(), **locals()} )
    
    Subsequent print() statements executed in the user script
    are displayed in the console.
    
    An (untranslated - english) error message is raised when
    the APSO extension is not installed.
    
    Change-Id: I1b620bc041e1293234ddfd789e0ce8892dc87169
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114561
    Tested-by: Jean-Pierre Ledure <jp at ledure.be>
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp at ledure.be>

diff --git a/wizards/source/scriptforge/python/scriptforge.py b/wizards/source/scriptforge/python/scriptforge.py
index dfca66cb0b89..bcd047ba7fa1 100644
--- a/wizards/source/scriptforge/python/scriptforge.py
+++ b/wizards/source/scriptforge/python/scriptforge.py
@@ -105,7 +105,7 @@ class ScriptForge(object, metaclass = _Singleton):
     Version = '7.2'  # Actual version number
     #
     # Basic dispatcher for Python scripts
-    basicdispatcher = '@application:ScriptForge.SF_PythonHelper._PythonDispatcher'
+    basicdispatcher = '@application#ScriptForge.SF_PythonHelper._PythonDispatcher'
     # Python helper functions module
     pythonhelpermodule = 'ScriptForgeHelper.py'
     #
@@ -170,7 +170,7 @@ class ScriptForge(object, metaclass = _Singleton):
                 url = 'uno:%s;urp;StarOffice.ComponentContext' % conn
                 ctx = resolver.resolve(url)
             except Exception:  # thrown when LibreOffice specified instance isn't started
-                raise ConnectionError(
+                raise SystemExit(
                     'Connection to LibreOffice failed (host = ' + hostname + ', port = ' + str(port) + ')')
             return ctx
         elif len(hostname) == 0 and port == 0:  # Usual interactive mode
@@ -198,9 +198,9 @@ class ScriptForge(object, metaclass = _Singleton):
                 "application"            a shared library                               (BASIC)
                 "share"                  a library of LibreOffice Macros                (PYTHON)
             :param script: Either
-                    [@][scope:][library.]module.method - Must not be a class module or method
+                    [@][scope#][library.]module.method - Must not be a class module or method
                         [@] means that the targeted method accepts ParamArray arguments (Basic only)
-                    [scope:][directory/]module.py$method - Must be a method defined at module level
+                    [scope#][directory/]module.py$method - Must be a method defined at module level
             :return: the value returned by the invoked script, or an error if the script was not found
             """
 
@@ -218,26 +218,26 @@ class ScriptForge(object, metaclass = _Singleton):
                 script = script[1:]
                 paramarray = True
             scope = ''
-            if ':' in script:
-                scope, script = script.split(':')
+            if '#' in script:
+                scope, script = script.split('#')
             if '.py$' in script.lower():  # Python
                 if len(scope) == 0:
                     scope = 'share'     # Default for Python
-                uri = 'vnd.sun.star.script:' + script + '?language=Python&location=' + scope
+                uri = 'vnd.sun.star.script:{0}?language=Python&location={1}'.format(script, scope)
             else:  # Basic
                 if len(scope) == 0:
                     scope = 'application'     # Default for Basic
                 lib = ''
                 if len(script.split('.')) < 3:
                     lib = cls.library + '.'     # Default library = ScriptForge
-                uri = 'vnd.sun.star.script:' + lib + script + '?language=Basic&location=' + scope
+                uri = 'vnd.sun.star.script:{0}{1}?language=Basic&location={2}'.format(lib, script, scope)
             # Get the script object
             fullscript = ('@' if paramarray else '') + scope + ':' + script
             try:
                 xscript = cls.scriptprovider.getScript(uri)
             except Exception:
-                raise SystemExit('The script ' + "'" + script + "'"
-                                 + ' could not be located in your LibreOffice installation')
+                raise RuntimeError(
+                    'The script \'{0}\' could not be located in your LibreOffice installation'.format(script))
         else:  # Should not happen
             return None
 
@@ -883,6 +883,30 @@ class SFScriptForge:
             param = '\t'.join(list(map(repr, args))).expandtabs(tabsize = 4)
             return self.ExecMethod(self.vbMethod, 'DebugPrint', param)
 
+        @classmethod
+        def PythonShell(cls, variables = None):
+            """
+                Open an APSO python shell window - Thanks to its author Hanya
+                :param variables: Use PythonShell.(loc = globals()) to push the global dictionary to the shell window
+                """
+            if variables is None:
+                variables = locals()
+            # Is APSO installed ?
+            ctx = ScriptForge.componentcontext
+            ext = ctx.getByName('/singletons/com.sun.star.deployment.PackageInformationProvider')
+            apso = 'apso.python.script.organizer'
+            if len(ext.getPackageLocation(apso)) > 0:
+                # Directly derived from apso.oxt|python|scripts|tools.py$console
+                # we need to load apso before import statement
+                ctx.ServiceManager.createInstance('apso.python.script.organizer.impl')
+                # now we can use apso_utils library
+                from apso_utils import console
+                kwargs = {'loc': variables}
+                kwargs['loc'].setdefault('XSCRIPTCONTEXT', uno)
+                console(**kwargs)
+            else:
+                raise RuntimeError('The APSO extension could not be located in your LibreOffice installation')
+
         @classmethod
         def RaiseFatal(cls, errorcode, *args):
             """
@@ -1157,7 +1181,7 @@ class SFScriptForge:
 
         @classmethod
         def ExecutePythonScript(cls, scope = '', script = '', *args):
-            return cls.SIMPLEEXEC(scope + ':' + script, *args)
+            return cls.SIMPLEEXEC(scope + '#' + script, *args)
 
         def HasUnoMethod(self, unoobject, methodname):
             return self.ExecMethod(self.vbMethod, 'HasUnoMethod', unoobject, methodname)
@@ -1958,7 +1982,8 @@ def CreateScriptService(service, *args):
     if len(args) == 0:
         serv = ScriptForge.InvokeBasicService('SF_Services', SFServices.vbMethod, 'CreateScriptService', service)
     else:
-        serv = ScriptForge.InvokeBasicService('SF_Services', SFServices.vbMethod, 'CreateScriptService', service, *args)
+        serv = ScriptForge.InvokeBasicService('SF_Services', SFServices.vbMethod, 'CreateScriptService',
+                                              service, *args)
     return serv
 
 


More information about the Libreoffice-commits mailing list