1#!/usr/bin/python
2
3import sys
4import commands
5import re
6from xml.dom import minidom
7from BeautifulSoup import BeautifulSoup
8import make_graph
9
10class exception:
11	pass
12
13res_div_re = re.compile('(.*?)_res_div')
14settings_div_re = re.compile('(.*?)_settings_div')
15
16
17gray_border_div_str = '<div style = "border-style: dotted; border-width: 1px; border-color: lightgray">'
18space_div_str = '<div style = "width: 100%; height: 20px">'
19
20
21
22def logical_build_from_build(build):
23	if build == 'gcc':
24		return 'g++'
25	if build == 'msvc':
26		return 'msvc++'
27	if build == 'local':
28		return 'local'
29	sys.stderr.write(build)
30	raise exception
31
32
33def img_title_from_origs(label, title, base_build_ref, build_name, logical_build_name):
34	title = title.replace('_tt_', '<tt>')
35	title = title.replace('_455tt_', '</tt>')
36	title = title.replace('_b_', '<b>')
37	title = title.replace('_455b_', '</b>')
38	title = title.replace('_456', ',')
39	title = title.replace('_457', '[]')
40	title = title.replace('_', ' ')
41	return '%s: %s - <a href = "%s_performance_tests.html#%s">%s</a>' % (
42		label,
43		title,
44		base_build_ref,
45		build_name,
46		logical_build_name)
47
48
49def make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name):
50	cmd_str = '%s/scripts/make_graph.py %s %s %s %s %s' % (
51		src_dir, doc_dir,
52		res_dir,
53		tests_info_xml_f_name,
54		test_name,
55		build_name)
56	# Must start a new process for pychart - otherwise pngs overlap.
57	so = commands.getstatusoutput(cmd_str)
58	if(so[0] != 0):
59		sys.stderr.write(cmd_str + '\n')
60		sys.stderr.write(so[1] + '\n')
61		sys.exit(-1)
62
63
64def make_png_str(label, test_name, build):
65	ret = '<h6 class="c1">'
66	ret += '<a name="%s" id= "%s">' % (label, label)
67	ret += '<img src="%s" ' % (test_name + '_' + build + '.png')
68	ret += 'alt="no image" />'
69	ret += '</a></h6>'
70	return ret
71
72def process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name):
73	doc_dir = src_dir + "/docs/html/ext/pb_ds"
74	res_dir = build_dir
75	html_f = open(doc_dir + '/' + html_f_name)
76	soup = BeautifulSoup(html_f.read())
77	html_f.close()
78	platform_comp_re = re.compile('platform_comp_%s' % build_name)
79	for d in soup('div'):
80		try:
81			settings_m = settings_div_re.match(d['id'])
82			res_m = res_div_re.match(d['id'])
83		except:
84			settings_m = None
85			res_m = None
86
87		if settings_m:
88			build = settings_m.groups()[0]
89			if build == build_name:
90				logical_build_name = logical_build_from_build(build)
91				info = gray_border_div_str
92				info += '<h3><a name = "%s"><u>%s</u></a></h3>' % (build, logical_build_name)
93				info += make_graph.comp_platform_info(compiler_name)
94				info += '</div>%s</div>' % space_div_str
95				d.contents = info
96		elif res_m:
97			label = res_m.groups()[0]
98			d = d.divTag
99
100			build = d['id'].replace('%s_' % label, '')
101
102			if build == build_name:
103				logical_build_name = logical_build_from_build(build)
104				d = d.divTag
105				test_name = d['id'].replace('%s_' % label, '')
106				d = d.divTag
107				base_build_ref = d['id'].replace('%s_' % label, '')
108				d = d.divTag
109				title = d['id'].replace('%s_' % label, '')
110				img_title = img_title_from_origs(label, title, base_build_ref, build, logical_build_name)
111
112				make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name)
113				png_str = make_png_str(label, test_name, build)
114				content = gray_border_div_str
115				content += png_str
116				content += img_title
117#				content += make_graph.legend(doc_dir, res_dir, tests_info_xml_f_name, test_name, build_name)
118				content += '</div>%s</div>' % space_div_str
119				d.contents = content
120
121	return soup
122
123
124
125if __name__ == "__main__":
126	"""
127	Doc dir
128	This module takes 6 parameters from the command line:
129	Source directory
130	Build directory
131	HTMLs XML file name
132	Tests info XML file name
133	Build name
134	Compiler name
135	"""
136
137	usg = "make_graph.py <src_dir> <build_dir> <htmls_xml_f_name> <tests_info_xml_f_name> <build_name> <compiler_name>\n"
138
139	if len(sys.argv) != 7:
140		sys.stderr.write(usg)
141		raise exception
142
143	src_dir = sys.argv[1]
144	build_dir = sys.argv[2]
145	htmls_xml_f_name = sys.argv[3]
146	tests_info_xml_f_name = sys.argv[4]
147	build_name = sys.argv[5]
148	compiler_name = sys.argv[6]
149	doc_dir = src_dir + "/docs/html/ext/pb_ds"
150	htmls_dat = minidom.parse(htmls_xml_f_name)
151	for html in htmls_dat.getElementsByTagName('html'):
152		html_f_name = html.attributes['name'].value
153
154		new_soup = process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name)
155
156		html_f = open(doc_dir + '/' + html_f_name, 'w')
157		html_f.write(str(new_soup))
158		html_f.close()
159
160
161