GStreamer documentation notes

IMPORTANT
=========

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

Some of the docbook-related bits in this README might be out of date now that
quite a bit of the documentation has moved into the gst-docs repository.

OVERVIEW
========

GStreamer has two sets of documentation that we maintain:
* API references, using gtk-doc (gstreamer, gstreamer-libs)
* FAQ / Application Development Manual / Plugin Writer's Guide / Tutorials -
  these are maintained in markdown format and live in the gst-docs repository.

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 .svg
    - 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

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 revision 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 defined, 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

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.


DEVHELP INTEGRATION
-------------------
Check https://wiki.gnome.org/Apps/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
