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

38 statements  

1# Implements https://sw.kovidgoyal.net/kitty/graphics-protocol/ 

2 

3from base64 import b64encode, b64decode 

4import sys 

5from typing import Union 

6 

7def _supports_kitty_graphics() -> bool: 

8 import platform 

9 

10 if platform.system() not in ("Darwin", "Linux"): 

11 return False 

12 

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 

28 

29 process = psutil.Process() 

30 while process := process.parent(): 

31 if process.name() in supported_terminals: 

32 return True 

33 return False 

34 

35 

36supports_kitty_graphics = _supports_kitty_graphics() 

37 

38 

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) 

56 

57 

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) 

64 

65 

66display_formatter_default_active_types = [ 

67 "text/plain", 

68 *(["image/png"] if supports_kitty_graphics else []), 

69] 

70 

71terminal_default_mime_renderers = { 

72 "image/png": kitty_png_render, 

73}