euporie 2.3.2__py3-none-any.whl → 2.4.1__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 (92) hide show
  1. euporie/console/__main__.py +3 -1
  2. euporie/console/app.py +6 -4
  3. euporie/console/tabs/console.py +34 -9
  4. euporie/core/__init__.py +6 -1
  5. euporie/core/__main__.py +1 -1
  6. euporie/core/app.py +79 -109
  7. euporie/core/border.py +44 -14
  8. euporie/core/comm/base.py +5 -4
  9. euporie/core/comm/ipywidgets.py +11 -11
  10. euporie/core/comm/registry.py +12 -6
  11. euporie/core/commands.py +30 -23
  12. euporie/core/completion.py +1 -4
  13. euporie/core/config.py +15 -5
  14. euporie/core/convert/{base.py → core.py} +117 -53
  15. euporie/core/convert/formats/ansi.py +46 -25
  16. euporie/core/convert/formats/base64.py +3 -3
  17. euporie/core/convert/formats/common.py +38 -13
  18. euporie/core/convert/formats/formatted_text.py +54 -12
  19. euporie/core/convert/formats/html.py +5 -5
  20. euporie/core/convert/formats/jpeg.py +1 -1
  21. euporie/core/convert/formats/markdown.py +4 -4
  22. euporie/core/convert/formats/pdf.py +1 -1
  23. euporie/core/convert/formats/pil.py +5 -3
  24. euporie/core/convert/formats/png.py +7 -6
  25. euporie/core/convert/formats/rich.py +4 -3
  26. euporie/core/convert/formats/sixel.py +5 -5
  27. euporie/core/convert/utils.py +1 -1
  28. euporie/core/current.py +11 -5
  29. euporie/core/formatted_text/ansi.py +4 -8
  30. euporie/core/formatted_text/html.py +1630 -856
  31. euporie/core/formatted_text/markdown.py +177 -166
  32. euporie/core/formatted_text/table.py +20 -14
  33. euporie/core/formatted_text/utils.py +21 -10
  34. euporie/core/io.py +14 -14
  35. euporie/core/kernel.py +48 -37
  36. euporie/core/key_binding/bindings/micro.py +5 -1
  37. euporie/core/key_binding/bindings/mouse.py +2 -2
  38. euporie/core/keys.py +3 -0
  39. euporie/core/launch.py +5 -2
  40. euporie/core/lexers.py +13 -2
  41. euporie/core/log.py +135 -139
  42. euporie/core/margins.py +32 -14
  43. euporie/core/path.py +273 -0
  44. euporie/core/processors.py +35 -0
  45. euporie/core/renderer.py +21 -5
  46. euporie/core/style.py +34 -19
  47. euporie/core/tabs/base.py +101 -17
  48. euporie/core/tabs/notebook.py +72 -30
  49. euporie/core/terminal.py +56 -48
  50. euporie/core/utils.py +12 -16
  51. euporie/core/widgets/cell.py +6 -5
  52. euporie/core/widgets/cell_outputs.py +2 -2
  53. euporie/core/widgets/decor.py +74 -82
  54. euporie/core/widgets/dialog.py +132 -28
  55. euporie/core/widgets/display.py +76 -24
  56. euporie/core/widgets/file_browser.py +87 -31
  57. euporie/core/widgets/formatted_text_area.py +1 -3
  58. euporie/core/widgets/forms.py +79 -40
  59. euporie/core/widgets/inputs.py +23 -13
  60. euporie/core/widgets/layout.py +4 -3
  61. euporie/core/widgets/menu.py +368 -216
  62. euporie/core/widgets/page.py +99 -58
  63. euporie/core/widgets/pager.py +1 -1
  64. euporie/core/widgets/palette.py +30 -27
  65. euporie/core/widgets/search_bar.py +38 -25
  66. euporie/core/widgets/status_bar.py +103 -5
  67. euporie/data/desktop/euporie-console.desktop +7 -0
  68. euporie/data/desktop/euporie-notebook.desktop +7 -0
  69. euporie/hub/__main__.py +3 -1
  70. euporie/hub/app.py +9 -7
  71. euporie/notebook/__main__.py +3 -1
  72. euporie/notebook/app.py +7 -30
  73. euporie/notebook/tabs/__init__.py +7 -3
  74. euporie/notebook/tabs/display.py +18 -9
  75. euporie/notebook/tabs/edit.py +106 -23
  76. euporie/notebook/tabs/json.py +73 -0
  77. euporie/notebook/tabs/log.py +18 -8
  78. euporie/notebook/tabs/notebook.py +60 -41
  79. euporie/preview/__main__.py +3 -1
  80. euporie/preview/app.py +2 -1
  81. euporie/preview/tabs/notebook.py +23 -10
  82. euporie/web/tabs/web.py +149 -0
  83. euporie/web/widgets/webview.py +563 -0
  84. euporie-2.4.1.data/data/share/applications/euporie-console.desktop +7 -0
  85. euporie-2.4.1.data/data/share/applications/euporie-notebook.desktop +7 -0
  86. {euporie-2.3.2.dist-info → euporie-2.4.1.dist-info}/METADATA +6 -5
  87. euporie-2.4.1.dist-info/RECORD +129 -0
  88. {euporie-2.3.2.dist-info → euporie-2.4.1.dist-info}/WHEEL +1 -1
  89. euporie/core/url.py +0 -64
  90. euporie-2.3.2.dist-info/RECORD +0 -122
  91. {euporie-2.3.2.dist-info → euporie-2.4.1.dist-info}/entry_points.txt +0 -0
  92. {euporie-2.3.2.dist-info → euporie-2.4.1.dist-info}/licenses/LICENSE +0 -0
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from functools import partial
6
6
  from typing import TYPE_CHECKING
