Prettify URLs before displaying them to the user

This commit is contained in:
Kovid Goyal 2022-12-29 17:04:02 +05:30
parent f4ac03b791
commit 306f9e5735
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 21 additions and 6 deletions

View File

@ -8,7 +8,7 @@ import os
import re import re
import sys import sys
from contextlib import suppress from contextlib import suppress
from functools import lru_cache, partial from functools import partial
from gettext import gettext as _ from gettext import gettext as _
from time import monotonic, sleep from time import monotonic, sleep
from typing import ( from typing import (
@ -64,7 +64,7 @@ from .utils import (
cleanup_ssh_control_masters, func_name, get_editor, get_new_os_window_size, cleanup_ssh_control_masters, func_name, get_editor, get_new_os_window_size,
is_path_in_temp_dir, less_version, log_error, macos_version, open_url, is_path_in_temp_dir, less_version, log_error, macos_version, open_url,
parse_address_spec, parse_uri_list, platform_window_id, remove_socket_file, parse_address_spec, parse_uri_list, platform_window_id, remove_socket_file,
safe_print, single_instance, startup_notification_handler, which, safe_print, single_instance, startup_notification_handler, which, sanitize_url_for_dispay_to_user
) )
from .window import CommandOutput, CwdRequest, Window from .window import CommandOutput, CwdRequest, Window
@ -2603,7 +2603,5 @@ class Boss:
pass pass
mouse_discard_event = discard_event mouse_discard_event = discard_event
@lru_cache(maxsize=64)
def sanitize_url_for_dispay_to_user(self, url: str) -> str: def sanitize_url_for_dispay_to_user(self, url: str) -> str:
# TODO: Use punycode, remove percent encoding, etc. return sanitize_url_for_dispay_to_user(url)
return url

View File

@ -1088,3 +1088,18 @@ def sanitize_for_bracketed_paste(text: bytes) -> bytes:
break break
text = new_text text = new_text
return text return text
@lru_cache(maxsize=64)
def sanitize_url_for_dispay_to_user(url: str) -> str:
from urllib.parse import urlparse, urlunparse, unquote
try:
purl = urlparse(url)
if purl.netloc:
purl = purl._replace(netloc=purl.netloc.encode('idna').decode('ascii'))
if purl.path:
purl = purl._replace(path=unquote(purl.path))
url = urlunparse(purl)
except Exception:
url = 'Unpareseable URL: ' + url
return url

View File

@ -12,7 +12,7 @@ from kitty.fast_data_types import (
wcwidth, expand_ansi_c_escapes wcwidth, expand_ansi_c_escapes
) )
from kitty.rgb import to_color from kitty.rgb import to_color
from kitty.utils import is_path_in_temp_dir, sanitize_title from kitty.utils import is_path_in_temp_dir, sanitize_title, sanitize_url_for_dispay_to_user
from . import BaseTest, filled_cursor, filled_history_buf, filled_line_buf from . import BaseTest, filled_cursor, filled_history_buf, filled_line_buf
@ -436,6 +436,8 @@ class TestDataTypes(BaseTest):
self.assertTrue(is_path_in_temp_dir(os.path.join(prefix, path))) self.assertTrue(is_path_in_temp_dir(os.path.join(prefix, path)))
for path in ('/home/xy/d.png', '/tmp/../home/x.jpg'): for path in ('/home/xy/d.png', '/tmp/../home/x.jpg'):
self.assertFalse(is_path_in_temp_dir(os.path.join(path))) self.assertFalse(is_path_in_temp_dir(os.path.join(path)))
self.ae(sanitize_url_for_dispay_to_user(
'h://a\u0430b.com/El%20Ni%C3%B1o/'), 'h://xn--ab-7kc.com/El Niño/')
def test_color_profile(self): def test_color_profile(self):
c = ColorProfile() c = ColorProfile()