euporie 2.8.1__py3-none-any.whl → 2.8.3__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.
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ from functools import lru_cache
6
7
  from typing import TYPE_CHECKING
7
8
 
8
9
  from prompt_toolkit.auto_suggest import AutoSuggest, DynamicAutoSuggest
@@ -97,6 +98,21 @@ if TYPE_CHECKING:
97
98
  log = logging.getLogger(__name__)
98
99
 
99
100
 
101
+ @lru_cache
102
+ def _get_lexer(highlight: bool, lexer: Lexer | None, language: str) -> Lexer:
103
+ """Determine which lexer should be used for syntax highlighting."""
104
+ if not highlight:
105
+ return SimpleLexer()
106
+ elif lexer is not None:
107
+ return lexer
108
+ try:
109
+ pygments_lexer_class = get_lexer_by_name(language).__class__
110
+ except ClassNotFound:
111
+ return SimpleLexer()
112
+ else:
113
+ return PygmentsLexer(pygments_lexer_class, sync_from_start=False)
114
+
115
+
100
116
  class KernelInput(TextArea):
101
117
  """Kernel input text areas.
102
118
 
@@ -129,7 +145,7 @@ class KernelInput(TextArea):
129
145
  scrollbar: FilterOrBool = True,
130
146
  style: str = "class:kernel-input",
131
147
  search_field: SearchToolbar | None = None,
132
- preview_search: FilterOrBool = True,
148
+ preview_search: FilterOrBool = False,
133
149
  prompt: AnyFormattedText = "",
134
150
  input_processors: list[Processor] | None = None,
135
151
  name: str = "",
@@ -182,14 +198,6 @@ class KernelInput(TextArea):
182
198
  self._language = language
183
199
  self.lexer = lexer
184
200
 
185
- def _get_lexer() -> Lexer:
186
- try:
187
- pygments_lexer_class = get_lexer_by_name(self.language).__class__
188
- except ClassNotFound:
189
- return SimpleLexer()
190
- else:
191
- return PygmentsLexer(pygments_lexer_class, sync_from_start=False)
192
-
193
201
  self.formatters = formatters if formatters is not None else []
194
202
  self._diagnostics = diagnostics or Report()
195
203
  self.inspector = inspector
@@ -228,7 +236,8 @@ class KernelInput(TextArea):
228
236
 
229
237
  # Set extra key-bindings
230
238
  widgets_key_bindings = load_registered_bindings(
231
- "euporie.core.widgets.inputs.KernelInput"
239
+ "euporie.core.widgets.inputs.KernelInput",
240
+ config=app.config,
232
241
  )
233
242
  if key_bindings:
234
243
  widgets_key_bindings = merge_key_bindings(
@@ -240,7 +249,11 @@ class KernelInput(TextArea):
240
249
 
241
250
  self.control = BufferControl(
242
251
  buffer=self.buffer,
243
- lexer=DynamicLexer(lambda: self.lexer or _get_lexer()),
252
+ lexer=DynamicLexer(
253
+ lambda: _get_lexer(
254
+ app.config.syntax_highlighting, self.lexer, self.language
255
+ )
256
+ ),
244
257
  input_processors=[
245
258
  ConditionalProcessor(
246
259
  DiagnosticProcessor(_get_diagnostics),
@@ -408,8 +408,6 @@ class MenuBar:
408
408
  """Close the current menu."""
409
409
  if self.selected_menu:
410
410
  self.selected_menu = self.selected_menu[:-1]
411
- log.debug(self.selected_menu)
412
- log.debug(self.last_focused)
413
411
  self.refocus()
414
412
 
415
413
  # Add global CUA menu shortcut
@@ -516,7 +514,7 @@ class MenuBar:
516
514
  focused = self.focused()
517
515
 
518
516
  # This is called during the rendering. When we discover that this
519
- # widget doesn't have the focus anymore. Reset menu state.
517
+ # widget doesn't have the focus anymore, reset the menu state.
520
518
  if not focused:
521
519
  self.selected_menu = []
522
520
 
@@ -527,9 +525,11 @@ class MenuBar:
527
525
  # Toggle focus.
528
526
  if not hover and focused and self.selected_menu == [index]:
529
527
  self.selected_menu = []
530
- self.selected_menu = [index]
528
+ else:
529
+ self.selected_menu = [index]
531
530
  self.refocus()
532
531
  return None
532
+
533
533
  return NotImplemented
534
534
 
535
535
  results: StyleAndTextTuples = []
@@ -147,7 +147,8 @@ class Pager:
147
147
  ],
148
148
  style="class:pager",
149
149
  key_bindings=load_registered_bindings(
150
- "euporie.core.widgets.pager.Pager"
150
+ "euporie.core.widgets.pager.Pager",
151
+ config=get_app().config,
151
152
  ),
152
153
  height=height,
153
154
  ),
@@ -5,7 +5,9 @@ from __future__ import annotations
5
5
  import logging
6
6
  from typing import TYPE_CHECKING
7
7
 
8
+ from prompt_toolkit.document import Document
8
9
  from prompt_toolkit.filters.app import is_searching
10
+ from prompt_toolkit.filters.base import Condition
9
11
  from prompt_toolkit.key_binding.vi_state import InputMode
10
12
  from prompt_toolkit.layout.controls import BufferControl, SearchBufferControl
11
13
  from prompt_toolkit.search import SearchDirection
@@ -55,7 +57,12 @@ class SearchBar(PtkSearchToolbar):
55
57
  ],
56
58
  )
57
59
  self.control.key_bindings = load_registered_bindings(
58
- "euporie.core.widgets.search.SearchBar"
60
+ "euporie.core.widgets.search.SearchBar",
61
+ config=get_app().config,
62
+ )
63
+ search_state = self.control.searcher_search_state
64
+ search_state.ignore_case = Condition(
65
+ lambda: self.search_buffer.text.islower() or search_state.text.islower()
59
66
  )
60
67
 
61
68
  register_bindings(
@@ -73,28 +80,44 @@ class SearchBar(PtkSearchToolbar):
73
80
  )
74
81
 
75
82
 
76
- def start_global_search(
77
- buffer_control: BufferControl | None = None,
78
- direction: SearchDirection = SearchDirection.FORWARD,
79
- ) -> None:
80
- """Start a search through all searchable `buffer_controls` in the layout."""
83
+ def find_search_control() -> tuple[SearchBufferControl | None, BufferControl | None]:
84
+ """Find the current search buffer and buffer control."""
85
+ current_buffer_control: BufferControl | None = None
86
+ search_buffer_control: SearchBufferControl | None = None
87
+
81
88
  app = get_app()
82
89
  layout = app.layout
83
- current_control = layout.current_control
84
- # Find the search buffer control
85
- if app.search_bar is not None:
90
+ current_control = app.layout.current_control
91
+
92
+ if isinstance(current_control, SearchBufferControl):
93
+ search_buffer_control = current_control
94
+
95
+ if search_buffer_control is None and app.search_bar is not None:
86
96
  search_buffer_control = app.search_bar.control
87
- elif (
88
- isinstance(current_control, BufferControl)
89
- and current_control.search_buffer_control is not None
97
+
98
+ if search_buffer_control is not None and current_buffer_control is None:
99
+ current_buffer_control = layout.search_links.get(search_buffer_control)
100
+
101
+ if current_buffer_control is None and isinstance(current_control, BufferControl):
102
+ current_buffer_control = current_control
103
+
104
+ if (
105
+ search_buffer_control is None
106
+ and current_buffer_control is not None
107
+ and current_buffer_control.search_buffer_control is not None
90
108
  ):
91
- search_buffer_control = current_control.search_buffer_control
92
- else:
93
- return
94
- # Find all searchable controls
109
+ search_buffer_control = current_buffer_control.search_buffer_control
110
+
111
+ return search_buffer_control, current_buffer_control
112
+
113
+
114
+ def find_searchable_controls(
115
+ search_buffer_control: SearchBufferControl, current_control: BufferControl | None
116
+ ) -> list[BufferControl]:
117
+ """Find list of searchable controls and the index of the next control."""
95
118
  searchable_controls: list[BufferControl] = []
96
119
  next_control_index = 0
97
- for control in layout.find_all_controls():
120
+ for control in get_app().layout.find_all_controls():
98
121
  # Find the index of the next searchable control so we can link the search
99
122
  # control to it if the currently focused control is not searchable. This is so
100
123
  # that the next searchable control can be focused when search is completed.
@@ -105,24 +128,40 @@ def start_global_search(
105
128
  isinstance(control, BufferControl)
106
129
  and control.search_buffer_control == search_buffer_control
107
130
  ):
108
- # Set its search direction
109
- control.search_state.direction = direction
110
131
  # Add it to our list
111
132
  searchable_controls.append(control)
133
+ searchable_controls = (
134
+ searchable_controls[next_control_index:]
135
+ + searchable_controls[:next_control_index]
136
+ )
137
+ return searchable_controls
138
+
139
+
140
+ def start_global_search(
141
+ buffer_control: BufferControl | None = None,
142
+ direction: SearchDirection = SearchDirection.FORWARD,
143
+ ) -> None:
144
+ """Start a search through all searchable `buffer_controls` in the layout."""
145
+ search_buffer_control, current_control = find_search_control()
146
+ if search_buffer_control is None:
147
+ return
148
+ searchable_controls = find_searchable_controls(
149
+ search_buffer_control, current_control
150
+ )
112
151
 
113
152
  # Stop the search if we did not find any searchable controls
114
153
  if not searchable_controls:
115
154
  return
116
155
 
117
156
  # If the current control is searchable, link it
157
+ app = get_app()
158
+ layout = app.layout
118
159
  if current_control in searchable_controls:
119
160
  assert isinstance(current_control, BufferControl)
120
161
  layout.search_links[search_buffer_control] = current_control
121
162
  else:
122
163
  # otherwise use the next after the currently selected control
123
- layout.search_links[search_buffer_control] = searchable_controls[
124
- next_control_index % len(searchable_controls)
125
- ]
164
+ layout.search_links[search_buffer_control] = searchable_controls[0]
126
165
  # Make sure to focus the search BufferControl
127
166
  layout.focus(search_buffer_control)
128
167
  # If we're in Vi mode, make sure to go into insert mode.
@@ -137,31 +176,85 @@ def find() -> None:
137
176
 
138
177
  def find_prev_next(direction: SearchDirection) -> None:
139
178
  """Find the previous or next search match."""
140
- app = get_app()
141
- layout = app.layout
142
- control = app.layout.current_control
143
- # Determine search buffer and searched buffer
144
- search_buffer_control = None
145
- if isinstance(control, SearchBufferControl):
146
- search_buffer_control = control
147
- control = layout.search_links[search_buffer_control]
148
- elif isinstance(control, BufferControl):
149
- if control.search_buffer_control is not None:
150
- search_buffer_control = control.search_buffer_control
151
- elif app.search_bar is not None:
152
- search_buffer_control = app.search_bar.control
153
- if isinstance(control, BufferControl) and search_buffer_control is not None:
179
+ if is_searching():
180
+ accept_search()
181
+
182
+ search_buffer_control, current_control = find_search_control()
183
+ if search_buffer_control is None:
184
+ return
185
+ searchable_controls = find_searchable_controls(
186
+ search_buffer_control, current_control
187
+ )
188
+
189
+ if direction == SearchDirection.BACKWARD:
190
+ searchable_controls = searchable_controls[:1] + searchable_controls[1:][::-1]
191
+
192
+ # Search over all searchable buffers
193
+ for i, control in enumerate(searchable_controls):
154
194
  # Update search_state.
155
195
  search_state = control.search_state
156
196
  search_state.direction = direction
157
197
  # Apply search to buffer
158
198
  buffer = control.buffer
159
- buffer.apply_search(search_state, include_current_position=False, count=1)
160
- # Set selection
161
- buffer.selection_state = SelectionState(
162
- buffer.cursor_position + len(search_state.text)
163
- )
164
- buffer.selection_state.enter_shift_mode()
199
+
200
+ search_result: tuple[int, int] | None = None
201
+
202
+ # If we are searching history, use the PTK buffer search implementation
203
+ if buffer.enable_history_search():
204
+ search_result = buffer._search(search_state)
205
+
206
+ # Otherwise, only search the buffer's current "working line"
207
+ else:
208
+ document = buffer.document
209
+ # If have move to the next buffer, set the cursor position for the start of
210
+ # the search to the start or the end of the text, depending on if we are
211
+ # searching forwards or backwards
212
+ if i > 0:
213
+ if direction == SearchDirection.FORWARD:
214
+ document = Document(document.text, 0)
215
+ else:
216
+ document = Document(document.text, len(document.text))
217
+
218
+ text = search_state.text
219
+ ignore_case = search_state.ignore_case()
220
+
221
+ if direction == SearchDirection.FORWARD:
222
+ # Try find at the current input.
223
+ new_index = document.find(
224
+ text,
225
+ # If we have moved to the next buffer, include the current position
226
+ # which will be the start of the document text
227
+ include_current_position=i > 0,
228
+ ignore_case=ignore_case,
229
+ )
230
+ if new_index is not None:
231
+ search_result = (
232
+ buffer.working_index,
233
+ document.cursor_position + new_index,
234
+ )
235
+ else:
236
+ # Try find at the current input.
237
+ new_index = document.find_backwards(text, ignore_case=ignore_case)
238
+ if new_index is not None:
239
+ search_result = (
240
+ buffer.working_index,
241
+ document.cursor_position + new_index,
242
+ )
243
+
244
+ if search_result is not None:
245
+ working_index, cursor_position = search_result
246
+ buffer.working_index = working_index
247
+ buffer.cursor_position = cursor_position
248
+ # Set SelectionState
249
+ buffer.selection_state = SelectionState(
250
+ buffer.cursor_position + len(search_state.text)
251
+ )
252
+ buffer.selection_state.enter_shift_mode()
253
+
254
+ # Trigger a cursor position changed event on this buffer
255
+ buffer._cursor_position_changed()
256
+
257
+ break
165
258
 
166
259
 
167
260
  @add_cmd()
euporie/notebook/app.py CHANGED
@@ -445,7 +445,15 @@ class NotebookApp(BaseApp):
445
445
  description="Turn elements of euporie's interface on or off",
446
446
  ),
447
447
  self.config.get_item("color_scheme").menu,
448
- self.config.get_item("syntax_theme").menu,
448
+ MenuItem(
449
+ "Syntax highlighting",
450
+ children=[
451
+ self.config.get_item("syntax_highlighting").menu,
452
+ separator,
453
+ *self.config.get_item("syntax_theme").menu.children,
454
+ ],
455
+ description="Configure syntax highlighting",
456
+ ),
449
457
  get_cmd("toggle-expand").menu,
450
458
  get_cmd("toggle-line-numbers").menu,
451
459
  self.config.get_item("set_cursor_shape").menu,
@@ -148,7 +148,10 @@ class EditorTab(KernelTab):
148
148
  [self.input_box],
149
149
  width=Dimension(weight=1),
150
150
  height=Dimension(weight=1),
151
- key_bindings=load_registered_bindings("euporie.core.tabs.base.Tab"),
151
+ key_bindings=load_registered_bindings(
152
+ "euporie.core.tabs.base.Tab",
153
+ config=self.app.config,
154
+ ),
152
155
  )
153
156
 
154
157
  def save(self, path: Path | None = None, cb: Callable | None = None) -> None:
@@ -28,9 +28,7 @@ from euporie.core.filters import (
28
28
  cursor_on_first_line,
29
29
  cursor_on_last_line,
30
30
  display_has_focus,
31
- have_formatter,
32
31
  insert_mode,
33
- kernel_is_python,
34
32
  kernel_tab_has_focus,
35
33
  multiple_cells_selected,
36
34
  replace_mode,
@@ -86,7 +84,7 @@ class Notebook(BaseNotebook):
86
84
  except ModuleNotFoundError:
87
85
  pass
88
86
  else:
89
- file_extensions |= dict.fromkeys(NOTEBOOK_EXTENSIONS)
87
+ file_extensions.update(dict.fromkeys(NOTEBOOK_EXTENSIONS))
90
88
 
91
89
  allow_stdin = True
92
90
 
@@ -246,15 +244,16 @@ class Notebook(BaseNotebook):
246
244
  key_bindings=load_registered_bindings(
247
245
  "euporie.core.tabs.base.Tab",
248
246
  "euporie.notebook.tabs.notebook.Notebook",
247
+ config=self.app.config,
249
248
  ),
250
249
  )
251
250
 
252
251
  @property
253
252
  def cell(self) -> Cell:
254
253
  """Return the currently selected `Cell` in this `Notebook`."""
255
- cell = self.page.get_child().content
256
- assert isinstance(cell, Cell)
257
- return cell
254
+ if isinstance(cell := self.page.get_child().content, Cell):
255
+ return cell
256
+ return Cell(0, {}, self)
258
257
 
259
258
  # Editing specific stuff
260
259
 
@@ -1096,12 +1095,7 @@ class Notebook(BaseNotebook):
1096
1095
  cell.input_box.reformat()
1097
1096
 
1098
1097
  @staticmethod
1099
- @add_cmd(
1100
- filter=have_formatter
1101
- & kernel_is_python
1102
- & notebook_has_focus
1103
- & ~buffer_has_focus,
1104
- )
1098
+ @add_cmd(filter=notebook_has_focus & ~buffer_has_focus)
1105
1099
  def _reformat_notebook() -> None:
1106
1100
  """Automatically reformat all code cells in the notebook."""
1107
1101
  nb = get_app().tab
@@ -95,7 +95,8 @@ class WebViewControl(UIControl):
95
95
  self.render_thread = Thread(target=self.loop.run_forever, daemon=True)
96
96
 
97
97
  self.key_bindings = load_registered_bindings(
98
- "euporie.web.widgets.webview.WebViewControl"
98
+ "euporie.web.widgets.webview.WebViewControl",
99
+ config=get_app().config,
99
100
  )
100
101
 
101
102
  self._dom_cache: FastDictCache[tuple[Path], HTML] = FastDictCache(
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: euporie
3
- Version: 2.8.1
3
+ Version: 2.8.3
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
@@ -29,10 +29,10 @@ Requires-Dist: imagesize~=1.3
29
29
  Requires-Dist: jupyter-client>=7.1
30
30
  Requires-Dist: jupytext>=1.14.0
31
31
  Requires-Dist: linkify-it-py~=1.0
32
- Requires-Dist: markdown-it-py~=2.1.0
32
+ Requires-Dist: markdown-it-py~=2.2.0
33
33
  Requires-Dist: mdit-py-plugins~=0.3.0
34
34
  Requires-Dist: nbformat~=5.0
35
- Requires-Dist: pillow~=9.0
35
+ Requires-Dist: pillow>=9.0
36
36
  Requires-Dist: platformdirs~=3.5
37
37
  Requires-Dist: prompt-toolkit~=3.0.36
38
38
  Requires-Dist: pygments~=2.11
@@ -41,10 +41,6 @@ Requires-Dist: sixelcrop~=0.1.6
41
41
  Requires-Dist: timg~=1.1.6
42
42
  Requires-Dist: typing-extensions~=4.5
43
43
  Requires-Dist: universal-pathlib~=0.2.1
44
- Provides-Extra: format
45
- Requires-Dist: black>=19.3.b0; extra == 'format'
46
- Requires-Dist: isort~=5.10.1; extra == 'format'
47
- Requires-Dist: ruff~=0.1.0; extra == 'format'
48
44
  Provides-Extra: hub
49
45
  Requires-Dist: asyncssh~=2.10.1; extra == 'hub'
50
46
  Description-Content-Type: text/x-rst
@@ -3,10 +3,10 @@ euporie/console/__main__.py,sha256=m2EnzIDLO4dHlDt41JNKpUvAUSw6wD-X0V3YhymXqxc,2
3
3
  euporie/console/app.py,sha256=Icu-q-qTOuap873-s0ONcrtluD6EH5DPlbxX8ue6Zqo,7379
4
4
  euporie/console/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  euporie/console/tabs/__init__.py,sha256=Grm9EO1gnBO1o-k6Nqnlzo8XLIgFZSXNAdz49Vvh4zY,55
6
- euporie/console/tabs/console.py,sha256=GR-sGiOMnVigOYWqBMuzAnrfImUPDhnS5lWFIuUCcbk,26068
7
- euporie/core/__init__.py,sha256=Mlnoq2FjQ7tOZy6cLUR3iFh72lOEgvLPyTAG4K384Pw,536
8
- euporie/core/__main__.py,sha256=8sHP02sjS29QZzOwPF7hSzOR9UwPEvsMCbuGuOlxVu4,603
9
- euporie/core/app.py,sha256=MVGQJbXb30LbDgETCLbHTnpFD_zRhn8vSE0mWQzNw2o,46040
6
+ euporie/console/tabs/console.py,sha256=egClI0kRqQeBKjXOthxgpQ4eQpekaaN1LM76tKXJlEA,26109
7
+ euporie/core/__init__.py,sha256=Qk14pXMsR00wCnGYpMoqM4Acmqlaf1p7KKV8jKKIcdQ,313
8
+ euporie/core/__main__.py,sha256=_TeewhwpThCpmL8qYYtd61qeE_t61To1zrcM9o4lL_s,842
9
+ euporie/core/app.py,sha256=ZXpGbIOjMYahcUMIZw8DSumuWb45iE84-xgY7JQtJG8,46329
10
10
  euporie/core/border.py,sha256=kJbpyxwJBtIRpFOpXhDtaCT1_oyVRjRiYKG4lXn3-iA,48507
11
11
  euporie/core/clipboard.py,sha256=Ps1wTcIV2B1PKfXiNKITR8nee2bo5qVfdCuhobiCNms,4461
12
12
  euporie/core/commands.py,sha256=uOS4cJTzxSv8jEMComMDAqaAUrsPjaB_AY4tTeZFGfY,8256
@@ -15,15 +15,15 @@ euporie/core/config.py,sha256=ka6wloVH2hLhe7ga3w0nKLtuYsMenXcumdIC4eNSqM8,22811
15
15
  euporie/core/current.py,sha256=BdSVCLngNpZdtYJaxdijuu8N9yRcoU_wr0jI6RGRSms,557
16
16
  euporie/core/data_structures.py,sha256=eA54Cg305R1mVX6YGTRPIvTN4piEFKrltehif49l92o,1800
17
17
  euporie/core/diagnostics.py,sha256=5rS3DbJqNiPVfOb3tU4RKyq2rIMoS3O3_0-a62zknPE,1686
18
- euporie/core/filters.py,sha256=OSyOzp-7LuBsfQoJQqD3aKpMayeJOAT5eYSa-RGoYWk,9180
19
- euporie/core/format.py,sha256=jFt-GgLDId6Wzz88cA6spkDM6Hix_ihRx9fV_feBENw,3764
20
- euporie/core/graphics.py,sha256=JxBIpa0gL8iT_GH_Zk0RhwetMk1683KaQCCueemrTvY,32728
18
+ euporie/core/filters.py,sha256=wjTE7INpUAglprngLipLa66S_pNXoalu0HrcmmJeSlM,8253
19
+ euporie/core/format.py,sha256=oFlD3aX_uVeLhqxo2n-zaUBsiNKpWqhx6W-5arFY5C4,4154
20
+ euporie/core/graphics.py,sha256=g9kJeuoOCgx4IeD_EIlf3tAdRfQy4bTLs7istiZnvl0,32651
21
21
  euporie/core/history.py,sha256=uO14q8keGEtH1R9loaZrBfy66GfXcJhxyXW95-35niA,2542
22
22
  euporie/core/inspection.py,sha256=JhUttlOqvcYOLTSqrn49zSACbaeGLwbwK-BVOLllh6Y,2563
23
23
  euporie/core/io.py,sha256=ipl11Uo3mOmbqTjqC9k1Z8nwXmgNWgY-7ROI3WG4FwY,4469
24
24
  euporie/core/kernel.py,sha256=9bKFeE41Hrr241scVSnIjTFwKVSEk3yDc9HGK2rLXMs,46223
25
25
  euporie/core/keys.py,sha256=hfxzZjh4dbDdEkel1YXu8p5RgGwD44oZ9mptHZ0TcfA,3309
26
- euporie/core/launch.py,sha256=a51t67xWCGXVPRfzQMeHSJHaMBC5SDkGsjBGUqNSX_w,1405
26
+ euporie/core/launch.py,sha256=drtCrvVmGS19nMjL21Q0YwB7zZ0EK0E-0Wa_rRS0N70,1540
27
27
  euporie/core/lexers.py,sha256=AXNDYOR0BZf0sYj9o8YSb0oF4AGYZdKygwFIUKJ3XFM,1083
28
28
  euporie/core/log.py,sha256=6d8Dk5SA2fYr2QL1BqATmMtTU_BQ_DuONqNSQAYiOek,16323
29
29
  euporie/core/lsp.py,sha256=LU-sPEl-jeGA-nqlJMoFl0SzcTS9cY9KDKVmU3bDXdk,49204
@@ -44,12 +44,12 @@ euporie/core/comm/base.py,sha256=72PF6upybtBnNB3M8oNkR8WDzC2vptRS9TmIKJkNRq4,404
44
44
  euporie/core/comm/ipywidgets.py,sha256=obOKgcYc8OBB1PfKfNRB59ppZbnVA2eCDokSTUucZ7Q,52725
45
45
  euporie/core/comm/registry.py,sha256=cxH5r6BZe-NUy0zFqxTriAnP0_spMY3m9r1Na688i7o,1353
46
46
  euporie/core/convert/__init__.py,sha256=SdXTdFh5Exb7NLtiY7pDuv4AcQdP5b1syQSoZeanJco,391
47
- euporie/core/convert/datum.py,sha256=VRkaVVVHHpfVxWY6zhBXgHD2qmPXfQAM9IfeMxJW1bE,14029
47
+ euporie/core/convert/datum.py,sha256=UxZBmiizxwviQF06IyBqPLiRWre4FSTdFOljb1WZWjM,14327
48
48
  euporie/core/convert/mime.py,sha256=uQwXw2hUsfS_dMeR4Ci6Zv4fORIBnEa9rdRa-nVT-Ls,3142
49
49
  euporie/core/convert/registry.py,sha256=IP43FE1edE2WDpjlKNylWhQV88WULpzWCIddBOQxxk8,2757
50
- euporie/core/convert/utils.py,sha256=aB1QdbfAvRJ0RRllhgI-knsX9eJQEU9Ygp26549n7Rk,2782
50
+ euporie/core/convert/utils.py,sha256=h1qlZBQ0YqV-EgdIDZcO14KJwIqA5FfDOW_nd4ZtIDA,2438
51
51
  euporie/core/convert/formats/__init__.py,sha256=sPJqKh1aA0V2jJs5cXUBmAEadsozUsGxv55irlrVr68,164
52
- euporie/core/convert/formats/ansi.py,sha256=fN2VJPYZ4D0fY77mbeW2hrT-JfnU7vqDEyPt8kl-HPo,13613
52
+ euporie/core/convert/formats/ansi.py,sha256=SqkwtKqo-7wD2_tCgsJYwsCcM4vBgXPA5tGB7oVqtcM,14327
53
53
  euporie/core/convert/formats/base64.py,sha256=8tP29nX_patgOG9lYr-HIn0I_6VyV_SyfDi-ZZBTp6Q,878
54
54
  euporie/core/convert/formats/common.py,sha256=bDfVSBrMYCM1yAuKO254R2JBO-viZHB0MArezti5txM,4959
55
55
  euporie/core/convert/formats/ft.py,sha256=6RKWq0y3kbJ96kbMjfazGeBg3uha8CWoseRPa4WLWHE,2810
@@ -64,7 +64,7 @@ euporie/core/convert/formats/sixel.py,sha256=gsBDwXowN5eg-X-khzUjhYcNUsNl2up3zQV
64
64
  euporie/core/convert/formats/svg.py,sha256=SY-rioXSm5lK6LLp3mu3YeFYTFOJ-jCvEwH-wusfU1s,805
65
65
  euporie/core/ft/__init__.py,sha256=Ib-pswos3RiOM2Vn8GCZ4rwuoTNPeBJ0jhgRpwu7BKE,55
66
66
  euporie/core/ft/ansi.py,sha256=ICUBohoOVtbkf96T3EsFcHf-oSsWMxD7uyRoEFnhS1I,5796
67
- euporie/core/ft/html.py,sha256=qZAwXikisfiUKfirtPVOlsrTDdOyRKGtW8HNon8z9YU,179010
67
+ euporie/core/ft/html.py,sha256=ITqARO7LK6UKMb6NTCl73UdxwfOT2nMSE-x1Ysp15WQ,179417
68
68
  euporie/core/ft/table.py,sha256=L6rtT1XHArydL7gYX1m98MPoKCDYk8L7jibKRiayaGc,53325
69
69
  euporie/core/ft/utils.py,sha256=Or3eZwoJi2NbYQg0M2mk815RlKcDmGXr7K5-7JJcT1k,27773
70
70
  euporie/core/key_binding/__init__.py,sha256=zFKrJrZARNht6Tl4TT5Fw3fk-IrD8SBYk5mBJ5K_F1A,47
@@ -76,7 +76,7 @@ euporie/core/key_binding/vi_state.py,sha256=ek3Wxsckihsr5x9ULiDtNnVkOEiCBzoF4m4q
76
76
  euporie/core/key_binding/bindings/__init__.py,sha256=vzrTyqaHWRxLDdiLStPQ-AprURIie76-i3cibELIDsA,274
77
77
  euporie/core/key_binding/bindings/basic.py,sha256=djhGhPC6yDPfgXcNXfh14wLhFdraUBQH8VMfkZnLZvI,1648
78
78
  euporie/core/key_binding/bindings/completion.py,sha256=npf61P0NvmrYMG8qT-1AYDReLcoMHsgdG5gzBloSTWk,2081
79
- euporie/core/key_binding/bindings/micro.py,sha256=04ByQ-7N5YNPOouHZiYcBIFIuHX2KuLW3XUZ1wzSBBo,27847
79
+ euporie/core/key_binding/bindings/micro.py,sha256=NZSeYZIlN2kA-nNRC8_0ECqT4jRbGOfcTllKnpRrXh8,28020
80
80
  euporie/core/key_binding/bindings/mouse.py,sha256=xbsBFSF2zLtK-f_Aj2NQ5kFaWaR1fimvs7dXhBpiFFM,6545
81
81
  euporie/core/key_binding/bindings/page_navigation.py,sha256=FWIv4iqWUCMjFHLu-I5Z08NIULXuTIjrn9fC25XImYg,4142
82
82
  euporie/core/layout/__init__.py,sha256=T5iGOnMGfNwVffJlfFMwGTFBLV7RkOuKw5gVp6cl4wA,59
@@ -87,25 +87,25 @@ euporie/core/layout/decor.py,sha256=qMCgkrjokpqH9gaBXLe_rGLx9AwzfJ7rtyVhSAVh45w,
87
87
  euporie/core/layout/mouse.py,sha256=GJvFwOCZ8x-CppW8rGmJ6kV6JdW0Ndjihf8IwkuBI6Q,5165
88
88
  euporie/core/layout/print.py,sha256=YNDafjVTcI8GwOjueLBuqWMY72alxV9HE0BQaka9sgA,4645
89
89
  euporie/core/layout/screen.py,sha256=0xP9ZErMcw51nPgBbrm-DSQqFq5WNvsh9fw1amz2Z28,2224
90
- euporie/core/layout/scroll.py,sha256=DMBoVNNfahMDbq_vKezT3qDfQm2EwBGwOv2qy5QYkDc,33093
90
+ euporie/core/layout/scroll.py,sha256=mVmAbECfytPk2oPMZ_HpeAbSsYIXyX8FDQQ7a8UWRw4,33149
91
91
  euporie/core/tabs/__init__.py,sha256=Grm9EO1gnBO1o-k6Nqnlzo8XLIgFZSXNAdz49Vvh4zY,55
92
92
  euporie/core/tabs/base.py,sha256=Gdydp8Km9p6Hdqs-pdHvxGAKyWhvE_76zdE4ywcZF-g,20934
93
93
  euporie/core/tabs/notebook.py,sha256=4EdMMVvHzIAMAVkIZyDeToz5ad-emse5g5l2sMluTDU,17953
94
94
  euporie/core/widgets/__init__.py,sha256=ektso_Ea1-pZB04alUujQsa2r-kv8xAF0SmQOv_bvHQ,52
95
- euporie/core/widgets/cell.py,sha256=PMx_XHhnIXuqd0BcVmZPIDt1SaLlpnbTJuiB5-3yK64,35650
95
+ euporie/core/widgets/cell.py,sha256=MucSmfWmlNaN4hoEsLnwFo5MVo3qrLShtR9AVfUZJlo,36040
96
96
  euporie/core/widgets/cell_outputs.py,sha256=FSTvEYvwqNiHvj1UgbDYyQnW8pZpfdz2sKodxysqFsE,17334
97
97
  euporie/core/widgets/decor.py,sha256=GPZG7-h3MKynQIXJ_YoR6tPpYxtmrXi0uoyVCovSjBQ,8770
98
98
  euporie/core/widgets/dialog.py,sha256=Dj6CAHtHlSPmk2F30FXZZ2kYrEFYGkPAKzbWHUfaw-c,32675
99
- euporie/core/widgets/display.py,sha256=iGq5UTE_q3TS9fg1IIZ7dHDMyCMCDPqj0ue5kEwH4dw,21558
99
+ euporie/core/widgets/display.py,sha256=UicJq9iSzHrrYXdXTXWPvBsC69ttZU8GHJ7xRK5Fbmo,21767
100
100
  euporie/core/widgets/file_browser.py,sha256=SmoQnngytD8-NgiRCKNLeFSdrqSCWRUUaGu8Tq295TQ,20731
101
101
  euporie/core/widgets/formatted_text_area.py,sha256=J7P_TNXPZKZkiBdjAVkPvkfRY1veXe4tzXU241k4b-Q,4037
102
102
  euporie/core/widgets/forms.py,sha256=iZj09v9I91ByuwUpGvf1FZrH2LF8FDIE-2MuAGIbLeA,85459
103
- euporie/core/widgets/inputs.py,sha256=BEYyP8SIH7h5yLkzY8NZExcc8-yL9z1feOCS_o1Q_78,21476
103
+ euporie/core/widgets/inputs.py,sha256=Rpsy-kouiDeoSWPs89l1pSTXGnyAV0_tufQ3EqZp1P8,21826
104
104
  euporie/core/widgets/layout.py,sha256=GAmWCUIhyhFvk0RBx8L7VeQpudKaFgkoyTk1tRKDJ94,23490
105
- euporie/core/widgets/menu.py,sha256=r5fdg63V3_VbZsd4EsAp2OBwaaGNnJemVFju8VyvM6E,32916
106
- euporie/core/widgets/pager.py,sha256=8d2eeNHAQfNnVqz8s4jBdzXDsHHjGMmQgISFZVJCnzs,6481
105
+ euporie/core/widgets/menu.py,sha256=K5Zkv_wKs7-2ZgMDygLDTKj5Vkh7MPLwc9ZWIhXa_xM,32856
106
+ euporie/core/widgets/pager.py,sha256=mbqB2-mX8bORUKM5492s5K9rpoGrvrBN1qY7uYE9o0g,6527
107
107
  euporie/core/widgets/palette.py,sha256=e15dnPAg7VYjjahae-XsWViCjUA63jR5fdS3Oyof3MY,10847
108
- euporie/core/widgets/search.py,sha256=vz747icOZtwcEL1nH7p1hvrRtd-0W4LtSvXddO3y-hU,8227
108
+ euporie/core/widgets/search.py,sha256=szGAC19LYhAnMvQGLRWrjPoUjQa9Q3nhyugQ3uFshaU,11816
109
109
  euporie/core/widgets/status.py,sha256=WnS9PzlfPyyVXLTaswLHV1tgbvmYCSWqs1re-DOTxXQ,5558
110
110
  euporie/core/widgets/tree.py,sha256=BG7QRsI2GzSJPReNQu9zWFjO0iy8TeJwrmCmP5dc2ek,3760
111
111
  euporie/data/desktop/euporie-console.desktop,sha256=DI08G0Dl2s5asM6afWUfkKvO5YmcBm-pWQZzUHiNnqc,153
@@ -116,17 +116,17 @@ euporie/hub/app.py,sha256=w1J4A0X-W8Tr_rlRm13jMDjn35ggTOggDDVhCSIvitE,6129
116
116
  euporie/hub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  euporie/notebook/__init__.py,sha256=rOE71d95pym_ILYVg07NO9oDYbSB0AskxbC8cr4htiU,44
118
118
  euporie/notebook/__main__.py,sha256=m2EnzIDLO4dHlDt41JNKpUvAUSw6wD-X0V3YhymXqxc,289
119
- euporie/notebook/app.py,sha256=KvsSwjttvSuJgBsXa2eT0cUJVLOIdqzUM2lxuf2VneE,21320
119
+ euporie/notebook/app.py,sha256=JySFMBP0QkvJHlyFCbLfzZBijJjixmVSek-lruTAD1Q,21686
120
120
  euporie/notebook/current.py,sha256=rQ_R9B0b8JmWILxEyGzGfuVY2iVkHTghq4qRiC-MYSU,387
121
121
  euporie/notebook/enums.py,sha256=g7quMch8KAlaaYJS0UppWqx6tx-ZFt7HxFcmEfam5OM,221
122
122
  euporie/notebook/filters.py,sha256=c2PncF-n4dE67cFmVmhsMhFVWCfxePAaCW6mb6zm0Yo,1502
123
123
  euporie/notebook/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
124
  euporie/notebook/tabs/__init__.py,sha256=CnHrMzmr4tKEd8Rs8swFvNDWj0fCiLChdqha0AtDNqY,417
125
125
  euporie/notebook/tabs/display.py,sha256=y8wMa-MsQZky_JgJEwUtMUGIbLnFiAZMfrX1u-km6VM,2595
126
- euporie/notebook/tabs/edit.py,sha256=_X7pnBLyXTAziblT4F_behiB4awE_GOR7bB-cRTHrKw,6458
126
+ euporie/notebook/tabs/edit.py,sha256=Hop0AIvIaXJ9SaWtgxpocjGN0JEcsNuPkBsZPcJ76UE,6529
127
127
  euporie/notebook/tabs/json.py,sha256=xKDHYkA59aleBpm6qLuic5GNPNQU6qApLuIT1vZzJrg,2179
128
128
  euporie/notebook/tabs/log.py,sha256=VJQRC_4SB4aZ4tVELm6ldkFCON_A_rqxBfi-sZzGBOw,3550
129
- euporie/notebook/tabs/notebook.py,sha256=gg-lLlVWZOivJTD6JMFaw73ca307mkqYe7ALZKdkKsw,43052
129
+ euporie/notebook/tabs/notebook.py,sha256=oIWfzPLhQZIvaStB1Nh2UXhko4GTW39xmRH0UYe39NA,43002
130
130
  euporie/notebook/widgets/__init__.py,sha256=74tOl0bYuWkaKT-4pgD5zmdiIkoFYx8uGj4SxcLHLtQ,48
131
131
  euporie/notebook/widgets/side_bar.py,sha256=EDFAulshV7YqA50w84RRl88UI60AehIXYYA2exlFh0M,7243
132
132
  euporie/preview/__init__.py,sha256=B6RsBuuT0JJk1v6U5n95VuFXcOeFLq6UGgt4w-n_nEI,51
@@ -136,11 +136,11 @@ euporie/preview/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
136
  euporie/preview/tabs/__init__.py,sha256=rY6DfQ-8qRo_AiICCD-zTyhJBnuMjawWDd8tRxR6q58,43
137
137
  euporie/preview/tabs/notebook.py,sha256=IHY-cAWo5UmehmXpSSLyuTJvjN9jBeD5BsSoa86zrUw,8504
138
138
  euporie/web/tabs/web.py,sha256=6wTB7ZLRqG79eQwKwsPIw03gHDUalmMVROSS9Z9j3YM,5228
139
- euporie/web/widgets/webview.py,sha256=jjJhZfujzyPCCz6t7bfgdPQ3ud20-1YhT-Lod5x-rrI,20762
140
- euporie-2.8.1.data/data/share/applications/euporie-console.desktop,sha256=DI08G0Dl2s5asM6afWUfkKvO5YmcBm-pWQZzUHiNnqc,153
141
- euporie-2.8.1.data/data/share/applications/euporie-notebook.desktop,sha256=RtpJzvizTDuOp0BLa2bLgVHx11LG6L7PL-oF-wHTsgU,155
142
- euporie-2.8.1.dist-info/METADATA,sha256=oX2LhYGnOU2JtJNCYQdn-odDfKZT31GVOiXY1LiWlYM,6583
143
- euporie-2.8.1.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
144
- euporie-2.8.1.dist-info/entry_points.txt,sha256=iHdjwf9iCAipy7w3tXCH2W_SavHVCSHpJk_84--b7rE,776
145
- euporie-2.8.1.dist-info/licenses/LICENSE,sha256=rI0bfSsCfCVw6d8vk7WokRxd3t8yx5xV4fC5fwaMgCg,1079
146
- euporie-2.8.1.dist-info/RECORD,,
139
+ euporie/web/widgets/webview.py,sha256=PA8hWqJs8FLMEFNAHYKz4Zt2fJTg-BSyuCji6isxz3o,20800
140
+ euporie-2.8.3.data/data/share/applications/euporie-console.desktop,sha256=DI08G0Dl2s5asM6afWUfkKvO5YmcBm-pWQZzUHiNnqc,153
141
+ euporie-2.8.3.data/data/share/applications/euporie-notebook.desktop,sha256=RtpJzvizTDuOp0BLa2bLgVHx11LG6L7PL-oF-wHTsgU,155
142
+ euporie-2.8.3.dist-info/METADATA,sha256=a5j1deTZou2cOApnrYnNxEO-rYXgRBNHThbUNQijlD0,6417
143
+ euporie-2.8.3.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
144
+ euporie-2.8.3.dist-info/entry_points.txt,sha256=iHdjwf9iCAipy7w3tXCH2W_SavHVCSHpJk_84--b7rE,776
145
+ euporie-2.8.3.dist-info/licenses/LICENSE,sha256=rI0bfSsCfCVw6d8vk7WokRxd3t8yx5xV4fC5fwaMgCg,1079
146
+ euporie-2.8.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.21.1
2
+ Generator: hatchling 1.24.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any