Doxygen/de

Doxygen ist ein beliebtes Werkzeug zur Generierung von Dokumentation aus kommentierten C++ Quellen; es unterstützt auch andere gängige Programmiersprachen wie C#, PHP, Java und Python. Besuche die Doxygen Website, um mehr über das System zu erfahren, und konsultiere das Doxygen Handbuch für die vollständigen Informationen.

Dieses Dokument gibt eine kurze Einführung in Doxygen, insbesondere wie es in FreeCAD zur Dokumentation seiner Quellen verwendet wird. Auf der Seite Quelldokumentation findest Du Anweisungen zum Erstellen der FreeCAD Dokumentation, die ebenfalls online auf der FreeCAD API Website bereitgestellt wird.



Doxygen mit C++ Code
Der Abschnitt Getting started (Step 3) im Doxygen Handbuch erwähnt die grundlegenden Möglichkeiten der Dokumentation der Quellen.

Für Mitglieder, Klassen und Namensräume gibt es grundsätzlich zwei Möglichkeiten:
 * 1) Platziere einen speziellen "Dokumentationsblock" (einen kommentierten Absatz) vor der Deklaration oder Definition der Funktion, des Elements, der Klasse oder des Namensraums. Bei Datei-, Klassen- und Namensraumelementen (Variablen) ist es auch erlaubt, die Dokumentation direkt nach dem Element zu platzieren. Siehe Abschnitt Spezielle Kommentarblöcke im Handbuch, um mehr über diese Blöcke zu erfahren.
 * 2) Platziere einen speziellen Dokumentationsblock an einer anderen Stelle (eine andere Datei oder einen anderen Ort in der gleichen Datei) und füge einen "Strukturbefehl" in den Dokumentationsblock ein. Ein Strukturbefehl verknüpft einen Dokumentationsblock mit einer bestimmten zu dokumentierenden Einheit (Funktion, Element, Variable, Klasse, Namensraum oder Datei). Siehe Abschnitt Dokumentation an anderer Stelle im Handbuch, um mehr über Strukturbefehle zu erfahren.

Hinweis:
 * Der Vorteil der ersten Option ist, dass du den Namen der Einheit (Funktion, Element, Variable, Klasse oder Namensraum) nicht wiederholen musst, da Doxygen den Code analysiert und die relevanten Informationen extrahiert.
 * Dateien können nur mit der zweiten Option dokumentiert werden, da es keine Möglichkeit gibt, einen Dokumentationsblock vor eine Datei zu stellen. Natürlich benötigen Dateimitglieder (Funktionen, Variablen, Typedefinitionen, Definitionen) keinen expliziten Strukturbefehl; einfach einen Dokumentationsblock vor oder nach ihnen zu setzen, wird gut funktionieren.

Erster Stil: Dokumentationsblock vor dem Kode
Usually you'd want to document the code in the header file, just before the class declaration or function prototype. This keeps the declaration and documentation close to each other, so it's easy to update the latter one if the first one changes.

The special documentation block starts like a C-style comment but has an additional asterisk, so ; the block ends with a matching. An alternative is using C++-style comments with an additional slash, so.

Zweiter Stil: Dokumentationsblock an anderer Stelle
Alternativ kann die Dokumentation auch in einer anderen Datei (oder in derselben Datei oben, unten oder wo auch immer) abgelegt werden, weg von der Klassendeklaration oder dem Funktionsprototyp. In diesem Fall hast du duplizierte Informationen, einmal in der eigentlichen Quelldatei und einmal in der Dokumentationsdatei.

First file, :

Second file, :

In this case the structural command is used to indicate which source file is being documented; a structural command  indicates that the following code is a function, and the command  is used to give a small description of this function.

This way of documenting a source file is useful if you just want to add documentation to your project without adding real code. When you place a comment block in a file with one of the following extensions, , or then Doxygen will parse the comments and build the appropriate documentation, but it will hide this auxiliary file from the file list.

