GStreamer documentation notes

IMPORTANT
=========

Please make sure you've read and understood everything in this file
before you try changing documentation.

OVERVIEW
========

GStreamer has two sets of documentation that we maintain:
* API references, using gtk-doc (gstreamer, gstreamer-libs)
* "books", using DocBook/XML (faq, manual, pwg)

DOCBOOK NOTES
=============

OK, I've grown so tired of having to coax the docs to build every time I
get round to it that I've decided to note down some of the things that
are important to know.

OVERVIEW
--------
* Our documentation should all be Docbook/XML.  No SGML.
* The source for the documentation is:
  - one or more .xml files, with the main one being gstreamer-(whatever).xml
  - image files
    - in .fig
    - in .png (and maybe others)
* We want to generate docs in HTML, PS and PDF
* We want to use xml to to generate these

CONVENTIONS
-----------
We stick to some simple conventions for writing docbook documentation.
* id names:
  - all id's start with chapter-, part-, section-, or misc-
  - verify this is the case by looking at the generated file names in html/
  - sections should also include the chapter name;
    for example in a chapter called chapter-example, a section would be
    called section-example-hello-world
* there are currently comments of the form <!-- synchronize with PWG -->
  in the docbook file. Please check the relevant section of the other manual
  when updating.

HOW IMAGES ARE HANDLED
----------------------
* the format of images used is:
  - PNG for html
  - EPS for ps
  - PDF for pdf

* images may need to be converted from their source format to the end format

* a file called image.entities is generated that provides two entities:
  &image; and &IMAGE;
  &image; is the file extension (png, ps, pdf)
* all generated images will be put in images/

HOW THE BUILD WORKS FOR EACH FORMAT
-----------------------------------
* HTML:
  - xmlto html gstreamer-whatever.xml should produce the html docs.
  - We do this in the html subdir of the doc builddir.
  - images are copied to (builddir)/html/images
  - PNGS should be set to all of the png's referenced for html, both
    already there and auto-generated

* PS :
  - images are converted to .ps files in EPS format.  Generated images are
    put in images/
  - xmlto ps gstreamer-whatever.xml generates the ps file

* PDF :
  There are two ways:
  - ps2pdf is the easiest
  - we specify ps, PS as the image type, but using xmlto the build will fail
    because it uses ps2pdf internally and it fails to generate the images
    By hand-generating .pdf images before xmlto we can make the build succeed.
    (This is why image-pdf has file ext pdf but type EPS; this tricks xmlto in
     doing the right thing)
    xmlto pdf gstreamer-whatever.xml generates pdf (but seems to fail on the
    FAQ, so for now we use ps2pdf)

HOW THE BUILD SYSTEM IS SET UP
------------------------------
* make all should build html, ps, and pdf
* html is built in a subdir, with the png/ps images copied there
* ps and pdf are built in the current dir, in one file

SPELL CHECKING
--------------
* with aspell
  * aspell -b -c --mode=sgml --lang=en <file>.xml
    unfortunately the curses-ui of aspell (0.50.5) has problems with the xml tags


GTK-DOC NOTES
=============

* files under CVS control:
  - Makefile.am
  - gstreamer-sections.txt
    describes which symbols later appear on one api-doc page
    configure which symbols are shown/invisible/private
  - gstreamer.types
    the types file lists all get_type() functions that register the GObject types
  - gstreamer-docs.sgml
    defines the overall structure of the api documentation
  - tmpl/
    - only add the file to CVS if you have at least filled the short description
      (filename corresponds to the <FILE> tag in the sections file)
    - document as much as possible in the source (*.c files)

* what to do when adding a new piece of API:
  - add both an entity and use the entity in gstreamer-docs.sgml
  - add a new <SECTION> to gstreamer-sections.txt in the correct alphabetical
    position related to the other sections (so that it is easier to locate)
  - add all documented symbols to gstreamer-sections.txt in the proper section
    (default),<SUBSECTION Standard>,<SUBSECTION Private>
  - document at least the Short_Description in tmpl/.sgml
  - document symbols where they are definied, so that when one changes the
    definition, the chaces are good that docs are updated.
    - document functions, signals in the .c files
    - document structs, typedefs, enums in the .h files

* checklist:
  - make sure *-sections.txt has a <TITLE> set for each <FILE>
  - add only *one* <TITLE> to each file, when you have multiple classes in one
    source-file, create one <FILE> section for each class
  - the <TITLE> *must* be named like the type of the GType, when it gets
    registered (otherwise gtkdoc introspection fails)
  - for clarity name the <FILE> like the <TITLE>, but all lowercase

* what to do when trying to improve the docs
  - compare the output of
    grep "_get_type" gstreamer-sections.txt | sort
    with the types in XXX.types to detect entries that
    are maybe missing
  - gtk docs does not warns about empty member docs!, run
    find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \;
    in the project root to find them
  - gtk docs does not warns about empty Returns: docs!, run
    find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \;
    in the project root to find them

