Использование stdout shell скриптов в OOo макросах [MEMO]

Автор smaharbA, 26 ноября 2010, 19:37

0 Пользователи и 1 гость просматривают эту тему.

Hubbitus

Цитата: convas от 30 января 2011, 20:25PS. Это вариант для Windows, но для Linux делается аналогично.
И с передачей файла с макросом будете пользователю всегда давать ссылку на эту инструкцию чтобы он смог себе настроить систему!?

Рыбка Рио

Скрипт можно создать макросом, в случае, если его нет. И кстати, лучше наверное, его создать в папке user - тогда он будет в списке макросов Питона в "Мои макросы" (см. файл создаёт макрос Python (если его нет) и запускает его.odt)

Dim sf As Object
   
Sub Main
'    Globalscope.BasicLibraries.LoadLibrary( "MRILib" )
   scripturl=createUnoService("com.sun.star.util.PathSubstitution").getSubstituteVariableValue("$(user)") & "/Scripts/python/mynewscript2.py"
    script = ConvertFromURL(scripturl)

    sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
    If not sf.exists(scripturl) then CreatePythonScript(script)
'    mri sf
    script="mynewscript2.py"
    script = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory").createScriptProvider("")._
        getScript("vnd.sun.star.script:" & script & "$hi?language=Python&location=user")
    script.invoke(array(), array(), array())
End Sub

Sub CreatePythonScript (script As String)
    fileStream = sf.openFileWrite(script)
    fileStream.truncate()
    mytext = createUnoService("com.sun.star.io.TextOutputStream")
    mytext.OutputStream = fileStream
    mytext.WriteString("#!" & chr(10) & "# -*- coding: UTF-8 -*-" & chr(10) & "def hi( ):" & chr(10) & chr(9) & "XSCRIPTCONTEXT.getDocument().Text.End.String = 'привет от Питона! '" & chr(10) & chr(9) & "return None")
    fileStream.closeOutput
    mytext.closeOutput
End Sub


