CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HTMLExport.py
Go to the documentation of this file.
1 import sys
2 import os.path
3 import logging
4 import random
5 
6 import FWCore.ParameterSet.SequenceTypes as sqt
7 import FWCore.ParameterSet.Config as cms
8 import FWCore.ParameterSet.Modules as mod
9 import FWCore.ParameterSet.Types as typ
10 import FWCore.ParameterSet.Mixins as mix
11 
12 from Vispa.Plugins.ConfigEditor.ConfigDataAccessor import ConfigDataAccessor
13 from FWCore.GuiBrowsers.FileExportPlugin import FileExportPlugin
14 
15 class HTMLExport(FileExportPlugin):
16  options_types={}
17  plugin_name='HTML Export'
18  file_types=('html',)
19  def __init__(self):
20  FileExportPlugin.__init__(self)
21 
22  def produce(self,data):
23  def elem(elemtype,innerHTML='',html_class='',**kwargs):
24  if html_class:
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)
29 
30  def htmlPSet(pset):
31  def linkInputTag(tag):
32  inputtag=''
33  if isinstance(tag,typ.InputTag):
34  inputtag = tag.pythonValue()
35  else:
36  inputtag = tag
37  if len(str(tag))==0:
38  inputtag = '""'
39  return inputtag
40 
41  pset_items_html=''
42  for k,v in pset.items():
43  if isinstance(v,mix._ParameterTypeBase):
44  if isinstance(v,mix._SimpleParameterTypeBase):
45  item_class='other'
46  if isinstance(v,typ.bool):
47  item_class='bool'
48  if isinstance(v,typ.double):
49  item_class='double'
50  if isinstance(v,typ.string):
51  item_class='string'
52  if isinstance(v,(typ.int32, typ.uint32, typ.int64, typ.uint64)):
53  item_class='int'
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),
58  'pset-item'
59  )
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'),
65  'pset-item'
66  )
67  if isinstance(v,typ.PSet):
68  pset_html = ''
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'),
74  'pset-item'
75  )
76  else:
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_())),
81  'pset-item'
82  )
83  if isinstance(v,mix._ValidatingListBase):
84  list_html = ''
85  if len(v)==0:
86  list_html = elem('li','(empty)','label')
87  else:
88  if isinstance(v,typ.VInputTag):
89  for vv in v:
90  list_html += elem('li',linkInputTag(vv),'param-value-inputtag pset-list-item')
91  elif isinstance(v,typ.VPSet):
92  for vv in v:
93  list_html += elem('li',htmlPSet(vv.parameters_()),'pset-list-item')
94  else:
95  item_class='other'
96  if isinstance(v,typ.vbool):
97  item_class='bool'
98  if isinstance(v,typ.vdouble):
99  item_class='double'
100  if isinstance(v,typ.vstring):
101  item_class='string'
102  if isinstance(v,(typ.vint32,typ.vuint32,typ.vint64,typ.vuint64)):
103  item_class='int'
104  for vv in v:
105  if len(str(vv))==0:
106  vv = "''"
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')),
112  'pset-item'
113  )
114 
115 
116  return elem('table',pset_items_html,'pset')
117 
118  def htmlModule(mod):
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))))
120 
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))),
124  'module_table')
125 
126  mod_pset = htmlPSet(mod.parameters_())
127 
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))
130 
131  def htmlPathRecursive(p):
132  children = data.children(p)
133  if children:
134  seq_name='Sequence'
135  if isinstance(p,sqt.Path):
136  seq_name='Path'
137  if isinstance(p,sqt.EndPath):
138  seq_name='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')
143  else:
144  return htmlModule(p)
145 
146  toplevel={}
147 
148 
149 
150  filter_html = elem('span','Filter '+
151  elem('input',type='text',width=50,onkeyup="return doFilter();",id='input-filter'),
152  'right label')
153 
154  header_html = div('Config File Visualisation'+filter_html,'header')
155 
156  if data.process():
157  for tlo in data.children(data.topLevelObjects()[0]):
158  children = data.children(tlo)
159  if children:
160  toplevel[tlo._label]=children
161  path_html=''
162  if 'paths' in toplevel:
163  for path in toplevel['paths']:
164  path_html += div(htmlPathRecursive(path),'path')
165 
166  file_html = div(elem('span','Process:')
167  +elem('span',data.process().name_(),'title')
168  +elem('span',data._filename,'right'),
169  'file')
170  head_html = elem('head',elem('title',data.process().name_()))
171  else:
172  toplevel['sequences']=[]
173  toplevel['paths']=[]
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]
182 
183  path_html = ''
184  sequence_html = ''
185  module_html = ''
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')
197 
198 
199 
200  style_html = elem('style',
201  """
202  .title{font-weight:bold}
203  .label{color:grey}
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}
219  .module{}
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}
223  .pset-item{}
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}
234  .path{}
235  .hidden{display:none}
236  """,
237  type='text/css')
238 
239  script_html = elem('script',
240  """
241  function toggleModuleVisible(id) {
242  var elem = document.getElementById(id);
243  if (elem.style.display=='block') {
244  elem.style.display='none';
245  } else {
246  elem.style.display='block';
247  }
248  }
249 
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';
258  } else {
259  area_elem.style.display='none';
260  hidden_elem.style.display='block';
261  label_elem.className = 'sequence_label_hidden';
262  }
263  }
264 
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';
274  } else {
275  elem.style.display='none';
276  }
277  }
278  }
279  }
280  """,
281  type='text/javascript')
282 
283  body_html = elem('body',script_html+header_html+footer_html+div(file_html+path_html,'canvas'))
284 
285  return elem('html',head_html+style_html+body_html)
286 
287  def export(self,data,filename,filetype):
288  #if not data.process():
289  # raise "HTMLExport requires a cms.Process object"
290 
291  html = self.produce(data)
292 
293  if filetype=='html':
294  htmlfile = open(filename,'w')
295  htmlfile.write(html)
296  htmlfile.close()
static std::string join(char **cmd)
Definition: RemoteFile.cc:18