euporie 2.8.13__py3-none-any.whl → 2.8.15__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.
Files changed (36) hide show
  1. euporie/console/tabs/console.py +4 -0
  2. euporie/core/__init__.py +1 -1
  3. euporie/core/cache.py +36 -0
  4. euporie/core/clipboard.py +16 -1
  5. euporie/core/config.py +1 -1
  6. euporie/core/convert/datum.py +25 -9
  7. euporie/core/convert/formats/ansi.py +25 -21
  8. euporie/core/convert/formats/base64.py +3 -1
  9. euporie/core/convert/formats/common.py +4 -4
  10. euporie/core/convert/formats/ft.py +6 -3
  11. euporie/core/convert/formats/html.py +22 -24
  12. euporie/core/convert/formats/markdown.py +4 -2
  13. euporie/core/convert/formats/pil.py +3 -1
  14. euporie/core/convert/formats/png.py +6 -4
  15. euporie/core/convert/formats/rich.py +3 -1
  16. euporie/core/convert/formats/sixel.py +3 -3
  17. euporie/core/convert/formats/svg.py +3 -1
  18. euporie/core/ft/html.py +192 -125
  19. euporie/core/ft/table.py +1 -1
  20. euporie/core/kernel/__init__.py +7 -3
  21. euporie/core/kernel/base.py +13 -0
  22. euporie/core/kernel/local.py +8 -3
  23. euporie/core/layout/containers.py +5 -0
  24. euporie/core/tabs/kernel.py +6 -1
  25. euporie/core/widgets/cell_outputs.py +39 -8
  26. euporie/core/widgets/display.py +11 -4
  27. euporie/core/widgets/forms.py +11 -5
  28. euporie/core/widgets/menu.py +9 -8
  29. euporie/preview/tabs/notebook.py +15 -4
  30. {euporie-2.8.13.dist-info → euporie-2.8.15.dist-info}/METADATA +2 -1
  31. {euporie-2.8.13.dist-info → euporie-2.8.15.dist-info}/RECORD +36 -35
  32. {euporie-2.8.13.data → euporie-2.8.15.data}/data/share/applications/euporie-console.desktop +0 -0
  33. {euporie-2.8.13.data → euporie-2.8.15.data}/data/share/applications/euporie-notebook.desktop +0 -0
  34. {euporie-2.8.13.dist-info → euporie-2.8.15.dist-info}/WHEEL +0 -0
  35. {euporie-2.8.13.dist-info → euporie-2.8.15.dist-info}/entry_points.txt +0 -0
  36. {euporie-2.8.13.dist-info → euporie-2.8.15.dist-info}/licenses/LICENSE +0 -0
@@ -37,6 +37,7 @@ from prompt_toolkit.layout.utils import explode_text_fragments
37
37
  from prompt_toolkit.mouse_events import MouseEvent, MouseEventType
38
38
  from prompt_toolkit.utils import get_cwidth, take_using_weights, to_str
39
39
 
40
+ from euporie.core.cache import SimpleCache
40
41
  from euporie.core.data_structures import DiInt
41
42
  from euporie.core.layout.controls import DummyControl
42
43
  from euporie.core.layout.screen import BoundedWritePosition
@@ -557,6 +558,10 @@ class Window(ptk_containers.Window):
557
558
  super().__init__(*args, **kwargs)
558
559
  if isinstance(self.content, PtkDummyControl):
559
560
  self.content = DummyControl()
561
+ # Use thread-safe cache for margin widths
562
+ self._margin_width_cache: SimpleCache[tuple[Margin, int], int] = SimpleCache(
563
+ maxsize=1
564
+ )
560
565
 
