Add support for show in main application
This commit is contained in:
parent
fe825d4c80
commit
06dd86b77e
|
@ -1,3 +1,9 @@
|
||||||
|
v 0.3.0 [15-oct-2019]
|
||||||
|
---------------------
|
||||||
|
- Add menus in start application.
|
||||||
|
- Update easymacro.py
|
||||||
|
|
||||||
|
|
||||||
v 0.2.0 [27-sep-2019]
|
v 0.2.0 [27-sep-2019]
|
||||||
---------------------
|
---------------------
|
||||||
- Update easymacro.py
|
- Update easymacro.py
|
||||||
|
|
28
conf.py
28
conf.py
|
@ -26,7 +26,7 @@ import logging
|
||||||
TYPE_EXTENSION = 1
|
TYPE_EXTENSION = 1
|
||||||
|
|
||||||
# ~ https://semver.org/
|
# ~ https://semver.org/
|
||||||
VERSION = '0.2.0'
|
VERSION = '0.3.0'
|
||||||
|
|
||||||
# ~ Your great extension name, not used spaces
|
# ~ Your great extension name, not used spaces
|
||||||
NAME = 'ZAZFavorites'
|
NAME = 'ZAZFavorites'
|
||||||
|
@ -184,7 +184,6 @@ FILES = {
|
||||||
'update': f'{NAME.lower()}.update.xml',
|
'update': f'{NAME.lower()}.update.xml',
|
||||||
'addin': 'CalcAddIn.xcu',
|
'addin': 'CalcAddIn.xcu',
|
||||||
'shortcut': 'Accelerators.xcu',
|
'shortcut': 'Accelerators.xcu',
|
||||||
'jobs': 'Jobs.xcu',
|
|
||||||
'easymacro': True,
|
'easymacro': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,6 +205,7 @@ PATHS = {
|
||||||
'regmerge': '/usr/lib/libreoffice/program/regmerge',
|
'regmerge': '/usr/lib/libreoffice/program/regmerge',
|
||||||
'soffice': ('soffice', PROGRAM, FILE_TEST),
|
'soffice': ('soffice', PROGRAM, FILE_TEST),
|
||||||
'install': ('unopkg', 'add', '-v', '-f', '-s'),
|
'install': ('unopkg', 'add', '-v', '-f', '-s'),
|
||||||
|
'profile': '/home/mau/.config/libreoffice/4/user',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -428,21 +428,6 @@ FILE_ADDONS = f"""<?xml version='1.0' encoding='UTF-8'?>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
NODE_ADDONS = '\n <manifest:file-entry manifest:full-path="Addons.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>'
|
|
||||||
if TYPE_EXTENSION > 1:
|
|
||||||
NODE_ADDONS = f'\n <manifest:file-entry manifest:full-path="{FILES["rdb"]}" manifest:media-type="application/vnd.sun.star.uno-typelibrary;type=RDB"/>'
|
|
||||||
if TYPE_EXTENSION == 3:
|
|
||||||
NODE_ADDONS += '\n <manifest:file-entry manifest:full-path="CalcAddIn.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>'
|
|
||||||
|
|
||||||
FILE_MANIFEST = f"""<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<manifest:manifest>
|
|
||||||
<manifest:file-entry manifest:full-path="{FILES['py']}" manifest:media-type="application/vnd.sun.star.uno-component;type=Python"/>
|
|
||||||
<manifest:file-entry manifest:full-path="Office/{FILES['shortcut']}" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
|
||||||
<manifest:file-entry manifest:full-path="Office/{FILES['jobs']}" manifest:media-type="application/vnd.sun.star.configuration-data"/>{NODE_ADDONS}
|
|
||||||
</manifest:manifest>
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
FILE_UPDATE = ''
|
FILE_UPDATE = ''
|
||||||
if URL_XML_UPDATE:
|
if URL_XML_UPDATE:
|
||||||
FILE_UPDATE = f"""<?xml version="1.0" encoding="UTF-8"?>
|
FILE_UPDATE = f"""<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
@ -627,9 +612,16 @@ FILE_SHORTCUTS = f"""<?xml version="1.0" encoding="UTF-8"?>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
DATA_MANIFEST = [FILES['py'], f"Office/{FILES['shortcut']}", 'Addons.xcu']
|
||||||
|
if TYPE_EXTENSION > 1:
|
||||||
|
DATA_MANIFEST.append(FILES['rdb'])
|
||||||
|
if TYPE_EXTENSION == 3:
|
||||||
|
DATA_MANIFEST.append('CalcAddIn.xcu')
|
||||||
|
|
||||||
|
|
||||||
DATA = {
|
DATA = {
|
||||||
'py': FILE_PY,
|
'py': FILE_PY,
|
||||||
'manifest': FILE_MANIFEST,
|
'manifest': DATA_MANIFEST,
|
||||||
'description': FILE_DESCRIPTION,
|
'description': FILE_DESCRIPTION,
|
||||||
'addons': FILE_ADDONS,
|
'addons': FILE_ADDONS,
|
||||||
'update': FILE_UPDATE,
|
'update': FILE_UPDATE,
|
||||||
|
|
2319
easymacro.py
2319
easymacro.py
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -1,28 +0,0 @@
|
||||||
<?xml version='1.0' encoding='UTF-8'?>
|
|
||||||
<oor:component-data
|
|
||||||
oor:name="Jobs"
|
|
||||||
oor:package="org.openoffice.Office"
|
|
||||||
xmlns:oor="http://openoffice.org/2001/registry"
|
|
||||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
>
|
|
||||||
<node oor:name="Jobs">
|
|
||||||
<node oor:name="Favorites" oor:op="replace">
|
|
||||||
<prop oor:name="Service" oor:type="xs:string">
|
|
||||||
<value>service:net.elmau.zaz.Favorites</value>
|
|
||||||
</prop>
|
|
||||||
<node oor:name="Arguments">
|
|
||||||
<prop oor:name="first" oor:type="xs:string" oor:op="replace">
|
|
||||||
<value>first</value>
|
|
||||||
</prop>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
<node oor:name="Events">
|
|
||||||
<node oor:name="onFirstVisibleTask" oor:op="fuse">
|
|
||||||
<node oor:name="JobList">
|
|
||||||
<node oor:name="Favorites" oor:op="replace"/>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
</oor:component-data>
|
|
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest:manifest>
|
<manifest:manifest manifest:version="1.2" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
|
||||||
<manifest:file-entry manifest:full-path="ZAZFavorites.py" manifest:media-type="application/vnd.sun.star.uno-component;type=Python"/>
|
<manifest:file-entry manifest:full-path="ZAZFavorites.py" manifest:media-type="application/vnd.sun.star.uno-component;type=Python"/>
|
||||||
<manifest:file-entry manifest:full-path="Office/Accelerators.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
<manifest:file-entry manifest:full-path="Office/Accelerators.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
||||||
<manifest:file-entry manifest:full-path="Office/Jobs.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
<manifest:file-entry manifest:full-path="Addons.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
||||||
<manifest:file-entry manifest:full-path="Addons.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
|
||||||
</manifest:manifest>
|
</manifest:manifest>
|
||||||
|
|
|
@ -70,9 +70,8 @@ class Controllers(object):
|
||||||
'After': '.uno:RecentFileList',
|
'After': '.uno:RecentFileList',
|
||||||
'Submenu': submenus,
|
'Submenu': submenus,
|
||||||
}
|
}
|
||||||
doc = app.get_document()
|
|
||||||
|
|
||||||
for doc_type in ('calc', 'writer'):
|
for doc_type in ('main', 'calc', 'writer'):
|
||||||
app.remove_menu(doc_type, 'File', command)
|
app.remove_menu(doc_type, 'File', command)
|
||||||
app.insert_menu(doc_type, 'File', **data)
|
app.insert_menu(doc_type, 'File', **data)
|
||||||
app.set_config('paths', paths)
|
app.set_config('paths', paths)
|
||||||
|
@ -115,6 +114,7 @@ class ZAZFavorites(unohelper.Base, XJobExecutor):
|
||||||
self.path_ext = app.get_path_extension(ID_EXTENSION)
|
self.path_ext = app.get_path_extension(ID_EXTENSION)
|
||||||
self.IMAGES = app.join(self.path_ext, self.IMAGES)
|
self.IMAGES = app.join(self.path_ext, self.IMAGES)
|
||||||
|
|
||||||
|
@app.catch_exception
|
||||||
def trigger(self, args):
|
def trigger(self, args):
|
||||||
if args == 'config':
|
if args == 'config':
|
||||||
return self._config()
|
return self._config()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<description xmlns="http://openoffice.org/extensions/description/2006" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:d="http://openoffice.org/extensions/description/2006">
|
<description xmlns="http://openoffice.org/extensions/description/2006" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:d="http://openoffice.org/extensions/description/2006">
|
||||||
<identifier value="net.elmau.zaz.Favorites" />
|
<identifier value="net.elmau.zaz.Favorites" />
|
||||||
<version value="0.2.0" />
|
<version value="0.3.0" />
|
||||||
<display-name>
|
<display-name>
|
||||||
<name lang="en">Favorites files</name>
|
<name lang="en">Favorites files</name>
|
||||||
<name lang="es">Archivos favoritos</name>
|
<name lang="es">Archivos favoritos</name>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
185
zaz.py
185
zaz.py
|
@ -19,11 +19,16 @@
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import zipfile
|
||||||
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
from subprocess import call
|
from subprocess import call
|
||||||
import zipfile
|
from xml.etree import ElementTree as ET
|
||||||
|
from xml.dom.minidom import parseString
|
||||||
|
|
||||||
|
|
||||||
from conf import (
|
from conf import (
|
||||||
DATA,
|
DATA,
|
||||||
|
@ -37,6 +42,84 @@ from conf import (
|
||||||
log)
|
log)
|
||||||
|
|
||||||
|
|
||||||
|
class LiboXML(object):
|
||||||
|
TYPES = {
|
||||||
|
'py': 'application/vnd.sun.star.uno-component;type=Python',
|
||||||
|
'zip': 'application/binary',
|
||||||
|
'xcu': 'application/vnd.sun.star.configuration-data',
|
||||||
|
'rdb': 'application/vnd.sun.star.uno-typelibrary;type=RDB',
|
||||||
|
'xcs': 'application/vnd.sun.star.configuration-schema',
|
||||||
|
'help': 'application/vnd.sun.star.help',
|
||||||
|
'component': 'application/vnd.sun.star.uno-components',
|
||||||
|
}
|
||||||
|
NAME_SPACES = {
|
||||||
|
'manifest_version': '1.2',
|
||||||
|
'manifest': 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0',
|
||||||
|
'xmlns:loext': 'urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0',
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._manifest = None
|
||||||
|
self._paths = []
|
||||||
|
|
||||||
|
def _save_path(self, attr):
|
||||||
|
self._paths.append(attr['{{{}}}full-path'.format(self.NAME_SPACES['manifest'])])
|
||||||
|
return
|
||||||
|
|
||||||
|
def _clean(self, name, nodes):
|
||||||
|
has_words = re.compile('\\w')
|
||||||
|
|
||||||
|
if not re.search(has_words, str(nodes.tail)):
|
||||||
|
nodes.tail = ''
|
||||||
|
if not re.search(has_words, str(nodes.text)):
|
||||||
|
nodes.text = ''
|
||||||
|
|
||||||
|
for node in nodes:
|
||||||
|
if name == 'manifest':
|
||||||
|
self._save_path(node.attrib)
|
||||||
|
if not re.search(has_words, str(node.tail)):
|
||||||
|
node.tail = ''
|
||||||
|
if not re.search(has_words, str(node.text)):
|
||||||
|
node.text = ''
|
||||||
|
return
|
||||||
|
|
||||||
|
def new_manifest(self, data):
|
||||||
|
attr = {
|
||||||
|
'manifest:version': self.NAME_SPACES['manifest_version'],
|
||||||
|
'xmlns:manifest': self.NAME_SPACES['manifest'],
|
||||||
|
'xmlns:loext': self.NAME_SPACES['xmlns:loext'],
|
||||||
|
}
|
||||||
|
self._manifest = ET.Element('manifest:manifest', attr)
|
||||||
|
return self.add_data_manifest(data)
|
||||||
|
|
||||||
|
def parse_manifest(self, data):
|
||||||
|
ET.register_namespace('manifest', self.NAME_SPACES['manifest'])
|
||||||
|
self._manifest = ET.fromstring(data)
|
||||||
|
data = {'xmlns:loext': self.NAME_SPACES['xmlns:loext']}
|
||||||
|
self._manifest.attrib.update(**data)
|
||||||
|
self._clean('manifest', self._manifest)
|
||||||
|
return
|
||||||
|
|
||||||
|
def add_data_manifest(self, data):
|
||||||
|
node_name = 'manifest:file-entry'
|
||||||
|
attr = {
|
||||||
|
'manifest:full-path': '',
|
||||||
|
'manifest:media-type': '',
|
||||||
|
}
|
||||||
|
for path in data:
|
||||||
|
if path in self._paths:
|
||||||
|
continue
|
||||||
|
ext = path.split('.')[-1]
|
||||||
|
attr['manifest:full-path'] = path
|
||||||
|
attr['manifest:media-type'] = self.TYPES.get(ext, '')
|
||||||
|
ET.SubElement(self._manifest, node_name, attr)
|
||||||
|
return self._get_xml(self._manifest)
|
||||||
|
|
||||||
|
def _get_xml(self, doc):
|
||||||
|
xml = parseString(ET.tostring(doc, encoding='utf-8'))
|
||||||
|
return xml.toprettyxml(indent=' ', encoding='utf-8').decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
def _exists(path):
|
def _exists(path):
|
||||||
return os.path.exists(path)
|
return os.path.exists(path)
|
||||||
|
|
||||||
|
@ -222,8 +305,11 @@ def _update_files():
|
||||||
target = _join(path_source, 'pythonpath', source)
|
target = _join(path_source, 'pythonpath', source)
|
||||||
copyfile(source, target)
|
copyfile(source, target)
|
||||||
|
|
||||||
|
xml = LiboXML()
|
||||||
|
|
||||||
path = _join(path_source, DIRS['meta'], FILES['manifest'])
|
path = _join(path_source, DIRS['meta'], FILES['manifest'])
|
||||||
_save(path, DATA['manifest'])
|
data = xml.new_manifest(DATA['manifest'])
|
||||||
|
_save(path, data)
|
||||||
|
|
||||||
path = _join(path_source, DIRS['office'])
|
path = _join(path_source, DIRS['office'])
|
||||||
_mkdir(path)
|
_mkdir(path)
|
||||||
|
@ -265,7 +351,96 @@ def _new():
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def _get_info_path(path):
|
||||||
|
path, filename = os.path.split(path)
|
||||||
|
name, extension = os.path.splitext(filename)
|
||||||
|
return (path, filename, name, extension)
|
||||||
|
|
||||||
|
|
||||||
|
def _zip_embed(source, files):
|
||||||
|
PATH = 'Scripts/python/'
|
||||||
|
EASYMACRO = 'easymacro.'
|
||||||
|
|
||||||
|
p, f, name, e = _get_info_path(source)
|
||||||
|
now = datetime.now().strftime('_%Y%m%d_%H%M%S')
|
||||||
|
path_source = _join(p, name + now + e)
|
||||||
|
copyfile(source, path_source)
|
||||||
|
target = source
|
||||||
|
|
||||||
|
with zipfile.PyZipFile(EASYMACRO + 'zip', mode='w') as zf:
|
||||||
|
zf.writepy(EASYMACRO + 'py')
|
||||||
|
|
||||||
|
xml = LiboXML()
|
||||||
|
|
||||||
|
path_easymacro = PATH + EASYMACRO + 'zip'
|
||||||
|
names = [f[1] for f in files] + [path_easymacro]
|
||||||
|
nodes = []
|
||||||
|
with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED) as zt:
|
||||||
|
with zipfile.ZipFile(path_source, compression=zipfile.ZIP_DEFLATED) as zs:
|
||||||
|
for name in zs.namelist():
|
||||||
|
if FILES['manifest'] in name:
|
||||||
|
path_manifest = name
|
||||||
|
xml_manifest = zs.open(name).read()
|
||||||
|
elif name in names:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
zt.writestr(name, zs.open(name).read())
|
||||||
|
|
||||||
|
data = []
|
||||||
|
for path, name in files:
|
||||||
|
data.append(name)
|
||||||
|
zt.write(path, name)
|
||||||
|
|
||||||
|
zt.write(EASYMACRO + 'zip', path_easymacro)
|
||||||
|
data.append(path_easymacro)
|
||||||
|
|
||||||
|
xml.parse_manifest(xml_manifest)
|
||||||
|
xml_manifest = xml.add_data_manifest(data)
|
||||||
|
zt.writestr(path_manifest, xml_manifest)
|
||||||
|
|
||||||
|
os.unlink(EASYMACRO + 'zip')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def _embed(args):
|
||||||
|
PATH = 'Scripts/python'
|
||||||
|
PYTHONPATH = 'pythonpath'
|
||||||
|
|
||||||
|
doc = args.document
|
||||||
|
if not doc:
|
||||||
|
msg = '-d/--document Path file to embed is mandatory'
|
||||||
|
log.error(msg)
|
||||||
|
return
|
||||||
|
if not _exists(doc):
|
||||||
|
msg = 'Path file not exists'
|
||||||
|
log.error(msg)
|
||||||
|
return
|
||||||
|
|
||||||
|
files = []
|
||||||
|
if args.files:
|
||||||
|
files = args.files.split(',')
|
||||||
|
source = _join(PATHS['profile'], PATH)
|
||||||
|
content = os.listdir(source)
|
||||||
|
if PYTHONPATH in content:
|
||||||
|
content.remove(PYTHONPATH)
|
||||||
|
|
||||||
|
if files:
|
||||||
|
files = [(_join(source, f), _join(PATH, f)) for f in files if f in content]
|
||||||
|
else:
|
||||||
|
files = [(_join(source, f), _join(PATH, f)) for f in content]
|
||||||
|
|
||||||
|
_zip_embed(doc, files)
|
||||||
|
|
||||||
|
log.info('Embedded macros successfully...')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
|
if args.embed:
|
||||||
|
_embed(args)
|
||||||
|
return
|
||||||
|
|
||||||
if args.new:
|
if args.new:
|
||||||
_new()
|
_new()
|
||||||
return
|
return
|
||||||
|
@ -279,7 +454,7 @@ def main(args):
|
||||||
if args.install:
|
if args.install:
|
||||||
_install_and_test()
|
_install_and_test()
|
||||||
|
|
||||||
log.info('Extension make sucesfully...')
|
log.info('Extension make successfully...')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@ -290,6 +465,10 @@ def _process_command_line_arguments():
|
||||||
default=False, required=False)
|
default=False, required=False)
|
||||||
parser.add_argument('-n', '--new', dest='new', action='store_true',
|
parser.add_argument('-n', '--new', dest='new', action='store_true',
|
||||||
default=False, required=False)
|
default=False, required=False)
|
||||||
|
parser.add_argument('-e', '--embed', dest='embed', action='store_true',
|
||||||
|
default=False, required=False)
|
||||||
|
parser.add_argument('-d', '--document', dest='document', default='')
|
||||||
|
parser.add_argument('-f', '--files', dest='files', default='')
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue