Volání skriptů Pythonu z Basicu

Z maker LibreOffice Basic je možné volat skripty Pythonu a díky tomu lze přistupovat k užitečným funkcím jako například:

tip

Pokud chcete volat volat z jazyka LibreOfficeBasicu jazyky jiné (Python, JavaScript nebo jiný skripitovací jazyk), je vhodné, abyste měli odpovídající znalost Basicu a rozhraní pro programování aplikací (API).


Získávání skriptů Pythonu

Skripty Pythonu mohou být osobní, sdílené nebo vložené v dokumentech. Chcete-li je spouštět, je nutné jazyku LibreOffice Basic poskytnout informaci o jejich umístění. Toho dosáhnete pomocí rozhraní com.sun.star.script.provider.XScript, které odpovídá objektům UNO:


         Option Explicit
             
         Public Function GetPythonScript(macro As String, _
                 Optional location As String) As com.sun.star.script.provider.Xscript
             ''' Získá objekt se skriptem Pythonu před spuštěním
             ' Argumenty:
             '    macro   : jako "library/module.py$macro" nebo "module.py$macro"
             '    location: jako "document", "share", "user" nebo ENUM(eration)
             ' Výsledek:
             '    služba UNO com.sun.star.script.provider.XScript s umístěním'''
             If IsMissing(location) Then location = "user"
             Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
             Dim sp As Object ' kompatibilní s com.sun.star.script.provider.XScriptProvider
             Dim uri As String
             If location="document" Then
                 sp = ThisComponent.getScriptProvider()
             Else
                 mspf = CreateUNOService("com.sun.star.script.provider.MasterScriptProviderFactory")
                 sp = mspf.createScriptProvider("")
             End If
             uri = "vnd.sun.star.script:"& macro &"?language=Python&location="& location
             GetPythonScript = sp.getScript(uri)
         End Function ' GetPythonScript
      

Spouštění skriptů Pythonu

The LibreOffice Application Programming Interface (API) Scripting Framework supports inter-language script execution between Python and Basic, or other supported programming languages for that matter. Arguments can be passed back and fourth across calls, providing they represent primitives data types that both languages recognize, and assuming that the Scripting Framework converts them appropriately.

Syntaxe

workstation_name = script.invoke(Array(), Array(), Array())

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out je typu Array

file_len = script.invoke(Array(systemFilePath), Array(), Array())

normalizedPath = script.invoke(Array(systemFilePath), Array(), Array())

Příklady vložených skriptů

Níže uvedené programy ComputerName a GetFilelen volají odpovídající kód v Pythonu, a to s využitím výše zmíněné funkce GetPythonScript. V kódu není uvažováno zpracování chyb.


         Option Explicit
         Option Compatible ' zapnutí podpory Properties
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get ComputerName As String
             '''Název počítače'''
             scr = GetPythonScript("Platform.py$computer_name", "document")
             ComputerName = scr.invoke(Array(), Array(), Array())
         End Property ' ComputerName
             
         Private Function GetFilelen(systemFilePath As String) As Currency
             '''Velikost souboru v bajtech'''
             scr = GetPythonScript("Os/Path.py$get_size", Script.ISEMBEDDED)
             GetFilelen = scr.invoke(Array(systemFilePath), Array(), Array(),)
         End Function ' GetFilelen
             
         Private Type _SCRIPT_LOCATION
             ISEMBEDDED As String ' skript v dokumentu
             ISPERSONAL As String ' uživatelský skript
             ISSHARED As String ' makro LibreOffice
         End Type ' _SCRIPT_LOCATION
             
         Public Function Script() As Object ' Text enumeration
             Static enums As _SCRIPT_LOCATION : With enums
             If .ISEMBEDDED = "" Then
                 .ISEMBEDDED = "document" ' skript v dokumentu
                 .ISPERSONAL = "user" ' uživatelský skript
                 .ISSHARED = "share" ' makro LibreOffice
             End If : End With ' enums
             Script = enums
         End Function ' Script
      

Volají se dva různé moduly Pythonu. Tu mohou být buď vloženy do aktuálního dokumenty, nebo být uloženy v souborovém systému. Pro přehlednost je vynechána kontrola typu argumentů:


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
          
         import platform
          
         def computer_name() -> str:
             return platform.node()
          
         def OSname() -> str:
             return platform.system()
      

         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
          
         import os.path
          
         def get_size(systemFilePath: str) -> str:
             return str(os.path.getsize(systemFilePath))
          
         def normalyze(systemPath: str) -> str:
             return os.path.normpath(systemPath)
      

Příklady osobních nebo sdílených skriptů

Způsob volání osobních nebo sdílených skriptů Pythonu je stejný jako u vložených skriptů. Názvy knihoven jsou namapovány na složky. Cesty k souborům uživatelského profilu LibreOffice a sdílených modulů lze zjistit tak, jak je popsáno na stránce Zjištění informací o relaci. Níže uvedené programy OSName, HelloWorld a NormalizePath volají odpovídající kód v Pythonu, a to s využitím výše zmíněné funkce GetPythonScript. V kódu není uvažováno zpracování chyb.


         Option Explicit
         Option Compatible ' zapnutí podpory Properties
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get OSName As String
             '''Název platformy jako "Linux", "Darwin" nebo "Windows"'''
             scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
             OSName = scr.invoke(Array(), Array(), Array()) 
         End Property ' OSName
             
         Private Sub HelloWorld()
             '''Příklad sdíleného skriptu Pythonu v LibreOffice'''
             scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
             scr.invoke(Array(), Array(), Array(),)
         End Sub ' HelloWorld
             
         Public Function NormalizePath(systemFilePath As String) As String
             '''Odstraní z řetězce s cestou nadbytečné '\..''''
             scr = GetPythonScript("Os/Path.py$normalyze", "user")
             NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
         End Function ' NormalizePath
      

Standardní moduly Pythonu

Python, který je součástí LibreOffice, obsahuje řadu užitečných standardních knihoven, které pokrývají širokou škálu funkcí. Mimo jiné se jedná o knihovny: