Change to utils.display_len

evennia.utils.tests.test_utils.TestFormatGrid
evennia.commands.default.tests.TestHelp
Both pass
This commit is contained in:
davewiththenicehat 2021-06-19 11:46:46 -04:00
parent da6e1edb29
commit 02fc0f998e

View file

@ -1837,10 +1837,7 @@ def percentile(iterable, percent, key=lambda x: x):
return d0 + d1 return d0 + d1
from evennia.utils.ansi import strip_ansi def format_grid(elements, width=78, sep=" ", verbatim_elements=None):
def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ansi=True):
""" """
This helper function makes a 'grid' output, where it distributes the given This helper function makes a 'grid' output, where it distributes the given
string-elements as evenly as possible to fill out the given width. string-elements as evenly as possible to fill out the given width.
@ -1864,9 +1861,6 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
like this to make it easier to insert decorations between rows, such like this to make it easier to insert decorations between rows, such
as horizontal bars. as horizontal bars.
""" """
def ansi_len(text):
"""Use arg ignore_ansi to calculate length of text in element."""
return len(strip_ansi(text)) if ignore_ansi else len(text)
def _minimal_rows(elements): def _minimal_rows(elements):
""" """
@ -1875,8 +1869,8 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
""" """
rows = [""] rows = [""]
for element in elements: for element in elements:
rowlen = ansi_len((rows[-1])) rowlen = display_len((rows[-1]))
elen = ansi_len((element)) elen = display_len((element))
if rowlen + elen <= width: if rowlen + elen <= width:
rows[-1] += element rows[-1] += element
else: else:
@ -1888,7 +1882,7 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
Dynamic-space, good for making even columns in a multi-line grid but Dynamic-space, good for making even columns in a multi-line grid but
will look strange for a single line. will look strange for a single line.
""" """
wls = [ansi_len((elem)) for elem in elements] wls = [display_len((elem)) for elem in elements]
wls_percentile = [wl for iw, wl in enumerate(wls) if iw not in verbatim_elements] wls_percentile = [wl for iw, wl in enumerate(wls) if iw not in verbatim_elements]
if wls_percentile: if wls_percentile:
@ -1904,7 +1898,7 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
# we use rstrip here to remove extra spaces added by sep # we use rstrip here to remove extra spaces added by sep
return [ return [
crop(element.rstrip(), width) + " " \ crop(element.rstrip(), width) + " " \
* max(0, width - ansi_len((element.rstrip()))) * max(0, width - display_len((element.rstrip())))
for iel, element in enumerate(elements) for iel, element in enumerate(elements)
] ]
@ -1916,7 +1910,7 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
for ie, element in enumerate(elements): for ie, element in enumerate(elements):
wl = wls[ie] wl = wls[ie]
lrow = ansi_len((row)) lrow = display_len((row))
# debug = row.replace(" ", ".") # debug = row.replace(" ", ".")
if lrow + wl > width: if lrow + wl > width:
@ -1955,7 +1949,7 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
if ie >= nelements - 1: if ie >= nelements - 1:
# last element, make sure to store # last element, make sure to store
row += " " * max(0, width - ansi_len((row))) row += " " * max(0, width - display_len((row)))
rows.append(row) rows.append(row)
return rows return rows
@ -1968,7 +1962,7 @@ def format_grid(elements, width=78, sep=" ", verbatim_elements=None, ignore_ans
# add sep to all but the very last element # add sep to all but the very last element
elements = [elements[ie] + sep for ie in range(nelements - 1)] + [elements[-1]] elements = [elements[ie] + sep for ie in range(nelements - 1)] + [elements[-1]]
if sum(ansi_len((element)) for element in elements) <= width: if sum(display_len((element)) for element in elements) <= width:
# grid fits in one line # grid fits in one line
return _minimal_rows(elements) return _minimal_rows(elements)
else: else: