Обръщения към макроси на Basic от Python

От скриптовете на Python можете да извиквате макроси на LibreOffice Basic, което ви дава достъп до следните важни възможности:

Обкръжението за скриптове (Scripting Framework) на интерфейса за приложно програмиране (API) на LibreOffice поддържа многоезиково изпълнение между Python и Basic, както и между други езици. При обръщенията могат да се предават аргументи в двете посоки, стига да представят разпознавани и от двата езика примитивни типове данни, които Scripting Framework е в състояние да преобразува правилно.

tip

Преди да използвате междуезикови обръщения от Python към Basic, JavaScript или друга скриптова машина, е препоръчително да се запознаете със стандартните модули на Python и възможностите на LibreOffice API.


warning

Когато стартирате скриптове на Python от интегрирана развойна среда (IDE), вградената машина за Basic на LibreOffice може да отсъства. В такъв контекст избягвайте обръщения от Python към LibreOffice Basic. Обкръжението на Python и Universal Networks Objects (UNO) обаче са изцяло достъпни. Вижте Инсталиране на интегрирана развойна среда за Python за повече информация.


Извличане на скриптове на LibreOffice Basic

Макросите на LibreOffice Basic могат да бъдат лични, споделени или вградени в документи. За да ги изпълнява, системата за изпълнение на Python трябва да разполага с местоположенията им. Реализирането на интерфейса com.sun.star.script.provider.XScriptProvider позволява извличането на изпълними скриптове:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Получаваме скриптов обект на Basic преди извикването.'''
		     ctx = uno.getComponentContext()
		     smgr = ctx.ServiceManager
		     if isEmbedded:
		         desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
		         scriptPro = desktop.CurrentComponent.getScriptProvider()
		         location = "document"
		     else:
		         mspf = smgr.createInstanceWithContext(
		             "com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
		         scriptPro = mspf.createScriptProvider("")
		         location = "application"
		     scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
		                  "?language=Basic&location="+location
		     xScript = scriptPro.getScript(scriptName)
		     return xScript
		 

Изпълняване на скриптове на LibreOffice Basic

Документацията на комплекта за разработка на софтуер (SDK) на LibreOffice за интерфейса com.sun.star.script.provider.XScript описва конвенцията за междуезикови обръщения. Извикването на функция изисква три масива:

Синтаксис на Python

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

Примери с лични и споделени скриптове

Примерите във Вход/изход към екрана описват обръщения от Python към Basic. Наблюдение на събития в документите илюстрира използването на идиома *args на Python за отпечатване на променлив брой параметри в конзолния диалог на Access2Base.

tip

По време на разработване можете да прекъсвате изпълнението на скрипт на Python с разширението Xray, за да инспектирате свойствата и методите на UNO обекти. Дебъгерът на разширения APSO позволява интроспекция на обекти чрез разширението Xray или разширението MRI.



	  def xray(myObject):
	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
	  	  script.invoke((myObject,), (), ())
	  

Примери с вградени скриптове в документи

Опростеният синтаксис *args на Python може да бъде използван с подпрограми на LibreOffice Basic, които приемат променлив брой аргументи. По-долу функциите Print и SUM на Python извикват съответствията си от Basic Print и SUM с помощта на гореспоменатата функция getBasicScript. Обработката на изключения не е показана.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Извежда указаните низови или числови изрази в диалогов прозорец."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """Сумира указания числов израз."""
	      xScript = getBasicScript("SUM", "Scripting", embedded=True)
	      res = xScript.invoke((args), (), ())
	      return res[0]
	      
	  # def getBasicScript()  # see above
	      
	  def playWithArgs():
	      Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
	      Print(SUM(45, -9.81, 297864.681974))
	      Print(SUM(45, -9.81, 297864.681974, 8762E+137))
	      
	  g_exportedScripts = (playWithArgs,)
	  

Базираните на документ подпрограми Print и SUM на LibreOffice Basic приемат променлив брой аргументи. Атрибутите Private или Public не действат. За яснота е пропусната проверката на типа на аргументите.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Отпечатване на списък с променлив брой елементи '''
	      ' Приемат се всички аргументи, поддържащи преобразуване с CStr().
	      Dim str As String, i As Integer
	      If UBound(args) >= 0 Then
	          For i = 0 To UBound(args)
	              str = str + Cstr(args(i))+ sep 
	          Next i
	      End If
	      Print str
	  End Sub ' Standard.Scripting.Print()
	      
	  Public Function SUM(ParamArray args() As Variant) As Variant
	      ''' Сумиране на променлив брой числа '''
	      Dim ndx As Integer
	      If UBound(args) >= 0 Then
	          For ndx = 0 To UBound(args)
	              SUM = SUM + args(ndx)
	          Next ndx
	      End If
	  End Function ' Standard.Scripting.SUM()
	  

Моля, подкрепете ни!