view 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 source
<!--
  ~ 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>