561
566
  def write_to_screen(
562
567
  self,
@@ -387,7 +387,12 @@ class KernelTab(Tab, metaclass=ABCMeta):
387
387
  return
388
388
 
389
389
  # Prompt user to select a kernel
390
- self.app.dialogs["change-kernel"].show(tab=self, message=msg)
390
+ if dialog := self.app.dialogs.get("change-kernel"):
391
+ dialog.show(tab=self, message=msg)
392
+ return
393
+
394
+ if msg:
395
+ log.warning(msg)
391
396
 
392
397
  def switch_kernel(self, factory: KernelFactory) -> None:
393
398
  """Shut down the current kernel and change to another."""
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ import weakref
6
7
  from abc import ABCMeta, abstractmethod
7
8
  from functools import cache
8
9
  from pathlib import PurePath
@@ -23,10 +24,13 @@ from euporie.core.widgets.tree import JsonView
23
24
 
24
25
  if TYPE_CHECKING:
25
26
  from typing import Any, Protocol, TypeVar
27
+ from weakref import ReferenceType
26
28
 
27
29
  from prompt_toolkit.layout.containers import AnyContainer
28
30
 
31
+ from euporie.core.config import Setting
29
32
  from euporie.core.tabs.kernel import KernelTab
33
+ from euporie.core.widgets.display import DisplayWindow
30
34
 
31
35
  KTParent = TypeVar("KTParent", bound=KernelTab)
32
36
 
@@ -64,10 +68,15 @@ class CellOutputElement(metaclass=ABCMeta):
64
68
 
65
69
  """
66
70
 
71
+ @property
72
+ def width(self) -> int | None:
73
+ """Return the current width of the output's content."""
74
+ return None
75
+
67
76
  def scroll_left(self) -> None:
68
77
  """Scroll the output left."""
69
78
 
70
- def scroll_right(self) -> None:
79
+ def scroll_right(self, max: int | None = None) -> None:
71
80
  """Scroll the output right."""
72
81
 
73
82
  @abstractmethod
@@ -147,6 +156,18 @@ class CellOutputDataElement(CellOutputElement):
147
156
  # Ensure container gets invalidated if `wrap_cell_output` changes
148
157
  self.container.control.invalidate_events.append(config.events.wrap_cell_outputs)
149
158
 
159
+ # Reset scroll position on `wrap_cell_outputs` config change
160
+ def _unregister(win: ReferenceType[DisplayWindow]) -> None:
161
+ config.events.wrap_cell_outputs -= _reset_scroll
162
+
163
+ weak_win = weakref.ref(self.container.window, _unregister)
164
+
165
+ def _reset_scroll(caller: Setting | None = None) -> None:
166
+ if (win := weak_win()) is not None:
167
+ win.reset()
168
+
169
+ config.events.wrap_cell_outputs += _reset_scroll
170
+
150
171
  @property
151
172
  def data(self) -> Any:
152
173
  """Return the control's display data."""
@@ -165,13 +186,18 @@ class CellOutputDataElement(CellOutputElement):
165
186
  )
166
187
  self.container.datum = self._datum
167
188
 
189
+ @property
190
+ def width(self) -> int:
191
+ """Return the current width of the output's content."""
192
+ return self.container.window.content.max_line_width
193
+
168
194
  def scroll_left(self) -> None:
169
195
  """Scroll the output left."""
170
196
  self.container.window._scroll_left()
171
197
 
172
- def scroll_right(self) -> None:
198
+ def scroll_right(self, max: int | None = None) -> None:
173
199
  """Scroll the output right."""
174
- self.container.window._scroll_right()
200
+ self.container.window._scroll_right(max)
175
201
 
176
202
  def __pt_container__(self) -> AnyContainer:
177
203
  """Return the display container."""
@@ -403,9 +429,9 @@ class CellOutput:
403
429
  """Scroll the currently visible output left."""
404
430
  self.element.scroll_left()
405
431
 
406
- def scroll_right(self) -> None:
432
+ def scroll_right(self, max: int | None = None) -> None:
407
433
  """Scroll the currently visible output right."""
408
- self.element.scroll_right()
434
+ self.element.scroll_right(max)
409
435
 
410
436
 
411
437
  class CellOutputArea:
@@ -499,8 +525,12 @@ class CellOutputArea:
499
525
 
500
526
  def scroll_right(self) -> None:
501
527
  """Scroll the outputs right."""
528
+ max_width = max(
529
+ (cell_output.element.width or 0 for cell_output in self.rendered_outputs),
530
+ default=None,
531
+ )
502
532
  for cell_output in self.rendered_outputs:
503
- cell_output.scroll_right()
533
+ cell_output.scroll_right(max_width)
504
534
 
505
535
  def __pt_container__(self) -> AnyContainer:
506
536
  """Return the cell output area container (an :class:`HSplit`)."""
@@ -511,15 +541,16 @@ class CellOutputArea:
511
541
  from prompt_toolkit.formatted_text.utils import to_plain_text
512
542
 
513
543
  outputs = []
544
+ app = get_app()
545
+ config = app.config
514
546
  for cell_output in self.rendered_outputs:
515
547
  if isinstance(cell_output.element, CellOutputDataElement):
516
- config = get_app().config
517
548
  control = cell_output.element.container.control
518
549
  for line in control.get_lines(
519
550
  control.datum,
520
551
  width=88,
521
552
  height=None,
522
- fg=(cp := get_app().color_palette).fg.base_hex,
553
+ fg=(cp := app.color_palette).fg.base_hex,
523
554
  bg=cp.bg.base_hex,
524
555
  wrap_lines=config.wrap_cell_outputs,
525
556
  ):
@@ -55,8 +55,6 @@ class DisplayControl(UIControl):
55
55
  A control which displays rendered HTML content.