The FreeCAD project adds several files ending in in many directories in order to provide a description, or examples, of the code there. It is important that such files are correctly categorized in a group or namespace, for which Doxygen provides some auxiliary commands like, , and.

Example ; this file in FreeCAD's source tree gives a short explanation of the namespace.

Another example is the file. Before the implementation details of the methods, there is a documentation block that explains some details of the command framework of FreeCAD. It has various commands to structure the documentation. It even includes example code enclosed in a pair of and  keywords; when the file is processed by Doxygen this code example will be specially formatted to stand out. The keyword is used in several places to create links to named sections, subsections, pages or anchors elsewhere in the documentation. Similarly, the or  commands print "See also" and provide a link to other classes, functions, methods, variables, files or URLs. Example

Beispiel aus dem VTK Projekt
This is an example from VTK, a 3D visualization library used to present scientific data, like finite element results, and point cloud information.

A class to store a collection of coordinates is defined in a C++ header file. The top part of the file is commented, and a few keywords are used, like, , and to indicate important parts. Inside the class, before the class method prototypes, a block of commented text explains what the function does, and its arguments.
 * Source code of vtkArrayCoordinates.h.
 * Doxygen produced documentation for the vtkArrayCoordinates class.

Erstellung der Dokumentation


Um die Quellcode Dokumentation zu erstellen, gibt es zwei grundlegende Schritte:
 * 1) Erstelle eine Konfigurationsdatei, um zu steuern, wie Doxygen die Quelldateien verarbeiten soll.
 * 2) Führe  in dieser Konfiguration aus.

Der Prozess wird im Folgenden beschrieben.


 * Stelle sicher, dass die Programme und  in Deinem System vorhanden sind. Es wird auch empfohlen, das Programm  von Graphviz zu verwenden, um Diagramme mit den Beziehungen zwischen Klassen und Namensräumen zu erzeugen. Auf Linux Systemen können diese Programme über Ihren Paketmanager installiert werden.


 * Stelle sicher, dass Du Dich im gleichen Ordner wie Deine Quelldateien befindest, oder im Toplevel Verzeichnis Deines Quellbaums, wenn Du viele Quelldateien in verschiedenen Unterverzeichnissen hast.


 * Führe aus, um eine Konfigurationsdatei namens  zu erstellen. Wenn Du diesen Namen weglässt, wird er standardmäßig auf  ohne Erweiterung gesetzt.
 * Dies ist eine große, einfache Textdatei, die viele Variablen mit ihren Werten enthält. Im Doxygen Handbuch werden diese Variablen als "Tags" bezeichnet. Die Konfigurationsdatei und alle Tags sind im Abschnitt Konfiguration des Handbuchs ausführlich beschrieben. Du kannst die Datei mit einem beliebigen Texteditor öffnen und den Wert jedes Tags nach Bedarf bearbeiten. In der gleichen Datei kannst du Kommentare lesen, die jedes der Tags und seine Standardwerte erklären.


 * Anstatt einen Texteditor zu verwenden, kannst du starten, um viele Tags gleichzeitig zu bearbeiten. Mit dieser Schnittstelle kannst du viele Eigenschaften definieren, wie z.B. Projektinformationen, Art der Ausgabe (HTML und LaTeX), Verwendung von Graphviz zur Erstellung von Diagrammen, Warnmeldungen zur Anzeige, Dateimuster (Erweiterungen) zum Dokumentieren oder Ausschließen, Eingabefilter, optionale Kopf- und Fußzeilen für die von HTML generierten Seiten, Optionen für LaTeX-, RTF-, XML- oder Docbook-Ausgaben und viele andere Optionen.


 * Eine weitere Möglichkeit besteht darin, die Konfigurationsdatei von Grund auf neu zu erstellen und nur die Tags hinzuzufügen, die du mit einem Texteditor willst.
 * Nachdem die Konfiguration gespeichert wurde, kannst du Doxygen auf dieser Konfigurationsdatei ausführen.


 * Die generierte Dokumentation wird in einem Ordner namens } erstellt. Es wird aus vielen HTML Seiten, PNG Bildern für Grafiken, Cascading Style Sheets, Javascript-Dateien und möglicherweise vielen Unterverzeichnissen mit mehr Dateien je nach Größe Ihres Codes bestehen. Der Einstiegspunkt in die Dokumentation ist }, den du mit einem Webbrowser öffnen kannst.

