.. _pages/write_api_documentation#writing_api_documentation:
Writing API Documentation
*************************
For documenting the qooxdoo API special comments in the source code (so-called "doc comments") are used. The doc comments in qooxdoo are similar to `JSDoc comments `_ or `Javadoc `_ comments. To account for some qooxdoo specific needs there are certain differences to the two systems mentioned above. For a complete treatment of the syntax see the :doc:`JSDoc reference `.
.. _pages/write_api_documentation#the_structure_of_a_documentation_comment:
An introductory example
========================================
Doc comments are specially formatted comment blocks enclosed by ``/**`` and ``*/``. A typical use case is to put them in front of a method definition. You start with a general description of the method, and then add sections that start with ``@`` followed by a special key that describes e.g. a parameter or the return type of the method. Here is an example:
::
/**
* Shows a message to the user.
*
* @param text {string} the message to show.
*/
showMessage : function(text) {
...
}
The ``@param`` attribute entry describes the parameter ``text``. Description texts may also include markup for highlighting and structure.
Here is a longer example that covers an entire class file:
::
/**
* General class description.
*/
qx.Class.define("mypackage.MyClass",
{
extend : blubb.MySuperClass,
/**
* Constructor description.
*
* @param param1 {Integer} description of first parameter\
*/
construct : function(param1) {
...
}
});
properties :
{
/** Property definitions. */
"myProperty" :
{
check : "Number",
init : 0
}
},
members :
{
/** Method description */
myMethod : function(bla, blubb)
{
...
}
},
statics :
{
/** Static method description */
myStaticMethod : function(bla, blubb)
{
...
},
/** Constant description */
MY_CONSTANT : 100
},
The class description is taken as the first comment in the file which starts with ``/**``. Therefore if you have a comment at the start of the file which has a first line of ``/**********``, that will be taken as the class description, overriding any comment above the class itself. Therefore use ``/* *********`` or ``/* ==========`` etc.
.. _pages/write_api_documentation#example:
Advanced Doc Comments
=======================
Here is a more advanced example of a method documentation block that uses more ``@`` keys to provide structured information about the method.
::
/**
* Handles a drop.
*
* @param dragSource {qx.bla.DragSource} the drag source that was dropped.
* @param targetElement {Element} the target element the drop aims to.
* @param dropType {Integer ? null} the drop type. This is the same type
* as used in {@link qx.bla.DragEvent}.
* @return {Boolean} whether the event was handled.
* @throws {Error} if the targetElement is no child of this drop target.
*
* @see #getDragEvent
* @see qx.bla.DragEvent
*/
handleDrop : function(dragSource, targetElement, dropType) {
...
}
This will render in the Apiviewer similarly to this:
.. image:: /_static/apiviewer_method.png
As mentioned above the :doc:`JSDoc reference ` has the complete list of possible section keys and markup possibilities.
.. _pages/write_api_documentation#__init__.js_files:
Package documentation
========================
While documenting a class files where JSDoc comments are interleaved with the class code seems straight forward, this is not so obvious if you want to provide documentation for a *package*, i.e. a collection of classes under a common namespace (like *qx.ui.core*, *qx.util*, etc.).
In order to fill this gap you can add a ``__init__.js`` file to the package. This file should contain only a single JSDoc comment that describes the package as a whole. These files are then scanned during a ``generate.py api`` run and the documentation is inserted at the package nodes, together with a list of classes of the corresponding package, in the documentation tree. See the API documentation for the `framework packages `_ as examples.