Initial commit

This commit is contained in:
2026-09-11 12:47:00 +02:00
parent a25c7b46f5
commit d108f863e0
24 changed files with 2498 additions and 15 deletions

109
synopse_handler.py Normal file
View File

@@ -0,0 +1,109 @@
# -*- coding: utf-8 -*-
"""Protocol Handler der Erweiterung 'Synopse'."""
import traceback
import unohelper
from com.sun.star.frame import XDispatchProvider, XDispatch
from com.sun.star.lang import XServiceInfo, XInitialization
from synopse.redline_model import extract_blocks
from synopse.builder import build
from synopse import compare as compare_mod
from synopse.dialog import show_options, show_compare_options, message
from synopse.i18n import set_language, t
IMPL_NAME = "de.example.synopse.ProtocolHandler"
PROTOCOL = "de.example.synopse:"
def run(ctx):
set_language(ctx)
desktop = ctx.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", ctx)
doc = desktop.getCurrentComponent()
if doc is None or not doc.supportsService("com.sun.star.text.TextDocument"):
message(ctx, t("msg.nodoc"))
return
try:
_blocks, edit_authors, note_authors = extract_blocks(doc)
if not edit_authors and not note_authors:
message(ctx, t("msg.nochanges"))
return
opts = show_options(ctx, edit_authors, note_authors)
if opts is None:
return
build(ctx, doc, opts)
except Exception as exc: # pragma: no cover
message(ctx, t("msg.error.build", exc, traceback.format_exc()))
def run_compare(ctx):
set_language(ctx)
desktop = ctx.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", ctx)
docs = compare_mod.open_documents(ctx)
if len(docs) < 2:
message(ctx, t("msg.twodocs"))
return
try:
choice = show_compare_options(ctx, docs, desktop.getCurrentComponent())
if choice is None:
return
source, target, opts = choice
compare_mod.build(ctx, source, target, opts)
except Exception as exc: # pragma: no cover
message(ctx, t("msg.error.compare", exc, traceback.format_exc()))
class SynopseHandler(unohelper.Base, XServiceInfo, XDispatchProvider,
XDispatch, XInitialization):
def __init__(self, ctx):
self.ctx = ctx
self.frame = None
# XInitialization
def initialize(self, args):
if args:
self.frame = args[0]
# XServiceInfo
def getImplementationName(self):
return IMPL_NAME
def supportsService(self, name):
return name == "com.sun.star.frame.ProtocolHandler"
def getSupportedServiceNames(self):
return ("com.sun.star.frame.ProtocolHandler",)
# XDispatchProvider
def queryDispatch(self, url, target_frame, search_flags):
if url.Protocol == PROTOCOL:
return self
return None
def queryDispatches(self, requests):
return tuple(self.queryDispatch(r.FeatureURL, r.FrameName,
r.SearchFlags) for r in requests)
# XDispatch
def dispatch(self, url, args):
if url.Protocol != PROTOCOL:
return
if url.Path == "run":
run(self.ctx)
elif url.Path == "compare":
run_compare(self.ctx)
def addStatusListener(self, control, url):
pass
def removeStatusListener(self, control, url):
pass
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(
SynopseHandler, IMPL_NAME, ("com.sun.star.frame.ProtocolHandler",))