Wenn du neue Klassen, Funktionen oder eine ganze neue Arbeitsbereiche schreibst, wird empfohlen, regelmäßig auszuführen, um sicherzustellen, dass die Dokumentationsblöcke Markdown und Spezielle Befehle korrekt gelesen werden und dass alle öffentlichen Funktionen vollständig dokumentiert sind. Bitte lies auch die Dokumentationshinweise im Quellcode.

Bei der Generierung der kompletten FreeCAD Dokumentation führe  nicht direkt aus. Stattdessen verwende das Projekt, um die Build Umgebung zu konfigurieren, und löst dann die Kompilierung der FreeCAD Quellen und der Doxygen Dokumentation aus; dies wird auf der Seite Quell Dokumentation erläutert.

Doxygen Auszeichnung
Alle Doxygen Befehlsdokumentation beginnt mit einem Backslash oder einem at Symbol, je nach Wunsch. Normalerweise wird der Backslash verwendet, aber gelegentlich wird der  verwendet, um die Lesbarkeit zu verbessern.

Die Befehle können ein oder mehrere Argumente haben. Im Doxygen Handbuch werden die Argumente wie folgt beschrieben.
 * Wenn Klammern verwendet werden, ist das Argument ein einzelnes Wort.
 * Wenn Klammern verwendet werden, erstreckt sich das Argument bis zum Ende der Zeile, in der der Befehl gefunden wurde.
 * Wenn  Klammern verwendet werden, verlängert sich das Argument bis zum nächsten Absatz. Absätze werden durch eine Leerzeile oder durch ein Abschnittskennzeichen begrenzt.
 * Wenn Klammern verwendet werden, ist das Argument optional.

Some of the most common keywords used in the FreeCAD documentation are presented here.
 * , see \defgroup, and Grouping.
 * , see \ingroup, and Grouping.
 * , see \addtogroup, and Grouping.
 * , see \author; indicates the author of this piece of code.
 * , see \brief; briefly describes the function.
 * , see \file; documents a source or header file.
 * , see \page; puts the information in a separate page, not directly related to one specific class, file or member.
 * , see \package; indicates documentation for a Java package (but also used with Python).
 * , see \fn; documents a function.
 * , see \var; documents a variable; it is equivalent to, , and.
 * , see \section; starts a section.
 * , see \subsection; starts a subsection.
 * , see \namespace; indicates information for a namespace.
 * , and, see \cond; defines a block to conditionally document or omit.
 * , see \a; displays the argument in italics for emphasis.
 * , see \param; indicates the parameter of a function.
 * , see \return; specifies the return value.
 * , see \sa; prints "See also".
 * , see \note; adds a paragraph to be used as a note.

Markdown Unterstützung
Seit Doxygen 1.8 wird die Markdown Syntax in Dokumentationsblöcken erkannt. Markdown ist eine minimalistische Formatierungssprache, die von einfachen Text Emails inspiriert ist, die, ähnlich wie die Wiki Syntax, einfach und lesbar sein soll, ohne komplizierten Code wie den in HTML, LaTeX oder Doxygens eigenen Befehlen zu benötigen. Markdown hat bei freier Software an Popularität gewonnen, insbesondere in Online Plattformen wie Github, da es die Erstellung von Dokumentation ohne komplizierten Code ermöglicht. Weitere Informationen finden sich im Abschnitt Markdown Support im Doxygen Handbuch. Besuche die Markdown Webseite, um mehr über den Ursprung und die Philosophie von Markdown zu erfahren.