56
56
  """
57
57
 
58
- _window: Window
59
-
60
58
  def __init__(
61
59
  self,
62
60
  datum: Datum,
@@ -156,6 +154,8 @@ class DisplayControl(UIControl):
156
154
  fg=fg,
157
155
  bg=bg,
158
156
  extend=not self.dont_extend_width(),
157
+ # Use as extra cache key to force re-rendering when wrap_lines changes
158
+ wrap_lines=wrap_lines,
159
159
  )
160
160
  if width and height:
161
161
  key = Datum.add_size(datum, Size(height, width))
@@ -174,6 +174,13 @@ class DisplayControl(UIControl):
174
174
  lines.extend([[]] * max(0, height - len(lines)))
175
175
  return lines
176
176
 
177
+ @property
178
+ def max_line_width(self) -> int:
179
+ """Return the current maximum line width."""
180
+ return self._max_line_width_cache[
181
+ self.datum, self.width, self.height, self.wrap_lines()
182
+ ]
183
+
177
184
  def get_max_line_width(
178
185
  self,
179
186
  datum: Datum,
@@ -428,12 +435,12 @@ class DisplayWindow(Window):
428
435
 
429
436
  return NotImplemented
430
437
 
431
- def _scroll_right(self) -> NotImplementedOrNone:
438
+ def _scroll_right(self, max: int | None = None) -> NotImplementedOrNone:
432
439
  """Scroll window right."""
433
440
  info = self.render_info
434
441
  if info is None:
435
442
  return NotImplemented
436
- content_width = self.content.content_width
443
+ content_width = max or self.content.content_width
437
444
  if self.horizontal_scroll < content_width - info.window_width:
438
445
  if info.cursor_position.y <= info.configured_scroll_offsets.right:
439
446
  self.content.move_cursor_right()
@@ -1148,9 +1148,12 @@ class SelectableWidget(metaclass=ABCMeta):
1148
1148
  return next((x for x in self.indices), None)
1149
1149
 
1150
1150
  @index.setter
1151
- def index(self, value: int) -> None:
1151
+ def index(self, value: int | None) -> None:
1152
1152
  """Set the selected indices to a single value."""
1153
- self.indices = [value]
1153
+ if value is None:
1154
+ self.indices = []
1155
+ else:
1156
+ self.indices = [value]
1154
1157
 
1155
1158
  @property
1156
1159
  def indices(self) -> list[int]:
@@ -1161,7 +1164,7 @@ class SelectableWidget(metaclass=ABCMeta):
1161
1164
  return output
1162
1165
 
1163
1166
  @indices.setter
1164
- def indices(self, values: tuple[int]) -> None:
1167
+ def indices(self, values: list[int]) -> None:
1165
1168
  """Set the selected indices."""
1166
1169
  self._selected.clear()
1167
1170
  for i in range(len(self.options)):
@@ -1722,9 +1725,12 @@ class ToggleButtons(SelectableWidget):
1722
1725
  return next((x for x in self.indices), None)
1723
1726
 
1724
1727
  @index.setter
1725
- def index(self, value: int) -> None:
1728
+ def index(self, value: int | None) -> None:
1726
1729
  """Set the selected indices to a single value."""
1727
- self.indices = [value]
1730
+ if value is None:
1731
+ self.indices = []
1732
+ else:
1733
+ self.indices = [value]
1728
1734
  self.update_buttons(self)
1729
1735
 
1730
1736
  def update_buttons(self, widget: SelectableWidget | None = None) -> None:
@@ -618,9 +618,10 @@ class MenuBar:
618
618
  self.refocus()
619
619
  item.handler()
620
620
  else:
621
- self.selected_menu = self.selected_menu[
622
- : level + 1
623
- ] + [i]
621
+ self.selected_menu = [
622
+ *self.selected_menu[: level + 1],
623
+ i,
624
+ ]
624
625
  app.layout.focus(
625
626
  self.menu_containers[
626
627
  len(self.selected_menu) - 1
@@ -734,11 +735,11 @@ class MenuBar:
734
735
  # Show the right edge
735
736
  yield (f"{style} class:menu,border", grid.MID_RIGHT)
736
737
 
737
- for i, item in enumerate(menu.children):
738
- if not item.hidden():
739
- result.extend(one_item(i, item))
740
- if i < len(menu.children) - 1:
741
- result.append(("", "\n"))
738
+ visible_children = [x for x in menu.children if not x.hidden()]
739
+ for i, item in enumerate(visible_children):
740
+ result.extend(one_item(i, item))
741
+ if i < len(visible_children) - 1:
742
+ result.append(("", "\n"))
742
743
 
743
744
  return result
744
745
 
@@ -39,7 +39,10 @@ class PreviewNotebook(BaseNotebook):
39
39
  self,
40
40
  app: BaseApp,
41
41
  path: Path | None = None,
42
+ kernel: BaseKernel | None = None,
43
+ comms: dict[str, Comm] | None = None,
42
44
  use_kernel_history: bool = False,
45
+ connection_file: Path | None = None,
43
46
  ) -> None:
44
47
  """Create a new instance."""
45
48
  self.cell_index = 0
@@ -49,6 +52,8 @@ class PreviewNotebook(BaseNotebook):
49
52
  self.app.after_render += self.after_render
50
53
 
51
54
  self._cell = Cell(0, {}, self)
55
+ # Start the kernel (if needed) after the tab is fully loaded
56
+ self._init_kernel(kernel, comms, use_kernel_history, connection_file)
52
57
 
53
58
  def pre_init_kernel(self) -> None:
54
59
  """Filter cells before kernel is loaded."""
@@ -72,13 +77,19 @@ class PreviewNotebook(BaseNotebook):
72
77
  use_kernel_history: bool = False,
73
78
  connection_file: Path | None = None,
74
79
  ) -> None:
75
- """Set up the tab's kernel and related components."""
80
+ """We defer starting the kernel until the whole tab has loaded."""
81
+
82
+ def _init_kernel(
83
+ self,
84
+ kernel: BaseKernel | None = None,
85
+ comms: dict[str, Comm] | None = None,
86
+ use_kernel_history: bool = False,
87
+ connection_file: Path | None = None,
88
+ ) -> None:
89
+ """Start the tab's kernel if needed."""
76
90
  # Only load the kernel if running the notebook
