prefig 0.3.8__py3-none-any.whl → 0.3.9__py3-none-any.whl

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.
prefig/core/__init__.py CHANGED
@@ -13,6 +13,7 @@ from . import (
13
13
  graph,
14
14
  grid_axes,
15
15
  group,
16
+ image,
16
17
  implicit,
17
18
  label,
18
19
  label_tools,
prefig/core/axes.py CHANGED
@@ -748,7 +748,7 @@ def label_text(x, commas):
748
748
  suffix = text[period:]
749
749
  text = text[:period]
750
750
  while len(text) > 3:
751
- suffix = ',' + text[-3:] + suffix
751
+ suffix = '{,}' + text[-3:] + suffix
752
752
  text = text[:-3]
753
753
  text = text + suffix
754
754
  return r'\text{' + prefix + text + r'}'
@@ -787,8 +787,8 @@ def tick_mark(element, diagram, parent, outline_status):
787
787
  size = un.valid_eval(element.get('size'))
788
788
  if not isinstance(size, np.ndarray):
789
789
  size = (size, size)
790
- else:
791
- size = (3,3)
790
+ else:
791
+ size = (3,3)
792
792
 
793
793
  if tactile:
794
794
  size = (18,0)
@@ -869,8 +869,8 @@ def tick_mark(element, diagram, parent, outline_status):
869
869
 
870
870
  if el_copy.get('alignment', None) is None:
871
871
  el_copy.set('alignment', align)
872
- if el_copy.get('offset', None) is None:
873
- el_copy.set('offset', off)
872
+ if el_copy.get('offset', None) is None:
873
+ el_copy.set('offset', off)
874
874
  el_copy.set("user-coords", "no")
875
875
  el_copy.set("anchor", util.pt2str(p, spacer=","))
876
876
  label.label(el_copy, diagram, parent, outline_status)
prefig/core/graph.py CHANGED
@@ -29,6 +29,10 @@ def graph(element, diagram, parent, outline_status = None):
29
29
  domain = [bbox[0], bbox[2]]
30
30
  else:
31
31
  domain = un.valid_eval(domain)
32
+ if domain[0] == -np.inf:
33
+ domain[0] = bbox[0]
34
+ if domain[1] == np.inf:
35
+ domain[1] = bbox[2]
32
36
 
33
37
  # if there are arrows, we need to pull the domain in by two pixels
34
38
  # so that the arrows don't go outside the domain
prefig/core/image.py ADDED
@@ -0,0 +1,127 @@
1
+ import lxml.etree as ET
2
+ import logging
3
+ import numpy as np
4
+ import base64
5
+ import lxml.etree as ET
6
+ from . import user_namespace as un
7
+ from . import group
8
+ from . import utilities as util
9
+ from . import CTM
10
+
11
+ log = logging.getLogger('prefigure')
12
+
13
+ type_dict = {'jpg':'jpeg',
14
+ 'jpeg':'jpeg',
15
+ 'png':'png',
16
+ 'gif':'gif',
17
+ 'svg':'svg'}
18
+
19
+ # Allows a block of XML to repeat with a changing parameter
20
+
21
+ def image(element, diagram, parent, outline_status):
22
+ if len(element) == 0:
23
+ log.error("An <image> must contain content to replace the image in a tactile build")
24
+ return;
25
+
26
+ if diagram.output_format() == 'tactile':
27
+ element.tag = 'group'
28
+ group.group(element, diagram, parent, outline_status)
29
+ return
30
+
31
+ source = element.get('source', None)
32
+ if source is None:
33
+ log.error("An <image> needs a @source attribute")
34
+ return
35
+ try:
36
+ ll = un.valid_eval(element.get('lower-left', '(0,0)'))
37
+ dims = un.valid_eval(element.get('dimensions', '(1,1)'))
38
+ center = element.get('center', None)
39
+ if center is not None:
40
+ center = un.valid_eval(center)
41
+ ll = center - 0.5 * dims
42
+ else:
43
+ center = ll + 0.5*dims
44
+ rotation = un.valid_eval(element.get('rotate', '0'))
45
+ scale = un.valid_eval(element.get('scale', '1'))
46
+ except:
47
+ log.error("Error parsing placement data in an <image>")
48
+ return
49
+
50
+ file_type = None
51
+ if element.get('filetype', None) is not None:
52
+ file_type = type_dict.get(element.get('filetype'), None)
53
+ if file_type is None:
54
+ suffix = source.split('.')[-1]
55
+ file_type = type_dict.get(suffix, None)
56
+ if file_type is None:
57
+ log.error(f"Cannot determine the type of image in {source}")
58
+ return
59
+
60
+ ll_svg = diagram.transform(ll)
61
+ ur_svg = diagram.transform(ll + dims)
62
+ center_svg = diagram.transform(center)
63
+ width, height = ur_svg - ll_svg
64
+ height = -height
65
+
66
+ if diagram.get_environment() == 'pretext':
67
+ source = 'data/' + source
68
+ else:
69
+ assets_dir = diagram.get_external()
70
+ if assets_dir is not None:
71
+ assets_dir = assets_dir.strip()
72
+ if assets_dir[-1] != '/':
73
+ assets_dir += '/'
74
+ source = assets_dir + source
75
+
76
+ opacity = element.get('opacity', None)
77
+ if opacity is not None:
78
+ opacity = un.valid_eval(opacity)
79
+ if file_type == 'svg':
80
+ svg_tree = ET.parse(source)
81
+ svg_root = svg_tree.getroot()
82
+ svg_width = svg_root.get('width', None)
83
+ svg_height = svg_root.get('height', None)
84
+
85
+ object = ET.SubElement(parent, 'foreignObject')
86
+ object.set('x', util.float2str(center_svg[0]-width/2))
87
+ object.set('y', util.float2str(center_svg[1]-height/2))
88
+ object.set('width', util.float2str(width))
89
+ object.set('height', util.float2str(height))
90
+ svg_root.set('width', '100%')
91
+ svg_root.set('height', '100%')
92
+ if svg_root.get('viewBox', None) is None:
93
+ svg_root.set('viewBox', f"0 0 {svg_width} {svg_height}")
94
+ object.append(svg_root)
95
+ diagram.add_id(object, element.get('id'))
96
+ svg_root.attrib.pop('id', None)
97
+ if opacity is not None:
98
+ object.set('opacity', util.float2str(opacity))
99
+ return
100
+
101
+ image_el = ET.SubElement(parent, 'image')
102
+ image_el.set('x', util.float2str(-width/2))
103
+ image_el.set('y', util.float2str(-height/2))
104
+ image_el.set('width', util.float2str(width))
105
+ image_el.set('height', util.float2str(height))
106
+ if opacity is not None:
107
+ image_el.set('opacity', util.float2str(opacity))
108
+ diagram.add_id(image_el, element.get('id'))
109
+
110
+ with open(source, "rb") as image_file:
111
+ encoded_string = base64.b64encode(image_file.read())
112
+ encoded_string = encoded_string.decode('utf-8')
113
+ ref = f"data:image/{file_type};base64,{encoded_string}"
114
+ image_el.set('href', ref)
115
+
116
+ transform_pieces = [CTM.translatestr(*center_svg)]
117
+
118
+ if isinstance(scale, np.ndarray):
119
+ transform_pieces.append(CTM.scalestr(*scale))
120
+ elif scale != '1':
121
+ transform_pieces.append(f"scale({scale})")
122
+
123
+ if rotation != 0:
124
+ transform_pieces.append(f"rotate({-rotation})")
125
+
126
+ image_el.set('transform', ' '.join(transform_pieces))
127
+
@@ -15,6 +15,9 @@ def set_diagram(d):
15
15
  # introduce some useful mathematical operations
16
16
  # that are meant to be available to authors
17
17
 
18
+ def ln(x):
19
+ return math.log(x)
20
+
18
21
  def dot(u, v):
19
22
  return np.dot(np.array(u), np.array(v))
20
23
 
prefig/core/path.py CHANGED
@@ -480,6 +480,31 @@ def decorate(child, diagram, current_point, cmds):
480
480
  cmds += ['L', util.pt2str(ctm.transform((x_pos,0)))]
481
481
  cmds += ['L', util.pt2str(ctm.transform((length, 0)))]
482
482
 
483
+ if decoration_data[0] == 'ragged':
484
+ # offset, step
485
+ try:
486
+ data = [d.split('=') for d in decoration_data[1:]]
487
+ data = {k:v for k, v in data}
488
+ except:
489
+ log.error("Error in wave decoration data")
490
+ return
491
+ try:
492
+ offset = un.valid_eval(data['offset'])
493
+ step = un.valid_eval(data['step'])
494
+ except:
495
+ log.error("Error in retrieving the step and an offset in a ragged decoration")
496
+
497
+ np.random.seed(int(data.get('seed','1')))
498
+ x_pos = 0
499
+ y_pos = 0
500
+ p = ctm.transform((0,0))
501
+ cmds += ['L', util.pt2str(ctm.transform((0,0)))]
502
+ while x_pos < length-step:
503
+ y_pos = 2 * offset * (np.random.random()-0.5)
504
+ x_pos += (0.5*np.random.random()+0.75)*step
505
+ cmds += ['L', util.pt2str(ctm.transform((x_pos,y_pos)))]
506
+ cmds += ['L', util.pt2str(ctm.transform((length, 0)))]
507
+
483
508
  if decoration_data[0] == 'capacitor':
484
509
  try:
485
510
  data = [d.split('=') for d in decoration_data[1:]]
prefig/core/rectangle.py CHANGED
@@ -71,9 +71,11 @@ def rectangle(element, diagram, parent, outline_status):
71
71
  path.set('d', ' '.join(cmds))
72
72
 
73
73
  if diagram.output_format() == 'tactile':
74
- if element.get('stroke') is not None:
74
+ stroke = element.get('stroke')
75
+ fill = element.get('fill')
76
+ if stroke is not None and stroke != 'none':
75
77
  element.set('stroke', 'black')
76
- if element.get('fill') is not None:
78
+ if fill is not None and fill != 'none':
77
79
  element.set('fill', 'lightgray')
78
80
  else:
79
81
  util.set_attr(element, 'stroke', 'none')
@@ -26,6 +26,8 @@ def slope_field(element, diagram, parent, outline_status):
26
26
  return
27
27
  bbox = diagram.bbox()
28
28
 
29
+ if element.get('id', None) is None:
30
+ diagram.add_id(element, None)
29
31
  # We're going to turn this element into a group and add lines to it
30
32
  element.tag = "group"
31
33
  if element.get('outline', 'no') == 'yes':
@@ -127,6 +129,9 @@ def vector_field(element, diagram, parent, outline_status):
127
129
  return
128
130
  bbox = diagram.bbox()
129
131
 
132
+ if element.get('id', None) is None:
133
+ diagram.add_id(element, None)
134
+
130
135
  # We're going to turn this element into a group and add lines to it
131
136
  element.tag = "group"
132
137
  if element.get('outline', 'no') == 'yes':
@@ -196,6 +201,7 @@ def vector_field(element, diagram, parent, outline_status):
196
201
  # we will go through and generate the vectors first
197
202
  # since we'll need to scale them
198
203
  max_scale = 0
204
+ exponent = un.valid_eval(element.get('exponent', '1'))
199
205
  x = rx[0]
200
206
  while x <= rx[2]:
201
207
  y = ry[0]
@@ -211,6 +217,13 @@ def vector_field(element, diagram, parent, outline_status):
211
217
  return;
212
218
  except:
213
219
  pass
220
+ norm = math_util.length(f_value)
221
+ if norm < 1e-10:
222
+ f_value = np.array((0,0))
223
+ else:
224
+ # we will scale the length by length**exponent
225
+ # to promote the length of shorter vectors
226
+ f_value = norm**exponent * (1/norm * f_value)
214
227
  max_scale = max(max_scale,
215
228
  abs((f_value[0])/rx[1]),
216
229
  abs((f_value[1])/ry[1]))
prefig/core/tags.py CHANGED
@@ -11,6 +11,7 @@ from . import definition
11
11
  from . import graph
12
12
  from . import grid_axes
13
13
  from . import group
14
+ from . import image
14
15
  from . import implicit
15
16
  from . import label
16
17
  from . import legend
@@ -41,6 +42,7 @@ tag_dict = {
41
42
  'caption': label.caption,
42
43
  'circle': circle.circle,
43
44
  'clip': clip.clip,
45
+ 'contour': implicit.implicit_curve,
44
46
  'coordinates': coordinates.coordinates,
45
47
  'definition': definition.definition,
46
48
  'derivative': definition.derivative,
@@ -50,6 +52,7 @@ tag_dict = {
50
52
  'grid-axes': grid_axes.grid_axes,
51
53
  'group': group.group,
52
54
  'histogram': statistics.histogram,
55
+ 'image': image.image,
53
56
  'implicit-curve': implicit.implicit_curve,
54
57
  'label': label.label,
55
58
  'legend': legend.legend,
@@ -66,6 +66,8 @@ def validate_node(node, args=None):
66
66
  return True
67
67
  if isinstance(node, ast.Expression):
68
68
  return validate_node(node.body, args)
69
+ if isinstance(node, ast.Starred):
70
+ return validate_node(node.value)
69
71
  if isinstance(node, ast.Name):
70
72
  if node.id in variables:
71
73
  return True
@@ -313,12 +313,13 @@ GraphicalElements =
313
313
  Area-Under-Curve* &
314
314
  Axes* &
315
315
  Circle* &
316
+ Contour* &
316
317
  Ellipse* &
317
- Gradient* &
318
318
  Graph* &
319
319
  Grid* &
320
320
  Grid-Axes* &
321
321
  Histogram* &
322
+ Image*&
322
323
  Implicit-Curve* &
323
324
  Label* &
324
325
  Legend* &
@@ -422,34 +423,6 @@ Axes = element axes {
422
423
  YLabel?
423
424
  }
424
425
 
425
- Gradient = element gradient {
426
- attribute at {text}?,
427
- attribute function {text}?,
428
- attribute spacings {text}?,
429
- attribute scale {text}?,
430
- attribute curve {text}?,
431
- attribute domain {text}?,
432
- attribute N {text}?,
433
- attribute arrow-width {text}?,
434
- attribute arrow-angles {text?}?,
435
- StrokeAttributes,
436
- CommonAttributes
437
- }
438
-
439
- Vector-Field = element vector-field {
440
- attribute at {text}?,
441
- attribute function {text}?,
442
- attribute spacings {text}?,
443
- attribute scale {text}?,
444
- attribute curve {text}?,
445
- attribute domain {text}?,
446
- attribute N {text}?,
447
- attribute arrow-width {text}?,
448
- attribute arrow-angles {text?}?,
449
- StrokeAttributes,
450
- CommonAttributes
451
- }
452
-
453
426
  Grid = element grid {
454
427
  attribute at {text}?,
455
428
  attribute spacings {text}?,
@@ -506,6 +479,16 @@ Tick-Mark = element tick-mark {
506
479
  LabelText?
507
480
  }
508
481
 
482
+ Contour = element contour {
483
+ attribute at {text}?,
484
+ attribute function {text},
485
+ attribute k {text}?,
486
+ attribute depth {text}?,
487
+ attribute initial-depth {text}?,
488
+ StrokeAttributes,
489
+ CommonAttributes
490
+ }
491
+
509
492
  Circle = element circle {
510
493
  attribute at {text}?,
511
494
  attribute center {text},
@@ -538,6 +521,18 @@ Graph = element graph {
538
521
  CommonAttributes
539
522
  }
540
523
 
524
+ Image = element image {
525
+ attribute at {text}?,
526
+ attribute source{text},
527
+ attribute lower-left {text}?,
528
+ attribute center {text}?,
529
+ attribute dimensions {text}?,
530
+ attribute opacity {text}?,
531
+ attribute filetype {"svg"|"png"|"gif"|"jpeg"|"jpg"}?,
532
+ attribute rotate {text}?,
533
+ attribute scale {text}?
534
+ }
535
+
541
536
  Histogram = element histogram {
542
537
  attribute at {text}?,
543
538
  attribute data {text},
@@ -815,4 +810,18 @@ Vector = element vector {
815
810
  CommonAttributes
816
811
  }
817
812
 
813
+ Vector-Field = element vector-field {
814
+ attribute at {text}?,
815
+ attribute function {text}?,
816
+ attribute spacings {text}?,
817
+ attribute scale {text}?,
818
+ attribute curve {text}?,
819
+ attribute domain {text}?,
820
+ attribute N {text}?,
821
+ attribute arrow-width {text}?,
822
+ attribute arrow-angles {text?}?,
823
+ StrokeAttributes,
824
+ CommonAttributes
825
+ }
826
+
818
827
  }
@@ -763,10 +763,10 @@
763
763
  <ref name="Circle"/>
764
764
  </zeroOrMore>
765
765
  <zeroOrMore>
766
- <ref name="Ellipse"/>
766
+ <ref name="Contour"/>
767
767
  </zeroOrMore>
768
768
  <zeroOrMore>
769
- <ref name="Gradient"/>
769
+ <ref name="Ellipse"/>
770
770
  </zeroOrMore>
771
771
  <zeroOrMore>
772
772
  <ref name="Graph"/>
@@ -780,6 +780,9 @@
780
780
  <zeroOrMore>
781
781
  <ref name="Histogram"/>
782
782
  </zeroOrMore>
783
+ <zeroOrMore>
784
+ <ref name="Image"/>
785
+ </zeroOrMore>
783
786
  <zeroOrMore>
784
787
  <ref name="Implicit-Curve"/>
785
788
  </zeroOrMore>
@@ -1122,80 +1125,6 @@
1122
1125
  </optional>
1123
1126
  </element>
1124
1127
  </define>
1125
- <define name="Gradient">
1126
- <element name="gradient">
1127
- <optional>
1128
- <attribute name="at"/>
1129
- </optional>
1130
- <optional>
1131
- <attribute name="function"/>
1132
- </optional>
1133
- <optional>
1134
- <attribute name="spacings"/>
1135
- </optional>
1136
- <optional>
1137
- <attribute name="scale"/>
1138
- </optional>
1139
- <optional>
1140
- <attribute name="curve"/>
1141
- </optional>
1142
- <optional>
1143
- <attribute name="domain"/>
1144
- </optional>
1145
- <optional>
1146
- <attribute name="N"/>
1147
- </optional>
1148
- <optional>
1149
- <attribute name="arrow-width"/>
1150
- </optional>
1151
- <optional>
1152
- <attribute name="arrow-angles">
1153
- <optional>
1154
- <text/>
1155
- </optional>
1156
- </attribute>
1157
- </optional>
1158
- <ref name="StrokeAttributes"/>
1159
- <ref name="CommonAttributes"/>
1160
- </element>
1161
- </define>
1162
- <define name="Vector-Field">
1163
- <element name="vector-field">
1164
- <optional>
1165
- <attribute name="at"/>
1166
- </optional>
1167
- <optional>
1168
- <attribute name="function"/>
1169
- </optional>
1170
- <optional>
1171
- <attribute name="spacings"/>
1172
- </optional>
1173
- <optional>
1174
- <attribute name="scale"/>
1175
- </optional>
1176
- <optional>
1177
- <attribute name="curve"/>
1178
- </optional>
1179
- <optional>
1180
- <attribute name="domain"/>
1181
- </optional>
1182
- <optional>
1183
- <attribute name="N"/>
1184
- </optional>
1185
- <optional>
1186
- <attribute name="arrow-width"/>
1187
- </optional>
1188
- <optional>
1189
- <attribute name="arrow-angles">
1190
- <optional>
1191
- <text/>
1192
- </optional>
1193
- </attribute>
1194
- </optional>
1195
- <ref name="StrokeAttributes"/>
1196
- <ref name="CommonAttributes"/>
1197
- </element>
1198
- </define>
1199
1128
  <define name="Grid">
1200
1129
  <element name="grid">
1201
1130
  <optional>
@@ -1407,6 +1336,25 @@
1407
1336
  </optional>
1408
1337
  </element>
1409
1338
  </define>
1339
+ <define name="Contour">
1340
+ <element name="contour">
1341
+ <optional>
1342
+ <attribute name="at"/>
1343
+ </optional>
1344
+ <attribute name="function"/>
1345
+ <optional>
1346
+ <attribute name="k"/>
1347
+ </optional>
1348
+ <optional>
1349
+ <attribute name="depth"/>
1350
+ </optional>
1351
+ <optional>
1352
+ <attribute name="initial-depth"/>
1353
+ </optional>
1354
+ <ref name="StrokeAttributes"/>
1355
+ <ref name="CommonAttributes"/>
1356
+ </element>
1357
+ </define>
1410
1358
  <define name="Circle">
1411
1359
  <element name="circle">
1412
1360
  <optional>
@@ -1485,6 +1433,43 @@
1485
1433
  <ref name="CommonAttributes"/>
1486
1434
  </element>
1487
1435
  </define>
1436
+ <define name="Image">
1437
+ <element name="image">
1438
+ <optional>
1439
+ <attribute name="at"/>
1440
+ </optional>
1441
+ <attribute name="source"/>
1442
+ <optional>
1443
+ <attribute name="lower-left"/>
1444
+ </optional>
1445
+ <optional>
1446
+ <attribute name="center"/>
1447
+ </optional>
1448
+ <optional>
1449
+ <attribute name="dimensions"/>
1450
+ </optional>
1451
+ <optional>
1452
+ <attribute name="opacity"/>
1453
+ </optional>
1454
+ <optional>
1455
+ <attribute name="filetype">
1456
+ <choice>
1457
+ <value>svg</value>
1458
+ <value>png</value>
1459
+ <value>gif</value>
1460
+ <value>jpeg</value>
1461
+ <value>jpg</value>
1462
+ </choice>
1463
+ </attribute>
1464
+ </optional>
1465
+ <optional>
1466
+ <attribute name="rotate"/>
1467
+ </optional>
1468
+ <optional>
1469
+ <attribute name="scale"/>
1470
+ </optional>
1471
+ </element>
1472
+ </define>
1488
1473
  <define name="Histogram">
1489
1474
  <element name="histogram">
1490
1475
  <optional>
@@ -2198,4 +2183,41 @@
2198
2183
  <ref name="CommonAttributes"/>
2199
2184
  </element>
2200
2185
  </define>
2186
+ <define name="Vector-Field">
2187
+ <element name="vector-field">
2188
+ <optional>
2189
+ <attribute name="at"/>
2190
+ </optional>
2191
+ <optional>
2192
+ <attribute name="function"/>
2193
+ </optional>
2194
+ <optional>
2195
+ <attribute name="spacings"/>
2196
+ </optional>
2197
+ <optional>
2198
+ <attribute name="scale"/>
2199
+ </optional>
2200
+ <optional>
2201
+ <attribute name="curve"/>
2202
+ </optional>
2203
+ <optional>
2204
+ <attribute name="domain"/>
2205
+ </optional>
2206
+ <optional>
2207
+ <attribute name="N"/>
2208
+ </optional>
2209
+ <optional>
2210
+ <attribute name="arrow-width"/>
2211
+ </optional>
2212
+ <optional>
2213
+ <attribute name="arrow-angles">
2214
+ <optional>
2215
+ <text/>
2216
+ </optional>
2217
+ </attribute>
2218
+ </optional>
2219
+ <ref name="StrokeAttributes"/>
2220
+ <ref name="CommonAttributes"/>
2221
+ </element>
2222
+ </define>
2201
2223
  </grammar>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefig
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: An authoring system for mathematical diagrams
5
5
  Home-page: https://prefigure.org
6
6
  License: GPL-3.0-or-later
@@ -1,11 +1,11 @@
1
1
  prefig/__init__.py,sha256=tAf78JkO5kBvFM23RmchK8TEDYO6v8AXqzOv-kq7TR0,53
2
2
  prefig/cli.py,sha256=-jbXTVb2Vao4uefq3ia69DDh7ZQivIO-H1grzCVPg0I,12495
3
3
  prefig/core/CTM.py,sha256=P32b5rfJD_8QwMNCHRAS6lIB5ellBi1gaSdhxTV4a00,5781
4
- prefig/core/__init__.py,sha256=1EoRwLI_BVkLiO5ulkKNd7MlEuAiLW7wnM_3KO92LCA,717
4
+ prefig/core/__init__.py,sha256=roT0a8-iBrp8WXTbPN5RzMWFiCXfpKrEXa2xE-F-yBo,728
5
5
  prefig/core/annotations.py,sha256=9wStnLhEHFmkIocufHLiBcUZ3NSce7ZESor5kjj-vzg,3998
6
6
  prefig/core/area.py,sha256=U-AxXvaZJWgVccpLlh-aaRfM_QtTa09NR2TqAd8Yk0o,3710
7
7
  prefig/core/arrow.py,sha256=h8lFm1rMdpiZRyQu5kvAiptBmMYr5aKCZuB5JypAGDM,11283
8
- prefig/core/axes.py,sha256=hTvw8uAuTlVaFFfOAv5xlhk0ol0TyZZTktsM_R_4wn0,31677
8
+ prefig/core/axes.py,sha256=xMO_X6PbKZ5ptEdaQJk0iZ1iV5mGyZ3Apq0eBrGUoCk,31679
9
9
  prefig/core/calculus.py,sha256=Q4kSGTTTeQYEEVKgmYWpFP0JLHmCsBchB5OF9qSclQk,498
10
10
  prefig/core/circle.py,sha256=_v1eMVhl4nnD4WXCz-Boa_SAdQg_kKeU3NhP42z2Yzw,15668
11
11
  prefig/core/clip.py,sha256=X3TcFYPuZwjZ9SFBWMc1MYY__6XTJqLafPeOLFNOdIE,806
@@ -14,31 +14,32 @@ prefig/core/coordinates.py,sha256=vEAJ8kL9S1VylxWysqY5qW2WyCMyHj42yFkuAzjfqFs,35
14
14
  prefig/core/definition.py,sha256=7LiaCxQwwEPdcnMpcMgrkZEfAoTc5ng8LO6Nf50Htwg,1033
15
15
  prefig/core/diagram.py,sha256=7Hsa8xOpGmLnln2Chl-ofVl_bG6ZOEJPGV2vE1V8RnI,22599
16
16
  prefig/core/diffeqs.py,sha256=aLXcmTsnfTG6L2-RiNfSaijzwmJF6xJcQpNQdDAWTQo,7127
17
- prefig/core/graph.py,sha256=DSgvfJdk-dsBX0yHwjHhI1nkD-yU9gfKAGjFwAQIoWk,9935
17
+ prefig/core/graph.py,sha256=q81dyJy3CxMWvMNhm74SZ9yjfltatdckmajxegA0z0A,10064
18
18
  prefig/core/grid_axes.py,sha256=v98C5tb9knNViGYGDrWL_ULb7Y78vMSQ6OJO7Xd0DXY,12165
19
19
  prefig/core/group.py,sha256=KByOibuslP9TqSygNfPSaN4zU5oSRYaH2CPnR21ogTg,5825
20
+ prefig/core/image.py,sha256=eQKy0mNvCE6J8EA1S5Y08YF3lrb7kCeGG4wrjBQ_-pI,4373
20
21
  prefig/core/implicit.py,sha256=JyFKpKj6Xi1PF-3BeZpd7t0aNe8jH9Wf_E2rghvt-Ug,6179
21
22
  prefig/core/label.py,sha256=e_gOd2kcdOtcJay1VyRstP66SiDNxK2UK2-obkxQnOc,24746
22
23
  prefig/core/label_tools.py,sha256=jOawiyrKC5iQs0vq7133xNXqrkJbMqDZVHflT-hOruo,9167
23
24
  prefig/core/legend.py,sha256=0mVfyU3LvqgDCYUOlCeBD04maV-rj2h0fs1aOEBBt6c,13340
24
25
  prefig/core/line.py,sha256=HBB9cvJawKAtdubISn5maRrzFFzV0NQuBgwoQoxeXcw,6055
25
- prefig/core/math_utilities.py,sha256=nQV8RiZRvGgqAeatWwHKOHb107ZcLRgwa77CaXvUmCg,5892
26
+ prefig/core/math_utilities.py,sha256=sMm3U9rcYKY8oZZWeJjcBokCDO4CxUkvmaX55auR4Eo,5927
26
27
  prefig/core/network.py,sha256=1izAX2AKvnj2knElrdLeojE_0Q0zO0aQM-EsEwor0Os,27217
27
28
  prefig/core/parametric_curve.py,sha256=ftxdg3gs0M0ME5iPJo3iEX7jT8PHQEMYpx8psr8Cm-w,3046
28
29
  prefig/core/parse.py,sha256=plLmR0KKrUjYx0PmHHo5HZonaaT3tW4qjiDOtzuhSkQ,4542
29
- prefig/core/path.py,sha256=ZWKUNgVU4qeU98Vp4WKpQoy7DehH1UmnyXA4DKRhpGo,19365
30
+ prefig/core/path.py,sha256=8BbWAUzZqe1YD0gO4QtDENaINavAAC1mlU-y3UV-vu0,20312
30
31
  prefig/core/point.py,sha256=a97N1soBcmYn3StZ60HBmaBi3pB1abA7sL0LNJ2nxR0,8341
31
32
  prefig/core/polygon.py,sha256=8NVdWSUVXuNE4GiPQ4MySSmLy8aCNwKUqCcfHukizME,11301
32
33
  prefig/core/read.py,sha256=Q1Nsluwysg3M5wtUmwIirfNo-Rw9-dFJPEeM4pDCpyo,1988
33
- prefig/core/rectangle.py,sha256=T0EMtRdLtmG1uY7Bu8kXmxQ81IGG_102g5fLCg9RuzE,3387
34
+ prefig/core/rectangle.py,sha256=b_ki7yqA4-mke1_0khvKqSKBRToB667mZc-xZhhPIBA,3473
34
35
  prefig/core/repeat.py,sha256=DAO5w4BxUMGU-8ymsv8EwsifI0zPa_cgIRUcWWS8BWU,2755
35
36
  prefig/core/riemann_sum.py,sha256=T2dQgJIY17QuuPDOB8XWIP8HYmg5jOQ-LroFH7tiGAU,3012
36
37
  prefig/core/shape.py,sha256=Qb_-upbSHwEoYrrAnbCoFFFuVIb3JgJLdyP9ckD5evc,8675
37
- prefig/core/slope_field.py,sha256=MQgqwfsBNL4bZYqcpEif64gj7Xz6a1SSfcJPAYBZAE8,8231
38
+ prefig/core/slope_field.py,sha256=KThnVBuO_3QK7k6xxCWnsbiv-X9P8oS1SgFPLoynA-E,8797
38
39
  prefig/core/statistics.py,sha256=5qN_-ABN0EFVG12ZP95uSPk82INbWRqI3w2fUdR3wsw,3458
39
- prefig/core/tags.py,sha256=Y3LdH8KSEqIbjTrQLBOV56WMqGbjII-kEhtlEEIKSTQ,4048
40
+ prefig/core/tags.py,sha256=7w6E3960o_ZgZl4xYJLVJ1eLttt0vVlB4IgMZGTMyyE,4134
40
41
  prefig/core/tangent_line.py,sha256=I9wf9VAqhnmmsh8Lzynwi7_Z1DonHXqHf8ym7eO40tk,3400
41
- prefig/core/user_namespace.py,sha256=73rV4iXICoh84xHCqBMTcIXNXGPQcPvTUEE8qFiSivM,6980
42
+ prefig/core/user_namespace.py,sha256=6xlkYd2g9dSiDPH0vmYj93oPzm1BFZdgyMGQ9ipKOgU,7059
42
43
  prefig/core/utilities.py,sha256=R1fBrzj-abXHG4Bh-sS0pZNC8vc9fIt6yJBcuztCVho,2905
43
44
  prefig/core/vector.py,sha256=lTw-y9mt6jqmbFxdPwQB4PYBQ9y4pGrQRcpRp9lBIbY,2917
44
45
  prefig/engine.py,sha256=Zz7j2sFxeMwPN1f3GFTpaBihqguzMNJD5iBONOVL7eQ,11972
@@ -55,13 +56,13 @@ prefig/resources/examples/tangent.xml,sha256=FLZaNz0iFoTLX6gB4pfLZFtu_TWeCug4Dda
55
56
  prefig/resources/fonts/Braille29.ttf,sha256=T4hosDvaUGMVK0Wh0BmBgWeT7sQQmLXyA3gRUR-a0oE,55880
56
57
  prefig/resources/js/mj-sre-page.js,sha256=LHVeI4dCH13bTv56nz3SKNo3JGRXa6joPM3D3wpKV40,9251
57
58
  prefig/resources/js/package.json,sha256=hwKDg76_GzkhX72T7DRiF3FoMLokCv9PSLQvnW5Ovok,116
58
- prefig/resources/schema/pf_schema.rnc,sha256=33E_zj90OVa9xU6QXfBgJZwlPzaoNgtTYrAcp2uBEdk,19954
59
- prefig/resources/schema/pf_schema.rng,sha256=YC9BYvLNa1OgHs3Y5fV_99NwbQaXTfKnAAhjE3L8tAE,53903
59
+ prefig/resources/schema/pf_schema.rnc,sha256=WORhF-dRkNY8aeiNQvZIaPTE5QGCMzbrXqttXCjtOJY,20166
60
+ prefig/resources/schema/pf_schema.rng,sha256=TmZQLgyK2wntXDXOiQXYcVQedlPuPh8IWrtttK0iCQY,54454
60
61
  prefig/resources/template/pf_publication.xml,sha256=eEv8HACv610Apw5DSVNy0reLfELYqHlNy9Oq0GH7C_c,200
61
62
  prefig/scripts/__init__.py,sha256=qJcPi1WRh9UAwu4zIFJbmxWalAMilMYqgi6LxRkF7bI,25
62
63
  prefig/scripts/install_mj.py,sha256=5A6-oc1xbIXka5mkFE70vlp9-Rh_QoxOxGMrQi9Hkio,1219
63
- prefig-0.3.8.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
64
- prefig-0.3.8.dist-info/METADATA,sha256=_77yC4Xrf2khqt3FJ3JMRed5KY7WhjlfJ8PNmCgibwk,8710
65
- prefig-0.3.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
66
- prefig-0.3.8.dist-info/entry_points.txt,sha256=OP4ZQT71q2b0Zfbie-oM2Z1HlxpkuX7qaxJnzwsBOVQ,42
67
- prefig-0.3.8.dist-info/RECORD,,
64
+ prefig-0.3.9.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
65
+ prefig-0.3.9.dist-info/METADATA,sha256=rYzAuVlVvkQLiZ-THOuBV_TPO7aiPv85eJhbRNuciOs,8710
66
+ prefig-0.3.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
67
+ prefig-0.3.9.dist-info/entry_points.txt,sha256=OP4ZQT71q2b0Zfbie-oM2Z1HlxpkuX7qaxJnzwsBOVQ,42
68
+ prefig-0.3.9.dist-info/RECORD,,
File without changes