//////////////////////////////////////////

  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.

//////////////////////////////////////////

= groovydoc, the Groovy & Java documentation generator

GroovyDoc is a tool responsible for generating documentation from your code. It acts like the Javadoc tool in the
Java world but is capable of handling both `groovy` and `java` files. The distribution comes with two ways of generating
documentation: from <<Groovydoc-CommandLine,command line>> or from <<Groovydoc-Ant,Apache Ant>>. Other build tools
like Maven or Gradle also offer wrappers for Groovydoc.

[[Groovydoc-CommandLine]]
== The groovydoc command line tool

The `groovydoc` command line can be invoked to generate groovydocs:

----
groovydoc [options] [packagenames] [sourcefiles]
----

where options must be picked from the following table:

[cols="2,2,5",options="header,footer"]
|=======================================================================
|Short version |Long version |Description
|-author | |Include @author paragraphs (currently not used)
|-charset <charset>| |Charset for cross-platform viewing of generated documentation
|-classpath, -cp | --classpath |Specify where to find the class files - must be
first argument
|-d |--destdir <dir> |Destination directory for output files
| |--debug|Enable debug output
|-doctitle <html> | |Include title for the overview page
|-exclude <pkglist>| | Specify a list of packages to exclude
(separated by colons for all operating systems)
|-fileEncoding <charset>| |Charset for generated documentation files
|-footer <html> | |Include footer text for each page
|-header <html> | |Include header text for each page
|-help|--help|Display help message
|-nomainforscripts| |Don't include the implicit 'public static void
main' method for scripts
|-noscripts| |Don't process Groovy Scripts
|-notimestamp| |Don't include timestamp within hidden comment in generated HTML
|-noversionstamp| |Don't include Groovy version within hidden comment in generated HTML
|-overview <file>| |Read overview documentation from HTML file
|-package| |Show package/protected/public classes and members
|-private| |Show all classes and members
|-protected| |Show protected/public classes and members (default)
|-public| |Show only public classes and members
|-quiet| |Suppress superfluous output
|-sourcepath <pathlist>| |Specify where to find source files (dirs
separated by platform path separator)
|-stylesheetfile <path>| |File to change style of the generated documentation
|-verbose| |Enable verbose output
| |--version|Display the version
|-windowtitle <text>| |Browser window title for the documentation
|=======================================================================

[[Groovydoc-Ant]]
== The groovydoc Ant task

The `groovydoc` Ant task allows generating groovydocs from an Ant build.

[[ThegroovydocAnttask-Requiredtaskdef]]
=== Required taskdef

Assuming all the groovy jars you need are in _my.classpath_ (this will be `groovy-VERSION.jar`,
`groovy-ant-VERSION.jar`, `groovy-groovydoc-VERSION.jar` plus any modules and transitive dependencies you might be using)
you will need to declare this task at some point in the build.xml prior to the groovydoc task being invoked.

[source,xml]
-----------------------------------------------------------
<taskdef name         = "groovydoc"
         classname    = "org.codehaus.groovy.ant.Groovydoc"
         classpathref = "my.classpath"/>
-----------------------------------------------------------

[[ThegroovydocAnttask-groovydocAttributes]]
=== <groovydoc> Attributes

[cols="1,2,1",options="header,footer"]
|=======================================================================
|Attribute |Description |Required
|destdir |Location to store the class files. |Yes
|sourcepath |The sourcepath to use. |No
|packagenames |Comma separated list of package files (with terminating
wildcard). |No
|use |Create class and package usage pages. |No
|windowtitle |Browser window title for the documentation (text). |No
|doctitle |Include title for the package index(first) page (html-code).
|No
|header |Include header text for each page (html-code). |No
|footer |Include footer text for each page (html-code). |No
|overview |Read overview documentation from HTML file. |No
|private |Show all classes and members (i.e. including private ones) if
set to ``true''. |No
|=======================================================================

[[ThegroovydocAnttask-groovydocNestedElements]]
=== <groovydoc> Nested Elements

[[ThegroovydocAnttask-link]]
==== link

Create link to groovydoc/javadoc output at the given URL.

[cols="<,<,<",options="header,footer"]
|=======================================================
|Attribute |Description |Required
|packages |Comma separated list of package prefixes |Yes
|href |Base URL of external site |Yes
|=======================================================

