Initial commit
[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
18     def set_layout(self, layout):
19         self.layout = layout
20         return self
21
22     def set_title(self, title):
23         self.title = title
24         return self
25
26     def set_style(self, style):
27         self.style = style
28         return self
29
30     def add_item(self, item):
31         self.items.append(item)
32         return self
33
34     def set_debug_info(self, debug_info):
35         self.debug_info = debug_info
36         return self
37
38     def __pick_layout(self):
39         if len(self.items) == 1:
40             self.layout = page_builder.LAYOUT_ONE_ITEM
41         elif len(self.items) <= 4:
42             self.layout = page_builder.LAYOUT_FOUR_ITEMS
43         else:
44             self.layout = page_builder.LAYOUT_MANY_ITEMS
45
46     def __render_header(self, f):
47         if self.title is not None:
48             f.write("<H1>%s</H1>\n" % self.title)
49         f.write("<HR>\n<TABLE WIDTH=99% BORDER=0>\n<TR>\n")
50         if self.style is not None:
51             f.write(self.style)
52
53     def __render_footer(self, f):
54         f.write("</TR>\n</TABLE>\n")
55
56     def render_html(self, f):
57         if self.layout == page_builder.LAYOUT_AUTO or self.layout is None:
58             self.__pick_layout()
59
60         self.__render_header(f)
61
62         items_per_row = None
63
64         if self.layout == page_builder.LAYOUT_ONE_ITEM:
65             items_per_row = 1
66
67         elif self.layout == page_builder.LAYOUT_FOUR_ITEMS:
68             items_per_row = 2
69
70         elif self.layout == page_builder.LAYOUT_MANY_ITEMS:
71             items_per_row = 3
72
73         elif self.layout == page_builder.LAYOUT_TEXT_TWO_COLUMNS:
74             items_per_row = 1
75
76         elif self.layout == page_builder.LAYOUT_TEXT_ONE_COLUMN:
77             items_per_row = 1
78
79         else:
80             print "Error, unknown layout type: %d" % self.layout
81
82         count = 0
83         self.items.sort(key=len, reverse=True)
84         for item in self.items:
85             f.write('<TD WIDTH=50%% STYLE="padding: 10px;">\n%s\n</TD>\n' % item)
86             count += 1
87             if count % items_per_row == 0:
88                 f.write("</TR>\n<TR>\n")
89
90         self.__render_footer(f)
91
92 #x = page_builder()
93 #x.set_title("title").add_item("item1").add_item("item2").add_item("item3").render_html(sys.stdout)