configurationengine/source/scripts/gen_report_template.html
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
     1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
     1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
     2 <html lang="en">
     2 <html lang="en">
     3 <head>
     3 <head>
       
     4     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
     4     <title>ConE generation report</title>
     5     <title>ConE generation report</title>
     5     <style type="text/css">
     6     <style type="text/css">
     6         body {
     7         body {
     7             font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
     8             font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
     8             font-size: 0.8em;
     9             font-size: 0.8em;
   108             border-style: solid; 
   109             border-style: solid; 
   109             vertical-align: top;
   110             vertical-align: top;
   110             font: Tahoma, Verdana, Arial;
   111             font: Tahoma, Verdana, Arial;
   111             _font-size: 0.8em;
   112             _font-size: 0.8em;
   112         }
   113         }
   113 
   114         div.popup  {
       
   115             background-color: #f9fafd;
       
   116             font: #595a5f Tahoma, Verdana, Arial bold;
       
   117             font-size: 0.8em;
       
   118             border-top: 1px #9d9da1;
       
   119             border-bottom: 1px #9d9da1;
       
   120         }
       
   121         div.floater  {
       
   122             text-align: left; 
       
   123             width: 50%; 
       
   124             float: left;
       
   125         }
       
   126         div.floater-right  {
       
   127             text-align: right; 
       
   128             width: 50%; 
       
   129             float: right;
       
   130         }
       
   131         table.log {
       
   132             word-wrap: break-word;
       
   133             border: 1px #EBEBEB;
       
   134             padding: 5px;
       
   135             border-style: solid; 
       
   136             vertical-align: top;
       
   137             font: #595a5f Tahoma, Verdana, Arial;
       
   138             font-size: 0.8em;
       
   139         }
   114         .currentValue {
   140         .currentValue {
   115             background-color: #e8f2fe;
   141             background-color: #e8f2fe;
   116         }
   142         }
   117     </style>
   143     </style>
       
   144     <script language="javascript" type="text/javascript">
       
   145     //<![CDATA[
       
   146     {% include 'tablefilter.js' without context %}
       
   147     //]]>
       
   148     </script>
       
   149     
       
   150     <script language="javascript" type="text/javascript">
       
   151     //<![CDATA[
       
   152     {% include 'popup.js' without context %}
       
   153     //]]>
       
   154     </script>
       
   155 
   118 </head>
   156 </head>
   119 <body>
   157 <body>
   120 
   158 
   121     <h1>Generation summary:</h1>
   159     <h1>Generation summary:</h1>
   122     <table class="summary">
   160     <table class="summary">
   123      <tr>
   161     <tr>
   124         <th class="featureName" colspan="2">Statistics</th>
   162         <th class="featureName">Statistics</th>
   125      </tr>
   163         {% for report in rep_data -%}
   126      <tr>
   164         <th class="featureName">{{ report.label }}</th>
       
   165         {% endfor -%}
       
   166     </tr>
       
   167     <tr>
   127         <td>Refs in files</td>
   168         <td>Refs in files</td>
   128         <td>{{ rep_data.nbr_of_refs }}</td>
   169         {% for report in rep_data -%}
   129     </tr>
   170         <td>{{ report.context.changed_refs|length }}</td>
   130     <tr>
   171         {% endfor -%}
   131         <td>Refs with no implementation</td>
   172     </tr>
   132         <td>{{ rep_data.nbr_of_refs_noimpl }}</td>
   173     <tr>
   133     </tr>
   174         <td>Not generated Refs</td>
   134     <tr>
   175         {% for report in rep_data -%}
   135         <th class="featureName" colspan="2">Details</th>
   176         <td>{{ report.context.get_refs_with_no_output()|length }}</td>
   136      </tr>
   177         {% endfor -%}
       
   178     </tr>
       
   179     <tr>
       
   180         <th class="featureName" colspan="{{ rep_data|length + 1 }}">Details</th>
       
   181     </tr>
   137     <tr>
   182     <tr>
   138         <td>Report generated</td>
   183         <td>Report generated</td>
   139         <td>{{ rep_data.generation_time }}</td>
   184         {% for report in rep_data -%}
       
   185         <td>{{ report.generation_time }}</td>
       
   186         {% endfor -%}
   140     </tr>
   187     </tr>
   141     <tr>
   188     <tr>
   142         <td>Generation duration</td>
   189         <td>Generation duration</td>
   143         <td>{{ rep_data.duration }}</td>
   190         {% for report in rep_data -%}
       
   191         <td>{{ report.duration }}</td>
       
   192         {% endfor -%}
   144     </tr>
   193     </tr>
   145     <tr>
   194     <tr>
   146         <td>Generation log</td>
   195         <td>Generation log</td>
   147         <td><a href="file:{{ rep_data.cwd|pathname_to_url }}/cone.log">cone.log</a></td>
   196         {% for report in rep_data -%}
   148     </tr>
   197         <td><a href="file:{{ report.context.log_file|pathname_to_url }}">cone log</a></td>
   149     <tr>
   198         {% endfor -%}
   150         <th class="featureName" colspan="2">Generation options</th>
   199     </tr>
       
   200     <tr>
       
   201         <th class="featureName" colspan="{{ rep_data|length + 1 }}">Generation options</th>
   151     </tr>
   202     </tr>
   152     <tr>
   203     <tr>
   153         <td align="left">Layers</td>
   204         <td align="left">Layers</td>
   154         <td align="left">{{ rep_data.options.layers }}</td>
   205         {% for report in rep_data -%}
       
   206         <td align="left">{{ report.options.layers }}</td>
       
   207         {% endfor -%}
   155     </tr>
   208     </tr>
   156     <tr>
   209     <tr>
   157         <td align="left">Added</td>
   210         <td align="left">Added</td>
   158         <td align="left">{{ rep_data.options.added }}</td>
   211         {% for report in rep_data -%}
       
   212         <td align="left">{{ report.options.added }}</td>
       
   213         {% endfor -%}
   159     </tr>
   214     </tr>
   160     <tr>
   215     <tr>
   161         <td align="left">Dryrun</td>
   216         <td align="left">Dryrun</td>
   162         <td align="left">{{ rep_data.options.dryrun }}</td>
   217         {% for report in rep_data -%}
       
   218         <td align="left">{{ report.options.dryrun }}</td>
       
   219         {% endfor -%}
   163     </tr>
   220     </tr>
   164     <tr>
   221     <tr>
   165         <td align="left">Verbose</td>
   222         <td align="left">Verbose</td>
   166         <td align="left">{{ rep_data.options.verbose }}</td>
   223         {% for report in rep_data -%}
       
   224         <td align="left">{{ report.options.verbose }}</td>
       
   225         {% endfor -%}
   167     </tr>
   226     </tr>
   168     <tr>
   227     <tr>
   169         <td align="left">Overrides</td>
   228         <td align="left">Overrides</td>
   170         <td align="left">{{ rep_data.options.overrides }}</td>
   229         {% for report in rep_data -%}
       
   230         <td align="left">{{ report.options.overrides }}</td>
       
   231         {% endfor -%}
   171     </tr>
   232     </tr>
   172     <tr>
   233     <tr>
   173         <td align="left">Project</td>
   234         <td align="left">Project</td>
   174         <td align="left">{{ rep_data.options.project }}</td>
   235         {% for report in rep_data -%}
       
   236         <td align="left">{{ report.options.project }}</td>
       
   237         {% endfor -%}
   175     </tr>
   238     </tr>
   176         <tr>
   239         <tr>
   177         <td align="left">Report</td>
   240         <td align="left">Report</td>
   178         <td align="left">{{ rep_data.options.report }}</td>
   241         {% for report in rep_data -%}
       
   242         <td align="left">{{ report.options.report }}</td>
       
   243         {% endfor -%}
   179     </tr>
   244     </tr>
   180     <tr>
   245     <tr>
   181         <td align="left">Impls</td>
   246         <td align="left">Impls</td>
   182         <td align="left">{{ rep_data.options.impls }}</td>
   247         {% for report in rep_data -%}
       
   248         <td align="left">{{ report.options.impls }}</td>
       
   249         {% endfor -%}
       
   250     </tr>
       
   251     <tr>
       
   252         <td align="left">Tags</td>
       
   253         {% for report in rep_data -%}
       
   254         <td align="left">{{ report.context.tags }}</td>
       
   255         {% endfor -%}
   183     </tr>
   256     </tr>
   184     <tr>
   257     <tr>
   185         <td align="left">Output</td>
   258         <td align="left">Output</td>
   186         <td align="left">{{ rep_data.options.output }}</td>
   259         {% for report in rep_data -%}
       
   260         <td align="left">{{ report.options.output }}</td>
       
   261         {% endfor -%}
   187     </tr>
   262     </tr>
   188     <tr>
   263     <tr>
   189         <td align="left">Configuration</td>
   264         <td align="left">Configuration</td>
   190         <td align="left">{{ rep_data.options.configuration }}</td>
   265         {% for report in rep_data -%}
   191     </tr>
   266         <td align="left">{{ report.options.configuration }}</td>
   192     <tr>
   267         {% endfor -%}
   193         <td align="left">Working directory</td>
       
   194         <td align="left">{{ rep_data.cwd }}</td>
       
   195     </tr>
   268     </tr>
   196     </table>
   269     </table>
   197     
   270     
   198     <h1>Rule execution results:</h1><br>
   271     <h1>Generation Outputs:</h1><br>
       
   272     <p>Predefined filters:<br>
       
   273         <FORM>
       
   274         <INPUT type="button" value="Refs with no implementation" onclick="tf_outputs.SetFilterValue(1,'None');tf_outputs.SetFilterValue(0, '');tf_outputs.SetFilterValue(2, '');tf_outputs.Filter();return false;" name="Refs with no implementation"">
       
   275         <br>
       
   276         <INPUT type="button" value="Refs with not output" onclick="tf_outputs.SetFilterValue(2, 'None');tf_outputs.SetFilterValue(0, '');tf_outputs.SetFilterValue(1, '');tf_outputs.Filter();return false;" name="Refs with not output">
       
   277         </FORM>
       
   278     </p>
       
   279     <table class="report" id="outputs">
       
   280     <tr>
       
   281         <th class="featureName">Settings</th>
       
   282         <th class="featureName">Impl. file</th>
       
   283         <th class="featureName">Outputs</th>
       
   284     </tr>
       
   285 
       
   286     {% macro popup_link(source, linkid, linkname) -%}
       
   287         {% if 'all' in report_options %}
       
   288             <a href="#" onclick="Showpopup({{source}}, '{{linkid}}');return false;">{{ linkname }}</a>
       
   289         {% else %}
       
   290            {{ linkname }}
       
   291         {% endif %}
       
   292     {%- endmacro %}
       
   293 
       
   294     {% macro get_report_colums(reports_list, report_elem) -%}        
       
   295     {%- endmacro %}
       
   296 
       
   297     <!-- process the output files -->    
       
   298     {% for out in merged_context.get_output() %}
       
   299     <tr>
       
   300         <td>
       
   301             {%- if out.implementation.get_refs() %}
       
   302                 {%- for ref in out.implementation.get_refs() %}
       
   303                    {%- if ref in merged_context.changed_refs %}                  
       
   304                      {%- if ref in merged_context.temp_features %}
       
   305                        <i>{{ popup_link('this', ref+'.apidiv',ref) }}</i><br>
       
   306                      {%- else %}
       
   307                        <B>{{ popup_link('this', ref+'.apidiv', ref) }}</B><br>
       
   308                      {%- endif %}
       
   309                    {%- else %}
       
   310                      {{ ref }}<br>
       
   311                    {%- endif %}
       
   312                 {%- endfor %}
       
   313             {%- endif %}
       
   314         </td>
       
   315         <td>
       
   316           {%- if out.type == 'ref' %}
       
   317             Rule: 
       
   318           {%- elif out.type == 'exception'  %}
       
   319             Exception: 
       
   320           {%- endif  %}
       
   321           {{ popup_link('this',out.implementation.ref|replace("/", ".") +':'+out.implementation.lineno|string+'.impldiv',out.implementation.ref+':'+out.implementation.lineno|string) }}
       
   322         </td>
       
   323         <td>
       
   324         {%- if out.name != None and out.type != 'exception' %}
       
   325         {{ popup_link('this',out.name|replace("/", ".")|replace("\\", ".")+'.output',out.name) }}
       
   326         {%- else %}
       
   327             <span class="red">None</span><br>
       
   328         {%- endif %}
       
   329         </td>
       
   330     </tr>
       
   331     {%- endfor %}
       
   332             
       
   333     <!-- process the refs with no output -->    
       
   334     {%- for ref in merged_context.get_refs_with_no_output(merged_context.get_changed_refs(operation='intersection',ignore_temps=True)) %}
       
   335     <tr>
       
   336         <td>
       
   337           <B>
       
   338             {{ popup_link('this',ref+'.apidiv',ref) }}
       
   339           </B><br>
       
   340         </td>
       
   341         <td>
       
   342           {%- if merged_context.impl_set.get_implementations_with_ref(ref) %}    
       
   343               {%- for impl in merged_context.impl_set.get_implementations_with_ref(ref) %}
       
   344                 {{ popup_link('this',impl.ref|replace("/", ".")|replace("\\", ".")+'.impldiv',impl.ref) }}
       
   345               {%- endfor %}
       
   346           {%- else %}
       
   347             <span class="red">None</span><br>           
       
   348           {%- endif %}
       
   349         </td>
       
   350         <td>
       
   351             <span class="red">None</span><br> 
       
   352         </td>
       
   353     </tr>
       
   354     {%- endfor %}
       
   355 
       
   356     </table>
       
   357         
       
   358     <!-- Create extra data divs only when debug is on -->        
       
   359     {% if 'all' in report_options %}
       
   360         <!-- Create data divs for feature ref elements -->
       
   361         {%- for feat in merged_context.features.get_features(merged_context.changed_refs) %}
       
   362             <div id="{{ feat.fqr|replace("/", ".")  }}.apidiv" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;">
       
   363                 <table class="report">
       
   364                 <tr><td>
       
   365                     <div class="floater"><b>Ref:</b>{{ feat.fqr }}</div> 
       
   366                     <div class="floater-right"><a href="#" onclick="Popup.hide('{{ feat.fqr }}.apidiv');return false;">Close</a></div>
       
   367                 </td></tr>
       
   368                 <tr><td>
       
   369                     <div>
       
   370                         <b>Name: </b>{{ feat.name }}<br>
       
   371                         <b>Type: </b>{{ feat.type }}<br>
       
   372                         <b>ConfML: </b><a href="file:{{ rep_data[0].project_dir|pathname_to_url }}/{{ feat.get_proxied_obj().get_configuration_path()|pathname_to_url }}">{{ feat.get_proxied_obj().get_configuration_path() }}</a>
       
   373                     </div>
       
   374                 </tr></td>
       
   375                 </table>
       
   376                 <b>Data: </b>
       
   377                 <table class="report">
       
   378                 {%- if feat.is_sequence_root() %}
       
   379                     <tr>
       
   380                       {%- for columnfea in feat.get_column_features() %}
       
   381                       <th class="th.header">{{ columnfea.ref }}</th>
       
   382                       {%- endfor %}
       
   383                     </tr>
       
   384                     {%- for row in feat.get_value() %}
       
   385                        <tr>
       
   386                         {%- for col in row %}
       
   387                             <td>{{ col|e|xml_charref_replace  }}</td>
       
   388                         {%- endfor %}
       
   389                        </tr>
       
   390                     {%- endfor %}
       
   391                 {%- else %}
       
   392                     {%- for data in feat.get_datas() %}
       
   393                         {% if loop.first %}
       
   394                             <tr>
       
   395                                 <th class="th.header">Layer</th>
       
   396                                 <th class="th.header">Value</th>
       
   397                             </tr>
       
   398                         {% endif -%}    
       
   399                         {% if not data.template %}
       
   400                             <tr>
       
   401                                 <td><a href="file:{{ rep_data[0].project_dir|pathname_to_url }}/{{ data.get_configuration_path()|pathname_to_url }}">{{ data.get_configuration_path() }}</a></td>
       
   402                                 <td>{{ data.get_value()|e|xml_charref_replace  }}</td>
       
   403                             </tr>
       
   404                         {% endif -%}
       
   405                     {% endfor %}
       
   406                 {% endif -%}
       
   407                 </table>
       
   408             </div>
       
   409         {%- endfor %}
   199     
   410     
   200     <table class="report">
   411         <!-- Create data divs for generation output elements -->
   201         <tr>
   412         {% for output in merged_context.outputs.values() %}
   202             <th class="featureName">File</th>
   413             <div id="{{ output.name|replace("/", ".")|replace("\\", ".") }}.output" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;">
   203             <th class="featureName">Rule No.</th>
   414                 <table class="report">
   204             <th class="featureName">Input refs</th>
   415                 <tr><td>
   205             <th class="featureName">Affected refs</th>
   416                     <div class="floater"><b>Ref:</b>{{ output.name }}</div> 
   206         </tr>
   417                     <div class="floater-right"><a href="#" onclick="Popup.hide('{{ output.name|replace("/", ".")|replace("\\", ".") }}.output');return false;">Close</a></div>
   207         
   418                 </td></tr>
   208         {% for result in rep_data.rule_exec_results %}
   419                 <tr><td>
   209         {#- Report only rule executions that affected something #}
   420                     <div>
   210         {%- if result.affected_refs|length > 0 %}
   421                         <b>Implml: </b>{{ output.implementation }}<br>
   211         <tr>
   422                         <b>Type: </b>{{ output.type }}<br>
   212             <a name="rule:{{result.source}}:{{result.index}}"/>
   423                         {% if output.type == 'file' %}
   213             <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ result.source|pathname_to_url }}">{{ result.source }}</a></td>
   424                         <b>File: </b><a href="file:{{ output.abspath|pathname_to_url }}">{{ output.name }}</a><br>
   214             <td>{{result.index}}</td>
   425                         {% elif output.type == 'ref' %}
   215             <td>
   426                         <b>Target ref: </b>{{ output.name }} <a href="#" onclick="tf_outputs.SetFilterValue(0, '{{output.name}}');tf_outputs.SetFilterValue(1, '');tf_outputs.SetFilterValue(2, '');tf_outputs.Filter();return false;">filter</a><br>
   216             {%- for ref in result.input_refs -%}
   427                         {% elif output.type == 'exception' %}
   217                 {{ref}}<br/>
   428                         <b>Exception: </b>{{ output.exception }}<br>
   218             {% endfor %}
   429                         {% endif %}
   219             </td>
   430                         <b>Related log entries: </b><br>
   220             <td>
   431                         <table class="log">
   221             {%- for ref in result.affected_refs -%}
   432                         {% for log in merged_context.grep_log(output.filename) -%}
   222                 {{ref}}<br/>
   433                         <tr><td>{{ log[0] }}</td><td>{{ log[1] }}</td></tr>
   223             {% endfor %}
   434                         {% endfor -%}
   224             </td>
   435                         </table>
   225         </tr>
   436                     </div>
   226         {% endif -%}
   437                 </tr></td>
       
   438                 </table>
       
   439             </div>
       
   440         {% endfor %}
       
   441     
       
   442         <!-- Create data divs for generation specific implementation elements -->
       
   443         {% for output in merged_context.outputs.values() %}
       
   444             <div id="{{ output.implementation.ref|replace("/", ".") }}:{{ output.implementation.lineno }}.impldiv" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;">
       
   445                 <table class="report">
       
   446                 <tr><td>
       
   447                     <div class="floater"><b>Ref:</b>{{ output.name }}</div> 
       
   448                     <div class="floater-right"><a href="#" onclick="Popup.hide('{{ output.implementation.ref|replace("/", ".") }}:{{ output.implementation.lineno }}.impldiv');return false;">Close</a></div>
       
   449                 </td></tr>
       
   450                 <tr><td>
       
   451                     <div>
       
   452                         <b>Implml: </b>{{ output.implementation }}<br>
       
   453                         <b>Type: </b>{{ output.implementation.__class__.__name__ }}<br>
       
   454                         <b>File: </b><a href="file:{{ [rep_data[0].project_dir,output.implementation.ref]|join('/')|pathname_to_url }}">{{ output.implementation.ref }}</a><br>
       
   455                         <b>Line: </b>{{output.implementation.lineno}}<br>
       
   456                         {% if output.type == 'exception' %}
       
   457                         <b>Exception: </b>{{ output.exception }}<br>
       
   458                         {% endif %}
       
   459                         <b>Related log entries: </b><br>
       
   460                         <table class="log">
       
   461                         {% for log in merged_context.grep_log(output.implementation.ref) -%}
       
   462                         <tr><td>{{ log[0] }}</td><td>{{ log[1] }}</td></tr>
       
   463                         {% endfor -%}
       
   464                         </table>
       
   465                     </div>
       
   466                 </tr></td>
       
   467                 </table>
       
   468             </div>
   227         {% endfor %}
   469         {% endfor %}
   228         
   470         
   229     </table>
   471         <!-- Create data divs for implementation elements -->
       
   472         {% for impl in merged_context.impl_dict.values() %}
       
   473             <div id="{{ impl.ref|replace("/", ".")|replace("\\", ".") }}.impldiv" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;">
       
   474                 <table class="report">
       
   475                 <tr><td>
       
   476                     <div class="floater"><b>Ref:</b>{{ impl.ref|replace("/", ".")|replace("\\", ".") }}}</div> 
       
   477                     <div class="floater-right"><a href="#" onclick="Popup.hide('{{ impl.ref|replace("/", ".")|replace("\\", ".") }}.impldiv');return false;">Close</a></div>
       
   478                 </td></tr>
       
   479                 <tr><td>
       
   480                     <div>
       
   481                         <b>Implml: </b><a href="file:{{ [rep_data[0].project_dir,impl.ref]|join('/')|pathname_to_url }}">{{ impl.ref }}</a><br>
       
   482                         <b>Type: </b>{{ impl.__class__.__name__ }}<br>
       
   483                         <b>Related log entries: </b><br>
       
   484                         <table class="log">
       
   485                         {% for log in merged_context.grep_log(impl.ref) -%}
       
   486                         <tr><td>{{ log[0] }}</td><td>{{ log[1] }}</td></tr>
       
   487                         {% endfor -%}
       
   488                         </table>
   230     
   489     
   231     
   490                     </div>
   232     <h1>Output files:</h1><br>
   491                 </tr></td>
   233     
   492                 </table>
   234     <table class="report">
   493             </div>
   235     <tr>
   494         {% endfor %}
   236         <th class="featureName">API</th>
   495     {% endif %} <!-- verbose 3 -->
   237         <th class="featureName">Data</th>
   496         
   238         <th class="featureName">Impl. file</th>
   497     <script language="javascript" type="text/javascript">
   239         <th class="featureName">Impl. type</th>
   498         //<![CDATA[
   240         <th class="featureName">Generated for</th>
   499              var output_Props =  {  
   241         <th class="featureName">Output files</th>
   500                      paging: false,
   242     </tr>
   501                      highlight_keywords: true,                      
   243     {% for feat in rep_data.lines %}
   502                      rows_counter: true,  
   244     
   503                      rows_counter_text: "Rows:",  
   245         <tr>
   504                      btn_reset: true,  
   246             <td align="left" rowspan={{ feat.nbr_impls }}>
   505                      loader: true,  
   247                 {% if feat.is_temp_feature -%}
   506                      loader_text: "Filtering data..."  
   248                 <b><i>{{ feat.ref }}</i></b><br>
   507                  }; 
   249                 {%- else -%}
   508             setFilterGrid("outputs", output_Props);
   250                 <b>{{ feat.ref }}</b><br>
       
   251                 {%- endif %}
       
   252                 <b>Name: </b>{{ feat.feat_name }}<br>
       
   253                 <b>Type: </b>{{ feat.feat_type }}<br>
       
   254                 <b>ConfML: </b><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ feat.config_path|pathname_to_url }}">{{ feat.config_path }}</a>
       
   255             </td>
       
   256             <td align="left" rowspan={{ feat.nbr_impls }}>
       
   257             <table class="report">
       
   258             
   509             
   259             {% for data in feat.datas %}
   510             function Showpopup(item_over, popup_ref)
   260                 {% if loop.first %}
   511             {
   261                     <tr>
   512                 Popup.show(popup_ref, item_over,'top left', {'offsetTop':20});
   262                         <th class="th.header">Layer</th>
   513             } 
   263                         <th class="th.header">Value</th>
   514         //]]>
   264                     </tr>
   515     </script>
   265                     <tr>
   516 
   266                         <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
       
   267                         <td>{{ data.value|e|xml_charref_replace }}</td>
       
   268                     </tr>
       
   269                 {% else %}
       
   270                     <tr>
       
   271                         <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
       
   272                         <td>{{ data.value|e|xml_charref_replace  }}</td>
       
   273                     </tr>
       
   274                 {% endif %}
       
   275             {% endfor %}
       
   276             </table>
       
   277 
       
   278             <table class="report">
       
   279                 {% for data in feat.seq_data %}
       
   280                     {% if loop.first %}
       
   281                         <tr>
       
   282                             <th class="th.header">Setting</th>
       
   283                             <th class="th.header">Value</th>
       
   284                         </tr>
       
   285                         <tr>
       
   286                             <td><b>{{ data[0]|e|xml_charref_replace }}</b></td>
       
   287                             <td>
       
   288                                 {% for value in data[1] %}
       
   289                                     {{ value|e|xml_charref_replace }}<br>
       
   290                                 {% endfor %}
       
   291                             </td>
       
   292                         </tr>
       
   293                     {% else %}
       
   294                         <tr>
       
   295                             <td><b>{{ data[0]|e|xml_charref_replace }}</b></td>
       
   296                             <td>
       
   297                                 {% for value in data[1] %}
       
   298                                     {{ value|e|xml_charref_replace }}<br>
       
   299                                 {% endfor %}
       
   300                             </td>
       
   301                         </tr>
       
   302                     {% endif %}
       
   303                 {% endfor %}
       
   304             </table>
       
   305             
       
   306             {% for impl in feat.impls %}
       
   307                 {% if loop.first %}
       
   308                     <td align="left">
       
   309                         <a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ impl.name|pathname_to_url }}">{{ impl.name }}</a>
       
   310                     </td>
       
   311                     <td align="left">
       
   312                         {{ impl.type }}
       
   313                     </td>
       
   314                     <td align="left">
       
   315                         {{ ', '.join(impl.generation_runs) }}
       
   316                     </td>
       
   317                     <td align="left">
       
   318                         {% for output in impl.outputfiles -%}
       
   319                             {% if output.exists %}
       
   320                                 <a href="file:{{ output.abs_filename|pathname_to_url }}">{{ output.filename }}</a><br>
       
   321                             {% else %}
       
   322                                 <span class="red">{{ output.filename }}</span><br>
       
   323                             {% endif %}
       
   324                         {%- endfor %}
       
   325                     </td>
       
   326                 {% else %}
       
   327                     <tr>
       
   328                     <td align="left">
       
   329                         <a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ impl.name|pathname_to_url }}">{{ impl.name }}</a>
       
   330                     </td>
       
   331                     <td align="left">
       
   332                         {{ impl.type }}
       
   333                     </td>
       
   334                     <td align="left">
       
   335                         {{ ', '.join(impl.generation_runs) }}
       
   336                     </td>
       
   337                     <td align="left">
       
   338                         {% for output in impl.outputfiles %}
       
   339                             {% if output.exists %}
       
   340                                 <a href="file:{{ output.abs_filename|pathname_to_url }}">{{ output.filename }}</a><br>
       
   341                             {% else %}
       
   342                                 <span class="red">{{ output.filename }}</span><br>
       
   343                             {% endif %}
       
   344                         {% endfor %}
       
   345                     </td>
       
   346                     </tr>
       
   347                 {% endif %}
       
   348                 
       
   349             {% endfor %}
       
   350         </tr>
       
   351     {% endfor %}    
       
   352     </table>
       
   353 
       
   354     <h1>Refs with no implementation:</h1><br>
       
   355     
       
   356     <table class="report">
       
   357     <tr>
       
   358         <th class="featureName">API</th>
       
   359         <th class="featureName">Data</th>
       
   360     </tr>
       
   361     {% for feat in rep_data.ref_noimpl %}
       
   362         <tr>
       
   363             <td align="left" >
       
   364                 {% if feat.is_temp_feature -%}
       
   365                 <b><i>{{ feat.ref }}</i></b><br>
       
   366                 {%- else -%}
       
   367                 <b>{{ feat.ref }}</b><br>
       
   368                 {%- endif %}
       
   369                 <b>Name: </b>{{ feat.feat_name|e|xml_charref_replace }}<br>
       
   370                 <b>Type: </b>{{ feat.feat_type|e|xml_charref_replace }}<br>
       
   371                 <b>ConfML: </b><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ feat.config_path|pathname_to_url }}">{{ feat.config_path }}</a>
       
   372             </td>
       
   373             <td align="left">
       
   374             <table class="report">
       
   375             
       
   376             {% for data in feat.datas %}
       
   377                 {% if loop.first %}
       
   378                     <tr>
       
   379                         <th class="th.header">Layer</th>
       
   380                         <th class="th.header">Value</th>
       
   381                     </tr>
       
   382                     <tr>
       
   383                         <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
       
   384                         <td>{{ data.value|e|xml_charref_replace }}</td>
       
   385                     </tr>
       
   386                 {% else %}
       
   387                     <tr>
       
   388                         <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
       
   389                         <td>{{ data.value|e|xml_charref_replace }}</td>
       
   390                     </tr>
       
   391                 {% endif %}
       
   392             {% endfor %}
       
   393             </table>
       
   394             
       
   395             <table class="report">
       
   396                 {% for data in feat.seq_data %}
       
   397                     {% if loop.first %}
       
   398                         <tr>
       
   399                             <th class="th.header">Setting</th>
       
   400                             <th class="th.header">Value</th>
       
   401                         </tr>
       
   402                         <tr>
       
   403                             <td><b>{{ data[0] }}</b></td>
       
   404                             <td>
       
   405                                 {% for value in data[1] %}
       
   406                                     {{ value|e|xml_charref_replace }}<br>
       
   407                                 {% endfor %}
       
   408                             </td>
       
   409                         </tr>
       
   410                     {% else %}
       
   411                         <tr>
       
   412                             <td><b>{{ data[0] }}</b></td>
       
   413                             <td>
       
   414                                 {% for value in data[1] %}
       
   415                                     {{ value|e|xml_charref_replace }}<br>
       
   416                                 {% endfor %}
       
   417                             </td>
       
   418                         </tr>
       
   419                     {% endif %}
       
   420                 {% endfor %}
       
   421             </table>
       
   422         </tr>
       
   423     {% endfor %}    
       
   424     </table>
       
   425     <h1>Not generated output files:</h1><br>
       
   426     
       
   427     <table class="report">
       
   428     <tr>
       
   429         <th class="featureName">Output file</th>
       
   430     </tr>
       
   431     {% for file in rep_data.missing_output_files %}
       
   432         <tr>
       
   433             <td align="left" >
       
   434                 {{ file.filename }}
       
   435             </td>
       
   436     {% endfor %}
       
   437     </table>
       
   438     
   517     
   439 </body>
   518 </body>
   440 </html>
   519 </html>