7
7
 
8
- from euporie.core.convert.base import register
8
+ from euporie.core.convert.core import register
9
9
  from euporie.core.convert.formats.common import (
10
10
  chafa_convert_cmd,
11
11
  chafa_convert_py,
@@ -15,10 +15,10 @@ from euporie.core.convert.utils import call_subproc, commands_exist, have_module
15
15
  from euporie.core.current import get_app
16
16
 
17
17
  if TYPE_CHECKING:
18
+ from pathlib import Path
18
19
  from typing import Any
19
20
 
20
21
  from PIL.Image import Image as PilImage
21
- from upath import UPath
22
22
 
23
23
 
24
24
  register(
@@ -46,7 +46,7 @@ def png_to_sixel_img2sixel(
46
46
  rows: int | None = None,
47
47
  fg: str | None = None,
48
48
  bg: str | None = None,
49
- path: UPath | None = None,
49
+ path: Path | None = None,
50
50
  ) -> str:
51
51
  """Convert PNG data to sixels :command:`img2sixel`."""
52
52
  bg = bg or get_app().color_palette.bg.base_hex
@@ -77,7 +77,7 @@ def pil_to_sixel_py_timg(
77
77
  rows: int | None = None,
78
78
  fg: str | None = None,
79
79
  bg: str | None = None,
80
- path: UPath | None = None,
80
+ path: Path | None = None,
81
81
  ) -> str:
82
82
  """Convert a pillow image to sixels :py:mod:`timg`."""
83
83
  import timg
@@ -96,7 +96,7 @@ def pil_to_sixel_py_teimpy(
96
96
  rows: int | None = None,
97
97
  fg: str | None = None,
98
98
  bg: str | None = None,
99
- path: UPath | None = None,
99
+ path: Path | None = None,
100
100
  ) -> str:
101
101
  """Convert a pillow image to sixels :py:mod:`teimpy`."""
102
102
  import numpy as np
@@ -15,7 +15,7 @@ from typing import TYPE_CHECKING
15
15
  import imagesize
16
16
  from prompt_toolkit.filters import Condition, to_filter
17
17
 
18
- from euporie.core.convert.base import convert
18
+ from euporie.core.convert.core import convert
19
19
  from euporie.core.current import get_app
20
20
 
21
21
  if TYPE_CHECKING:
euporie/core/current.py CHANGED
@@ -2,15 +2,21 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, cast
5
+ from typing import TYPE_CHECKING
6
6
 
7
- from prompt_toolkit.application.current import get_app as ptk_get_app
7
+ from prompt_toolkit.application.current import _current_app_session
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from euporie.core.app import BaseApp
11
11
 
12
12
 
13
13
  def get_app() -> BaseApp:
14
- """Get the current application."""
15
- app = ptk_get_app()
16
- return cast("BaseApp", app)
14
+ """Get the current active (running) Application."""
15
+ from euporie.core.app import BaseApp
16
+
17
+ session = _current_app_session.get()
18
+ if isinstance(session.app, BaseApp):
19
+ return session.app
20
+
21
+ # Use a baseapp as our "DummyApplication"
22
+ return BaseApp()
@@ -17,7 +17,7 @@ log = logging.getLogger(__name__)
17
17
  class ANSI(PTANSI):
18
18
  """Convert ANSI text into formatted text, preserving all control sequences."""
19
19
 
20
- def __init__(self, value: str, tab_size: int = 4) -> None:
20
+ def __init__(self, value: str, tab_size: int = 8) -> None:
21
21
  """Initiate the ANSI processor instance.
22
22
 
23
23
  This replaces carriage returns to emulate terminal output.
@@ -27,7 +27,8 @@ class ANSI(PTANSI):
27
27
  tab_size: The number of spaces to use to represent a tab
28
28
 
29
29
  """
30
- self.tab_size = tab_size
30
+ # Replace tabs with spaces
31
+ value = value.expandtabs(tabsize=tab_size)
31
32
  # Replace windows style newlines
32
33
  value = value.replace("\r\n", "\n")
33
34
  # Remove anything before a carriage return if there is something after it to
@@ -35,7 +36,7 @@ class ANSI(PTANSI):
35
36
  value = re.sub(r"^.*\r(?!\n)", "", value, 0, re.MULTILINE)
36
37
  # Clear line by deleting previous characters
37
38
  value = re.sub(r".*\x1b\[2K", "", value, 0)
38
- # Ignore cursor hide / show request
39
+ # Remove hide & show cursor commands
39
40
  value = re.sub(r"\x1b\[\?25[hl]", "", value, 0)
40
41
 
41
42
  super().__init__(value)
@@ -75,11 +76,6 @@ class ANSI(PTANSI):
75
76
  formatted_text.pop()
76
77
  continue
77
78
 
78
- # Check for tabs
79
- elif char == "\t":
80
- formatted_text.append(("", " " * self.tab_size))
81
- continue
82
-
83
79
  elif char in ("\x1b", "\x9b"):
84
80
  # Got a CSI sequence, try to compile a control sequence
85
81
  char = yield