77
91
  if self.app.config.run:
78
92
  super().init_kernel(kernel, comms, use_kernel_history, connection_file)
79
- else:
80
- self.pre_init_kernel()
81
- self.post_init_kernel()
82
93
 
83
94
  def print_title(self) -> None:
84
95
  """Print a notebook's filename."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euporie
3
- Version: 2.8.13
3
+ Version: 2.8.15
4
4
  Summary: Euporie is a suite of terminal applications for interacting with Jupyter kernels
5
5
  Project-URL: Documentation, https://euporie.readthedocs.io/en/latest
6
6
  Project-URL: Issues, https://github.com/joouha/euporie/issues
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
21
22
  Classifier: Programming Language :: Python :: Implementation :: CPython
22
23
  Classifier: Programming Language :: Python :: Implementation :: PyPy
23
24
  Classifier: Topic :: Scientific/Engineering
@@ -5,15 +5,16 @@ euporie/console/_settings.py,sha256=jZroKFFsTzyEhP1Sis41Se70hwxqDmpa2Lb19XnMnRQ,
5
5
  euporie/console/app.py,sha256=nUmsoIQZMnQ0e506irqzvPOd31x_xUXn2w3kT1e2f9w,5736
6
6
  euporie/console/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  euporie/console/tabs/__init__.py,sha256=Grm9EO1gnBO1o-k6Nqnlzo8XLIgFZSXNAdz49Vvh4zY,55
8
- euporie/console/tabs/console.py,sha256=qp0uNQTRDu5qDoXGQ4LpKm6OhVjAvskzXMyctL-Trnw,31908
9
- euporie/core/__init__.py,sha256=pSpDq3JkgvsQ531ieYUpw5oByTxVS1oo_c0FY_sLTxg,314
8
+ euporie/console/tabs/console.py,sha256=TYMgXghxyEQVjkn8yGapWXz30kY-RLbaDew6ACljPCM,31992
9
+ euporie/core/__init__.py,sha256=Cjosf8D6N4OFOXeUnlvGQFSx7M93relLtKiVjXHHTN8,314
10
10
  euporie/core/__main__.py,sha256=QkRamWXgrPiRj7h4sYNhHNpVOUJuEpRuvZE-YLK1dUU,1255
11
11
  euporie/core/_settings.py,sha256=JspB4eMUXry4r5g4Wzn4aV0FmzSVmWf1G96Jcr5bcDE,2937
12
12
  euporie/core/border.py,sha256=HktTPL-sKxaiM8_DPdaetFI5fOvEBVJrw3tmgsKT2jY,48835
13
- euporie/core/clipboard.py,sha256=A2LdeyWKWuG0rPy6QoefmBbRtOtpzz_R6FLwBfU5Dr4,2060
13
+ euporie/core/cache.py,sha256=lW7NnfkCBG7m2nS2fv874FNoEkST8Tze826iKPqK7G0,881
14
+ euporie/core/clipboard.py,sha256=RT6rbi_9aGYAV9HZntOLPAWmut5vCZItAMSjqknpSG0,2534
14
15
  euporie/core/commands.py,sha256=aBBCSBm7AJRCoiOZzbIOucExqm5nYf--SrbiysBRkFc,9035
15
16
  euporie/core/completion.py,sha256=F_MQ9XyZdzVwipW7O8w2XOR-puYvTVcALC2XWmEhpYc,5752
16
- euporie/core/config.py,sha256=wgjeCSgLIkRo1PXt6z41z1agkToSnMR6wfSmbF6LCT8,25198
17
+ euporie/core/config.py,sha256=OkJwjrr4o8-JmAFYTuZWJVw6yTpZagAz-GLwQCZgtQM,25199
17
18
  euporie/core/data_structures.py,sha256=2ml-q-y5Ft0pyq1Xc-NySCLMoEir71M9e2PLfvPbegc,2350
18
19
  euporie/core/diagnostics.py,sha256=KywmOqa1_Lfk5SsO1Fd0Vl801DvVKvAD4pOOpdLijAM,1680
19
20
  euporie/core/filters.py,sha256=t-s9g-wSPhDd3iXcLtiwT5IsIfK7vIuicV-KU-eB19A,10237
@@ -56,35 +57,35 @@ euporie/core/comm/base.py,sha256=-zXNOXimuD7Aeo2scADnvSimZa6pF8obT51vluBz2co,412
56
57
  euporie/core/comm/ipywidgets.py,sha256=Qw1LI_Er8l9leZJMsohtQBJD_K4b0KPordynXhrknFk,53013
57
58
  euporie/core/comm/registry.py,sha256=x9AhhTi4Ohxq6fdPXU9GJgH58CleYsEy-xw084TcIx0,1384
58
59
  euporie/core/convert/__init__.py,sha256=dZKZVTyYAuIKtjTbtcqvko-I89LYwr4fDbYj1J9PyEc,64
59
- euporie/core/convert/datum.py,sha256=m3zFbwplo6KiE6-I7ezTG8XFJP1bZs7rW__Dam0tNjM,15918
60
+ euporie/core/convert/datum.py,sha256=w0OMyfEFc9OTqt_62JMYBy6hkb7vzpKOpNWbYxVHDPY,16285
60
61
  euporie/core/convert/mime.py,sha256=uQwXw2hUsfS_dMeR4Ci6Zv4fORIBnEa9rdRa-nVT-Ls,3142
61
62
  euporie/core/convert/registry.py,sha256=pDnUzXp08t-XN3lXxBimMuRSNFwskAOLeeU0OHMMN30,2904
62
63
  euporie/core/convert/utils.py,sha256=aNqorWKz_yHItJZjTXcwCJ_CANuKhv2IQPq3w2o9Iqs,3449
63
64
  euporie/core/convert/formats/__init__.py,sha256=FfUR-GAaH750KEeDF0jmtwwvrWZth0Gr-Mw9qOy5264,486
64
- euporie/core/convert/formats/ansi.py,sha256=66jcfOOiWE3uBf154eiGmwGlKbQ3GCATOcDthj1kaeY,14011
65
- euporie/core/convert/formats/base64.py,sha256=8tP29nX_patgOG9lYr-HIn0I_6VyV_SyfDi-ZZBTp6Q,878
66
- euporie/core/convert/formats/common.py,sha256=TgNL0049rzsnrznoJn5Ij95XbQO-pifU_pk2nsysX-w,4645
67
- euporie/core/convert/formats/ft.py,sha256=6RKWq0y3kbJ96kbMjfazGeBg3uha8CWoseRPa4WLWHE,2810
68
- euporie/core/convert/formats/html.py,sha256=JdjMEXVGbKLz2db86b83hfeQxS3mzKmWdzEOv0jQJNQ,2470
65
+ euporie/core/convert/formats/ansi.py,sha256=ZwJePbKfBNG2712_JgjRQEPGYLYuzPiTtXVFwbzMDHQ,13965
66
+ euporie/core/convert/formats/base64.py,sha256=QZ_rMBKc5Lrc0zTh-MPLw_jN4Z_wDtejCVLx1dYebTA,900
67
+ euporie/core/convert/formats/common.py,sha256=g4uizutWZalvMNJtD8w7DSOm3r4RW-0tMzL8KEOyb7s,4621
68
+ euporie/core/convert/formats/ft.py,sha256=fIrTkJYwCzL8zS3iKMjwZZEzyCsgOUiNaTS016iDv3I,2888
69
+ euporie/core/convert/formats/html.py,sha256=9W1gTkHZMnwSE72RTHKf6MiztHbegyKXNCeeAWVJ-90,2340
69
70
  euporie/core/convert/formats/jpeg.py,sha256=c38IZEd6HVAmKBXnDE0qmqwfWtjcwVL5ugXffV0wCpA,287
70
- euporie/core/convert/formats/markdown.py,sha256=vKTyS-HGz_smvvNxo0cJoRNgBjbRWU2Bf1sM1_bwWAM,2377
71
+ euporie/core/convert/formats/markdown.py,sha256=VTIqFFP8T42vB7BGD7Uy1oQX1fR7siMbmd-OHgJe69U,2393
71
72
  euporie/core/convert/formats/pdf.py,sha256=6d8e5tjV1j6QXMr7KBNmQ2hQzVY9Il19xg4a8E_0I0I,283
72
- euporie/core/convert/formats/pil.py,sha256=wMT7Qqe6KH1kZfr1Hg8OyIZg02lMMwowtFB1XeXLiy4,2494
73
- euporie/core/convert/formats/png.py,sha256=7lLP0v58m7Z0BPc_xxlXPmEvaVpmFp36k3aUfTNWn9E,4973
74
- euporie/core/convert/formats/rich.py,sha256=lh12hxMWvWMJ2Y3cMZBKcX8UQ4huWRWyi0H7LgpNqZE,939
75
- euporie/core/convert/formats/sixel.py,sha256=DV9ifN09XgRFvacc3D6UOdOhSMIT3sjp9SgzJTfYeJI,2493
76
- euporie/core/convert/formats/svg.py,sha256=SY-rioXSm5lK6LLp3mu3YeFYTFOJ-jCvEwH-wusfU1s,805
73
+ euporie/core/convert/formats/pil.py,sha256=vB-Z7TYkW1Onfk6MYm5PXQ4kSPRL-hBE8Cckuyy1k9M,2516
74
+ euporie/core/convert/formats/png.py,sha256=VorJeFikAsxuAm8DDALoDOvNYr4C94ryq8lXSrcNxW0,4977
75
+ euporie/core/convert/formats/rich.py,sha256=gvRJEzdZOs1HBC6S_aucOpwGrNUN4mYsZkojh-6UJn8,961
76
+ euporie/core/convert/formats/sixel.py,sha256=8e5jKspmaO1pHjlL2vweWowultYAg2nlp7du9bRMkeQ,2475
77
+ euporie/core/convert/formats/svg.py,sha256=qdROd6IRDMNlRZx8fYRbQjqzpCozkNXExnFBl6Vy-Tc,827
77
78
  euporie/core/ft/__init__.py,sha256=Ib-pswos3RiOM2Vn8GCZ4rwuoTNPeBJ0jhgRpwu7BKE,55
78
79
  euporie/core/ft/ansi.py,sha256=JhmxJYtNczJa315yhHOhpM5ohZ3kROhH7sz18WiZ3a4,6197
79
- euporie/core/ft/html.py,sha256=akjouBd6LP6Yejl7uY7AhFkTiasZce90HOI1kR91zww,179494
80
- euporie/core/ft/table.py,sha256=VfKGsWPnHaqH_fBlNgBAr2ku3WcqiRjeMENR98yu9OA,53314
80
+ euporie/core/ft/html.py,sha256=B_VL2yop_rcPRb0jMUTJow5w_gVAWUNT3Q3zokBPiRA,182792
81
+ euporie/core/ft/table.py,sha256=MC6TLc0GfRviB3xeuouZRIyq2DNxxWFFGolDf-5Tk2E,53328
81
82
  euporie/core/ft/utils.py,sha256=qcArKRg4XeQIHtxxypU5g21PQ-IlPYrjYvGY53WcvLU,27870
82
- euporie/core/kernel/__init__.py,sha256=OzDNoLffqunS-mZb23U0a2_tOx-E0QtmT25rVLj76bU,1540
83
+ euporie/core/kernel/__init__.py,sha256=aN38i26yR_WV8cP5N_SJtefBEVR460CvPG1q3Vjfe9U,1634
83
84
  euporie/core/kernel/_settings.py,sha256=h2ESe2FnHG4tu3ECz7jIIOjrpCLFrRZL3jHBpWRKeIU,828
84
- euporie/core/kernel/base.py,sha256=nAgUVwMb0IIfgfjv13L7kov7PXSzBo3MfMf12ipoOGs,17937
85
+ euporie/core/kernel/base.py,sha256=bNNg4juqguj_Ox-c5gy7jPWj523owzNzu7hmbQoUBHc,18271
85
86
  euporie/core/kernel/jupyter.py,sha256=R2H3eTYLQwLSc9pRadyETNFHrIqY1b9I6uxqAdQHXS8,36206
86
87
  euporie/core/kernel/jupyter_manager.py,sha256=tvft5LGjXYXPJBO3tNOKvyicnz-FwS1wbUQ2Q6OtEwY,4031
87
- euporie/core/kernel/local.py,sha256=M3ODqCPbGq2r2l7DATF95DPbnzt6Smta_XxkWpiVs-M,25580
88
+ euporie/core/kernel/local.py,sha256=MLyb_KZijLcGw5xcv4sM5Ti6sTs6KGPbOUhCRcHah0c,25690
88
89
  euporie/core/key_binding/__init__.py,sha256=zFKrJrZARNht6Tl4TT5Fw3fk-IrD8SBYk5mBJ5K_F1A,47
89
90
  euporie/core/key_binding/key_processor.py,sha256=sGEOH3cd0yJO-81dWROzzDYjxEA5gxo1rpNbuphvv9I,5756
90
91
  euporie/core/key_binding/micro_state.py,sha256=h_CBBiIUa4mHf70ZZDNbXreC0p0H3boNVzHnHVuIAp8,1276
@@ -101,7 +102,7 @@ euporie/core/key_binding/bindings/terminal.py,sha256=eOoWaztPs2KblYxnbhHxMD-Xru9
101
102
  euporie/core/key_binding/bindings/vi.py,sha256=XutOsbBI8ywyWR5XY2pUN14Vga6R0vrDK27q7ZhE8pM,1567
102
103
  euporie/core/layout/__init__.py,sha256=T5iGOnMGfNwVffJlfFMwGTFBLV7RkOuKw5gVp6cl4wA,59
103
104
  euporie/core/layout/cache.py,sha256=AkZgwETYwqq4o5MNj0BWly3aZcZCrQGEUR6Li9q-3Xo,16054
104
- euporie/core/layout/containers.py,sha256=ySDSaMjkSPZeE5T1GNPI-FYUcU9VipCiNAF_UfVCXEY,49189
105
+ euporie/core/layout/containers.py,sha256=g09OTcEw0Tjx1URwIhec2VoIVcnitSF7kglsZFAXmsk,49400
105
106
  euporie/core/layout/controls.py,sha256=iFklysBxk_roWKfNN4Hdjqf4sFdEBzNWZq2OavlpJHY,825
106
107
  euporie/core/layout/decor.py,sha256=aUJXdeDujk4hDG5uvEdF44sRBzTak12x1J5W7YQxfSk,14128
107
108
  euporie/core/layout/mouse.py,sha256=AQwmSySsDJmWweh7Skly-XqqNGZavNtfqt3DDsTsvRg,5169
@@ -112,22 +113,22 @@ euporie/core/tabs/__init__.py,sha256=7IzC_LLd-61JH6CBLDEeLhTtlEyFbQtgRqGbVUWBNP8
112
113
  euporie/core/tabs/_commands.py,sha256=M1emj8w8ni-_EfE3PHTWQ_SJR0VYXBMLgLExIpLXvZc,1903
113
114
  euporie/core/tabs/_settings.py,sha256=MgC_WPy28g44PvhY_3Y1EwR7yikid4gEXZoV1Ydtq6w,3659
114
115
  euporie/core/tabs/base.py,sha256=PsYq4nMBYeYjVkfJqosBw30R1DcTlCKQtlmtXZ2oLfo,7698
115
- euporie/core/tabs/kernel.py,sha256=gsaW_2GUWBeeUtrNOTrrr6He_ShkLcA5XjiDXdS_No8,17348
116
+ euporie/core/tabs/kernel.py,sha256=EbOMwi4WJeV41dlLqd8vQinMRwr-Y3SLCERp70mLsIk,17450
116
117
  euporie/core/tabs/notebook.py,sha256=rZa2LRaCCEl3kb4hniQEQtly_uCBBF92dYFYcv8ID2g,15024
117
118
  euporie/core/widgets/__init__.py,sha256=ektso_Ea1-pZB04alUujQsa2r-kv8xAF0SmQOv_bvHQ,52
118
119
  euporie/core/widgets/_settings.py,sha256=6U6tgw8YajrvP5MbdBwvaYHNXjyRsP6ewBkSmqiVAhI,5456
119
120
  euporie/core/widgets/cell.py,sha256=PqY6FBTwPFF0mfHTJtBae_8ZQkBcBkf1RQReYARkOzQ,33783
120
- euporie/core/widgets/cell_outputs.py,sha256=tIDBIWPnwavGlKDykDr_mOfbOgkpD94N_wV3RHVXGAA,17257
121
+ euporie/core/widgets/cell_outputs.py,sha256=ltt-CGUYrkJJ9AnxNiUAD2o-7v0dhiTenIkLuLMRhWU,18421
121
122
  euporie/core/widgets/decor.py,sha256=_K3bSNpvAFdn5ZZyNFVjZPv6QV4fNIlNMdRpYjc4MU0,7895
122
123
  euporie/core/widgets/dialog.py,sha256=2yvNzDqDjsOBWVfeSgR4Lv1LC73tQIeI_qz2YIx7H1k,32987
123
- euporie/core/widgets/display.py,sha256=ddpPcFJGx9cRpn5kLAaMI6bxKPygFmDN3VcgcvObFVY,21557
124
+ euporie/core/widgets/display.py,sha256=L2AnzIa5BmJ7KH3WLr753vj2eHmZ12l2xMHThhQCqUs,21910
124
125
  euporie/core/widgets/file_browser.py,sha256=jj8l5cpX7S6d1HlYXUg3TXdsvmhFneIOiotKpwCVgoQ,20050
125
126
  euporie/core/widgets/formatted_text_area.py,sha256=J7P_TNXPZKZkiBdjAVkPvkfRY1veXe4tzXU241k4b-Q,4037
126
- euporie/core/widgets/forms.py,sha256=G_omvjVhbWjY0HYb8s7gs9MqPyABBwAJElyCACsHv_0,85850
127
+ euporie/core/widgets/forms.py,sha256=ELpzh3wRcjS9BYUoFrrZckDFkOVgqiGLQjqucRI1dVI,86011
127
128
  euporie/core/widgets/inputs.py,sha256=fVg4sEDCJKvVf-fPXMBhVmKjs1eoRLqlUSWKKxT9e_0,20469
128
129
  euporie/core/widgets/layout.py,sha256=jPChBUf8FEbj_c6RwBooaATFnecm_MrSTpJFkPxOFFQ,30521
129
130
  euporie/core/widgets/logo.py,sha256=VU9hSVAiguS5lI0EccQoPm8roAuQNgvFUO5IREvXWFo,1487
130
- euporie/core/widgets/menu.py,sha256=1vb7ORM3Avhx2k1D_QpSb4VtwjhBrmDQl1ZEJL3ub2s,34890
131
+ euporie/core/widgets/menu.py,sha256=-7l4QMw5OOHxFe3Gym9ftPH0kczsoGsHeZ79DJG7MHQ,34963
131
132
  euporie/core/widgets/pager.py,sha256=nbFVF20kE_P2GoDHzAp_sqfiBe1mvuCvVUdjE-KFPzU,6413
132
133
  euporie/core/widgets/palette.py,sha256=Uv5n1Lvls7FnSZ_481L5zvkRsbSzzshhDmTy3gpNomQ,10950
133
134
  euporie/core/widgets/tree.py,sha256=ql5vbpelnCWZacUk7kqdCK1uXfzRzLl34U2_hu65rUY,4288
@@ -164,16 +165,16 @@ euporie/preview/_settings.py,sha256=_N3Dfzg5XOE_L-yq3HgAV68FKgz2nD1UHwLRXVSqI64,
164
165
  euporie/preview/app.py,sha256=Wec45l6vmbQrtjcPkTLbqZS6gBQM4zQvoOl7DX-s6R4,7623
165
166
  euporie/preview/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
167
  euporie/preview/tabs/__init__.py,sha256=rY6DfQ-8qRo_AiICCD-zTyhJBnuMjawWDd8tRxR6q58,43
167
- euporie/preview/tabs/notebook.py,sha256=mr3pF7KUwhxyu592Dwws1oZmYEfT9NNoCfUBUC7vDAs,6672
168
+ euporie/preview/tabs/notebook.py,sha256=eRJxeIN6V6121OYKtCfapp_ie5Nkf7TmmZJpz96O4kY,7155
168
169
  euporie/web/__init__.py,sha256=wE-4WBbzcpWVu5YisLrUhYOn3ZlBK2YZryjc1r96qrY,38
169
170
  euporie/web/tabs/__init__.py,sha256=0DbkceML8N_qefZFZB7CJQw_FX0gkuNdabQoEu0zV9E,340
170
171
  euporie/web/tabs/web.py,sha256=CY8tfy_yrZYLWY2pEyOgJsqIHCfGIj9WVKnK6v9Jg8g,6195
171
172
  euporie/web/widgets/__init__.py,sha256=xIxCPl9KiisYgsX-V1LvDT6BETZRF3nC-ZsP8DP7nOY,46
172
173
  euporie/web/widgets/webview.py,sha256=RK_pgW3ebQjz25HGhlW4ouH2XFLJRfiUy6d_vz8o_d8,20469
173
- euporie-2.8.13.data/data/share/applications/euporie-console.desktop,sha256=DI08G0Dl2s5asM6afWUfkKvO5YmcBm-pWQZzUHiNnqc,153
174
- euporie-2.8.13.data/data/share/applications/euporie-notebook.desktop,sha256=RtpJzvizTDuOp0BLa2bLgVHx11LG6L7PL-oF-wHTsgU,155
175
- euporie-2.8.13.dist-info/METADATA,sha256=DTPKwA5g5CVz9bcaDFbVamecBZdS2lVR-crryhBPtMs,6516
176
- euporie-2.8.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
177
- euporie-2.8.13.dist-info/entry_points.txt,sha256=cJPvjp7siwHeqCcCdu-Q9OCcsp4ylbLv0S4RP7g3Bf0,798
178
- euporie-2.8.13.dist-info/licenses/LICENSE,sha256=yB-auuST68VxkNPXb-E7gVdFzOJShyBnoPyyveuAiYc,1079
179
- euporie-2.8.13.dist-info/RECORD,,
174
+ euporie-2.8.15.data/data/share/applications/euporie-console.desktop,sha256=DI08G0Dl2s5asM6afWUfkKvO5YmcBm-pWQZzUHiNnqc,153
175
+ euporie-2.8.15.data/data/share/applications/euporie-notebook.desktop,sha256=RtpJzvizTDuOp0BLa2bLgVHx11LG6L7PL-oF-wHTsgU,155
176
+ euporie-2.8.15.dist-info/METADATA,sha256=zBVAxzWPwfQy8VkXw01h8GuWL3rTYOg61HlkzovcgtE,6567
177
+ euporie-2.8.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
178
+ euporie-2.8.15.dist-info/entry_points.txt,sha256=cJPvjp7siwHeqCcCdu-Q9OCcsp4ylbLv0S4RP7g3Bf0,798
179
+ euporie-2.8.15.dist-info/licenses/LICENSE,sha256=yB-auuST68VxkNPXb-E7gVdFzOJShyBnoPyyveuAiYc,1079
180
+ euporie-2.8.15.dist-info/RECORD,,