Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/IPython/core/kitty.py: 34%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# Implements https://sw.kovidgoyal.net/kitty/graphics-protocol/
3from base64 import b64encode, b64decode
4import sys
5from typing import Union
7def _supports_kitty_graphics() -> bool:
8 import platform
10 if platform.system() not in ("Darwin", "Linux"):
11 return False
13 if not sys.stdout.isatty():
14 return False
15 # Hardcoding process names instead of using
16 # https://sw.kovidgoyal.net/kitty/graphics-protocol/#querying-support-and-available-transmission-mediums
17 # to avoid startup slowdown
18 supported_terminals = {
19 "ghostty",
20 "iTerm2",
21 "kitty",
22 "konsole",
23 "warp",
24 "wayst",
25 "wezterm-gui",
26 }
27 import psutil
29 process = psutil.Process()
30 while process := process.parent():
31 if process.name() in supported_terminals:
32 return True
33 return False
36supports_kitty_graphics = _supports_kitty_graphics()
39def png_to_kitty_ansi(png: bytes) -> str:
40 if not png.startswith(b"\x89PNG\r\n\x1a\n"):
41 raise ValueError
42 # This simplicity resembles
43 # https://sw.kovidgoyal.net/kitty/graphics-protocol/#a-minimal-example
44 # but if we need tmux support, we can switch to Unicode like
45 # https://github.com/hzeller/timg/blob/main/src/kitty-canvas.cc
46 result = ["\033_Ga=T,f=100,", "m=1;"]
47 encoded = b64encode(png)
48 for i in range(0, len(encoded), 4096):
49 result.append(encoded[i : i + 4096].decode("ascii"))
50 result.append("\033\\")
51 result.append("\033_G")
52 result.append("m=1;")
53 del result[-2:]
54 result[-3] = "m=0;"
55 return "".join(result)
58def kitty_png_render(png: Union[bytes, str], _md_dict: object) -> None:
59 if isinstance(png, str):
60 png = png_to_kitty_ansi(b64decode(png))
61 else:
62 png = png_to_kitty_ansi(png)
63 print(png)
66display_formatter_default_active_types = [
67 "text/plain",
68 *(["image/png"] if supports_kitty_graphics else []),
69]
71terminal_default_mime_renderers = {
72 "image/png": kitty_png_render,
73}