Doxygen unterstützt einen Standardsatz von Markdown Anweisungen sowie einige Erweiterungen wie z.B. Github Markdown. Im Folgenden werden einige Beispiele für die Formatierung von Markdown vorgestellt.

Das Folgende ist Standard Markdown. {{Code|code= Hier ist der Text für einen Absatz.

Wir machen mit mehr Text in einem anderen Absatz weiter.

Dies ist eine Level 1 Kopfzeile

=
===========

Dies ist eine Level 2 Kopfzeile.

=
===========


 * 1) This is a level 1 header


 * 1) This is level 3 header #######

> This is a block quote > spanning multiple lines

- Item 1

More text for this item.

- Item 2 * nested list item. * another nested item. - Item 3

1. First item. 2. Second item.


 * single asterisks: emphasis*

_single underscores_

**double asterisks: strong emphasis**

__double underscores__

This a normal paragraph

This is a code block

We continue with a normal paragraph again.

Use the `printf` function. Inline `code`.

[The link text](http://example.net/)

![Caption text](/path/to/img.jpg)

 }}

The following are Markdown extensions. [TOC]

First Header | Second Header - | - Content Cell | Content Cell Content Cell | Content Cell

~ {.py} class Dummy: pass ~
 * 1) A class

~ {.c} int func(int a, int b) { return a*b; } ~

``` int func(int a, int b) { return a*b; } ```

Zerteilen von Dokumentationsblöcken
Der Text in einem speziellen Dokumentationsblock wird analysiert, bevor er in die HTML- und LaTeX Ausgabedateien geschrieben wird. Beim Zertilen (engl.: Parsen) finden die folgenden Schritte statt:
 * Die Markdown Formatierung wird durch entsprechendes HTML oder spezielle Befehle ersetzt.
 * Die speziellen Befehle innerhalb der Dokumentation werden ausgeführt. Siehe Abschnitt Spezielle Befehle im Handbuch für eine Erklärung der einzelnen Befehle.
 * Wenn eine Zeile mit einem Leerzeichen beginnt, gefolgt von einem oder mehreren Sternchen und dann optional mehr Leerzeichen, dann werden alle Leerzeichen und Sternchen entfernt.
 * Alle resultierenden Leerzeilen werden als Absatztrennzeichen behandelt.
 * Links werden automatisch für Wörter erstellt, die den dokumentierten Klassen oder Funktionen entsprechen. Wenn dem Wort ein Prozentsymbol vorangestellt ist, wird dieses Symbol entfernt und es wird keine Verknüpfung für das Wort erstellt.
 * Links werden erstellt, wenn bestimmte Muster im Text gefunden werden. Weitere Informationen finden Sie im Abschnitt Automatische Linkerzeugung im Handbuch.
 * HTML-Tags, die sich in der Dokumentation befinden, werden interpretiert und für die LaTeX Ausgabe in LaTeX Äquivalente umgewandelt. Siehe den Abschnitt HTML-Befehle im Handbuch für eine Erklärung der einzelnen unterstützten HTML-Tags.

Doxygen mit Python Code
Doxygen funktioniert am besten für statisch typisierte Sprachen wie C++. Es kann aber auch eine Dokumentation für Python-Dateien erstellen.

Es gibt zwei Möglichkeiten, Dokumentationsblöcke für Python zu schreiben:
 * 1) Der pythonische Weg, mit "docstrings", d.h. ein Textblock, der von   unmittelbar nach der Klassen- oder Funktionsdefinition umgeben ist.
 * 2) Der Doxygen Weg, bei dem Kommentare vor die Klassen- oder Funktionsdefinition gestellt werden; in diesem Fall werden doppelte Hash-Zeichen  verwendet, um den Dokumentationsblock zu starten, und dann kann ein einzelnes Hash Zeichen in nachfolgenden Zeilen verwendet werden.

