Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib/output.py
diff options
context:
space:
mode:
Diffstat (limited to 'archinstall/lib/output.py')
-rw-r--r--archinstall/lib/output.py37
1 files changed, 34 insertions, 3 deletions
diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py
index 9f2a2ae3..63d9c1fb 100644
--- a/archinstall/lib/output.py
+++ b/archinstall/lib/output.py
@@ -1,6 +1,7 @@
import logging
import os
import sys
+import unicodedata
from enum import Enum
from pathlib import Path
@@ -83,7 +84,7 @@ class FormattedOutput:
if capitalize:
key = key.capitalize()
- key_list.append(key.ljust(width))
+ key_list.append(unicode_ljust(key, width))
output += ' | '.join(key_list) + '\n'
output += '-' * len(output) + '\n'
@@ -99,9 +100,9 @@ class FormattedOutput:
value = '*' * width
if isinstance(value, (int, float)) or (isinstance(value, str) and value.isnumeric()):
- obj_data.append(str(value).rjust(width))
+ obj_data.append(unicode_rjust(str(value), width))
else:
- obj_data.append(str(value).ljust(width))
+ obj_data.append(unicode_ljust(str(value), width))
output += ' | '.join(obj_data) + '\n'
@@ -326,3 +327,33 @@ def log(
if level != logging.DEBUG or storage.get('arguments', {}).get('verbose', False):
sys.stdout.write(f"{text}\n")
sys.stdout.flush()
+
+def _count_wchars(string: str) -> int:
+ "Count the total number of wide characters contained in a string"
+ return sum(unicodedata.east_asian_width(c) in 'FW' for c in string)
+
+def unicode_ljust(string: str, width: int, fillbyte: str = ' ') -> str:
+ """Return a left-justified unicode string of length width.
+ >>> unicode_ljust('Hello', 15, '*')
+ 'Hello**********'
+ >>> unicode_ljust('你好', 15, '*')
+ '你好***********'
+ >>> unicode_ljust('안녕하세요', 15, '*')
+ '안녕하세요*****'
+ >>> unicode_ljust('こんにちは', 15, '*')
+ 'こんにちは*****'
+ """
+ return string.ljust(width - _count_wchars(string), fillbyte)
+
+def unicode_rjust(string: str, width: int, fillbyte: str = ' ') -> str:
+ """Return a right-justified unicode string of length width.
+ >>> unicode_rjust('Hello', 15, '*')
+ '**********Hello'
+ >>> unicode_rjust('你好', 15, '*')
+ '***********你好'
+ >>> unicode_rjust('안녕하세요', 15, '*')
+ '*****안녕하세요'
+ >>> unicode_rjust('こんにちは', 15, '*')
+ '*****こんにちは'
+ """
+ return string.rjust(width - _count_wchars(string), fillbyte)