[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

А чтобы в Windows и Linux одновременно работало в нужной кодировке (иначе Питон пишет абракадабру в Windows), пришлось кое-что подправить в последей процедуре:

Sub CreatePythonScript (script As String)
   sep=getPathSeparator()
   If sep = "\" then sEncoding="Windows-1251" else sEncoding="UTF-8"
   fileStream = sf.openFileWrite(script)
   fileStream.truncate()
   mytext = createUnoService("com.sun.star.io.TextOutputStream")
   mytext.OutputStream = fileStream
   mytext.Encoding = sEncoding
   mytext.WriteString("#!" & chr(10) & "# -*- coding: " & sEncoding & " -*-" & chr(10) & "def hi( ):" & chr(10) & chr(9) & "XSCRIPTCONTEXT.getDocument().Text.End.String = 'привет от Питона! '" & chr(10) & chr(9) & "return None")
   fileStream.closeOutput
   mytext.closeOutput
End Sub




[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

convas

Цитата: Клио от 30 января 2011, 22:49А чтобы в Windows и Linux одновременно работало в нужной кодировке (иначе Питон пишет абракадабру в Windows), пришлось кое-что подправить в последей процедуре:

Не помогло.


[вложение удалено Администратором]

Рыбка Рио

Цитата: convas от 30 января 2011, 22:58Не помогло.
А вы скрипт не забыли удалить из Scripts/python/mynewscript2.py? Он наверное старым остался.
ubuntu 12.04 + LibO3.6.0

convas

Цитата: Клио от 30 января 2011, 23:00А вы скрипт не забыли удалить из Scripts/python/mynewscript2.py? Он наверное старым остался.
Конечно, забыл.


Рыбка Рио

Оказывается, всё намного проще. Нужно добавить "u" перед 'Привет от Питона' - тогда работает и в Windows и в Linux одновременно.

Sub CreatePythonScript (script As String)
   fileStream = sf.openFileWrite(script)
   fileStream.truncate()
   mytext = createUnoService("com.sun.star.io.TextOutputStream")
   mytext.OutputStream = fileStream
   mytext.WriteString("#!" & chr(10) & "# -*- coding: UTF-8 -*-" & chr(10) & "def hi( ):" & chr(10) & chr(9) & "XSCRIPTCONTEXT.getDocument().Text.End.String = u'привет от Питона! '" & chr(10) & chr(9) & "return None")
   fileStream.closeOutput
   mytext.closeOutput
End Sub



[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

raptor

Это все уже больше подходит к теме "Макросы Python"

Рыбка Рио

Метод пригодился для использования скриптов на Питоне в расширениях - Добрый день! Недавно познакомилась с OOo Calc. Проблема: ....

Используемый там код для запуска скрипта search_in_calc.py:
# -*- encoding: UTF-8 -*--*-
import uno, unohelper, os
from com.sun.star.task import XJobExecutor

class SIC(unohelper.Base, XJobExecutor):
def __init__(self, ctx):
self.ctx = ctx
self.smgr = self.ctx.ServiceManager

def trigger(self,args):
pip_name = '/singletons/com.sun.star.deployment.PackageInformationProvider'
if self.ctx.hasByName(pip_name):
script = unohelper.fileUrlToSystemPath(u'%s/search_in_calc.py' % self.ctx.getByName(pip_name).getPackageLocation('vnd.search_in_calc'))
ptsb = self.smgr.createInstanceWithContext('com.sun.star.util.PathSubstitution', self.ctx)
user = ptsb.getSubstituteVariableValue('$(user)')
mg = unohelper.fileUrlToSystemPath(user + "/Scripts/python")
sep=os.path.sep
pscript=''
for c in mg.split(sep):
pscript=pscript + '..' + sep
fst = mg.split(sep)[0]
if len(fst)==2 and fst[1]==':':
script=script[2:]
pscript=pscript[3:]
script = pscript+script
script = script.replace(sep,'/')
self.run1(script)

def run1(self, script):
smgr = self.smgr
mspf = smgr.createInstanceWithContext('com.sun.star.script.provider.MasterScriptProviderFactory',self.ctx)
sp = mspf.createScriptProvider('')
scr = sp.getScript('vnd.sun.star.script:' + script + '$main?language=Python&location=user')
array1=[]
array2=[]
array3=[]
scr.invoke(array1, array2, array3)

# user input something like servicename, structname...

# pythonloader looks for a static g_ImplementationHelper variable
g_ImplementationHelper = unohelper.ImplementationHelper()

g_ImplementationHelper.addImplementation(SIC, 'vnd.search_in_calc', ('com.sun.star.task.Job',),)
ubuntu 12.04 + LibO3.6.0

smaharbA

если что, то в виндузе в командной строке могут работать все известные кодировки, вплоть до бигюникод-ххх
Я конечно далек от мысли... (с)

Hubbitus

Теоретически могут, но для юнгикода даже ключ должен быть специальный при запуске:
http://stackoverflow.com/questions/1259084/what-encoding-code-page-is-cmd-exe-using

И с юникодом у них всегда были проблемы. Не знаю, может в последних версиях типа 7 наконец исправили...

smaharbA

не теоретически, а практически и не нужно никаких ключей хоть для уникод-биг
даже перекодировку текста делается чисто штатными средствами командной строки, без утилит одним эхом
Я конечно далек от мысли... (с)

dr.Faust

Цитата: smaharbA от 11 марта 2011, 21:46даже перекодировку текста делается чисто штатными средствами командной строки, без утилит одним эхом
Ага, а ещё эхом можно загнать в файл код фотошопа и будет фотошоп в батнике...
Свобода информации - свобода личности!

smaharbA

в целом можно, точно так делал джетдирект в пакетнике, в нем совмещенный код командной строки и джаваскрипт и приклеен исполняемый файл в бейс64 (никаких сторонних приблуд для работы, хотя конечно приблуда сам пакетник и есть)

а перекодировка (конечно не иконв или рекоде, и есть ограниченость некотороя, но всеж таки)

@echo off
setlocal ENABLEDELAYEDEXPANSION
set file=con
if /i "%1"=="utf8" (
set code=65001
) else if /i "%1"=="cp1251" (
set code=1251
) else if /i "%1"=="cp866" (
set code=866
) else if /i "%1"=="iso-8859-5" (
set code=28595
) else if /i "%1"=="koi8-r" (
set code=20866
) else if not "%1"=="" (
set code=%1
) else (
set code=1251
)
if exist "%2" (
set file=%2
) else (
echo Не верное имя файла %2
goto :eof
)
<nul set /p x=> %file%.%code%
for /f "delims=" %%i in (%file%) do (
set "txt=%%i"
set "txt=!txt:|=^|!"
set "txt=!txt:>=^>!"
set "txt=!txt:<=^<!"
set "txt=!txt:^!=^^!!"
set "txt=!txt:&=^&!"
chcp %code%| set /p "x=!txt!"
echo.
<nul set /p x=.> con
) >> %file%.%code%

Я конечно далек от мысли... (с)