[ovs-dev] [RFC PATCH 08/10] python/ovs-ofparse: add html formatter

Adrian Moreno amorenoz at redhat.com
Mon Nov 22 15:01:55 UTC 2021


Add a HTML formatting system. The HTMLStyle includes a color and a
anchor generator so links can be added to each key and value.

Styles are extracted from the configuration file

Signed-off-by: Adrian Moreno <amorenoz at redhat.com>
---
 python/automake.mk                          |   3 +-
 python/ovs/ovs_ofparse/etc/ovs-ofparse.conf |   9 ++
 python/ovs/ovs_ofparse/html.py              | 125 ++++++++++++++++++++
 3 files changed, 136 insertions(+), 1 deletion(-)
 create mode 100644 python/ovs/ovs_ofparse/html.py

diff --git a/python/automake.mk b/python/automake.mk
index 843570420..2fcc03f89 100644
--- a/python/automake.mk
+++ b/python/automake.mk
@@ -62,7 +62,8 @@ ovs_pyfiles = \
 	python/ovs/ovs_ofparse/console.py \
 	python/ovs/ovs_ofparse/etc/ovs-ofparse.conf \
 	python/ovs/ovs_ofparse/ofp_logic.py \
-	python/ovs/ovs_ofparse/dp_tree.py
+	python/ovs/ovs_ofparse/dp_tree.py \
+	python/ovs/ovs_ofparse/html.py
 
 
 
diff --git a/python/ovs/ovs_ofparse/etc/ovs-ofparse.conf b/python/ovs/ovs_ofparse/etc/ovs-ofparse.conf
index 19bf157df..1097ccc09 100644
--- a/python/ovs/ovs_ofparse/etc/ovs-ofparse.conf
+++ b/python/ovs/ovs_ofparse/etc/ovs-ofparse.conf
@@ -74,3 +74,12 @@ console.value.highlighted.color = #f20905
 console.key.highlighted.underline = true
 console.value.highlighted.underline = true
 console.delim.highlighted.underline = true
+
+# html
+html.key.color =  #00005f
+html.value.color = #870000
+html.key.resubmit.color = #00d700
+html.key.output.color = #005f00
+html.value.output.color = #00d700
+html.key.highlighted.color = #FF00FF
+html.value.highlighted.color = #FF00FF
diff --git a/python/ovs/ovs_ofparse/html.py b/python/ovs/ovs_ofparse/html.py
new file mode 100644
index 000000000..89cd553f0
--- /dev/null
+++ b/python/ovs/ovs_ofparse/html.py
@@ -0,0 +1,125 @@
+from ovs.ovs_ofparse.format import FlowFormatter, FlowBuffer, FlowStyle
+
+
+class HTMLStyle(FlowStyle):
+    """HTMLStyle defines a style for html-formatted flows
+
+    Args:
+        color(str): Optional; a string representing the CSS color to use
+        anchor_gen(callable): Optional; a callable to be used to generate the
+            href
+    """
+
+    def __init__(self, color=None, anchor_gen=None):
+        self.color = color
+        self.anchor_gen = anchor_gen
+
+
+class HTMLBuffer(FlowBuffer):
+    """HTMLBuffer implementes FlowBuffer to provide html-based flow formatting
+
+    Each flow gets formatted as:
+        <div><span>...</span></div>
+    """
+
+    def __init__(self):
+        self._text = ""
+
+    @property
+    def text(self):
+        return self._text
+
+    def _append(self, string, color, href):
+        """Append a key a string"""
+        style = ' style="color:{}"'.format(color) if color else ""
+        self._text += "<span{}>".format(style)
+        if href:
+            self._text += "<a href={}>".format(href)
+        self._text += string
+        if href:
+            self._text += "</a>"
+        self._text += "</span>"
+
+    def append_key(self, kv, style):
+        """Append a key
+        Args:
+            kv (KeyValue): the KeyValue instance to append
+            style (HTMLStyle): the style to use
+        """
+        href = style.anchor_gen(kv) if (style and style.anchor_gen) else ""
+        return self._append(
+            kv.meta.kstring, style.color if style else "", href
+        )
+
+    def append_delim(self, kv, style):
+        """Append a delimiter
+        Args:
+            kv (KeyValue): the KeyValue instance to append
+            style (HTMLStyle): the style to use
+        """
+        href = style.anchor_gen(kv) if (style and style.anchor_gen) else ""
+        return self._append(kv.meta.delim, style.color if style else "", href)
+
+    def append_end_delim(self, kv, style):
+        """Append an end delimiter
+        Args:
+            kv (KeyValue): the KeyValue instance to append
+            style (HTMLStyle): the style to use
+        """
+        href = style.anchor_gen(kv) if (style and style.anchor_gen) else ""
+        return self._append(
+            kv.meta.end_delim, style.color if style else "", href
+        )
+
+    def append_value(self, kv, style):
+        """Append a value
+        Args:
+            kv (KeyValue): the KeyValue instance to append
+            style (HTMLStyle): the style to use
+        """
+        href = style.anchor_gen(kv) if (style and style.anchor_gen) else ""
+        return self._append(
+            kv.meta.vstring, style.color if style else "", href
+        )
+
+    def append_extra(self, extra, style):
+        """Append extra string
+        Args:
+            kv (KeyValue): the KeyValue instance to append
+            style (HTMLStyle): the style to use
+        """
+        return self._append(extra, style.color if style else "", "")
+
+
+class HTMLFormatter(FlowFormatter):
+    """
+    Formts a flow in HTML Format
+    """
+
+    default_style_obj = FlowStyle(
+        {
+            "value.resubmit": HTMLStyle(
+                anchor_gen=lambda x: "#table_{}".format(x.value["table"])
+            ),
+            "default": HTMLStyle(),
+        }
+    )
+
+    def __init__(self, opts=None):
+        super(HTMLFormatter, self).__init__()
+        self.style = (
+            self._style_from_opts(opts, "html", HTMLStyle) or FlowStyle()
+        )
+
+    def format_flow(self, buf, flow, highlighted=None):
+        """
+        Formats the flow into the provided buffer as a html object
+
+        Args:
+            buf (FlowBuffer): the flow buffer to append to
+            flow (ovs_dbg.OFPFlow): the flow to format
+            highlighted (list): Optional; list of KeyValues to highlight
+        """
+        return super(HTMLFormatter, self).format_flow(
+            buf, flow, self.style, highlighted
+        )
-- 
2.31.1



More information about the dev mailing list