Hinweis:
 * Die erste Option wird bevorzugt, um PEP8, PEP257 und die meisten Stilrichtlinien für das Schreiben von Python zu erfüllen (siehe 1, 2). Es wird empfohlen, diesen Stil zu verwenden, wenn du beabsichtigst, dokumentierte Quellen mit Sphinx zu erzeugen, einem sehr gebräuchlichen Werkzeug zur Dokumentation von Python Code. Wenn Du diesen Stil verwendest, kann Doxygen die Kommentare wörtlich extrahieren, aber spezielle Doxygen Befehle, die mit oder  beginnen, funktionieren nicht.
 * Die zweite Option ist nicht der traditionelle Python Stil, aber sie erlaubt es Dir, die speziellen Befehle von Doxygen wie und  zu verwenden.

Erster Stil: Pythonische Dokumentation
Im folgenden Beispiel steht am Anfang eine docstring, um den allgemeinen Inhalt dieses Moduls (Datei) zu erklären. Dann erscheinen docstrings innerhalb der Funktions-, Klassen- und Klassenmethodendefinitionen. Auf diese Weise extrahiert Doxygen die Kommentare und präsentiert sie so, wie sie sind, ohne Änderungen.

Zweiter Stil: Dokumentationsblock vor dem Code
Im folgenden Beispiel beginnen die Dokumentationsblöcke mit doppelten Hashzeichen. Am Anfang erscheint eine, um den allgemeinen Inhalt dieses Moduls (Datei) zu erklären. Dann gibt es Blöcke vor den Definitionen von Funktions-, Klassen- und Klassenmethoden, und es gibt einen Block nach einer Klassenvariablen. Auf diese Weise extrahiert Doxygen die Dokumentation, erkennt die speziellen Befehle, , und und formatiert den Text entsprechend.

Zusammenstellung der Dokumentation
Compilation of documentation proceeds the same as for C++ sources. If both Python files, and, with distinct commenting style are in the same directory, both will be processed.

The documentation should show similar information to the following, and create appropriate links to the individual modules and classes.

Umwandlung des pythonischen Stils in den Doxygen Stil
Im vorherigen Beispiel zeigt die Python Datei, die in einem Doxygen Stil kommentiert wird, detailliertere Informationen und Formatierungen für ihre Klassen, Funktionen und Variablen. Der Grund dafür ist, dass dieser Stil es Doxygen erlaubt, die speziellen Befehle zu extrahieren, die mit oder  beginnen, während der Pythonischer Stil dies nicht tut. Daher wäre es wünschenswert, den pythonischen Stil in den Doxygen Stil zu konvertieren, bevor die Dokumentation erstellt wird. Dies ist mit einem zusätzlichen Python-Programm namens doxypypy möglich. Dieses Programm ist inspiriert von einem älteren Programm namens doxypy, das den Python  nehmen und in die Doxygen Kommentarblöcke konvertieren würde, die mit einem Doppelhash  beginnen. Doxypypy geht noch weiter, da es die docstrings analysiert und interessante Elemente wie Variablen und Argumente extrahiert und sogar Doktests (Beispielcode in den docstrings).

Doxypypy kann mit, dem Installationsprogramm für Python Pakete, installiert werden.

If the command is used without the  option, it will require superuser (root) privileges to install the package, but this is not needed in most cases; use root permissions only if you are certain the package won't collide with your distribution provided packages.

If the package was installed as a user, it may reside in your home directory, for example, in. If this directory is not in your system's, the program will not be found. Therefore, add the directory to the variable, either in your  file, or in your  file.

Alternatively, you can create a symbolic link to the program, placing the link in a directory that is already included in the.

Once the program is installed, and accessible from the terminal, a Python file with Pythonic docstrings can be reformatted to Doxygen style with the following instructions. The program outputs the reformatted code to standard output, so redirect this output to a new file.

The original file has a comment at the top  that indicates the module or namespace that is being described by the file. This keyword is not interpreted when using triple quotes in the comment block.