* what happens during a gtk-doc build ?
  - Scan step:
    - based on a $(MODULE).types file:
      - gtkdoc-scangobj creates a gtkdoc-scan binary
        - using CC, LD, CFLAGS, LDFLAGS env var
        - using --type-init-func and --module parameters
        - gtkdoc-scan creates
          - $MODULE.signals.new
          - $MODULE.hierarchy.new
          - $MODULE.interfaces.new
          - $MODULE.prerequisites.new
          - $MODULE.args.new
        - generated source and objects get deleted
        - gtkdoc-scangobj merges changes into the original files
    - gtkdoc-scan
      - extracts decls of functions, macros, enums, structs, unions from headers
      - generates
        - $MODULE-decl.txt
        - $MODULE-decl-list.txt
      - $MODULE-decl-list.txt then should get copied to $MODULE-sections.txt
    - scan-build.stamp gets created
  
  - Template generation step:
    - gtkdoc-mktmpl --module=$MODULE
      - reads in tmpl/*.sgml
      - moves them to tmpl/*.sgml.bak
      - recreates tmpl/*.sgml according to $MODULE-sections.txt
      - moves unused stuff to $MODULE-unused.txt
    - tmpl-build.stamp gets generated

* Possible errors and how to fix them
  - Warning: multiple "IDs" for constraint linkend: gst-tag-register.
    - check if gst_tag_register is listed more than once in -sections.txt

STYLE GUIDE FOR GTK-DOC
=======================
- this is in addition to gtk-doc's style-guide.txt

- when documenting signals, use "the #Gst..." for the object receiving the
  signal; no trailing dot, and no "that received the signal"
- function/macro descriptions are descriptive, not imperative
  ie, it uses the third person verb
- synopsis and description should have most-used/application functions at the
  top
- functions that can return FALSE/NULL or fail should describe their failure
  conditions like this:
  * Returns NULL if no element with the given name is found in the bin, if
  * the frobble was stuck in the froob, or the frizzle was frazzed.
- a line with function attributes should be added before Returns:
  - can contain:
    "MT safe." - the function is verified to be multithreadingsafe
    "Caller owns returned reference" for refcounted classes
    "Caller owns returned value" for other types (iterators, ..)
  - we do this because, in contrast with GLib/GTK, we are more explicit
    about threadsafety and related issues
- link to signals from the description like this:
  * The <link linkend="GstBin-element-added">element-added</link> signal
- the bottom of the description should say when the doc was last reviewed
  (version and date)
   * Last reviewed on 2005-10-28 (0.9.4)

WEBSITE DOCUMENTATION
=====================

Updating the online documentation is pretty simple.
Make sure that you
a) have a working freedesktop.org account
b) $HOME/.ssh/config set up so that it has the right User for the Host
   (for example, I have:
Host freedesktop.org
  User thomasvs
c) verify this works by doing ssh freedesktop.org and being logged in without
   a password prompt
d) have verified your changes build documentation locally.

Then, after updating any of the docs, run "make upload" from that directory.
Or, run "make upload" from this (docs) directory.

DOCUMENTING ELEMENTS
====================
As of september 2005 we have some system to document plugins and elements
in the various plugin packages.

- in a submodule, docs go in docs/plugins
- template can be copied from gst-plugins-base
- to add plugins documentation:
  - create docs/plugins
  - create Makefile.am and friends, add to configure.ac
  - create docs/version.entities.in, add to configure.ac
  - in docs/plugins:
    - create $(module)-plugins.types with #include <gst/gst.h>
    - run make
    - edit the -docs.sgml
    - add to cvs:
      cvs add *-plugins-docs.sgml *-plugins.args *-plugins.hierarchy *-plugins.interfaces *-plugins.prerequisites *-plugins.signals *-plugins.types inspect-build.stamp inspect.stamp scanobj-build.stamp
      cvs add inspect
      cvs add inspect/*.xml
    - Additional types can be added to the documentation by placing them in
      the .types file like this:
        type:GstPlayBaseBin
      This is useful for documenting plugin-private types that implement
      signals or properties. The GType is looked up by name after all the
      element classes have been printed - so this is only useful for types
      that are created as a consequence of loading plugins and registering
      the element(s).

- to add a plugin to be documented:
  - make sure inspect/ has generated a inspect/plugin-xxx.xml file for it.
    - if it has not, make sure you have pygst installed and run 'make update'.
      and add it to CVS.
  - add an xi:include in -docs.sgml in the Plugins chapter for that plugin

- to add an element to be documented:
  - add an xi:include in the Elements chapter for the element
    in the main -docs.sgml
  - add a section for it in -sections.txt with
      <SECTION>
      <FILE>element-(element)</FILE>
      <TITLE>(element)</TITLE>
      GstXxx
      <SUBSECTION Standard>
      GstXxxClass
      GST_XXX
      GST_XXX_CLASS
      GST_IS_XXX
      GST_IS_XXX_CLASS
      GST_TYPE_XXX
      gst_xxx_get_type
      </SECTION>
  - add a gtk-doc section to the source code like:
/**
 * SECTION:element-multifdsink

  and fill it with documentation about the element, preferably inside
  a <refsect2> docbook container.
  - add an example:
    - either a few pipelines, inside <programlisting>
    - or a piece of code:
      - create an example program (element)-example.c in the plugin dir
      - add the full path (starting with $(top_srcdir)) for this example
        to the EXAMPLE_CFILES variable in Makefile.am
      - add an xinclude of a file named "element-(element)-example.xml"
        to the docbook documentation piece in the element source code
  - add the header to EXTRA_HFILES in Makefile.am to be able to document
    signals and args; in that case, the object struct needs to be in
    -sections.txt outside of the Standard Subsection (which is annoying,
    but ...)
    (FIXME: are we sure we can both do the xinclude from the tmpl/ sgml,
     as well as an override from the source itself ? maybe we should just
     make sure the xinclude is in the source itself instead ?)
  - if the plugin has no public header, don't add the c-file, add entries to the
    -overrides.txt file (see playbin docs in plugins-base).
  - to rebuild the docs, do:
    make clean
    make update
    make
  - examples will only show up using gtk-doc 1.4 or later - it relies on
    merging stuff from .sgml with inline docs.  We might want to change
    this to only get stuff from the source.
  - you need to commit resulting files to git:
    - changes to *.signals and *.args
    - new files for your plugin created in inspect/
  - if you get this warning:
    " Documentation in template xxx for ./tmpl/element-yyy:Short_Description
      being overridden by inline comments"
    per-default the description from the GST_ELEMENT_DETAILS is put to the
    Short_Description. This warning mean you have a different one in the section
    docs as "@short_description:".

- the plugin-doc-list on the gstreamer homepage is updated along with other
  web site updates.

- maintainer tricks:
  - in gst-plugins-foo/docs/plugins/, run
        make check-inspected-versions
    to show plugins whose inspect information is not up-to-date (which is
    usually either because they have been moved to a different module or
    because they are not built on the maintainer's machine for some reason).
    Whether it really makes sense to update the version number is debatable
    (after all, the inspected information may be outdated and things may have
    changed, in which case it would be bad to change the version number)
  - find files that have docs
    for file in `find . -name "*.c" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.c/.h} ]; then echo ${file/.c/.h}; else echo "no header for $file"; fi; done
    for file in `find . -name "*.cc" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.cc/.h} ]; then echo ${file/.cc/.h}; else echo "no header for $file"; fi; done
    - add those .h files to EXTRA_HFILES in Makefile.am
  - update gst-plugins-xxx-docs.sgml
    cd docs/plugins
    ls -1 xml/plugin-*.xml | sort | sed -e "s/\(.*\)/    \<xi:include href=\"\1\" \/\>/"
    ls -1 xml/element-*.xml | grep -v -- "-details.xml" | sort | sed -e "s/\(.*\)/    \<xi:include href=\"\1\" \/\>/"
    - maybe we can generate these lists after "make update" and just xi:include
      them in gst-plugins-xxx-docs.sgml. They should be committed to the vcs.

- possible errors:
  - "multiple constraints for linkend ID":
    check if each section in -sections.txt actually starts and ends with
    <SECTION> and </SECTION>
  - if a plugin does not show up:
    - check inspect/plugin-xxx.xml and tmpl/elements-

RANDOM THINGS I'VE LEARNED
==========================

* for clean builddir != srcdir separation, I wanted to use xmlto --searchpath
  so the source xml could find the built entity file.
  But xmlto --searchpath is (right now) for TeX input, not xml input.
  xsltproc has a --path option (that xmlto doesn't use yet), but it
  resolves single files to $(specified_path)/$(srcdir)/$(file)
  For now, we need to hack around it by copying xml to the build dir.


(old) DOCUMENTATION BUILDING NOTES
----------------------------------

To build the GStreamer documentation you need the following installed (based on
Red Hat packages).  These packages comes from rawhide and are the ones that
will be in Red Hat 7.3/8.0

Docbook stuff:
sgml-common 
xml-common 
openjade (needs to be rebuilt from SRPM for Red Hat 7.2)
tetex-dvips
jadetex
docbook-dtds      
docbook-style-dsssl 
docbook-style-xsl
docbook-utils

XML stuff:
libxml2
libxml2-python
libxml2-devel
libxslt
libxslt-devel
libxslt-python



Gtkdoc:
gtk-doc

Other stuff:
transfig
pdftops

DEVHELP INTEGRATION
-------------------
Check http://www.imendio.com/projects/devhelp/
It's a really nice development app allowing you to look up API stuff
from various gtk-doc'd libraries.  GStreamer is one of these ;)

gtk-doc generates both html API docs and the matching .devhelp(2) books.

IMAGES
------
It's important to keep the original source format for images, to be able
to change and regenerate later on.  Original files go in
docs/images
