File: html_format.py

package info (click to toggle)
openvswitch 3.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 99,608 kB
  • sloc: sh: 1,683,183; ansic: 313,349; python: 28,192; xml: 21,442; makefile: 546; javascript: 191
file content (147 lines) | stat: -rw-r--r-- 4,861 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Copyright (c) 2023 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from ovs.flowviz.format import FlowFormatter, FlowBuffer, FlowStyle


class HTMLStyle:
    """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, 'style="color:{}"'.format(color) if color else ""
            )
        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_value_omitted(self, kv):
        """Append an omitted value.
        Args:
            kv (KeyValue): the KeyValue instance to append
        """
        dots = "." * len(kv.meta.vstring)
        return self._append(dots, "", "")

    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, omitted=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
            omitted (list): Optional; list of KeyValues to omit
        """
        return super(HTMLFormatter, self).format_flow(
            buf, flow, self.style, highlighted, omitted
        )