summaryrefslogtreecommitdiff
path: root/lib/extensions/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/extensions/base.py')
-rw-r--r--lib/extensions/base.py97
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__)