More work on generic RSS renderer base class. Make the kiosk have a countdown
[kiosk.git] / page_builder.py
1 import sys
2
3 class page_builder(object):
4     LAYOUT_AUTO = 0
5     LAYOUT_ONE_ITEM = 1
6     LAYOUT_FOUR_ITEMS = 2
7     LAYOUT_MANY_ITEMS = 3
8     LAYOUT_TEXT_ONE_COLUMN = 4
9     LAYOUT_TEXT_TWO_COLUMNS = 5
10
11     def __init__(self):
12         self.title = None
13         self.style = ""
14         self.layout = page_builder.LAYOUT_AUTO
15         self.items = []
16         self.debug_info = None
17         self.custom_html = None
18
19     def set_layout(self, layout):
20         self.layout = layout
21         return self
22
23     def set_title(self, title):
24         self.title = title
25         return self
26
27     def set_style(self, style):
28         self.style = style
29         return self
30
31     def add_item(self, item):
32         self.items.append(item)
33         return self
34
35     def set_debug_info(self, debug_info):
36         self.debug_info = debug_info
37         return self
38
39     def __pick_layout(self):
40         if len(self.items) == 1:
41             self.layout = page_builder.LAYOUT_ONE_ITEM
42         elif len(self.items) <= 4:
43             self.layout = page_builder.LAYOUT_FOUR_ITEMS
44         else:
45             self.layout = page_builder.LAYOUT_MANY_ITEMS
46
47     def __render_custom_html(self, f):
48         if self.custom_html is not None:
49             f.write(self.custom_html)
50
51     def __render_header(self, f):
52         if self.title is not None:
53             f.write("<H1>%s</H1>\n" % self.title)
54         f.write("<HR>\n<TABLE WIDTH=99% BORDER=0>\n<TR>\n")
55         if self.style is not None:
56             f.write(self.style)
57
58     def __render_footer(self, f):
59         f.write("</TR>\n</TABLE>\n")
60
61     def render_html(self, f):
62         if self.layout == page_builder.LAYOUT_AUTO or self.layout is None:
63             self.__pick_layout()
64         self.__render_custom_html(f)
65         self.__render_header(f)
66
67         items_per_row = None
68
69         if self.layout == page_builder.LAYOUT_ONE_ITEM:
70             items_per_row = 1
71
72         elif self.layout == page_builder.LAYOUT_FOUR_ITEMS:
73             items_per_row = 2
74
75         elif self.layout == page_builder.LAYOUT_MANY_ITEMS:
76             items_per_row = 3
77
78         elif self.layout == page_builder.LAYOUT_TEXT_TWO_COLUMNS:
79             items_per_row = 1
80
81         elif self.layout == page_builder.LAYOUT_TEXT_ONE_COLUMN:
82             items_per_row = 1
83
84         else:
85             print("Error, unknown layout type: %d" % self.layout)
86
87         count = 0
88         self.items.sort(key=len, reverse=True)
89         for item in self.items:
90             f.write('<TD WIDTH=50%% STYLE="padding: 10px;">\n%s\n</TD>\n' % item)
91             count += 1
92             if count % items_per_row == 0:
93                 f.write("</TR>\n<TR>\n")
94         self.__render_footer(f)
95
96     def set_custom_html(self, html):
97         self.custom_html = html
98
99 #x = page_builder()
100 #x.set_title("title").add_item("item1").add_item("item2").add_item("item3").render_html(sys.stdout)