[[ThegroovydocAnttask-Example1-groovydocAnttask]]
==== Example #1 - <groovydoc> Ant task

[source,xml]
----------------------------------------------------------------------------------------------------------------
<taskdef name           = "groovydoc"
         classname      = "org.codehaus.groovy.ant.Groovydoc"
         classpathref   = "path_to_groovy_all"/>

<groovydoc destdir      = "${docsDirectory}/gapi"
           sourcepath   = "${mainSourceDirectory}"
           packagenames = "**.*"
           use          = "true"
           windowtitle  = "${title}"
           doctitle     = "${title}"
           header       = "${title}"
           footer       = "${docFooter}"
           overview     = "src/main/overview.html"
           private      = "false">
        <link packages="java.,org.xml.,javax.,org.xml." href="http://docs.oracle.com/javase/8/docs/api/"/>
        <link packages="org.apache.tools.ant."          href="http://docs.groovy-lang.org/docs/ant/api/"/>
        <link packages="org.junit.,junit.framework."    href="http://junit.org/junit4/javadoc/latest/"/>
        <link packages="groovy.,org.codehaus.groovy."   href="http://docs.groovy-lang.org/latest/html/api/"/>
        <link packages="org.codehaus.gmaven."           href="http://groovy.github.io/gmaven/apidocs/"/>
</groovydoc>
----------------------------------------------------------------------------------------------------------------

[[ThegroovydocAnttask-Example2-ExecutinggroovydocfromGroovy]]
==== Example #2 - Executing <groovydoc> from Groovy

[source,groovy]
--------------------------------------------------------------------------------------------------------------
def ant = new AntBuilder()
ant.taskdef(name: "groovydoc", classname: "org.codehaus.groovy.ant.Groovydoc")
ant.groovydoc(
    destdir      : "${docsDirectory}/gapi",
    sourcepath   : "${mainSourceDirectory}",
    packagenames : "**.*",
    use          : "true",
    windowtitle  : "${title}",
    doctitle     : "${title}",
    header       : "${title}",
    footer       : "${docFooter}",
    overview     : "src/main/overview.html",
    private      : "false") {
        link(packages:"java.,org.xml.,javax.,org.xml.",href:"http://docs.oracle.com/javase/8/docs/api/")
        link(packages:"groovy.,org.codehaus.groovy.",  href:"http://docs.groovy-lang.org/latest/html/api/")
        link(packages:"org.apache.tools.ant.",         href:"http://docs.groovy-lang.org/docs/ant/api/")
        link(packages:"org.junit.,junit.framework.",   href:"http://junit.org/junit4/javadoc/latest/")
        link(packages:"org.codehaus.gmaven.",          href:"http://groovy.github.io/gmaven/apidocs/")
}
--------------------------------------------------------------------------------------------------------------

=== Custom templates

The `groovydoc` Ant task supports custom templates, but it requires two steps:

. A custom groovydoc class
. A new groovydoc task definition

==== Custom Groovydoc class

The first step requires you to extend the `Groovydoc` class, like in the following example:

[source,java]
----
package org.codehaus.groovy.tools.groovydoc;

import org.codehaus.groovy.ant.Groovydoc;

/**
 * Overrides GroovyDoc's default class template - for testing purpose only.
 */
public class CustomGroovyDoc extends Groovydoc {

    @Override
    protected String[] getClassTemplates() {
        return new String[]{"org/codehaus/groovy/tools/groovydoc/testfiles/classDocName.html"};
    }
}
----

You can override the following methods:

* `getClassTemplates` for class-level templates
* `getPackageTemplates` for package-level templates
* `getDocTemplates` for top-level templates

You can find the list of default templates in the `org.codehaus.groovy.tools.groovydoc.gstringTemplates.GroovyDocTemplateInfo`
class.

==== Using the custom groovydoc task

Once you've written the class, using it is just a matter of redefining the `groovydoc` task:

[source,xml]
----
<taskdef name           = "groovydoc"
         classname      = "org.codehaus.groovy.ant.CustomGroovyDoc"
         classpathref   = "path_to_groovy_all"/>
----

Please note that template customization is provided as is. APIs are subject to change, so you must consider this as a
fragile feature.

[[Groovydoc-GMavenPlus]]
== GMavenPlus Maven Plugin
https://github.com/groovy/GMavenPlus[GMavenPlus] is a Maven plugin with goals that
support GroovyDoc generation.

