[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 08/13] python/aqmp-tui: add syntax highlighting
From: |
G S Niteesh Babu |
Subject: |
[PATCH v3 08/13] python/aqmp-tui: add syntax highlighting |
Date: |
Sat, 31 Jul 2021 01:48:41 +0530 |
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
- [PATCH v3 00/13] AQMP TUI Draft, G S Niteesh Babu, 2021/07/30
- [PATCH v3 01/13] python/aqmp: Fix wait_closed work-around for python 3.6, G S Niteesh Babu, 2021/07/30
- [PATCH v3 02/13] python: disable pylint errors for aqmp-tui, G S Niteesh Babu, 2021/07/30
- [PATCH v3 03/13] python: Add dependencies for AQMP TUI, G S Niteesh Babu, 2021/07/30
- [PATCH v3 04/13] python/aqmp-tui: Add AQMP TUI draft, G S Niteesh Babu, 2021/07/30
- [PATCH v3 05/13] python: add entry point for aqmp-tui, G S Niteesh Babu, 2021/07/30
- [PATCH v3 06/13] python/aqmp-tui: Added type annotations for aqmp-tui, G S Niteesh Babu, 2021/07/30
- [PATCH v3 07/13] python: add optional pygments dependency, G S Niteesh Babu, 2021/07/30
- [PATCH v3 08/13] python/aqmp-tui: add syntax highlighting,
G S Niteesh Babu <=
- [PATCH v3 09/13] python/aqmp-tui: Add QMP connection manager, G S Niteesh Babu, 2021/07/30
- [PATCH v3 10/13] python/aqmp-tui: Add scrolling to history box, G S Niteesh Babu, 2021/07/30
- [PATCH v3 11/13] python/aqmp-tui: Add ability to highlight messages, G S Niteesh Babu, 2021/07/30
- [PATCH v3 12/13] python/aqmp-tui: Add pyperclip dependency, G S Niteesh Babu, 2021/07/30
- [PATCH v3 13/13] python/aqmp-tui: Allow copying message from TUI, G S Niteesh Babu, 2021/07/30