prefig 0.4.1.dev20250807054726__tar.gz → 0.4.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.
Files changed (68) hide show
  1. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/PKG-INFO +1 -1
  2. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/axes.py +7 -4
  3. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/parametric_curve.py +15 -3
  4. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/point.py +11 -1
  5. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/schema/pf_schema.rnc +3 -0
  6. prefig-0.4.2/prefig/resources/schema/pf_schema.rng +787 -0
  7. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/pyproject.toml +1 -1
  8. prefig-0.4.1.dev20250807054726/prefig/resources/schema/pf_schema.rng +0 -2223
  9. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/LICENSE +0 -0
  10. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/README.md +0 -0
  11. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/__init__.py +0 -0
  12. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/cli.py +0 -0
  13. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/CTM.py +0 -0
  14. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/__init__.py +0 -0
  15. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/annotations.py +0 -0
  16. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/area.py +0 -0
  17. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/arrow.py +0 -0
  18. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/calculus.py +0 -0
  19. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/circle.py +0 -0
  20. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/clip.py +0 -0
  21. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/compat.py +0 -0
  22. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/coordinates.py +0 -0
  23. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/definition.py +0 -0
  24. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/diagram.py +0 -0
  25. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/diffeqs.py +0 -0
  26. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/graph.py +0 -0
  27. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/grid_axes.py +0 -0
  28. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/group.py +0 -0
  29. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/image.py +0 -0
  30. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/implicit.py +0 -0
  31. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/label.py +0 -0
  32. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/label_tools.py +0 -0
  33. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/legend.py +0 -0
  34. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/line.py +0 -0
  35. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/math_utilities.py +0 -0
  36. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/network.py +0 -0
  37. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/parse.py +0 -0
  38. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/path.py +0 -0
  39. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/polygon.py +0 -0
  40. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/read.py +0 -0
  41. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/rectangle.py +0 -0
  42. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/repeat.py +0 -0
  43. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/riemann_sum.py +0 -0
  44. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/shape.py +0 -0
  45. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/slope_field.py +0 -0
  46. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/statistics.py +0 -0
  47. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/tags.py +0 -0
  48. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/tangent_line.py +0 -0
  49. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/user_namespace.py +0 -0
  50. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/utilities.py +0 -0
  51. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/core/vector.py +0 -0
  52. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/engine.py +0 -0
  53. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/diagcess/diagcess.html +0 -0
  54. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/diagcess/diagcess.js +0 -0
  55. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/de-system.xml +0 -0
  56. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/derivatives.xml +0 -0
  57. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/diffeqs.xml +0 -0
  58. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/implicit.xml +0 -0
  59. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/projection.xml +0 -0
  60. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/riemann.xml +0 -0
  61. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/roots_of_unity.xml +0 -0
  62. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/examples/tangent.xml +0 -0
  63. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/fonts/Braille29.ttf +0 -0
  64. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/js/mj-sre-page.js +0 -0
  65. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/js/package.json +0 -0
  66. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/resources/template/pf_publication.xml +0 -0
  67. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/scripts/__init__.py +0 -0
  68. {prefig-0.4.1.dev20250807054726 → prefig-0.4.2}/prefig/scripts/install_mj.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefig
3
- Version: 0.4.1.dev20250807054726
3
+ Version: 0.4.2
4
4
  Summary: An authoring system for mathematical diagrams
5
5
  Home-page: https://prefigure.org
6
6
  License: GPL-3.0-or-later
@@ -571,7 +571,7 @@ class Axes():
571
571
  xlabel.set('scale', '0.8')
572
572
  else:
573
573
  #math_element.text = r'\text{'+'{0:g}'.format(x)+'}'
574
- math_element.text = label_text(x, commas)
574
+ math_element.text = label_text(x, commas, diagram)
575
575
  if self.h_pi_format:
576
576
  math_element.text = get_pi_text(x)
577
577
 
@@ -680,7 +680,7 @@ class Axes():
680
680
  ylabel.set('scale', '0.8')
681
681
  else:
682
682
  #math_element.text = r'\text{'+'{0:g}'.format(y)+'}'
683
- math_element.text = label_text(y, commas)
683
+ math_element.text = label_text(y, commas, diagram)
684
684
  if self.v_pi_format:
685
685
  math_element.text = get_pi_text(y)
686
686
  # process as a math number
@@ -712,7 +712,7 @@ class Axes():
712
712
  user_coords=False)
713
713
  self.v_tick_group.append(line_el)
714
714
 
715
- def label_text(x, commas):
715
+ def label_text(x, commas, diagram):
716
716
  # we'll construct a text representation of x
717
717
  # maybe it's simple
718
718
  if x < 0:
@@ -741,13 +741,16 @@ def label_text(x, commas):
741
741
  return r'\text{' + prefix + text + r'}'
