1169691Skan#!/usr/bin/python
2169691Skan
3169691Skanimport sys
4169691Skanimport commands
5169691Skanimport re
6169691Skanfrom xml.dom import minidom
7169691Skanfrom BeautifulSoup import BeautifulSoup
8169691Skanimport make_graph
9169691Skan
10169691Skanclass exception:
11169691Skan	pass
12169691Skan
13169691Skanres_div_re = re.compile('(.*?)_res_div')
14169691Skansettings_div_re = re.compile('(.*?)_settings_div')
15169691Skan
16169691Skan
17169691Skangray_border_div_str = '<div style = "border-style: dotted; border-width: 1px; border-color: lightgray">'
18169691Skanspace_div_str = '<div style = "width: 100%; height: 20px">'
19169691Skan
20169691Skan
21169691Skan
22169691Skandef logical_build_from_build(build):
23169691Skan	if build == 'gcc':
24169691Skan		return 'g++'
25169691Skan	if build == 'msvc':
26169691Skan		return 'msvc++'
27169691Skan	if build == 'local':
28169691Skan		return 'local'
29169691Skan	sys.stderr.write(build)
30169691Skan	raise exception
31169691Skan
32169691Skan
33169691Skandef img_title_from_origs(label, title, base_build_ref, build_name, logical_build_name):
34169691Skan	title = title.replace('_tt_', '<tt>')
35169691Skan	title = title.replace('_455tt_', '</tt>')
36169691Skan	title = title.replace('_b_', '<b>')
37169691Skan	title = title.replace('_455b_', '</b>')
38169691Skan	title = title.replace('_456', ',')
39169691Skan	title = title.replace('_457', '[]')
40169691Skan	title = title.replace('_', ' ')
41169691Skan	return '%s: %s - <a href = "%s_performance_tests.html#%s">%s</a>' % (
42169691Skan		label,
43169691Skan		title,
44169691Skan		base_build_ref,
45169691Skan		build_name,
46169691Skan		logical_build_name)
47169691Skan
48169691Skan
49169691Skandef make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name):
50169691Skan	cmd_str = '%s/scripts/make_graph.py %s %s %s %s %s' % (
51169691Skan		src_dir, doc_dir,
52169691Skan		res_dir,
53169691Skan		tests_info_xml_f_name,
54169691Skan		test_name,
55169691Skan		build_name)
56169691Skan	# Must start a new process for pychart - otherwise pngs overlap.
57169691Skan	so = commands.getstatusoutput(cmd_str)
58169691Skan	if(so[0] != 0):
59169691Skan		sys.stderr.write(cmd_str + '\n')
60169691Skan		sys.stderr.write(so[1] + '\n')
61169691Skan		sys.exit(-1)
62169691Skan
63169691Skan
64169691Skandef make_png_str(label, test_name, build):
65169691Skan	ret = '<h6 class="c1">'
66169691Skan	ret += '<a name="%s" id= "%s">' % (label, label)
67169691Skan	ret += '<img src="%s" ' % (test_name + '_' + build + '.png')
68169691Skan	ret += 'alt="no image" />'
69169691Skan	ret += '</a></h6>'
70169691Skan	return ret
71169691Skan
72169691Skandef process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name):
73169691Skan	doc_dir = src_dir + "/docs/html/ext/pb_ds"
74169691Skan	res_dir = build_dir
75169691Skan	html_f = open(doc_dir + '/' + html_f_name)
76169691Skan	soup = BeautifulSoup(html_f.read())
77169691Skan	html_f.close()
78169691Skan	platform_comp_re = re.compile('platform_comp_%s' % build_name)
79169691Skan	for d in soup('div'):
80169691Skan		try:
81169691Skan			settings_m = settings_div_re.match(d['id'])
82169691Skan			res_m = res_div_re.match(d['id'])
83169691Skan		except:
84169691Skan			settings_m = None
85169691Skan			res_m = None
86169691Skan
87169691Skan		if settings_m:
88169691Skan			build = settings_m.groups()[0]
89169691Skan			if build == build_name:
90169691Skan				logical_build_name = logical_build_from_build(build)
91169691Skan				info = gray_border_div_str
92169691Skan				info += '<h3><a name = "%s"><u>%s</u></a></h3>' % (build, logical_build_name)
93169691Skan				info += make_graph.comp_platform_info(compiler_name)
94169691Skan				info += '</div>%s</div>' % space_div_str
95169691Skan				d.contents = info
96169691Skan		elif res_m:
97169691Skan			label = res_m.groups()[0]
98169691Skan			d = d.divTag
99169691Skan
100169691Skan			build = d['id'].replace('%s_' % label, '')
101169691Skan
102169691Skan			if build == build_name:
103169691Skan				logical_build_name = logical_build_from_build(build)
104169691Skan				d = d.divTag
105169691Skan				test_name = d['id'].replace('%s_' % label, '')
106169691Skan				d = d.divTag
107169691Skan				base_build_ref = d['id'].replace('%s_' % label, '')
108169691Skan				d = d.divTag
109169691Skan				title = d['id'].replace('%s_' % label, '')
110169691Skan				img_title = img_title_from_origs(label, title, base_build_ref, build, logical_build_name)
111169691Skan
112169691Skan				make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name)
113169691Skan				png_str = make_png_str(label, test_name, build)
114169691Skan				content = gray_border_div_str
115169691Skan				content += png_str
116169691Skan				content += img_title
117169691Skan#				content += make_graph.legend(doc_dir, res_dir, tests_info_xml_f_name, test_name, build_name)
118169691Skan				content += '</div>%s</div>' % space_div_str
119169691Skan				d.contents = content
120169691Skan
121169691Skan	return soup
122169691Skan
123169691Skan
124169691Skan
125169691Skanif __name__ == "__main__":
126169691Skan	"""
127169691Skan	Doc dir
128169691Skan	This module takes 6 parameters from the command line:
129169691Skan	Source directory
130169691Skan	Build directory
131169691Skan	HTMLs XML file name
132169691Skan	Tests info XML file name
133169691Skan	Build name
134169691Skan	Compiler name
135169691Skan	"""
136169691Skan
137169691Skan	usg = "make_graph.py <src_dir> <build_dir> <htmls_xml_f_name> <tests_info_xml_f_name> <build_name> <compiler_name>\n"
138169691Skan
139169691Skan	if len(sys.argv) != 7:
140169691Skan		sys.stderr.write(usg)
141169691Skan		raise exception
142169691Skan
143169691Skan	src_dir = sys.argv[1]
144169691Skan	build_dir = sys.argv[2]
145169691Skan	htmls_xml_f_name = sys.argv[3]
146169691Skan	tests_info_xml_f_name = sys.argv[4]
147169691Skan	build_name = sys.argv[5]
148169691Skan	compiler_name = sys.argv[6]
149169691Skan	doc_dir = src_dir + "/docs/html/ext/pb_ds"
150169691Skan	htmls_dat = minidom.parse(htmls_xml_f_name)
151169691Skan	for html in htmls_dat.getElementsByTagName('html'):
152169691Skan		html_f_name = html.attributes['name'].value
153169691Skan
154169691Skan		new_soup = process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name)
155169691Skan
156169691Skan		html_f = open(doc_dir + '/' + html_f_name, 'w')
157169691Skan		html_f.write(str(new_soup))
158169691Skan		html_f.close()
159169691Skan
160169691Skan
161