qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/4] python/utils: add enboxify() text decoration utility


From: Hanna Reitz
Subject: Re: [PATCH 1/4] python/utils: add enboxify() text decoration utility
Date: Wed, 16 Feb 2022 17:54:58 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0

On 16.02.22 17:16, John Snow wrote:

On Tue, Feb 15, 2022, 6:57 PM Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:

    On 16/2/22 00:53, John Snow wrote:
    > On Tue, Feb 15, 2022 at 5:55 PM Eric Blake <eblake@redhat.com>
    wrote:
    >>
    >> On Tue, Feb 15, 2022 at 05:08:50PM -0500, John Snow wrote:
    >>>>>> print(enboxify(msg, width=72, name="commit message"))
    >>> ┏━ commit message
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    >>> ┃ enboxify() takes a chunk of text and wraps it in a text art
    box that ┃
    >>> ┃  adheres to a specified width. An optional title label may
    be given, ┃
    >>> ┃  and any of the individual glyphs used to draw the box may
    be        ┃
    >>
    >> Why do these two lines have a leading space,
    >>
    >>> ┃ replaced or specified as well.                          ┃
    >>
    >> but this one doesn't?  It must be an off-by-one corner case
    when your
    >> choice of space to wrap on is exactly at the wrap column.
    >>
    >
    > Right, you're probably witnessing the right-pad *and* the actual
    space.
    >
    >>>
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    >>>
    >>> Signed-off-by: John Snow <jsnow@redhat.com>
    >>> ---
    >>>   python/qemu/utils/__init__.py | 58
    +++++++++++++++++++++++++++++++++++
    >>>   1 file changed, 58 insertions(+)

    >>> +    def _wrap(line: str) -> str:
    >>> +        return os.linesep.join([
    >>> +            wrapped_line.ljust(lwidth) + suffix
    >>> +            for wrapped_line in textwrap.wrap(
    >>> +                    line, width=lwidth, initial_indent=prefix,
    >>> + subsequent_indent=prefix, replace_whitespace=False,
    >>> +                    drop_whitespace=False,
    break_on_hyphens=False)
    >>
    >> Always nice when someone else has written the cool library
    function to
    >> do all the hard work for you ;)  But this is probably where you
    have the off-by-one I called out above.
    >>
    >
    > Yeah, I just didn't want it to eat multiple spaces if they were
    > present -- I wanted it to reproduce them faithfully. The tradeoff is
    > some silliness near the margins.
    >
    > Realistically, if I want something any better than what I've done
    > here, I should find a library to do it for me instead -- but for the
    > sake of highlighting some important information, this may be
    > just-enough-juice.

    's/^┃  /┃ /' on top ;D


I have to admit that this function is actually very fragile. Last night, I did some reading on unicode and emoji encodings and discovered that it's *basically impossible* to predict the "visual width" of a sequence of unicode codepoints.

Jumping it at random without knowing any of the history (that’s my forte!):

*Clippy face*

It sounds like you want to put a bar to the right of some text in a terminal, but you can’t predict the texts horizontal width, and so you can’t work out the number of spaces needed to pad the text with before the bar.

Two things come to my mind, if we’re talking about TTY output:
(A) printf '%79s┃\r%s\n' '' "$text"
(B) printf '%s\e[80G┃\n' "$text"

I.e. either printing the bar first, then printing the text over the line; or using an ANSI escape sequence to have the TTY position the bar.  Both seem to work for me in both konsole and xterm.

Or perhaps you’re really trying to find out how long a piece of text is visually (so you can break the line when this exceeds some limit), which you can also technically do with ANSI escape sequences, because "\e[6n" will return the cursor position to stdin (as "\e[{Y};{X}R").  But reading from stdin when there’s no newline is always really stupid, so I don’t know if you really want that.

(And you also need to print the text first before you can find out how long it is, which is kind of not great.)

Now that I wrote this all it feels like I didn’t help at all, but I put work into this mail, so I’ll send it anyway!

Hanna




reply via email to

[Prev in Thread] Current Thread [Next in Thread]