|
|
@@ -0,0 +1,367 @@ |
|
|
|
<?xml version="1.0"?> |
|
|
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" |
|
|
|
xmlns:lxslt="http://xml.apache.org/xslt" |
|
|
|
xmlns:redirect="http://xml.apache.org/xalan/redirect" |
|
|
|
extension-element-prefixes="redirect"> |
|
|
|
|
|
|
|
<!-- |
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more |
|
|
|
contributor license agreements. See the NOTICE file distributed with |
|
|
|
this work for additional information regarding copyright ownership. |
|
|
|
The ASF licenses this file to You under the Apache License, Version 2.0 |
|
|
|
(the "License"); you may not use this file except in compliance with |
|
|
|
the License. You may obtain a copy of the License at |
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software |
|
|
|
distributed under the License is distributed on an "AS IS" BASIS, |
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
|
|
See the License for the specific language governing permissions and |
|
|
|
limitations under the License. |
|
|
|
--> |
|
|
|
|
|
|
|
<xsl:output method="html" indent="yes" encoding="US-ASCII"/> |
|
|
|
<xsl:decimal-format decimal-separator="." grouping-separator="," /> |
|
|
|
|
|
|
|
<xsl:param name="output.dir" select="'.'"/> |
|
|
|
<xsl:param name="basedir" select="'.'"/> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Matches the root element of the data and starts the generation. |
|
|
|
--> |
|
|
|
<xsl:template match="checkstyle"> |
|
|
|
<!-- create the sorted.html with the data --> |
|
|
|
<redirect:write file="{$output.dir}/sorted.html"> |
|
|
|
<xsl:call-template name="sorted.html"/> |
|
|
|
</redirect:write> |
|
|
|
|
|
|
|
<!-- create the stylesheet.css with layout --> |
|
|
|
<redirect:write file="{$output.dir}/sorted.css"> |
|
|
|
<xsl:call-template name="sorted.css"/> |
|
|
|
</redirect:write> |
|
|
|
|
|
|
|
<!-- create the switch.js for collepsing the data --> |
|
|
|
<redirect:write file="{$output.dir}/switch.js"> |
|
|
|
<xsl:call-template name="switch.js"/> |
|
|
|
</redirect:write> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the HTML page with the data. |
|
|
|
--> |
|
|
|
<xsl:template name="sorted.html"> |
|
|
|
<html> |
|
|
|
<head> |
|
|
|
<title>CheckStyle Audit</title> |
|
|
|
<script language="JavaScript" src="switch.js" type="text/javascript"></script> |
|
|
|
<link rel="stylesheet" type="text/css" href="sorted.css"/> |
|
|
|
</head> |
|
|
|
<body onload="javascript:openFirst();"> |
|
|
|
<h1>CheckStyle Audit</h1> |
|
|
|
<p>Designed for use with |
|
|
|
<a href='http://checkstyle.sourceforge.net/'>CheckStyle</a> and |
|
|
|
<a href='http://ant.apache.org/'>Ant</a>. |
|
|
|
</p> |
|
|
|
<xsl:apply-templates select="." mode="navigation"/> |
|
|
|
<xsl:apply-templates select="." mode="data"/> |
|
|
|
</body> |
|
|
|
</html> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Key for detecting duplicate CheckModules |
|
|
|
--> |
|
|
|
<xsl:key name="module" match="file/error" use="@source"/> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the navagation bar. |
|
|
|
--> |
|
|
|
<xsl:template match="checkstyle" mode="navigation"> |
|
|
|
<ul id="navigation"> |
|
|
|
<xsl:for-each select="file/error[generate-id() = generate-id(key('module',@source))]"> |
|
|
|
<xsl:sort select="@source"/> |
|
|
|
<xsl:variable name="last-index"> |
|
|
|
<xsl:call-template name="last-index-of"> |
|
|
|
<xsl:with-param name="txt" select="@source"/> |
|
|
|
<xsl:with-param name="delimiter" select="'.'"></xsl:with-param> |
|
|
|
</xsl:call-template> |
|
|
|
</xsl:variable> |
|
|
|
<li><a href="javascript:change('{@source}');"> |
|
|
|
<xsl:value-of select="substring(@source, $last-index+1)"/> |
|
|
|
</a></li> |
|
|
|
</xsl:for-each> |
|
|
|
</ul> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the data part. |
|
|
|
--> |
|
|
|
<xsl:template match="checkstyle" mode="data"> |
|
|
|
<div id="content"> |
|
|
|
<xsl:for-each select="file/error[generate-id() = generate-id(key('module',@source))]"> |
|
|
|
<xsl:sort select="@source"/> |
|
|
|
<div class="hideable" id="{@source}"> |
|
|
|
<xsl:variable name="module" select="@source"/> |
|
|
|
<h2><xsl:value-of select="@source"/></h2> |
|
|
|
<xsl:call-template name="data"> |
|
|
|
<xsl:with-param name="filter" select="$module"/> |
|
|
|
</xsl:call-template> |
|
|
|
</div> |
|
|
|
</xsl:for-each> |
|
|
|
</div> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the content table for the given check module. |
|
|
|
@param filter full qualified module name |
|
|
|
--> |
|
|
|
<xsl:template name="data"> |
|
|
|
<xsl:param name="filter"/> |
|
|
|
|
|
|
|
<table> |
|
|
|
<tr> |
|
|
|
<th>file</th> |
|
|
|
<th>line</th> |
|
|
|
<th>severity</th> |
|
|
|
<th>message</th> |
|
|
|
</tr> |
|
|
|
<xsl:for-each select="/checkstyle/file"> |
|
|
|
<xsl:choose> |
|
|
|
<xsl:when test="error/@source=$filter"> |
|
|
|
<xsl:call-template name="data-rows"> |
|
|
|
<xsl:with-param name="node" select="."/> |
|
|
|
<xsl:with-param name="filter" select="$filter"/> |
|
|
|
</xsl:call-template> |
|
|
|
</xsl:when> |
|
|
|
</xsl:choose> |
|
|
|
</xsl:for-each> |
|
|
|
</table> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the data rows for the current check module. |
|
|
|
Ignores errors in the current file from other modules. |
|
|
|
@param node the file with the errors |
|
|
|
@param filter full qualified module name |
|
|
|
--> |
|
|
|
<xsl:template name="data-rows"> |
|
|
|
<xsl:param name="node"/> |
|
|
|
<xsl:param name="filter"/> |
|
|
|
|
|
|
|
<xsl:for-each select="$node/error"> |
|
|
|
<xsl:choose> |
|
|
|
<xsl:when test="@source=$filter"> |
|
|
|
<tr> |
|
|
|
<!-- Hide the basdir. First char of the result is a path separator so remove that. --> |
|
|
|
<td><xsl:value-of select="substring(substring-after($node/@name, $basedir),2)"/></td> |
|
|
|
<td><xsl:value-of select="@line"/></td> |
|
|
|
<td><xsl:value-of select="@severity"/></td> |
|
|
|
<td><xsl:value-of select="@message"/></td> |
|
|
|
</tr> |
|
|
|
</xsl:when> |
|
|
|
</xsl:choose> |
|
|
|
</xsl:for-each> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the CSS with the layout instructions. |
|
|
|
Generated so this XSL is the single source of the whole report. |
|
|
|
--> |
|
|
|
<xsl:template name="sorted.css"> |
|
|
|
body { |
|
|
|
font:normal 80% arial,helvetica,sanserif; |
|
|
|
color: black; |
|
|
|
background-color: white; |
|
|
|
margin: 0; |
|
|
|
padding: 1em; |
|
|
|
min-width: 41em; |
|
|
|
} |
|
|
|
h1 { |
|
|
|
font-weight:bold; |
|
|
|
font-size:140%; |
|
|
|
margin: 0 0 0.7em; |
|
|
|
padding: 0.3em; |
|
|
|
text-align: center; |
|
|
|
background-color: #eee; |
|
|
|
border: 2px ridge silver; |
|
|
|
} |
|
|
|
html<xsl:text disable-output-escaping="yes">></xsl:text>body h1 { |
|
|
|
border-color: gray; |
|
|
|
} |
|
|
|
|
|
|
|
ul#navigation { |
|
|
|
font-size: 0.83em; |
|
|
|
float: left; width: 18em; |
|
|
|
margin: 0 0 1.2em; padding: 0; |
|
|
|
border: 1px dashed silver; |
|
|
|
} |
|
|
|
ul#navigation li { |
|
|
|
list-style: none; |
|
|
|
margin: 0; padding: 0.2em; |
|
|
|
} |
|
|
|
ul#navigation a { |
|
|
|
display: block; |
|
|
|
padding: 0.2em; |
|
|
|
font-weight: bold; |
|
|
|
} |
|
|
|
ul#navigation a:link { |
|
|
|
color: black; background-color: #eee; |
|
|
|
} |
|
|
|
ul#navigation a:visited { |
|
|
|
color: #666; background-color: #eee; |
|
|
|
} |
|
|
|
ul#navigation a:hover { |
|
|
|
color: red; background-color: white; |
|
|
|
} |
|
|
|
ul#navigation a:active { |
|
|
|
color: white; background-color: gray; |
|
|
|
} |
|
|
|
|
|
|
|
div#content { |
|
|
|
margin: 0 1em 1em 16em; |
|
|
|
padding: 0 1em; |
|
|
|
} |
|
|
|
* html div#content { |
|
|
|
height: 1em; /* Workaround 3-Pixel-Bug of Internet Explorers */ |
|
|
|
} |
|
|
|
div#content h2 { |
|
|
|
font-size:100%; |
|
|
|
font-weight:bold; |
|
|
|
background: #525D76; |
|
|
|
color: white; |
|
|
|
text-decoration: none; |
|
|
|
padding: 5px; |
|
|
|
margin-right: 2px; |
|
|
|
margin-left: 2px; |
|
|
|
margin-bottom: 0; |
|
|
|
} |
|
|
|
div#content p { |
|
|
|
font-size: 1em; |
|
|
|
margin: 1em 0; |
|
|
|
} |
|
|
|
table { |
|
|
|
width:100%; |
|
|
|
border-collapse:collapse; |
|
|
|
} |
|
|
|
table td, table th { |
|
|
|
border:1px solid #000; |
|
|
|
padding:3px 7px 2px 7px; |
|
|
|
} |
|
|
|
table th { |
|
|
|
font-weight:bold; |
|
|
|
background: #ccc; |
|
|
|
color: black; |
|
|
|
} |
|
|
|
table tr:nth-child(odd) td { |
|
|
|
background: #efefef; |
|
|
|
} |
|
|
|
table tr:nth-child(even) td { |
|
|
|
background: #fff; |
|
|
|
} |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Generates the JavaScript for the dynamic style. |
|
|
|
Generated so this XSL is the single source of the whole report. |
|
|
|
--> |
|
|
|
<xsl:template name="switch.js"> |
|
|
|
/* |
|
|
|
* Hides all "hideable" div-containers |
|
|
|
*/ |
|
|
|
function hideAll() { |
|
|
|
allElements = document.getElementsByTagName("div"); |
|
|
|
for (i = 0; i <xsl:text disable-output-escaping="yes"><</xsl:text> allElements.length; i++) { |
|
|
|
if (allElements[i].className=="hideable") { |
|
|
|
allElements[i].style.display="none"; |
|
|
|
} |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* Shows one div-container and hides the other. |
|
|
|
* @param id id of the element to show |
|
|
|
*/ |
|
|
|
function change(id) { |
|
|
|
hideAll(); |
|
|
|
e = document.getElementById(id); |
|
|
|
if (e.style.display=="none") { |
|
|
|
e.style.display=""; |
|
|
|
} |
|
|
|
window.scrollTo(0, 0); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* Shows only the first data row. |
|
|
|
* Used in body:onload so the user could directly see some messages. |
|
|
|
*/ |
|
|
|
function openFirst() { |
|
|
|
hideAll(); |
|
|
|
for (i = 0; i <xsl:text disable-output-escaping="yes"><</xsl:text> allElements.length; i++) { |
|
|
|
if (allElements[i].className=="hideable") { |
|
|
|
allElements[i].style.display=""; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- |
|
|
|
Calculates the index of the last occurence of a substring in a string. |
|
|
|
@param txt the whole string in which to search |
|
|
|
@delimiter the substring to search |
|
|
|
--> |
|
|
|
<xsl:template name="last-index-of"> |
|
|
|
<xsl:param name="txt"/> |
|
|
|
<xsl:param name="remainder" select="$txt"/> |
|
|
|
<xsl:param name="delimiter" select="' '"/> |
|
|
|
|
|
|
|
<xsl:choose> |
|
|
|
<xsl:when test="contains($remainder, $delimiter)"> |
|
|
|
<xsl:call-template name="last-index-of"> |
|
|
|
<xsl:with-param name="txt" select="$txt"/> |
|
|
|
<xsl:with-param name="remainder" select="substring-after($remainder, $delimiter)"/> |
|
|
|
<xsl:with-param name="delimiter" select="$delimiter"/> |
|
|
|
</xsl:call-template> |
|
|
|
</xsl:when> |
|
|
|
<xsl:otherwise> |
|
|
|
<xsl:variable name="lastIndex" select="string-length(substring($txt, 1, string-length($txt)-string-length($remainder)))+1"/> |
|
|
|
<xsl:choose> |
|
|
|
<xsl:when test="string-length($remainder)=0"> |
|
|
|
<xsl:value-of select="string-length($txt)"/> |
|
|
|
</xsl:when> |
|
|
|
<xsl:when test="$lastIndex>0"> |
|
|
|
<xsl:value-of select="($lastIndex - string-length($delimiter))"/> |
|
|
|
</xsl:when> |
|
|
|
<xsl:otherwise> |
|
|
|
<xsl:value-of select="0"/> |
|
|
|
</xsl:otherwise> |
|
|
|
</xsl:choose> |
|
|
|
</xsl:otherwise> |
|
|
|
</xsl:choose> |
|
|
|
</xsl:template> |
|
|
|
|
|
|
|
</xsl:stylesheet> |