6 import FWCore.ParameterSet.SequenceTypes
as sqt
8 import FWCore.ParameterSet.Modules
as mod
9 import FWCore.ParameterSet.Types
as typ
12 from Vispa.Plugins.ConfigEditor.ConfigDataAccessor
import ConfigDataAccessor
13 from FWCore.GuiBrowsers.FileExportPlugin
import FileExportPlugin
17 plugin_name=
'HTML Export'
20 FileExportPlugin.__init__(self)
23 def elem(elemtype,innerHTML='',html_class='',**kwargs):
25 kwargs[
'class']=html_class
26 return "<%s %s>%s</%s>\n" % (elemtype,
' '.
join([
'%s="%s"'%(k,v)
for k,v
in kwargs.items()]),innerHTML,elemtype)
27 def div(innerHTML='',html_class='',**kwargs):
28 return elem(
'div',innerHTML,html_class,**kwargs)
31 def linkInputTag(tag):
33 if isinstance(tag,typ.InputTag):
34 inputtag = tag.pythonValue()
42 for k,v
in pset.items():
43 if isinstance(v,mix._ParameterTypeBase):
44 if isinstance(v,mix._SimpleParameterTypeBase):
46 if isinstance(v,typ.bool):
48 if isinstance(v,typ.double):
50 if isinstance(v,typ.string):
52 if isinstance(v,(typ.int32, typ.uint32, typ.int64, typ.uint64)):
54 pset_items_html+=elem(
'tr',
55 elem(
'td',k,
'param-name')
56 +elem(
'td',v.pythonTypeName(),
'param-class')
57 +elem(
'td',v.pythonValue(),
'param-value-%s'%item_class),
60 if isinstance(v,typ.InputTag):
61 pset_items_html+=elem(
'tr',
62 elem(
'td',k,
'param-name')
63 +elem(
'td',v.pythonTypeName(),
'param-class')
64 +elem(
'td',linkInputTag(v),
'param-value-inputtag'),
67 if isinstance(v,typ.PSet):
69 if len(v.parameters_())==0:
70 pset_items_html+=elem(
'tr',
71 elem(
'td',k,
'param-name')
72 +elem(
'td',v.pythonTypeName(),
'param-class')
73 +elem(
'td',
'(empty)',
'label'),
77 pset_items_html+=elem(
'tr',
78 elem(
'td',k,
'param-name')
79 +elem(
'td',v.pythonTypeName(),
'param-class')
80 +elem(
'td',htmlPSet(v.parameters_())),
83 if isinstance(v,mix._ValidatingListBase):
86 list_html = elem(
'li',
'(empty)',
'label')
88 if isinstance(v,typ.VInputTag):
90 list_html += elem(
'li',linkInputTag(vv),
'param-value-inputtag pset-list-item')
91 elif isinstance(v,typ.VPSet):
93 list_html += elem(
'li',htmlPSet(vv.parameters_()),
'pset-list-item')
96 if isinstance(v,typ.vbool):
98 if isinstance(v,typ.vdouble):
100 if isinstance(v,typ.vstring):
102 if isinstance(v,(typ.vint32,typ.vuint32,typ.vint64,typ.vuint64)):
107 list_html += elem(
'li',vv,
'pset-list-item param-value-%s'%item_class)
108 pset_items_html+=elem(
'tr',
109 elem(
'td',k,
'param-name')
110 +elem(
'td',
'%s[%s]'%(v.pythonTypeName(),len(v)),
'param-class')
111 +elem(
'td',elem(
'ol',list_html,
'pset-list')),
116 return elem(
'table',pset_items_html,
'pset')
119 mod_label_html = div(elem(
'a',data.label(mod),
'title',name=data.label(mod)),
'module_label '+data.type(mod),onClick=
'return toggleModuleVisible(\'%s\')'%(
'mod_%s'%(data.label(mod))))
121 mod_table = elem(
'table',
122 elem(
'tr',elem(
'td',
'Type',
'label')+elem(
'td',data.type(mod)))
123 +elem(
'tr',elem(
'td',
'Class',
'label')+elem(
'td',data.classname(mod))),
126 mod_pset = htmlPSet(mod.parameters_())
128 mod_content_html = div(mod_table+mod_pset,
'module_area',id=
'mod_%s'%data.label(mod))
129 return div(mod_label_html+mod_content_html,
'module',id=
'module_'+data.label(mod))
131 def htmlPathRecursive(p):
132 children = data.children(p)
135 if isinstance(p,sqt.Path):
137 if isinstance(p,sqt.EndPath):
139 seq_label_html = div(seq_name+
' '+elem(
'span',data.label(p),
'title')+
' '+elem(
'span',
'[%s children hidden]'%len(children),
'hidden',id=
'seq_hidden_%s'%data.label(p)),
'sequence_label',onClick=
'return toggleSequenceVisible(\'%s\')'%data.label(p),id=
'seq_label_%s'%data.label(p))
140 seq_inner_content_html =
''.
join([htmlPathRecursive(c)
for c
in children])
141 seq_content_html = div(seq_inner_content_html,
'sequence_area',id=
'seq_%s'%data.label(p))
142 return div(seq_label_html+seq_content_html,
'sequence')
150 filter_html = elem(
'span',
'Filter '+
151 elem(
'input',type=
'text',width=50,onkeyup=
"return doFilter();",id=
'input-filter'),
154 header_html = div(
'Config File Visualisation'+filter_html,
'header')
157 for tlo
in data.children(data.topLevelObjects()[0]):
158 children = data.children(tlo)
160 toplevel[tlo._label]=children
162 if 'paths' in toplevel:
163 for path
in toplevel[
'paths']:
164 path_html += div(htmlPathRecursive(path),
'path')
166 file_html = div(elem(
'span',
'Process:')
167 +elem(
'span',data.process().name_(),
'title')
168 +elem(
'span',data._filename,
'right'),
170 head_html = elem(
'head',elem(
'title',data.process().name_()))
172 toplevel[
'sequences']=[]
174 toplevel[
'modules']=[]
175 for tlo
in data.topLevelObjects():
176 if data.type(tlo)==
'Sequence':
177 toplevel[
'sequences']+=[tlo]
178 if data.type(tlo)==
'Path':
179 toplevel[
'paths']+=[tlo]
180 if data.type(tlo)
in (
'EDAnalyzer',
'EDFilter',
'EDProducer',
'OutputModule'):
181 toplevel[
'modules']+=[tlo]
186 for path
in toplevel[
'paths']:
187 path_html += div(htmlPathRecursive(path),
'path')
188 for sequence
in toplevel[
'sequences']:
189 sequence_html += htmlPathRecursive(sequence)
190 for module
in toplevel[
'modules']:
191 module_html += htmlModule(module)
192 file_html = div(elem(
'span',data._filename,
'right'),
'file')
193 path_html += sequence_html
194 path_html += module_html
195 head_html = elem(
'head',elem(
'title',data._filename))
196 footer_html = div(
'gordon.ball',
'footer')
200 style_html = elem(
'style',
202 .title{font-weight:bold}
204 .header{position:fixed;top:0px;left:0px;width:100%;background:#33cc00;font-weight:bold;font-size:120%}
205 .footer{position:fixed;bottom:0px;left:0px;width:100%;background:#33cc00;text-align:right}
206 .canvas{padding:40px 10px 40px 10px}
207 .file{position:relative;background:#bbb;width:100%;padding-left:5px}
208 .right{position:absolute;right:5px}
209 .sequence{border:1px solid #aaa}
210 .sequence:hover{border 1px solid #00ffff}
211 .sequence_label{background:lightskyblue;padding-left:5px}
212 .sequence_label:hover{background:#fff}
213 .sequence_label_hidden{background:grey;padding-left:5px}
214 .sequence_area{padding:5px 0px 5px 5px}
215 .edproducer{border:1px solid red;background-image:url('edproducer.png');background-position:center left;background-repeat:no-repeat;padding:0px 0px 0px 40px}
216 .edfilter{border:1px solid green;background-image:url('edfilter.png');background-position:center left;background-repeat:no-repeat;padding:0px 0px 0px 40px}
217 .edanalyzer{border:1px solid blue;background-image:url('edanalyzer.png');background-position:center left;background-repeat:no-repeat;padding:0px 0px 0px 40px}
218 .outputmodule{border:1px solid green;background-image:url('outputmodule.png');background-position:center left;background-repeat:no-repeat;padding:0px 0px 0px 40px}
220 .module_label:hover{background:#ccc;position:relative}
221 .module_area{display:none;padding:5px 0px 15px 15px;background:beige}
222 .pset{border-spacing:10px 1px;border:1px solid black}
224 .pset-list{list-style-type:none;margin:0px;padding:2px 2px 2px 2px;border:1px solid grey}
225 .pset-list-item{border-top:1px solid lightgrey;border-bottom:1px solid lightgrey}
226 .param-name{font-weight:bold}
227 .param-class{color:grey}
228 .param-value-int{font-family:courier;color:blue}
229 .param-value-double{font-family:courier;color:purple}
230 .param-value-string{font-family:courier;color:brown}
231 .param-value-bool{font-family:courier;color:#f0f}
232 .param-value-inputtag{font-family:courier;color:red}
233 .param-value-other{font-family:courier}
235 .hidden{display:none}
239 script_html = elem(
'script',
241 function toggleModuleVisible(id) {
242 var elem = document.getElementById(id);
243 if (elem.style.display=='block') {
244 elem.style.display='none';
246 elem.style.display='block';
250 function toggleSequenceVisible(id) {
251 var area_elem = document.getElementById('seq_'+id);
252 var hidden_elem = document.getElementById('seq_hidden_'+id);
253 var label_elem = document.getElementById('seq_label_'+id);
254 if (area_elem.style.display=='none') {
255 area_elem.style.display='block';
256 hidden_elem.style.display='none';
257 label_elem.className = 'sequence_label';
259 area_elem.style.display='none';
260 hidden_elem.style.display='block';
261 label_elem.className = 'sequence_label_hidden';
265 function doFilter() {
266 var text = document.getElementById('input-filter').value;
267 var regex = new RegExp(text);
268 for (var i=0;i<document.all.length;i++) {
269 if (document.all(i).id.substr(0,7)=="module_") {
270 var elem = document.all(i);
271 var elem_name = elem.id.substr(7);
272 if (regex.test(elem_name)) {
273 elem.style.display='block';
275 elem.style.display='none';
281 type=
'text/javascript')
283 body_html = elem(
'body',script_html+header_html+footer_html+div(file_html+path_html,
'canvas'))
285 return elem(
'html',head_html+style_html+body_html)
294 htmlfile = open(filename,
'w')
static std::string join(char **cmd)