From: G S Niteesh Babu <niteesh.gs@gmail.com>
To: qemu-devel@nongnu.org
Cc: ehabkost@redhat.com, kchamart@redhat.com, jsnow@redhat.com,
armbru@redhat.com, wainersm@redhat.com,
G S Niteesh Babu <niteesh.gs@gmail.com>,
stefanha@redhat.com, crosa@redhat.com, eblake@redhat.com
Subject: [PATCH v3 08/13] python/aqmp-tui: add syntax highlighting
Date: Sat, 31 Jul 2021 01:48:41 +0530 [thread overview]
Message-ID: <20210730201846.5147-9-niteesh.gs@gmail.com> (raw)
In-Reply-To: <20210730201846.5147-1-niteesh.gs@gmail.com>
Add syntax highlighting for the incoming and outgoing QMP messages.
This is achieved using the pygments module which was added in a
previous commit.
The current implementation is a really simple one which doesn't
allow for any configuration. In future this has to be improved
to allow for easier theme config using an external config of
some sort.
Signed-off-by: G S Niteesh Babu <niteesh.gs@gmail.com>
---
python/qemu/aqmp/aqmp_tui.py | 52 +++++++++++++++++++++++++++---------
1 file changed, 40 insertions(+), 12 deletions(-)
diff --git a/python/qemu/aqmp/aqmp_tui.py b/python/qemu/aqmp/aqmp_tui.py
index ab9ada793a..0d5ec62cb7 100644
--- a/python/qemu/aqmp/aqmp_tui.py
+++ b/python/qemu/aqmp/aqmp_tui.py
@@ -19,6 +19,8 @@
Union,
)
+from pygments import lexers
+from pygments import token as Token
import urwid
import urwid_readline
@@ -35,6 +37,22 @@
LOGGER = logging.getLogger()
+palette = [
+ (Token.Punctuation, '', '', '', 'h15,bold', 'g7'),
+ (Token.Text, '', '', '', '', 'g7'),
+ (Token.Name.Tag, '', '', '', 'bold,#f88', 'g7'),
+ (Token.Literal.Number.Integer, '', '', '', '#fa0', 'g7'),
+ (Token.Literal.String.Double, '', '', '', '#6f6', 'g7'),
+ (Token.Keyword.Constant, '', '', '', '#6af', 'g7'),
+ ('DEBUG', '', '', '', '#ddf', 'g7'),
+ ('INFO', '', '', '', 'g100', 'g7'),
+ ('WARNING', '', '', '', '#ff6', 'g7'),
+ ('ERROR', '', '', '', '#a00', 'g7'),
+ ('CRITICAL', '', '', '', '#a00', 'g7'),
+ ('background', '', 'black', '', '', 'g7'),
+]
+
+
def format_json(msg: str) -> str:
"""
Formats given multiline JSON message into a single line message.
@@ -57,17 +75,14 @@ def __init__(self, address: Union[str, Tuple[str, int]]) -> None:
self.aloop: Optional[Any] = None # FIXME: Use more concrete type.
super().__init__()
- def add_to_history(self, msg: str) -> None:
- urwid.emit_signal(self, UPDATE_MSG, msg)
+ def add_to_history(self, msg: str, level: Optional[str] = None) -> None:
+ urwid.emit_signal(self, UPDATE_MSG, msg, level)
def _cb_outbound(self, msg: Message) -> Message:
# FIXME: I think the ideal way to omit these messages during in-TUI
- # logging will be to add a filter to the logger. We can use regex to
- # filter out messages starting with 'Request:' or 'Response:' but I
- # think a better approach will be encapsulate the message in an object
- # and filter based on the object. Encapsulation of the message will
- # also be necessary when we want different formatting of messages
- # inside TUI.
+ # logging will be to add a filter to the logger. We can use
+ # regex/startswith to filter out messages starting with 'Request:' or
+ # 'Response:'. If possible please suggest other ideas.
handler = LOGGER.handlers[0]
if not isinstance(handler, TUILogHandler):
LOGGER.debug('Request: %s', str(msg))
@@ -156,6 +171,9 @@ def _get_formatted_address(self) -> str:
self._set_status('Server shutdown')
def run(self, debug: bool = False) -> None:
+ screen = urwid.raw_display.Screen()
+ screen.set_terminal_properties(256)
+
self.aloop = asyncio.get_event_loop()
self.aloop.set_debug(debug)
@@ -167,6 +185,8 @@ def run(self, debug: bool = False) -> None:
event_loop = urwid.AsyncioEventLoop(loop=self.aloop)
main_loop = urwid.MainLoop(urwid.AttrMap(self.window, 'background'),
unhandled_input=self.unhandled_input,
+ screen=screen,
+ palette=palette,
handle_mouse=True,
event_loop=event_loop)
@@ -251,7 +271,8 @@ def __init__(self, master: App) -> None:
self.history = urwid.SimpleFocusListWalker([])
super().__init__(self.history)
- def add_to_history(self, history: str) -> None:
+ def add_to_history(self,
+ history: Union[str, List[Tuple[str, str]]]) -> None:
self.history.append(urwid.Text(history))
if self.history:
self.history.set_focus(len(self.history) - 1)
@@ -271,8 +292,15 @@ def __init__(self, master: App) -> None:
super().__init__(self.body)
urwid.connect_signal(self.master, UPDATE_MSG, self.cb_add_to_history)
- def cb_add_to_history(self, msg: str) -> None:
- self.history.add_to_history(msg)
+ def cb_add_to_history(self, msg: str, level: Optional[str] = None) -> None:
+ formatted = []
+ if level:
+ formatted.append((level, msg))
+ else:
+ lexer = lexers.JsonLexer() # pylint: disable=no-member
+ for token in lexer.get_tokens(msg):
+ formatted.append(token)
+ self.history.add_to_history(formatted)
class Window(urwid.Frame):
@@ -298,7 +326,7 @@ def emit(self, record: LogRecord) -> None:
level = record.levelname
msg = record.getMessage()
msg = f'[{level}]: {msg}'
- self.tui.add_to_history(msg)
+ self.tui.add_to_history(msg, level)
def main() -> None:
--
2.17.1
next prev parent reply other threads:[~2021-07-30 20:25 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-30 20:18 [PATCH v3 00/13] AQMP TUI Draft G S Niteesh Babu
2021-07-30 20:18 ` [PATCH v3 01/13] python/aqmp: Fix wait_closed work-around for python 3.6 G S Niteesh Babu
2021-08-05 17:28 ` John Snow
2021-08-10 19:54 ` Niteesh G. S.
2021-07-30 20:18 ` [PATCH v3 02/13] python: disable pylint errors for aqmp-tui G S Niteesh Babu
2021-08-05 17:39 ` John Snow
2021-07-30 20:18 ` [PATCH v3 03/13] python: Add dependencies for AQMP TUI G S Niteesh Babu
2021-08-05 17:44 ` John Snow
2021-07-30 20:18 ` [PATCH v3 04/13] python/aqmp-tui: Add AQMP TUI draft G S Niteesh Babu
2021-08-05 18:58 ` John Snow
2021-08-13 15:10 ` Niteesh G. S.
2021-08-18 18:22 ` John Snow
2021-08-18 19:45 ` Niteesh G. S.
2021-08-05 19:11 ` John Snow
2021-08-13 14:38 ` Niteesh G. S.
2021-07-30 20:18 ` [PATCH v3 05/13] python: add entry point for aqmp-tui G S Niteesh Babu
2021-08-05 19:14 ` John Snow
2021-07-30 20:18 ` [PATCH v3 06/13] python/aqmp-tui: Added type annotations " G S Niteesh Babu
2021-08-05 19:56 ` John Snow
2021-08-10 17:12 ` Niteesh G. S.
2021-07-30 20:18 ` [PATCH v3 07/13] python: add optional pygments dependency G S Niteesh Babu
2021-08-16 19:37 ` John Snow
2021-07-30 20:18 ` G S Niteesh Babu [this message]
2021-08-16 19:44 ` [PATCH v3 08/13] python/aqmp-tui: add syntax highlighting John Snow
2021-08-16 21:19 ` Niteesh G. S.
2021-08-18 18:55 ` John Snow
2021-07-30 20:18 ` [PATCH v3 09/13] python/aqmp-tui: Add QMP connection manager G S Niteesh Babu
2021-08-17 4:50 ` John Snow
2021-08-17 19:06 ` Niteesh G. S.
2021-08-18 19:36 ` John Snow
2021-08-20 19:31 ` John Snow
2021-07-30 20:18 ` [PATCH v3 10/13] python/aqmp-tui: Add scrolling to history box G S Niteesh Babu
2021-07-30 20:18 ` [PATCH v3 11/13] python/aqmp-tui: Add ability to highlight messages G S Niteesh Babu
2021-07-30 20:18 ` [PATCH v3 12/13] python/aqmp-tui: Add pyperclip dependency G S Niteesh Babu
2021-07-30 20:18 ` [PATCH v3 13/13] python/aqmp-tui: Allow copying message from TUI G S Niteesh Babu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210730201846.5147-9-niteesh.gs@gmail.com \
--to=niteesh.gs@gmail.com \
--cc=armbru@redhat.com \
--cc=crosa@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=jsnow@redhat.com \
--cc=kchamart@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=wainersm@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).