svg-ultralight 0.45.0__tar.gz → 0.45.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of svg-ultralight might be problematic. Click here for more details.

Files changed (61) hide show
  1. {svg_ultralight-0.45.0/src/svg_ultralight.egg-info → svg_ultralight-0.45.2}/PKG-INFO +1 -1
  2. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/pyproject.toml +2 -2
  3. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/font_tools/font_info.py +18 -4
  4. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2/src/svg_ultralight.egg-info}/PKG-INFO +1 -1
  5. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/.gitignore +0 -0
  6. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/.pre-commit-config.yaml +0 -0
  7. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/README.md +0 -0
  8. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/dev-requirements.txt +0 -0
  9. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/experiments/encode_fonts3.txt +0 -0
  10. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/experiments/font_css.py +0 -0
  11. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/setup.cfg +0 -0
  12. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/__init__.py +0 -0
  13. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/animate.py +0 -0
  14. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/attrib_hints.py +0 -0
  15. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/__init__.py +0 -0
  16. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/bound_helpers.py +0 -0
  17. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/padded_text_initializers.py +0 -0
  18. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/supports_bounds.py +0 -0
  19. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/type_bound_collection.py +0 -0
  20. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/type_bound_element.py +0 -0
  21. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/type_bounding_box.py +0 -0
  22. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/bounding_boxes/type_padded_text.py +0 -0
  23. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/constructors/__init__.py +0 -0
  24. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/constructors/new_element.py +0 -0
  25. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/font_tools/__init__.py +0 -0
  26. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/font_tools/comp_results.py +0 -0
  27. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/font_tools/globs.py +0 -0
  28. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/image_ops.py +0 -0
  29. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/inkscape.py +0 -0
  30. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/layout.py +0 -0
  31. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/main.py +0 -0
  32. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/metadata.py +0 -0
  33. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/nsmap.py +0 -0
  34. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/py.typed +0 -0
  35. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/query.py +0 -0
  36. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/root_elements.py +0 -0
  37. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/string_conversion.py +0 -0
  38. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/strings/__init__.py +0 -0
  39. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/strings/svg_strings.py +0 -0
  40. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/transformations.py +0 -0
  41. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight/unit_conversion.py +0 -0
  42. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight.egg-info/SOURCES.txt +0 -0
  43. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight.egg-info/dependency_links.txt +0 -0
  44. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight.egg-info/requires.txt +0 -0
  45. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/src/svg_ultralight.egg-info/top_level.txt +0 -0
  46. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/__init__.py +0 -0
  47. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/conftest.py +0 -0
  48. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/resources/arrow.svg +0 -0
  49. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_bounding.py +0 -0
  50. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_inkscape.py +0 -0
  51. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_layout.py +0 -0
  52. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_matrices.py +0 -0
  53. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_metadata.py +0 -0
  54. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_new_element.py +0 -0
  55. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_padded_text_initializers.py +0 -0
  56. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_padding.py +0 -0
  57. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_queries.py +0 -0
  58. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_root_elements.py +0 -0
  59. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_string_conversion.py +0 -0
  60. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tests/test_svg_ultralight.py +0 -0
  61. {svg_ultralight-0.45.0 → svg_ultralight-0.45.2}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: svg-ultralight
3
- Version: 0.45.0
3
+ Version: 0.45.2
4
4
  Summary: a sensible way to create svg files with Python
5
5
  Author-email: Shay Hill <shay_public@hotmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "svg-ultralight"
3
- version = "0.45.0"
3
+ version = "0.45.2"
4
4
  description = "a sensible way to create svg files with Python"
5
5
  authors = [{ name = "Shay Hill", email = "shay_public@hotmail.com" }]
6
6
  license = { text = "MIT" }
@@ -53,7 +53,7 @@ convention = "pep257"
53
53
 
54
54
  [tool.commitizen]
55
55
  name = "cz_conventional_commits"
56
- version = "0.45.0"
56
+ version = "0.45.2"
57
57
  tag_format = "$version"
58
58
  version_files = ["pyproject.toml:^version"]
59
59
  annotated_tag = true
@@ -124,9 +124,23 @@ if TYPE_CHECKING:
124
124
  logging.getLogger("fontTools").setLevel(logging.ERROR)
125
125
 
126
126
 
127
+ _ESCAPE_CHARS = {"&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&apos;"}
128
+
129
+
130
+ def _sanitize_svg_data_text(text: str) -> str:
131
+ """Sanitize a string for use in an SVG data-text attribute.
132
+
133
+ :param text: The input string to sanitize.
134
+ :return: The sanitized string with XML characters escaped.
135
+ """
136
+ for char, escape_seq in _ESCAPE_CHARS.items():
137
+ text = text.replace(char, escape_seq)
138
+ return text
139
+
140
+
127
141
  # extract_gpos_kerning is an unfinished attempt to extract kerning from the GPOS
128
142
  # table.
129
- def get_gpos_kerning(font: TTFont) -> dict[tuple[str, str], int]:
143
+ def _get_gpos_kerning(font: TTFont) -> dict[tuple[str, str], int]:
130
144
  """Extract kerning pairs from the GPOS table of a font.
131
145
 
132
146
  :param font: A fontTools TTFont object.
@@ -325,7 +339,7 @@ class FTFontInfo:
325
339
  except (KeyError, AttributeError):
326
340
  kern = {}
327
341
  with suppress(Exception):
328
- kern.update(get_gpos_kerning(self.font))
342
+ kern.update(_get_gpos_kerning(self.font))
329
343
 
330
344
  return kern
331
345
 
@@ -370,7 +384,7 @@ class FTFontInfo:
370
384
  svgd = path_pen.svgd
371
385
  if not dx or not svgd:
372
386
  return svgd
373
- cpts = path_pen.cpts
387
+ cpts = get_cpts_from_svgd(svgd)
374
388
  for i, curve in enumerate(cpts):
375
389
  cpts[i][:] = [(x + dx, y) for x, y in curve]
376
390
  svgd = format_svgd_shortest(get_svgd_from_cpts(cpts))
@@ -532,7 +546,7 @@ class FTTextInfo:
532
546
  attributes["stroke-width"] = float(stroke_width) / self.scale
533
547
  return new_element(
534
548
  "path",
535
- data_text=self.text,
549
+ data_text=_sanitize_svg_data_text(self.text),
536
550
  d=self.font.get_text_svgd(self.text),
537
551
  **attributes,
538
552
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: svg-ultralight
3
- Version: 0.45.0
3
+ Version: 0.45.2
4
4
  Summary: a sensible way to create svg files with Python
5
5
  Author-email: Shay Hill <shay_public@hotmail.com>
6
6
  License: MIT
File without changes