Skip to content

Commit 67d0477

Browse files
committed
Refactor _cli.util.terminal_width
- Use ``re.Pattern`` - Avoid importing ``shutil`` for speed - Compare raw and formatted strings in ``term_width_line``
1 parent 407b00b commit 67d0477

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

sphinx/_cli/util/terminal_width.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,32 @@
22

33
from __future__ import annotations
44

5-
import re
6-
import shutil
7-
8-
_ansi_re: re.Pattern = re.compile('\x1b\\[(\\d\\d;){0,2}\\d\\dm')
5+
import os
6+
import sys
97

108

119
def get_terminal_width() -> int:
1210
"""Return the width of the terminal in columns."""
13-
return shutil.get_terminal_size().columns - 1
11+
try:
12+
columns = int(os.environ.get('COLUMNS', 0))
13+
except ValueError:
14+
columns = 0
15+
if columns > 1:
16+
return columns - 1
17+
try:
18+
return os.get_terminal_size(sys.__stdout__.fileno()).columns - 1
19+
except (AttributeError, ValueError, OSError):
20+
# fallback
21+
return 80 - 1
1422

1523

1624
_tw: int = get_terminal_width()
1725

1826

19-
def term_width_line(text: str) -> str:
20-
if not codes:
27+
def term_width_line(formatted_text: str, raw_text: str) -> str:
28+
if formatted_text == raw_text:
2129
# if no coloring, don't output fancy backspaces
22-
return text + '\n'
30+
return formatted_text + '\n'
2331
else:
2432
# codes are not displayed, this must be taken into account
25-
return text.ljust(_tw + len(text) - len(_ansi_re.sub('', text))) + '\r'
33+
return formatted_text.ljust(_tw + len(formatted_text) - len(raw_text)) + '\r'

0 commit comments

Comments
 (0)