From cca66b9ec4e494c1d919bff0f71a820d8afab1fa Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 20:24:48 +0200 Subject: Adding upstream version 1.2.2. Signed-off-by: Daniel Baumann --- share/extensions/jessyink_summary.py | 172 +++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100755 share/extensions/jessyink_summary.py (limited to 'share/extensions/jessyink_summary.py') diff --git a/share/extensions/jessyink_summary.py b/share/extensions/jessyink_summary.py new file mode 100755 index 0000000..698abbf --- /dev/null +++ b/share/extensions/jessyink_summary.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python +# +# Copyright 2008, 2009 Hannes Hochreiner +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +"""Effect to print out jessyInk summary""" + +from collections import defaultdict +import inkex + +from jessyink_install import JessyInkMixin, _ + + +class Summary(JessyInkMixin, inkex.EffectExtension): + """Print of jessyInk summary""" + + def add_arguments(self, pars): + pars.add_argument("--tab") + + def effect(self): + self.is_installed() + + # Find the script node, if present + for node in self.svg.xpath("//svg:script[@id='JessyInk']"): + version = node.get("jessyink:version") + if version: + self.msg(_("JessyInk script version {} installed.".format(version))) + else: + self.msg(_("JessyInk script installed.")) + + slides = [] + master_slide = None + + for node in self.svg.descendants().get(inkex.Layer): + if node.get("jessyink:master_slide"): + master_slide = node + else: + slides.append(node) + + if master_slide is not None: + self.msg(_("\nMaster slide:")) + self.describe_node( + master_slide, + "\t", + ["", len(slides), ""], + ) + + for i, slide in enumerate(slides): + self.msg(_("\nSlide {0!s}:").format(i + 1)) + self.describe_node(slide, "\t", [i + 1, len(slides), slide.label]) + + def describe_node(self, node, prefix, dat): + """Standard print out formatter""" + + self.msg(_(f"{prefix}Layer name: {node.label}")) + self.describe_transition(node, prefix, "In") + self.describe_transition(node, prefix, "Out") + self.describe_autotext(node, prefix, dat) + self.describe_effects(node, prefix) + + def describe_transition(self, node, prefix, transition): + """Display information about transitions.""" + trans = inkex.Style(node.get(f"jessyink:transition{transition}")) + if trans: + name = trans["name"] + if name != "appear" and "length" in trans: + length = int(trans["length"] / 1000.0) + self.msg( + _( + "{0}Transition {1}: {2} ({3!s} s)".format( + prefix, transition, name, length + ) + ) + ) + else: + self.msg(_(f"{prefix}Transition {transition}: {name}")) + + def describe_autotext(self, node, prefix, dat): + """Display information about auto-texts.""" + auto_texts = {"slide_num": dat[0], "num": dat[1], "title": dat[2]} + for x, child in enumerate(node.xpath(".//*[@jessyink:autoText]")): + if not x: + self.msg(_("\n{0}Auto-texts:").format(prefix)) + + pid = child.getparent().get("id") + val = auto_texts[child.get("jessyink:autoText")] + self.msg( + _( + _('{0}\t"{1}" (object id "{2}") will be replaced by "{3}".').format( + prefix, child.text, pid, val + ) + ) + ) + + def describe_effects(self, node, prefix): + """Display information about effects.""" + effects = sorted(self.collect_effects(node), key=lambda val: val[0]) + for x, (enum, effect) in enumerate(effects): + ret = "" + + order = effect[0]["order"] + if not x: + ret += _("\n{0}Initial effect (order number {1}):").format( + prefix, order + ) + else: + ret += _("\n{0}Effect {1} (order number {2}):").format( + prefix, enum, order + ) + + for item in effect: + eid = item["id"] + if item["type"] == "view": + ret += _('{0}\tView will be set according to object "{1}"').format( + prefix, eid + ) + else: + ret += _('{0}\tObject "{1}"').format(prefix, eid) + + if item["direction"] == "in": + ret += _(" will appear") + elif item["direction"] == "out": + ret += _(" will disappear") + + if item["name"] != "appear": + ret += _(' using effect "{0}"').format(item["name"]) + + if "length" in item: + ret += _(" in {0!s} s").format(int(item["length"]) / 1000.0) + + self.msg(ret + ".\n") + + @staticmethod + def collect_effects(node): + """Collect information about effects.""" + effects = defaultdict(list) + for child in node.xpath(".//*[@jessyink:effectIn]"): + effect_data = inkex.Style(child.get("jessyink:effectIn")) + effect_data["direction"] = "in" + effect_data["id"] = child.get("id") + effect_data["type"] = "effect" + effects[effect_data["order"]].append(effect_data) + + for child in node.xpath(".//*[@jessyink:effectOut]"): + effect_data = inkex.Style(child.get("jessyink:effectOut")) + effect_data["direction"] = "out" + effect_data["id"] = child.get("id") + effect_data["type"] = "effect" + effects[effect_data["order"]].append(effect_data) + + for child in node.xpath(".//*[@jessyink:view]"): + effect_data = inkex.Style(child.get("jessyink:view")) + effect_data["id"] = child.get("id") + effect_data["type"] = "view" + effects[effect_data["order"]].append(effect_data) + return effects + + +if __name__ == "__main__": + Summary().run() -- cgit v1.2.3