diff src/main/resources/org/ssdt_ohio/gradle/userdoc/templates/classDocName.html @ 16:8400a7db1330

USASR-1307: update templates to groovydoc 2.3.6
author smith@nwoca.org
date Wed, 31 Dec 2014 22:35:45 +0000
parents e3c55e83c9a4
children 3741247de37a
line wrap: on
line diff
--- a/src/main/resources/org/ssdt_ohio/gradle/userdoc/templates/classDocName.html	Fri Jan 17 18:16:29 2014 +0000
+++ b/src/main/resources/org/ssdt_ohio/gradle/userdoc/templates/classDocName.html	Wed Dec 31 22:35:45 2014 +0000
@@ -1,651 +1,735 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!-- **************************************************************** -->
-<!-- *  PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
-<!-- *  i.e. only iterate & print data where possible. Thanks, Jez. * -->
-<!-- **************************************************************** -->
-<%
-        
-        
-    classDoc = new org.ssdt_ohio.gradle.doc.tools.UserClassDocProxy().wrap(classDoc)
-
-    def title = classDoc.name() + (props.docTitle ? " (${props.docTitle})" : "")
-    def isVisible = { it.isPublic() || (it.isProtected() && props.protectedScope == 'true') || (!it.isProtected() && !it.isPrivate() && props.packageScope == 'true') || props.privateScope == 'true' }
-    def isVisibleExt = { t -> java.lang.reflect.Modifier.isPublic(t.modifiers) || java.lang.reflect.Modifier.isProtected(t.modifiers) }
-    def visibleFields = classDoc.fields().findAll(isVisible)
-    def visibleProperties = classDoc.properties() // props visible be defn
-    def visibleMethods = classDoc.methods().findAll(isVisible)
-    def visibleConstructors = classDoc.constructors().findAll(isVisible)
-    def visibleNested = classDoc.innerClasses().findAll(isVisible)
-    boolean hasFields = !classDoc.isAnnotationType() && visibleFields
-    boolean hasProperties = !classDoc.isAnnotationType() && visibleProperties
-    boolean hasElements = classDoc.isAnnotationType() && visibleFields
-    boolean methodSummaryShown = visibleMethods
-    boolean fieldSummaryShown = hasFields
-    boolean hasEnumConstants = classDoc.enumConstants()
-    def dolink = { t, boolean b ->
-        boolean isArray = false
-        if (!t || t instanceof String) {
-            return (classDoc.getDocUrl(t, b)  -'java.util.' - 'java.lang.')
-        }
-        if (t instanceof org.codehaus.groovy.tools.groovydoc.ArrayClassDocWrapper) {
-            t = t.delegate
-            isArray = true
-        }
-        if (t instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
-            if (t.fullPathName == 'def') return classDoc.getDocUrl("java.lang.Object def", b)
-            return "<a href='" + classDoc.relativeRootPath + t.fullPathName + ".html'>" + ( (b ? t.qualifiedTypeName() : t.name() ) - "java.lang." - "java.util." ) + "</a>" + (isArray ? "[]" : "")
-        }
-        return ( classDoc.getDocUrl(t.qualifiedTypeName(), b) - 'java.util.' - 'java.lang.' ) + (isArray ? "[]" : "")
-    }
-    def linkfull = { t -> dolink(t, true) }
-    def linkable = { t -> dolink(t, false) }
-    def modifiersWithIgnore = { t, boolean ignorePublic ->
-        (t.isPrivate()?"private&nbsp;":"") +
-        (t.isPublic() && !ignorePublic?"public&nbsp;":"") +
-        (t.isProtected()?"protected&nbsp;":"") +
-        (t.isStatic()?"static&nbsp;":"") +
-        (t.isFinal()?"final&nbsp;":"") +
-        (t.respondsTo('isAbstract') && t.isAbstract()?"abstract&nbsp;":"")
-    }
-    def modifiers = { t -> modifiersWithIgnore(t, classDoc.isGroovy()) }
-    def modifiersBrief = { t ->
-        (t.isPrivate()?"private&nbsp;":"") +
-        (t.isProtected()?"protected&nbsp;":"") +
-        (t.isStatic()?"static&nbsp;":"")
-    }
-    def annotations = { t, sepChar ->
-        t.annotations() ? t.annotations().collect {
-//        it.isTypeAvailable() ? '@'+linkable(it.type().name())+(it.description()-('@'+it.type().name())): it.description()
-            it.description()
-        }.join(sepChar) + sepChar : ''
-    }
-    def elementTypes = [
-        "required":"true",
-        "optional":"false"
-    ]
-    def isRequired = { f, v ->
-        def req = f.constantValueExpression() == null; req.toString() == v
-    }
-    def upcase = { n -> n[0].toUpperCase() + n[1..-1] }
-    def paramsOf = { n, boolean brief -> n.parameters().collect{ param -> (brief?'':annotations(param, ' ')) + linkable(param.isTypeAvailable()?param.type():param.typeName()) + (param.vararg()?'... ':' ') + param.name() + (param.defaultValue() ? " = " + param.defaultValue():"") }.join(", ") }
-    def nameFromParams = { n -> n.name() + '(' + n.parameters().collect{ param -> param.isTypeAvailable()?param.type().qualifiedTypeName():param.typeName() }.join(', ') + ')' }
-    def nameFromJavaParams = { n -> n.name + '(' + n.parameterTypes.collect{ param -> param.name }.join(', ') + ')' }
-%>
-<html>
-<head>
-<!-- Generated by groovydoc (${GroovySystem.version}) on ${new Date()} -->
-<title>${title}</title>
-<meta name="date" content="${new Date().format('yyyy-MM-dd')}">
-<meta http-equiv="Content-Type" content="text/html; charset=${props.charset}">
-<link href="${classDoc.relativeRootPath}groovy.ico" type="image/x-icon" rel="shortcut icon">
-<link href="${classDoc.relativeRootPath}groovy.ico" type="image/x-icon" rel="icon">
-<link rel="stylesheet" type="text/css" href="${classDoc.relativeRootPath}stylesheet.css" title="Style">
-<script type="text/javascript">
-function windowTitle()
-{
-    if (location.href.indexOf('is-external=true') == -1) {
-        parent.document.title="${title}";
-    }
-}
-</script>
-<noscript>
-</noscript>
-
-</head><body onload="windowTitle();" bgcolor="white">
-<hr>
-
-<!-- ========= START OF TOP NAVBAR ======= -->
-<A NAME="navbar_top"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
-<TR>
-<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_top_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
-  <TR ALIGN="center" VALIGN="top">
-  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="${classDoc.relativeRootPath}overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
-
-  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
-  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
-  <!--<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
-  -->
-  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="${classDoc.relativeRootPath}deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
-  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="${classDoc.relativeRootPath}index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
-  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="${classDoc.relativeRootPath}help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
-  </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<% if (props.header) { %><b>${props.header}</b><% } %>
-</EM></TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><!--<FONT SIZE="-2">
-&nbsp;<A HREF="${classDoc.relativeRootPath}groovy/lang/ExpandoMetaClass.ExpandoMetaProperty.html" title="class in groovy.lang"><B>PREV CLASS</B></A>&nbsp;
-
-&nbsp;<A HREF="${classDoc.relativeRootPath}groovy/lang/GroovyClassLoader.html" title="class in groovy.lang"><B>NEXT CLASS</B></A></FONT>--></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-  <A HREF="${classDoc.relativeRootPath}index.html?${classDoc.fullPathName}.html" target="_top"><B>FRAMES</B></A>  &nbsp;
-&nbsp;<A HREF="${classDoc.name()}.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
-&nbsp;<script type="text/javascript">
-  <!--
-  if(window==top) {
-    document.writeln('<A HREF="${classDoc.relativeRootPath}allclasses-frame.html"><B>All Classes</B></A>');
-  }
-  //-->
-</script>
-<noscript>
-  <A HREF="${classDoc.relativeRootPath}allclasses-frame.html"><B>All Classes</B></A>
-</noscript>
-
-</FONT></TD>
-
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-SUMMARY:&nbsp;<%
-    if (classDoc.isAnnotationType()) {
-        def hasReq = classDoc.fields().any{ isRequired(it, "true") }
-        def hasOpt = classDoc.fields().any{ isRequired(it, "false") }
-        %><% if (hasReq) { %><A HREF="#required_element_summary"><% } %>REQUIRED<% if (hasReq) { %></A><% }
-        %> | <% if (hasOpt) { %><A HREF="#optional_element_summary"><% } %>OPTIONAL<% if (hasOpt) { %></A><% } %><%
-    } else {
-        if (visibleNested) { %><A HREF="#nested_summary"><% } %>NESTED<% if (visibleNested) { %></A><% }
-        if (classDoc.isEnum()) {
-            %>&nbsp;|&nbsp;<% if (hasEnumConstants) { %><A HREF="#enum_constant_summary"><% } %>ENUM CONSTANTS<% if (hasEnumConstants) { %></A><% }
-        }
-        %>&nbsp;|&nbsp;<% if (hasFields) { %><A HREF="#field_summary"><% } %>FIELD<% if (hasFields) { %></A><% }
-        if (hasProperties) { %>&nbsp;|&nbsp;<A HREF="#property_summary">PROPERTY</A><% }
-        if (classDoc.isClass()) {
-            %>&nbsp;|&nbsp;<% if (visibleConstructors) { %><A HREF="#constructor_summary"><% } %>CONSTR<% if (visibleConstructors) { %></A><% }
-        }
-        %>&nbsp;|&nbsp;<% if (visibleMethods) { %><A HREF="#method_summary"><% } %>METHOD<% if (visibleMethods) { %></A><% }
-    }
-    %></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL:&nbsp;<%
-    if (classDoc.isAnnotationType()) {
-        if (hasElements) { %><A HREF="#element_detail"><% } %>ELEMENT<% if (hasElements) { %></A><% }
-    } else {
-        if (classDoc.isEnum()) {
-            if (hasEnumConstants) { %><A HREF="#enum_constant_detail"><% } %>ENUM CONSTANTS<% if (hasEnumConstants) { %></A>&nbsp;|&nbsp;<% }
-        }
-        if (hasFields) { %><A HREF="#field_detail"><% } %>FIELD<% if (hasFields) { %></A><% }
-        if (hasProperties) { %>&nbsp;|&nbsp;<A HREF="#prop_detail">PROPERTY</A><% }
-        if (classDoc.isClass()) {
-            %>&nbsp;|&nbsp;<% if (visibleConstructors) { %><A HREF="#constructor_detail"><% } %>CONSTR<% if (visibleConstructors) { %></A><% }
-        }
-        %>&nbsp;|&nbsp;<% if (visibleMethods) { %><A HREF="#method_detail"><% } %>METHOD<% if (visibleMethods) { %></A><% }
-    }
-    %></FONT></TD>
-</TR>
-</TABLE>
-<!-- ========= END OF TOP NAVBAR ========= -->
-
-
-<HR>
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>
-<%
-def pkg = classDoc.containingPackage().nameWithDots()
-if (pkg != "DefaultPackage") {
-%>
-<FONT SIZE="-1">
-${pkg}</FONT>
-<BR>
-<% } %>
-<span CLASS="ClassTitleFont"> ${classDoc.typeDescription} ${classDoc.name()}</span></H2>
-<%
-def parents = classDoc.isInterface() ? classDoc.parentInterfaces : classDoc.parentClasses
-if (parents.size() >= 2) {
-    %><pre><%
-    parents.eachWithIndex { p, i ->
-        %>${(i > 0 ? "  " * i + "  " * (i - 1) + "<img src='" + classDoc.relativeRootPath + "inherit.gif'>" : "") + ( i == parents.size() - 1 ? p.qualifiedTypeName() : linkfull(p))}\n<%
-    }
-    %></pre><%
-}
-if (classDoc.isInterface()) {
-    Set interfaces = classDoc.parentInterfaces
-    interfaces -= classDoc
-    if (interfaces) {
-        %><dl><dt><b>All Superinterfaces:</b> </dt><dd>${interfaces.collect{ linkable(it) }.join(', ')}</dd></dl><%
-    }
-} else {
-    // TODO follow up the tree collecting interfaces seen?
-    def interfaces = classDoc.interfaces()
-    if (interfaces) {
-        %><dl><dt><b>All Implemented Interfaces:</b> </dt><dd>${interfaces.collect{ linkable(it) }.join(', ')}</dd></dl><%
-    }
-}
-%><hr>
-<PRE>${annotations(classDoc, '\n') + modifiers(classDoc) + classDoc.typeSourceDescription + ' ' + classDoc.name()}
-<% if (classDoc.isInterface() && classDoc.interfaces()) {
-%>extends ${classDoc.interfaces().collect{ linkable(it) }.join(', ')}
-<% } else if (classDoc.superclass()) {
-%>extends ${linkable(classDoc.superclass())}
-<% } %>
-</PRE>
-<% if (classDoc.commentText()) { %>
-<P>
-${classDoc.commentText()}
-</P>
-<hr>
-<% } %>
-
-<!-- =========== NESTED CLASS SUMMARY =========== -->
-
-<A NAME="nested_summary"><!-- --></A>
-<% if (visibleNested) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Nested Class Summary</B></FONT></TH>
-    </TR>
-    <% for (c in visibleNested) { %>
-        <TR BGCOLOR="white" CLASS="TableRowColor">
-        <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-        <CODE>${modifiersBrief(c) + c.typeSourceDescription}</CODE></FONT></TD>
-        <TD>
-            <CODE>${linkable(c)}</CODE>
-            <BR>
-            <P>${c.firstSentenceCommentText()}</P>
-        </TD>
-        </TR>
-    <% } %>
-    </TABLE>
-    &nbsp;
-<% } %>
-
-<!-- =========== ENUM CONSTANT SUMMARY =========== -->
-
-<A NAME="enum_constant_summary"><!-- --></A>
-<% if (hasEnumConstants) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Enum Constant Summary</B></FONT></TH>
-    </TR>
-    <% for (ec in classDoc.enumConstants()) { %>
-        <TR BGCOLOR="white" CLASS="TableRowColor">
-        <TD>
-            <CODE><B><A HREF="#${ec.name()}">${ec.name()}</A></B></CODE>
-            <BR>
-            <P>${ec.firstSentenceCommentText()}</P>
-        </TD>
-        </TR>
-    <% } %>
-    </TABLE>
-    &nbsp;
-<% } %>
-
-<!-- =========== FIELD SUMMARY =========== -->
-
-<A NAME="field_summary"><!-- --></A>
-<% if (hasFields) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Field Summary</B></FONT></TH>
-    </TR>
-    <% for (field in visibleFields) { %>
-        <TR BGCOLOR="white" CLASS="TableRowColor">
-        <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-        <CODE>${modifiersBrief(field) + linkable(field.type())}</CODE></FONT></TD>
-        <TD>
-            <CODE><B><A HREF="#${field.name()}">${field.name()}</A></B></CODE>
-            <BR>
-            <P>${field.firstSentenceCommentText()}</P>
-        </TD>
-        </TR>
-    <% } %>
-    </TABLE>
-    &nbsp;
-<% }
-    classes = []
-    if (classDoc.isInterface()) {
-        classes.addAll(classDoc.interfaces().toList())
-    } else {
-        if (classDoc.superclass()) classes += classDoc.superclass()
-        else classes += new org.codehaus.groovy.tools.groovydoc.ExternalGroovyClassDoc(Object.class)
-    }
-    visited = [classDoc] as Set
-    while (classes) {
-        Set nextLevel = []
-        classes.each { c ->
-            if (c.isInterface()) nextLevel.addAll(c.interfaces().toList())
-            else if (c.superclass() && c.qualifiedTypeName() != 'java.lang.Object') nextLevel += c.superclass()
-            nextLevel -= visited
-            visited += nextLevel
-            def list = []
-            if (c instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
-                list = c.fields().findAll(isVisible).collect { field ->
-                    "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${field.name()}'>${field.name()}</a>"
-                }
-            } else {
-                list = c.externalClass().fields.findAll{ isVisibleExt(it) }.collect { field ->
-                    // "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${field.name()}'>${field.name()}</a>"
-                    field.name
-                }
-            }
-            if (list) {
-                if (!fieldSummaryShown) {
-                    fieldSummaryShown = true
-                    %><table BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-                    <TR CLASS="TableHeadingColor">
-                    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2" CLASS="ClassHeadingFont">
-                    <B>Field Summary</B></FONT></TH>
-                    </TR>
-                    </table>
-                    &nbsp;<%
-                }
-                %><table BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-                <tr CLASS="TableSubHeadingColor"><th ALIGN="left" COLSPAN="2">
-                <b>Fields inherited from ${c.typeSourceDescription} ${linkable(c)}</b>
-                </th></tr>
-                <tr class="TableRowColor"><td colspan='2'>${list.join(', ')}</td></tr>
-                </table>
-                &nbsp;<%
-            }
-        }
-        classes = nextLevel
-    }
-%>
-
-<!-- =========== PROPERTY SUMMARY =========== -->
-
-<A NAME="property_summary"><!-- --></A>
-<% if (hasProperties) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Property Summary</B></FONT></TH>
-    </TR>
-    <% for (prop in visibleProperties) { %>
-        <TR BGCOLOR="white" CLASS="TableRowColor">
-        <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-        <CODE>${modifiersBrief(prop) + linkable(prop.type())}</CODE></FONT></TD>
-        <TD>
-            <CODE><B><A HREF="#${prop.name()}">${prop.name()}</A></B></CODE>
-            <BR>
-            <P>${prop.firstSentenceCommentText()}</P>
-        </TD>
-        </TR>
-    <% } %>
-    </TABLE>
-    &nbsp;
-<% } %>
-
-<!-- =========== ELEMENT SUMMARY =========== -->
-
-<% if (hasElements) { %>
-    <% elementTypes.each { k, v -> %>
-        <A NAME="${k}_element_summary"><!-- --></A>
-        <% if (visibleFields.any{ isRequired(it, v) }) {  %>
-            <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-            <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-            <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-            <B>${upcase(k)} Element Summary</B></FONT></TH>
-            </TR>
-            <% for (element in visibleFields) { %>
-                <% if (isRequired(element, v)) { %>
-                <TR BGCOLOR="white" CLASS="TableRowColor">
-                <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-                <CODE>${modifiersBrief(element) + element.type().typeName()}</CODE></FONT></TD>
-                <TD>
-                    <CODE><B><A HREF="#${element.name()}">${element.name()}</A></B></CODE>
-                    <BR>
-                    <P>${element.firstSentenceCommentText()}</P>
-                </TD>
-                </TR>
-                <% } %>
-            <% } %>
-            </TABLE>
-        <% } %>
-        &nbsp;
-    <% } %>
-<% } %>
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<% if (visibleConstructors) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#D5D5FF" CLASS="TableHeadingColor">
-    <TD COLSPAN=2><FONT SIZE="+2">
-    <B>Constructor Summary</B></FONT></TD>
-    </TR>
-    <% for (constructor in visibleConstructors) { %>
-        <TR BGCOLOR="white" CLASS="TableRowColor">
-        <TD>
-            <CODE>${modifiersBrief(constructor)}<B><a href="#${nameFromParams(constructor)}">${constructor.name()}</a></B>(${paramsOf(constructor, true)})</CODE>
-            <BR>
-            <P>${constructor.firstSentenceCommentText()}</P>
-        </TD>
-        </TR>
-    <% } %>
-    </TABLE>
-    &nbsp;
-<% } %>
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<% if (visibleMethods) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2" CLASS="ClassHeadingFont">
-    <B>Method Summary</B></FONT></TH>
-    </TR>
-    <% for (method in visibleMethods) { %>
-        <TR BGCOLOR="white" CLASS="TableRowColor">
-        <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1" CLASS="ClassItemFont">
-            <CODE>${modifiersBrief(method)}${linkable(method.returnType())}</CODE></FONT>
-        </TD>
-        <TD>
-            <CODE><b><a href="#${nameFromParams(method)}">${method.name()}</a></b>(${paramsOf(method, true)})</CODE>
-            <BR>
-            <P>${method.firstSentenceCommentText()}</P>
-        </TD>
-        </TR>
-    <% } %>
-    </TABLE>
-    &nbsp;
-<% }
-    Set classes = []
-    if (classDoc.isInterface()) {
-        classes.addAll(classDoc.interfaces().toList())
-    } else {
-        if (classDoc.superclass()) classes += classDoc.superclass()
-        else classes += new org.codehaus.groovy.tools.groovydoc.ExternalGroovyClassDoc(Object.class)
-    }
-    Set visited = [classDoc] as Set
-    while (classes) {
-        Set nextLevel = []
-        classes.each { c ->
-            if (c.isInterface()) nextLevel.addAll(c.interfaces().toList())
-            else if (c.superclass() && c.qualifiedTypeName() != 'java.lang.Object') nextLevel += c.superclass()
-            nextLevel -= visited
-            visited += nextLevel
-            def list = []
-            if (c instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
-                list = c.methods().findAll(isVisible).collect { method ->
-                    "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${nameFromParams(method)}'>${method.name()}</a>"
-                }
-            } else {
-                list = c.externalClass().methods.findAll{ isVisibleExt(it) }.collect { method ->
-                    linkable(c.externalClass().name + "#" + nameFromJavaParams(method) + " " + method.name)
-                }
-            }
-            if (list) {
-                if (!methodSummaryShown) {
-                    methodSummaryShown = true
-                    %><table BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-                    <TR CLASS="TableHeadingColor">
-                    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2" CLASS="ClassHeadingFont">
-                    <B>Method Summary</B></FONT></TH>
-                    </TR>
-                    </table>
-                    &nbsp;<%
-                }
-                %><table BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-                <tr CLASS="TableSubHeadingColor"><th ALIGN="left" COLSPAN="2">
-                <b>Methods inherited from ${c.typeSourceDescription} ${linkable(c)}</b>
-                </th></tr>
-                <tr class="TableRowColor"><td colspan='2'>${list.join(', ')}</td></tr>
-                </table>
-                &nbsp;<%
-            }
-        }
-        classes = nextLevel
-    }
-%>
-
-<P>
-
-<!-- ============ ENUM CONSTANT DETAIL ========== -->
-
-<A NAME="enum_constant_detail"><!-- --></A>
-<% if (hasEnumConstants) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
-    <B>Enum Constant Detail</B></FONT></TH>
-    </TR>
-    </TABLE>
-    <% for (ec in classDoc.enumConstants()) { %>
-        <A NAME="${ec.name()}"><!-- --></A><H3>${ec.name()}</H3>
-        <PRE>${modifiers(ec) + '<a href="' + classDoc.relativeRootPath + classDoc.fullPathName + '.html">' + classDoc.name() + '</a>'} <B>${ec.name()}</B></PRE>
-        <DL>
-        <DD>${ec.commentText()}
-        </DD>
-        <P>
-        </DL>
-        <HR>
-    <% } %>
-    &nbsp;
-<% } %>
-
-<!-- =========== FIELD DETAIL =========== -->
-
-<A NAME="field_detail"><!-- --></A>
-<% if (hasFields) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Field Detail</B></FONT></TH>
-    </TR>
-    </TABLE>
-    <% for (field in visibleFields) { %>
-        <A NAME="${field.name()}"><!-- --></A><H3>${field.name()}</H3>
-        <PRE>${annotations(field, '\n') + modifiersWithIgnore(field, false) + linkable(field.type())} <B>${field.name()}</B></PRE>
-        <DL>
-        <DD>${field.commentText()}
-        </DD>
-        <P>
-        </DL>
-        <HR>
-    <% } %>
-    &nbsp;
-<% } %>
-
-<!-- =========== PROPERTY DETAIL =========== -->
-
-<A NAME="prop_detail"><!-- --></A>
-<% if (hasProperties) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Property Detail</B></FONT></TH>
-    </TR>
-    </TABLE>
-    <% for (prop in visibleProperties) { %>
-        <A NAME="${prop.name()}"><!-- --></A><H3>${prop.name()}</H3>
-        <PRE>${annotations(prop, '\n') + modifiers(prop) + linkable(prop.type())} <B>${prop.name()}</B></PRE>
-        <DL>
-        <DD>${prop.commentText()}
-        </DD>
-        <P>
-        </DL>
-        <HR>
-    <% } %>
-    &nbsp;
-<% } %>
-
-<!-- =========== ELEMENT DETAIL =========== -->
-
-<A NAME="element_detail"><!-- --></A>
-<% if (hasElements) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
-    <B>Element Detail</B></FONT></TH>
-    </TR>
-    </TABLE>
-    <% for (element in visibleFields) { %>
-        <A NAME="${element.name()}"><!-- --></A><H3>${element.name()}</H3>
-        <PRE>${modifiers(element) + linkable(element.type())} <B>${element.name()}</B></PRE>
-        <DL>
-        <DD>${element.commentText()}
-        </DD>
-        <P>
-        </DL>
-        <HR>
-    <% } %>
-    &nbsp;
-<% } %>
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<% if (visibleConstructors) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
-    <B>Constructor Detail</B></FONT></TH>
-    </TR>
-    </TABLE>
-    <% for (constructor in visibleConstructors) { %>
-        <A NAME="${nameFromParams(constructor)}"><!-- --></A><H3>
-        ${constructor.name()}</H3>
-        <PRE>${annotations(constructor, '\n') + modifiers(constructor)}<B>${constructor.name()}</B>(${paramsOf(constructor, false)})</PRE>
-        <DL>
-        <DD>${constructor.commentText()}
-        </DD>
-        <P>
-        </DL>
-        <HR>
-    <% } %>
-    &nbsp;
-<% } %>
-
-<!-- ============ METHOD DETAIL ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<% if (visibleMethods) { %>
-    <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
-    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-    <TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
-    <B>Method Detail</B></FONT></TH>
-    </TR>
-    </TABLE>
-    <% for (method in visibleMethods) { %>
-        <A NAME="${nameFromParams(method)}"><!-- --></A><H3>
-        ${method.name()}</H3>
-        <PRE>${annotations(method, '\n') + modifiers(method)}${linkable(method.returnType())} <B>${method.name()}</B>(${paramsOf(method, false)})</PRE>
-        <DL>
-        <DD>${method.commentText()}
-        </DD>
-        <P>
-        </DL>
-        <HR>
-    <% } %>
-    &nbsp;
-<% } %>
-
-<!-- ========= END OF CLASS DATA ========= -->
-<p>${props['footer']?:""}</p>
-<hr>
-
-</body>
-</html>
+<!--
+  ~ Copyright (c) 2014.  Ohio Department of Education. - All Rights Reserved.
+  ~ Unauthorized copying of this file, in any medium, is strictly prohibited.
+  ~ Written by State Software Development Team (http://ssdt.oecn.k12.oh.us/)
+  -->
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- *  PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- *  i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+<%
+
+    println "Generating for $classDoc (${classDoc.class})"
+    classDoc = new org.ssdt_ohio.gradle.doc.tools.UserClassDocProxy().wrap(classDoc)
+
+    def title = classDoc.name() + (props.docTitle ? " (${props.docTitle})" : "")
+    def isVisible = { it.isPublic() || (it.isProtected() && props.protectedScope == 'true') || (!it.isProtected() && !it.isPrivate() && props.packageScope == 'true') || props.privateScope == 'true' }
+    def isVisibleExt = { t -> java.lang.reflect.Modifier.isPublic(t.modifiers) || java.lang.reflect.Modifier.isProtected(t.modifiers) }
+    def visibleFields = classDoc.fields().findAll(isVisible)
+    def visibleProperties = classDoc.properties() // props visible be defn
+    def visibleMethods = classDoc.methods().findAll(isVisible)
+    def visibleConstructors = classDoc.constructors().findAll(isVisible)
+    def visibleNested = classDoc.innerClasses().findAll(isVisible)
+    boolean hasFields = !classDoc.isAnnotationType() && visibleFields
+    boolean hasProperties = !classDoc.isAnnotationType() && visibleProperties
+    boolean hasElements = classDoc.isAnnotationType() && visibleFields
+    boolean methodSummaryShown = visibleMethods
+    boolean fieldSummaryShown = hasFields
+    boolean hasEnumConstants = classDoc.enumConstants()
+    def dolink = { t, boolean b ->
+        boolean isArray = false
+        if (!t || t instanceof String) {
+            return (classDoc.getDocUrl(t, b)  -'java.util.' - 'java.lang.')
+        }
+        if (t instanceof org.codehaus.groovy.tools.groovydoc.ArrayClassDocWrapper) {
+            t = t.delegate
+            isArray = true
+        }
+        if (t instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
+            if (t.fullPathName == 'def') return classDoc.getDocUrl("java.lang.Object def", b)
+            return "<a href='" + classDoc.relativeRootPath + t.fullPathName + ".html'>" + ( (b ? t.qualifiedTypeName() : t.name() ) - "java.lang." - "java.util." ) + "</a>" + (isArray ? "[]" : "")
+        }
+        return ( classDoc.getDocUrl(t.qualifiedTypeName(), b) - 'java.util.' - 'java.lang.' ) + (isArray ? "[]" : "")
+    }
+    def linkfull = { t -> dolink(t, true) }
+    def linkable = { t -> dolink(t, false) }
+    def modifiersWithIgnore = { t, boolean ignorePublic ->
+        (t.isPrivate()?"private&nbsp;":"") +
+        (t.isPublic() && !ignorePublic?"public&nbsp;":"") +
+        (t.isProtected()?"protected&nbsp;":"") +
+        (t.isStatic()?"static&nbsp;":"") +
+        (t.isFinal()?"final&nbsp;":"") +
+        (t.respondsTo('isAbstract') && t.isAbstract()?"abstract&nbsp;":"")
+    }
+    def modifiers = { t -> modifiersWithIgnore(t, classDoc.isGroovy()) }
+    def modifiersBrief = { t ->
+        (t.isPrivate()?"private&nbsp;":"") +
+        (t.isProtected()?"protected&nbsp;":"") +
+        (t.isStatic()?"static&nbsp;":"")
+    }
+    def annotations = { t, sepChar ->
+        t.annotations() ? t.annotations().collect {
+//        it.isTypeAvailable() ? '@'+linkable(it.type().name())+(it.description()-('@'+it.type().name())): it.description()
+            it.description()
+        }.join(sepChar) + sepChar : ''
+    }
+    def elementTypes = [
+        "required":"true",
+        "optional":"false"
+    ]
+    def isRequired = { f, v ->
+        def req = f.constantValueExpression() == null; req.toString() == v
+    }
+    def upcase = { n -> n[0].toUpperCase() + n[1..-1] }
+    def paramsOf = { n, boolean brief -> n.parameters().collect{ param -> (brief?'':annotations(param, ' ')) + linkable(param.isTypeAvailable()?param.type():param.typeName()) + (param.vararg()?'... ':' ') + param.name() + (param.defaultValue() ? " = " + param.defaultValue():"") }.join(", ") }
+    def nameFromParams = { n -> n.name() + '(' + n.parameters().collect{ param -> param.isTypeAvailable()?param.type().qualifiedTypeName():param.typeName() }.join(', ') + ')' }
+    def nameFromJavaParams = { n -> n.name + '(' + n.parameterTypes.collect{ param -> param.name }.join(', ') + ')' }
+%>
+<html>
+<head>
+    <!-- Generated by groovydoc (${GroovySystem.version}) on ${new Date()} -->
+    <title>${title}</title>
+    <meta name="date" content="${new Date().format('yyyy-MM-dd')}">
+    <meta http-equiv="Content-Type" content="text/html; charset=${props.charset}">
+    <link href="${classDoc.relativeRootPath}groovy.ico" type="image/x-icon" rel="shortcut icon">
+    <link href="${classDoc.relativeRootPath}groovy.ico" type="image/x-icon" rel="icon">
+    <link rel="stylesheet" type="text/css" href="${classDoc.relativeRootPath}stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+    parent.document.title="${title}";
+}
+//-->
+</script>
+<noscript>
+    <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+    <!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+    <!--   -->
+</a>
+    <ul class="navList" title="Navigation">
+        <li><a href="${classDoc.relativeRootPath}overview-summary.html">Overview</a></li>
+        <li><a href="package-summary.html">Package</a></li>
+        <li class="navBarCell1Rev">Class</li>
+        <li><a href="${classDoc.relativeRootPath}deprecated-list.html">Deprecated</a></li>
+        <li><a href="${classDoc.relativeRootPath}index-all.html">Index</a></li>
+        <li><a href="${classDoc.relativeRootPath}help-doc.html">Help</a></li>
+    </ul>
+</div>
+
+<div class="subNav">
+    <div>
+        <ul class="navList">
+            <li><a href="${classDoc.relativeRootPath}index.html?${classDoc.fullPathName}" target="_top">Frames</a></li>
+            <li><a href="${classDoc.name()}.html" target="_top">No Frames</a></li>
+        </ul>
+    </div>
+    <div>
+        <ul class="subNavList">
+            <li>Summary:&nbsp;</li>
+            <%
+    if (classDoc.isAnnotationType()) {
+        def hasReq = classDoc.fields().any{ isRequired(it, "true") }
+        def hasOpt = classDoc.fields().any{ isRequired(it, "false") }
+        if (hasReq) { %><li><a href="#required_element_summary"><% } %>Required<% if (hasReq) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (hasOpt) { %><li><a href="#optional_element_summary"><% } %>Optional<% if (hasOpt) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+    } else {
+        if (visibleNested) { %><li><a href="#nested_summary"><% } %>Nested<% if (visibleNested) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (classDoc.isEnum()) {
+            if (hasEnumConstants) { %><li><a href="#enum_constant_summary"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        }
+        if (hasFields) { %><li><a href="#field_summary"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (hasProperties) { %><li><a href="#property_summary">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (classDoc.isClass()) {
+            if (visibleConstructors) { %><li><a href="#constructor_summary"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        }
+        if (visibleMethods) { %><li><a href="#method_summary"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+    }
+    %>
+        </ul>
+        <ul class="subNavList">
+            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
+            <%
+            if (classDoc.isAnnotationType()) {
+                if (hasElements) { %><li><a href="#element_detail"><% } %>Element<% if (hasElements) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+            } else {
+                if (classDoc.isEnum()) {
+                    if (hasEnumConstants) { %><li><a href="#enum_constant_detail"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                }
+                if (hasFields) { %><li><a href="#field_detail"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                if (hasProperties) { %><li><a href="#prop_detail">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                if (classDoc.isClass()) {
+                    if (visibleConstructors) { %><li><a href="#constructor_detail"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                }
+                if (visibleMethods) { %><li><a href="#method_detail"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+            }
+            %>
+        </ul>
+    </div>
+    <a name="skip-navbar_top">
+        <!--   -->
+    </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<%
+def pkg = classDoc.containingPackage().nameWithDots()
+String classDesc = "${classDoc.isGroovy() ? "[Groovy]" : "[Java]"} ${classDoc.typeDescription} ${org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc.encodeAngleBrackets(classDoc.getNameWithTypeArgs())}"
+if (pkg != "DefaultPackage") {
+%>
+    <div class="subTitle">Package: <strong>${pkg}</strong></div>
+<%}%>
+    <h2 title="${classDesc}" class="title">${classDesc}</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<%
+def parents = classDoc.isInterface() ? classDoc.parentInterfaces : classDoc.parentClasses
+if (parents.size() >= 2) {
+    parents.eachWithIndex { p, i ->
+        %><li><%
+        if ( i == parents.size() - 1) {
+            out << p.qualifiedTypeName()
+        } else {
+            %><ul class="inheritance"><% linkfull(p) %></ul></li><%
+        }
+    }
+}
+%>
+</ul>
+<div class="description">
+    <ul class="blockList">
+        <li class="blockList">
+<%
+if (classDoc.isInterface()) {
+    Set interfaces = classDoc.parentInterfaces
+    interfaces -= classDoc
+    if (interfaces) {
+        %>
+            <dl>
+                <dt>All Superinterfaces:</dt>
+                <dd>${interfaces.collect{ linkable(it) }.join(', ')}</dd>
+            </dl><%
+    }
+} else {
+    // TODO follow up the tree collecting interfaces seen?
+    def interfaces = classDoc.interfaces()
+    if (interfaces) {
+        %>
+            <dl>
+                <dt>All Implemented Interfaces and Traits:</dt>
+                <dd>${interfaces.collect{ linkable(it) }.join(', ')}</dd>
+            </dl>
+            <!-- todo: direct known subclasses -->
+            <hr>
+            <br>
+<pre>${annotations(classDoc, '\n') + modifiers(classDoc) + classDoc.typeSourceDescription + ' ' + classDoc.name()}
+<% if (classDoc.isInterface() && classDoc.interfaces()) {
+%>extends ${classDoc.interfaces().collect{ linkable(it) }.join(', ')}
+<% } else if (classDoc.superclass()) {
+%>extends ${linkable(classDoc.superclass())}
+<% } %>
+</pre>
+<% } %>
+<% } %>
+<% if (classDoc.commentText()) { %>
+    <p>${classDoc.commentText()}</p>
+<% } %>
+          </li>
+    </ul>
+</div>
+
+<div class="summary">
+    <ul class="blockList">
+        <li class="blockList">
+        <!-- =========== NESTED CLASS SUMMARY =========== -->
+        <% if (visibleNested) { %>
+            <ul class="blockList">
+                <li class="blockList"><a name="nested_summary"><!--   --></a>
+                    <h3>Nested Class Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
+                        <caption><span>Nested classes</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Modifiers</th>
+                            <th class="colLast" scope="col">Name</th>
+                            <th class="colLast" scope="col">Description</th>
+                        </tr>
+                        <% visibleNested.eachWithIndex { c, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code><strong>${modifiersBrief(c) + c.typeSourceDescription}</strong></code>&nbsp;</td>
+                            <td class="colLast"><code>${linkable(c)}</code></td>
+                            <td class="colLast">${c.firstSentenceCommentText()}</code></td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+                </li>
+            </ul>
+        <% } %>
+
+        <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+        <% if (hasEnumConstants) { %>
+            <ul class="blockList">
+                <li class="blockList"><a name="enum_constant_summary"><!--   --></a>
+                    <h3>Enum Constants Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+                        <caption><span>Enum constants classes</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Enum constant</th>
+                            <th class="colLast" scope="col">Description</th>
+                        </tr>
+                        <% classDoc.enumConstants().eachWithIndex { ec, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code><strong><a href="#${ec.name()}">${ec.name()}</a></strong></code></td>
+                            <td class="colLast">${ec.firstSentenceCommentText()}</td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+                </li>
+            </ul>
+        <% } %>
+        <!-- =========== FIELD SUMMARY =========== -->
+        <%
+        def buffer = new StringBuilder()
+        classes = []
+        if (classDoc.isInterface()) {
+            classes.addAll(classDoc.interfaces().toList())
+        } else {
+            if (classDoc.superclass()) classes += classDoc.superclass()
+            else classes += new org.codehaus.groovy.tools.groovydoc.ExternalGroovyClassDoc(Object.class)
+        }
+        visited = [classDoc] as Set
+        while (classes) {
+            Set nextLevel = []
+            classes.eachWithIndex { c,i ->
+                if (c.isInterface()) nextLevel.addAll(c.interfaces().toList())
+                else if (c.superclass() && c.qualifiedTypeName() != 'java.lang.Object') nextLevel += c.superclass()
+                nextLevel -= visited
+                visited += nextLevel
+                def list = []
+                if (c instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
+                    list = c.fields().findAll(isVisible).collect { field ->
+                        "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${field.name()}'>${field.name()}</a>"
+                    }
+                } else {
+                    list = c.externalClass().fields.findAll{ isVisibleExt(it) }.collect { field ->
+                        // "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${field.name()}'>${field.name()}</a>"
+                        field.name
+                    }
+                }
+                if (list) {
+                    buffer << """                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><strong><code>${c.typeSourceDescription} ${linkable(c)}</code></strong></td>
+                            <td class="colLast"><code>${list.join(', ')}</code></td>
+                        </tr>
+"""
+                }
+            }
+            classes = nextLevel
+        }
+
+
+        if (hasFields || buffer.length()>0) { %>
+            <ul class="blockList"><%
+                if (hasFields) { %>
+                <li class="blockList"><a name="field_summary"><!--   --></a>
+                    <h3>Field Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+                        <caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Modifiers</th>
+                            <th class="colLast" scope="col">Name</th>
+                            <th class="colLast" scope="col">Description</th>
+                        </tr>
+                        <% visibleFields.eachWithIndex { field, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code><strong>${modifiersBrief(field) + linkable(field.type())}</strong></code>&nbsp;</td>
+                            <td class="colLast"><code><a href="#${field.name()}">${field.name()}</a></code></td>
+                            <td class="colLast">${field.firstSentenceCommentText()}</code></td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+                </li>
+                <% } // if (hasFields)
+                if ((buffer.length())>0) { %>
+                <li class="blockList"><a name="field_summary"><!--   --></a>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited fields summary table">
+                        <caption><span>Inherited fields</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Fields inherited from class</th>
+                            <th class="colLast" scope="col">Fields</th>
+                        </tr>
+                        ${buffer}
+                    </table>
+                    </ul>
+                </li>
+                <% } // if buffer %>
+            </ul>
+        <% } // if hasFields or buffer %>
+
+        <!-- =========== PROPERTY SUMMARY =========== -->
+        <% if (hasProperties) { %>
+         <ul class="blockList">
+                <li class="blockList"><a name="property_summary"><!--   --></a>
+                    <h3>Properties Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Properties Summary table, listing nested classes, and an explanation">
+                        <caption><span>Properties</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Type</th>
+                            <th class="colLast" scope="col">Name and description</th>
+                        </tr>
+                        <% visibleProperties.eachWithIndex { prop, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code><strong>${modifiersBrief(prop) + linkable(prop.type())}</strong></code>&nbsp;</td>
+                            <td class="colLast"><code><a href="#${prop.name()}"></a>${prop.name()}</code><br>${prop.firstSentenceCommentText()}</td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+                </li>
+            </ul>
+        <% } %>
+
+        <!-- =========== ELEMENT SUMMARY =========== -->
+        <% if (hasElements) { %>
+        <ul class="blockList"><a name="element_summary"><!--   --></a>
+                <li class="blockList">
+                    <h3>Element Summary</h3>
+                    <% elementTypes.each { k, v ->
+                    %><a name="${k}_element_summary"><!--   --></a><%
+                        if (visibleFields.any{ isRequired(it, v) }) {  %>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="${upcase(k)} Element Summary table">
+                        <caption><span>${upcase(k)} Element Summary</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Type</th>
+                            <th class="colLast" scope="col">Name and Description</th>
+                        </tr>
+                        <% visibleFields.findAll {isRequired(it, v)}.eachWithIndex { element, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code><strong>${modifiersBrief(element) + linkable(element.type())}</strong></code>&nbsp;</td>
+                            <td class="colLast"><code><a href="#${element.name()}">${element.name()}</a></code><br>${element.firstSentenceCommentText()}</td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+                   <% }
+                   } //elementTypes.each %>
+                </li>
+        </ul>
+        <% } %>
+
+        <% if (visibleConstructors) { %>
+        <!-- ======== CONSTRUCTOR SUMMARY ======== -->
+        <ul class="blockList">
+                <li class="blockList"><a name="constructor_summary"><!--   --></a>
+                    <h3>Constructor Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
+                        <caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Constructor and description</th>
+                        </tr>
+                        <% visibleConstructors.eachWithIndex { constructor, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst">
+                                <code>${modifiersBrief(constructor)}<a href="#${nameFromParams(constructor)}">${constructor.name()}</a></strong>
+                                (${paramsOf(constructor, true)})</code><br>${constructor.firstSentenceCommentText()}</td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+              </li>
+        </ul>
+        <% } %>
+
+        <%
+        buffer = new StringBuilder()
+        Set classes = []
+        if (classDoc.isInterface()) {
+            classes.addAll(classDoc.interfaces().toList())
+        } else {
+            if (classDoc.superclass()) classes += classDoc.superclass()
+            else if (!classDoc.isTrait()) classes += new org.codehaus.groovy.tools.groovydoc.ExternalGroovyClassDoc(Object.class)
+        }
+        Set visited = [classDoc] as Set
+        while (classes) {
+            Set nextLevel = []
+            classes.eachWithIndex { c,i ->
+                if (c.isInterface()) nextLevel.addAll(c.interfaces().toList())
+                else if (c.superclass() && c.qualifiedTypeName() != 'java.lang.Object') nextLevel += c.superclass()
+                nextLevel -= visited
+                visited += nextLevel
+                def list = []
+                if (c instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
+                    list = c.methods().findAll(isVisible).collect { method ->
+                        "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${nameFromParams(method)}'>${method.name()}</a>"
+                    }
+                } else {
+                    list = c.externalClass().methods.findAll{ isVisibleExt(it) }.collect { method ->
+                        linkable(c.externalClass().name + "#" + nameFromJavaParams(method) + " " + method.name)
+                    }
+                }
+                if (list) {
+                    buffer << """
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code>${c.typeSourceDescription} ${linkable(c)}</strong></code></td>
+                            <td class="colLast"><code>${list.join(', ')}</code></td>
+                        </tr>"""
+                }
+            }
+            classes = nextLevel
+        }
+
+        if (visibleMethods || buffer.length()>0) { %>
+        <!-- ========== METHOD SUMMARY =========== -->
+        <ul class="blockList">
+            <% if (visibleMethods) { %>
+            <li class="blockList"><a name="method_summary"><!--   --></a>
+                    <h3>Methods Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+                        <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Type</th>
+                            <th class="colLast" scope="col">Name and description</th>
+                        </tr>
+                        <% visibleMethods.eachWithIndex { method, i -> %>
+                        <tr class="${i%2==0?'altColor':'rowColor'}">
+                            <td class="colFirst"><code>${modifiersBrief(method)}${linkable(method.returnType())}</strong></code></td>
+                            <td class="colLast"><code><strong><a href="#${nameFromParams(method)}">${method.name()}</a></strong>(${paramsOf(method, true)})</code><br>${method.firstSentenceCommentText()}</td>
+                        </tr>
+                        <% } %>
+                    </table>
+                   </ul>
+              </li>
+            <% } // if (visibleMethods)
+            if (buffer.length()>0) {
+                %>
+            <li class="blockList"><a name="method_summary"><!--   --></a>
+                    <h3>Inherited Methods Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
+                        <caption><span>Inherited Methods</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Methods inherited from class</th>
+                            <th class="colLast" scope="col">Name</th>
+                        </tr>
+                        ${buffer}
+                    </table>
+                   </ul>
+              </li>
+                <%
+            } // if buffer.length%>
+        </ul>
+        <% } %>
+    </li>
+    </ul>
+</div>
+
+<div class="details">
+    <ul class="blockList">
+        <li class="blockList">
+           <% if (hasEnumConstants) { %>
+            <!-- ============ ENUM CONSTANT DETAIL ========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="enum_constant_detail">
+                    <!--   -->
+                </a>
+                    <h3>Enum Constant Detail</h3>
+                    <% for (ec in classDoc.enumConstants()) { %>
+                        <a name="${ec.name()}"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>${modifiers(ec) + '<a href="' + classDoc.relativeRootPath + classDoc.fullPathName + '.html">' + classDoc.name() + '</a>'} <strong>${ec.name()}</strong></h4>
+                                <p>${ec.commentText()}</p>
+                            </li>
+                        </ul>
+                    <% } %>
+                </li>
+            </ul>
+            <% } %>
+
+            <% if (hasFields) { %>
+            <!-- =========== FIELD DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="field_detail">
+                    <!--   -->
+                </a>
+                    <h3>Field Detail</h3>
+                    <% visibleFields.each { field -> %>
+                        <a name="${field.name()}"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>${annotations(field, '\n') + modifiersWithIgnore(field, false) + linkable(field.type())} <strong>${field.name()}</strong></h4>
+                                <p>${field.commentText()}</p>
+                            </li>
+                        </ul>
+                    <% } %>
+                </li>
+            </ul>
+            <% } %>
+
+            <% if (hasProperties) { %>
+            <!-- =========== PROPERTY DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="prop_detail">
+                    <!--   -->
+                </a>
+                    <h3>Property Detail</h3>
+                    <% visibleProperties.each { prop -> %>
+                        <a name="${prop.name()}"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>${annotations(prop, '\n') + modifiers(prop) + linkable(prop.type())} <strong>${prop.name()}</strong></h4>
+                                <p>${prop.commentText()}</p>
+                            </li>
+                        </ul>
+                    <% } %>
+                </li>
+            </ul>
+            <% } %>
+
+            <% if (hasElements) { %>
+            <!-- =========== ELEMENT DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="element_detail">
+                    <!--   -->
+                </a>
+                    <h3>Element Detail</h3>
+                    <% visibleFields.each { element -> %>
+                        <a name="${element.name()}"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>${modifiers(element) + linkable(element.type())} <strong>${element.name()}</strong></h4>
+                                <p>${element.commentText()}</p>
+                            </li>
+                        </ul>
+                    <% } %>
+                </li>
+            </ul>
+            <% } %>
+
+            <% if (visibleConstructors) { %>
+            <!-- =========== CONSTRUCTOR DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="constructor_detail">
+                    <!--   -->
+                </a>
+                    <h3>Constructor Detail</h3>
+                    <% visibleConstructors.each { constructor -> %>
+                        <a name="${nameFromParams(constructor)}"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>${annotations(constructor, '\n') + modifiers(constructor)}<strong>${constructor.name()}</strong>(${paramsOf(constructor, false)})</h4>
+                                <p>${constructor.commentText()}</p>
+                            </li>
+                        </ul>
+                    <% } %>
+                </li>
+            </ul>
+            <% } %>
+
+
+            <% if (visibleMethods) { %>
+            <!-- =========== METHOD DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="method_detail">
+                    <!--   -->
+                </a>
+                    <h3>Method Detail</h3>
+                    <% visibleMethods.each { method -> %>
+                        <a name="${nameFromParams(method)}"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>${annotations(method, '\n') + modifiers(method)}${linkable(method.returnType())} <strong>${method.name()}</strong>(${paramsOf(method, false)})</h4>
+                                <p>${method.commentText()}</p>
+                            </li>
+                        </ul>
+                    <% } %>
+                </li>
+            </ul>
+            <% } %>
+        </li>
+    </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+    <!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+    <!--   -->
+</a>
+    <ul class="navList" title="Navigation">
+        <li><a href="${classDoc.relativeRootPath}overview-summary.html">Overview</a></li>
+        <li><a href="package-summary.html">Package</a></li>
+        <li class="navBarCell1Rev">Class</li>
+        <li><a href="${classDoc.relativeRootPath}deprecated-list.html">Deprecated</a></li>
+        <li><a href="${classDoc.relativeRootPath}index-all.html">Index</a></li>
+        <li><a href="${classDoc.relativeRootPath}help-doc.html">Help</a></li>
+    </ul>
+</div>
+
+<div class="subNav">
+    <div>
+        <ul class="navList">
+            <li><a href="${classDoc.relativeRootPath}index.html?${classDoc.fullPathName}" target="_top">Frames</a></li>
+            <li><a href="${classDoc.name()}.html" target="_top">No Frames</a></li>
+        </ul>
+    </div>
+    <div>
+        <ul class="subNavList">
+            <li>Summary:&nbsp;</li>
+            <%
+    if (classDoc.isAnnotationType()) {
+        def hasReq = classDoc.fields().any{ isRequired(it, "true") }
+        def hasOpt = classDoc.fields().any{ isRequired(it, "false") }
+        if (hasReq) { %><li><a href="#required_element_summary"><% } %>Required<% if (hasReq) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (hasOpt) { %><li><a href="#optional_element_summary"><% } %>Optional<% if (hasOpt) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+    } else {
+        if (visibleNested) { %><li><a href="#nested_summary"><% } %>Nested<% if (visibleNested) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (classDoc.isEnum()) {
+            if (hasEnumConstants) { %><li><a href="#enum_constant_summary"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        }
+        if (hasFields) { %><li><a href="#field_summary"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (hasProperties) { %><li><a href="#property_summary">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        if (classDoc.isClass()) {
+            if (visibleConstructors) { %><li><a href="#constructor_summary"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+        }
+        if (visibleMethods) { %><li><a href="#method_summary"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+    }
+    %>
+        </ul>
+        <ul class="subNavList">
+            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
+            <%
+            if (classDoc.isAnnotationType()) {
+                if (hasElements) { %><li><a href="#element_detail"><% } %>Element<% if (hasElements) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+            } else {
+                if (classDoc.isEnum()) {
+                    if (hasEnumConstants) { %><li><a href="#enum_constant_detail"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                }
+                if (hasFields) { %><li><a href="#field_detail"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                if (hasProperties) { %><li><a href="#prop_detail">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                if (classDoc.isClass()) {
+                    if (visibleConstructors) { %><li><a href="#constructor_detail"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+                }
+                if (visibleMethods) { %><li><a href="#method_detail"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<% 
+            }
+            %>
+        </ul>
+    </div>
+    <% if (props.footer) { %><p>${props.footer}</p><% } %>
+    <a name="skip-navbar_bottom">
+        <!--   -->
+    </a>
+    </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>