diff options
Diffstat (limited to 'lib/extensions/base.py')
| -rw-r--r-- | lib/extensions/base.py | 97 |
1 files changed, 9 insertions, 88 deletions
diff --git a/lib/extensions/base.py b/lib/extensions/base.py index 7b3c6f1c..e381e2c1 100644 --- a/lib/extensions/base.py +++ b/lib/extensions/base.py @@ -3,112 +3,33 @@ # Copyright (c) 2010 Authors # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. -import json import os -import re -from collections.abc import MutableMapping -from lxml import etree +import inkex from lxml.etree import Comment from stringcase import snakecase -import inkex - from ..commands import is_command, layer_commands from ..elements import EmbroideryElement, nodes_to_elements from ..elements.clone import is_clone from ..i18n import _ from ..marker import has_marker +from ..metadata import InkStitchMetadata from ..svg import generate_unique_id from ..svg.tags import (CONNECTOR_TYPE, EMBROIDERABLE_TAGS, INKSCAPE_GROUPMODE, NOT_EMBROIDERABLE_TAGS, SVG_CLIPPATH_TAG, SVG_DEFS_TAG, SVG_GROUP_TAG, SVG_MASK_TAG) -from ..utils.settings import DEFAULT_METADATA, global_settings - -SVG_METADATA_TAG = inkex.addNS("metadata", "svg") - - -def strip_namespace(tag): - """Remove xml namespace from a tag name. - - >>> {http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd}namedview - <<< namedview - """ - - match = re.match(r'^\{[^}]+\}(.+)$', tag) - - if match: - return match.group(1) - else: - return tag - - -class InkStitchMetadata(MutableMapping): - """Helper class to get and set inkstitch-specific metadata attributes. - - Operates on a document and acts like a dict. Setting an item adds or - updates a metadata element in the document. Getting an item retrieves - a metadata element's text contents or None if an element by that name - doesn't exist. - """ - - def __init__(self, document): - super().__init__() - self.document = document - self.metadata = document.metadata - - for setting in DEFAULT_METADATA: - if self[setting] is None: - self[setting] = global_settings[f'default_{setting}'] +from ..update import update_inkstitch_document - # Because this class inherints from MutableMapping, all we have to do is - # implement these five methods and we get a full dict-like interface. - def __setitem__(self, name, value): - item = self._find_item(name) - item.text = json.dumps(value) - - def _find_item(self, name, create=True): - tag = inkex.addNS(name, "inkstitch") - item = self.metadata.find(tag) - if item is None and create: - item = etree.SubElement(self.metadata, tag) - - return item - - def __getitem__(self, name): - item = self._find_item(name) - - try: - return json.loads(item.text) - except (ValueError, TypeError): - return None - - def __delitem__(self, name): - item = self._find_item(name, create=False) - - if item is not None: - self.metadata.remove(item) - - def __iter__(self): - for child in self.metadata: - if child.prefix == "inkstitch": - yield strip_namespace(child.tag) - - def __len__(self): - i = 0 - for i, item in enumerate(self): - pass - - return i + 1 - - def __json__(self): - return dict(self) - - -class InkstitchExtension(inkex.Effect): +class InkstitchExtension(inkex.EffectExtension): """Base class for Inkstitch extensions. Not intended for direct use.""" + def load(self, *args, **kwargs): + document = super().load(*args, **kwargs) + update_inkstitch_document(document) + return document + @classmethod def name(cls): return snakecase(cls.__name__) |
