mirror of
https://github.com/not-kennethreitz/click-tools.git
synced 2026-06-05 23:20:19 +00:00
ad90ccb90c
Signed-off-by: Kenneth Reitz <me@kennethreitz.org>
108 lines
2.7 KiB
Python
108 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
clint.textui.formatters
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Core TextUI functionality for text formatting.
|
|
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
|
|
from crayons import ColoredString, clean
|
|
from .utils import tsplit, schunk
|
|
|
|
|
|
NEWLINES = ('\n', '\r', '\r\n')
|
|
|
|
|
|
def min_width(string, cols, padding=' '):
|
|
"""Returns given string with right padding."""
|
|
|
|
is_color = isinstance(string, ColoredString)
|
|
|
|
stack = tsplit(str(string), NEWLINES)
|
|
|
|
for i, substring in enumerate(stack):
|
|
_sub = clean(substring).ljust((cols + 0), padding)
|
|
if is_color:
|
|
_sub = (_sub.replace(clean(substring), substring))
|
|
stack[i] = _sub
|
|
|
|
return '\n'.join(stack)
|
|
|
|
|
|
def max_width(string, cols, separator='\n'):
|
|
"""Returns a freshly formatted
|
|
:param string: string to be formatted
|
|
:type string: basestring or clint.textui.colored.ColoredString
|
|
:param cols: max width the text to be formatted
|
|
:type cols: int
|
|
:param separator: separator to break rows
|
|
:type separator: basestring
|
|
|
|
>>> formatters.max_width('123 5678', 8)
|
|
'123 5678'
|
|
>>> formatters.max_width('123 5678', 7)
|
|
'123 \n5678'
|
|
|
|
"""
|
|
|
|
is_color = isinstance(string, ColoredString)
|
|
|
|
if is_color:
|
|
string_copy = string._new('')
|
|
string = string.s
|
|
|
|
stack = tsplit(string, NEWLINES)
|
|
|
|
for i, substring in enumerate(stack):
|
|
stack[i] = substring.split()
|
|
|
|
_stack = []
|
|
|
|
for row in stack:
|
|
_row = ['', ]
|
|
_row_i = 0
|
|
|
|
for word in row:
|
|
if (len(_row[_row_i]) + len(word)) <= cols:
|
|
_row[_row_i] += word
|
|
_row[_row_i] += ' '
|
|
|
|
elif len(word) > cols:
|
|
|
|
# ensure empty row
|
|
if len(_row[_row_i]):
|
|
_row[_row_i] = _row[_row_i].rstrip()
|
|
_row.append('')
|
|
_row_i += 1
|
|
|
|
chunks = schunk(word, cols)
|
|
for i, chunk in enumerate(chunks):
|
|
if not (i + 1) == len(chunks):
|
|
_row[_row_i] += chunk
|
|
_row[_row_i] = _row[_row_i].rstrip()
|
|
_row.append('')
|
|
_row_i += 1
|
|
else:
|
|
_row[_row_i] += chunk
|
|
_row[_row_i] += ' '
|
|
else:
|
|
_row[_row_i] = _row[_row_i].rstrip()
|
|
_row.append('')
|
|
_row_i += 1
|
|
_row[_row_i] += word
|
|
_row[_row_i] += ' '
|
|
else:
|
|
_row[_row_i] = _row[_row_i].rstrip()
|
|
|
|
_row = map(str, _row)
|
|
_stack.append(separator.join(_row))
|
|
|
|
_s = '\n'.join(_stack)
|
|
if is_color:
|
|
_s = string_copy._new(_s)
|
|
return _s
|