In the new file the commenting style is changed so the line becomes, which now will be interpreted by Doxygen. However, to be interpreted correctly, the argument has to be edited manually to match the new module (file) name; after doing this the line should be.

(the top is manually edited, the rest stays the same)

To compile, create the configuration, and run in the toplevel directory that contains the files.

The documentation should show similar information to the following, and create appropriate links to the individual modules.

Fliegendes konvertieren des Kommentarstils
Im vorherigen Beispiel wurde die Konvertierung der Dokumentationsblöcke manuell mit nur einer Quelldatei durchgeführt. Im Idealfall soll diese Konvertierung automatisch, fliegend, mit einer beliebigen Anzahl von Python Dateien erfolgen. Dazu muss die Doxygen Konfiguration entsprechend angepasst werden.

Verwende zunächst nicht direkt das Programm, sondern erstelle die Konfigurationsdatei mit , bearbeite dann die erstellte und ändere das folgende Tag.

Was dies bewirkt, ist, dass Dateien, die dem Muster entsprechen, alle Dateien mit einer Erweiterung, die auf endet, das Programm  durchlaufen. Jedes Mal, wenn Doxygen auf eine solche Datei im Quellbaum trifft, wird der Dateiname als erstes Argument an dieses Programm übergeben.

Das Programm ist standardmäßig nicht vorhanden; es sollte als Shell Skript erstellt werden, um  mit den entsprechenden Optionen auszuführen und eine Datei als erstes Argument zu verwenden.

After saving this shell script, make sure it has execute permissions, and that it is located in a directory contained in your system's.

On Windows systems, a batch file can be used in a similar way.

With this configuration done, the command can be run to generate the documentation as usual. Every Python file using Pythonic  will be reformatted on the fly to use  style comments, and then will be processed by Doxygen, which now will be able to interpret the special commands and Mardown syntax. The original source code won't be modified, and no temporary file with a different name needs to be created as in the previous section; therefore, if a instruction is found, it doesn't need to be changed manually.

Note that existing Python files which already use the style for their comment blocks won't be affected by the  filter, and will be processed by Doxygen normally.



Python Code Qualitätsprüfung
Um die automatische Konvertierung von Dokumentationsblöcken nutzen zu können, ist es wichtig, dass die originalen Python Quellen korrekt geschrieben sind und den pythonischen Richtlinien in PEP8 und PEP257 entsprechen. Schlampig geschriebener Code führt dazu, dass bei der Verarbeitung der Datei fehlschlägt, so dass Doxygen die Dokumentation nicht korrekt formatieren kann.

The following commenting styles will not allow parsing of the docstrings by, so they should be avoided.

Always use triple quotes for the docstrings, and make sure they immediately follow the class or function declaration.

It is also a good idea to verify the quality of your Python code with a tool such as flake8 (Gitlab). Flake8 primarily combines three tools, Pyflakes, Pycodestyle (formerly pep8), and the McCabe complexity checker, in order to enforce proper Pythonic style.

To check all files inside a source tree use.

If the project demands it, some code checks deemed too strict can be ignored. The error codes can be consulted in the Pycodestyle documentation.

In similar way, a program that primarily checks that comments comply with PEP257 is Pydocstyle. The error codes can be consulted in the Pydocstyle documentation.

Also use it with to perform docstring checks on all source files.

Quelldokumentation mit Sphinx
Sphinx is the most popular system to document Python source code. However, since FreeCAD's core functions and workbenches are written in C++ it was deemed that Doxygen is a better documentation tool for this project.

While Sphinx can natively parse Python docstrings, it requires a bit more work to parse C++ sources. The Breathe (Github) project is an attempt at bridging the gap between Sphinx and Doxygen, in order to integrate both Python and C++ source code documentation in the same system. First, Doxygen needs to be configured to output an XML file; the XML output is then read by Breathe, and converted to suitable input for Sphinx.

See the Quick start guide in the Breathe documentation to know more about this process.

See this answer in Stackoverflow for other alternatives to documenting C++ and Python code together in the same project.