742
742
 
743
743
  period = text.find('.')
744
+ comma_include = '{,}'
745
+ if diagram.get_environment() == 'pyodide':
746
+ comma_include = ','
744
747
  if period < 0:
745
748
  suffix = ''
746
749
  else:
747
750
  suffix = text[period:]
748
751
  text = text[:period]
749
752
  while len(text) > 3:
750
- suffix = '{,}' + text[-3:] + suffix
753
+ suffix = comma_include + text[-3:] + suffix
751
754
  text = text[:-3]
752
755
  text = text + suffix
753
756
  return r'\text{' + prefix + text + r'}'
@@ -24,8 +24,9 @@ def parametric_curve(element, diagram, parent, outline_status):
24
24
  log.error(f"Error in <parametric-curve> defining domain={element.get('domain')}")
25
25
  return
26
26
 
27
- N = int(element.get('N', '100'))
27
+ arrows = int(element.get('arrows', '0'))
28
28
 
29
+ N = int(element.get('N', '100'))
29
30
  t = domain[0]
30
31
  dt = (domain[1]-domain[0])/N
31
32
  p = diagram.transform(f(t))
@@ -34,8 +35,21 @@ def parametric_curve(element, diagram, parent, outline_status):
34
35
  t += dt
35
36
  p = diagram.transform(f(t))
36
37
  points.append('L ' + util.pt2str(p))
38
+
37
39
  if element.get('closed', 'no') == 'yes':
38
40
  points.append('Z')
41
+
42
+ if arrows > 0 and element.get('arrow-location', None) is not None:
43
+ arrow_location = un.valid_eval(element.get('arrow-location'))
44
+ num_pts = 5
45
+ t = arrow_location - num_pts*dt
46
+ p = diagram.transform(f(t))
47
+ points.append('M ' + util.pt2str(p))
48
+ for _ in range(num_pts):
49
+ t += dt
50
+ p = diagram.transform(f(t))
51
+ points.append('L ' + util.pt2str(p))
52
+
39
53
  d = ' '.join(points)
40
54
 
41
55
  if diagram.output_format() == 'tactile':
@@ -51,12 +65,10 @@ def parametric_curve(element, diagram, parent, outline_status):
51
65
  diagram.add_id(path, element.get('id'))
52
66
  path.set('d', d)
53
67
  util.add_attr(path, util.get_2d_attr(element))
54
- # path.set('type', 'parametric curve')
55
68
 
56
69
  element.set('cliptobbox', element.get('cliptobbox', 'yes'))
57
70
  util.cliptobbox(path, element, diagram)
58
71
 
59
- arrows = int(element.get('arrows', '0'))
60
72
  forward = 'marker-end'
61
73
  backward = 'marker-start'
62
74
  if element.get('reverse', 'no') == 'yes':
@@ -1,5 +1,7 @@
1
1
  import lxml.etree as ET
2
2
  import logging
3
+ import numpy as np
4
+ import math
3
5
  from . import user_namespace as un
4
6
  from . import math_utilities as math_util
5
7
  from . import utilities as util
@@ -18,7 +20,15 @@ def point(element, diagram, parent, outline_status = None):
18
20
 
19
21
  # determine the location and size of the point from the XML element
20
22
  try:
21
- p = diagram.transform(un.valid_eval(element.get('p')))
23
+ p = un.valid_eval(element.get('p'))
24
+ if element.get('coordinates', 'cartesian') == 'polar':
25
+ radial = p[0]
26
+ angle = p[1]
27
+ if element.get('degrees', 'no') == 'yes':
28
+ angle = math.radians(angle)
29
+ p = radial * np.array([math.cos(angle), math.sin(angle)])
30
+ element.set('p', util.pt2long_str(p, spacer=','))
31
+ p = diagram.transform(p)
22
32
  except:
23
33
  log.error(f"Error in <point> defining p={element.get('p')}")
24
34
  return
@@ -641,6 +641,7 @@ Parametric-Curve = element parametric-curve {
641
641
  attribute N {text}?,
642
642
  attribute closed {"yes"|"no"}?,
643
643
  attribute arrows {text}?,
644
+ attribute arrow-location {text}?,
644
645
  attribute arrow-width {text}?,
645
646
  attribute arrow-angles {text}?,
646
647
  attribute reverse {"yes"|"no"}?,
@@ -685,6 +686,8 @@ Point = element point {
685
686
  attribute at {text}?,
686
687
  attribute style {text}?,
687
688
  attribute size {text}?,
689
+ attribute coordinates {"cartesian"|"polar"}?,
690
+ attribute degrees {"yes"|"no"}?,
688
691
  LabelAttributes,
689
692
  FillAttributes,
690
693
  CommonAttributes,