You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
582 lines
32 KiB
ReStructuredText
582 lines
32 KiB
ReStructuredText
.. _contributing_documentation:
|
|
|
|
**************************
|
|
Contributing Documentation
|
|
**************************
|
|
|
|
This is the documentation for the core processing elements and utilities that make up the |scname| system.
|
|
It aims to document the configuration and command line options for
|
|
|scname| in multiple formats (HTML, man, PDF, ePub etc) in a
|
|
consistent way. The functionality of |scname| differs between
|
|
versions so the documentation is versioned along with |scname|.
|
|
For more general topics and tutorials please refer to the
|
|
`SeisComP wiki`_.
|
|
|
|
The documentation is written in `reStructuredText`_ (reST) a
|
|
simple text mark up format. The documentation is generated using `Sphinx`_
|
|
which is used to create the `Python documentation`_.
|
|
The Sphinx website has a very good
|
|
`introduction to reST`_ and also covers the Sphinx specific
|
|
`directives`_.
|
|
|
|
If you would like to add to this documentation or you find an error, then please
|
|
submit a patch to `SeisComP on GitHub`_ or report to the
|
|
SeisComP `discussion forum`_.
|
|
|
|
.. note::
|
|
|
|
Please understand the :ref:`documentation style guide <documentation_style_guide>`
|
|
before contributing documentation.
|
|
|
|
If you view the HTML version of the documentation in a browser,
|
|
then you can use the *Show Source* link on each page to view the reST
|
|
source. The source and the documentation files for executables (see below) are
|
|
good starting points for a new patch.
|
|
|
|
Documenting Executables
|
|
=======================
|
|
|
|
The documentation for executables is generated from two sources:
|
|
|
|
'executable'.xml
|
|
An XML file that contains a brief description of the command,
|
|
markup describing the command line parameters, and any
|
|
configuration parameters for the executable. Each parameter should
|
|
have a brief description of the purpose of the parameter.
|
|
|
|
The description should be plain text and not contain reST markup. Where parameters are common across
|
|
a number of executables they should be placed in the appropriate common file and referred to using
|
|
their publicID.
|
|
|
|
All XML files live in the :file:`doc/apps` directory of the source
|
|
distribution or in :file:`etc/descriptions` of an installation.
|
|
|
|
'executable'.rst
|
|
This is a text file in reST markup that gives any more-detailed description and examples for the executable.
|
|
It is combined with the corresponding .xml to create the full documentation.
|
|
The first entry in the file should be a paragraph giving a more
|
|
detailed description of the executable.
|
|
|
|
These two files should be placed in a :file:`descriptions` sub-directory of the
|
|
respective module, e.g. :file:`src/seedlink/apps/seedlink/descriptions/seedlink.rst`.
|
|
The intention is that the documentation is close to the code to make it easier for developers to keep the
|
|
documentation up to date with code changes.
|
|
|
|
For a new executable an entry should also be made in the man section of :file:`conf.py`.
|
|
The man page is a short form of the documentation that is generated from only the .xml file.
|
|
|
|
|
|
Images
|
|
======
|
|
|
|
Any images should be placed in a suitable sub-directory of :file:`descriptions/media`.
|
|
Read the :ref:`documentation on image styles <documentation_style_guide_image>` for more details.
|
|
The images can then be referred to (in .rst) like::
|
|
|
|
.. figure:: media/scolv/scolv-overview.png
|
|
:width: 16cm
|
|
:align: center
|
|
|
|
Overview of the defrobnicator switches in :ref:`scolv`.
|
|
|
|
The images will be moved to the correct location during the documentation build.
|
|
|
|
|
|
Understanding the XML
|
|
=====================
|
|
|
|
As mentioned before XML is used to generate brief descriptions of the configuration and command line parameters.
|
|
This section describes the XML format.
|
|
|
|
Any description XML uses the root element *seiscomp*:
|
|
|
|
.. code-block:: xml
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<seiscomp>
|
|
...
|
|
</seiscomp>
|
|
|
|
Three elements are used inside the root element: :ref:`module<xml-module>`, :ref:`plugin<xml-plugin>` and :ref:`binding<xml-binding>`.
|
|
Modules, plugins and bindings can be described in one XML or split up into one file per description. It is better to
|
|
have things as close as possible. A module and its binding should go into one module.XML whereas plugins should
|
|
go into separate XML files.
|
|
|
|
|
|
.. _xml-module:
|
|
|
|
Module
|
|
------
|
|
|
|
A template for a description XML file can be found in :file:`doc/templates/app.xml`.
|
|
|
|
The XML file describes the |scname| :term:`module` with the configuration and command-line parameters.
|
|
|
|
Element: **module**
|
|
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+=============================+==========+===========+===============================================+
|
|
| **name** | attrib | yes | The name of the module. This name must be |
|
|
| | | | unique among all available modules. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| **category** | attrib | no | The category of the module. It is used by the |
|
|
| | | | configurator to group modules and by the |
|
|
| | | | documentation generator to create the final |
|
|
| | | | document structure. The category can contain |
|
|
| | | | slashes to introduce hierarchies. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| **standalone** | attrib | no | The standalone attribute is also optional and |
|
|
| | | | by default false. Standalone means that the |
|
|
| | | | module does not take the global configuration |
|
|
| | | | files (e.g. :file:`etc/global.cfg`) into |
|
|
| | | | account. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| **inherit-global-bindings** | attrib | no | If global bindings are inherited. The default |
|
|
| | | | is 'false'. If 'yes', then all parameters of |
|
|
| | | | the global binding are also available in |
|
|
| | | | the module binding to allow overwriting them. |
|
|
| | | | Standalone modules will never inherit global |
|
|
| | | | bindings regardless the value of this |
|
|
| | | | attribute. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| **description** | element | no | A short description of the module. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| **configuration** | element | no | The available configuration parameters. See |
|
|
| | | | element |
|
|
| | | | :ref:`configuration<xml-configuration>`. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
| **command-line** | element | no | The available command-line options. See |
|
|
| | | | element |
|
|
| | | | :ref:`command-line<xml-command-line>`. |
|
|
+-----------------------------+----------+-----------+-----------------------------------------------+
|
|
|
|
It follows a simple example of how a module definition looks like.
|
|
|
|
.. code-block:: xml
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<seiscomp>
|
|
<module name="scevent" category="Modules/Processing">
|
|
<description>
|
|
Associates an Origin to an Event or forms a new Event if no match
|
|
is found. Selects the preferred magnitude.
|
|
</description>
|
|
<configuration/>
|
|
<command-line/>
|
|
</module>
|
|
</seiscomp>
|
|
|
|
|
|
.. _xml-plugin:
|
|
|
|
Plugin
|
|
------
|
|
|
|
A template for a description XML file can be found in :file:`doc/templates/plugin.xml`.
|
|
|
|
The XML file describes the |scname| :term:`plugin` with the configuration and command-line parameters. This is most likely the
|
|
case when an application loads dynamically shared libraries also called plugins.
|
|
|
|
Element: **plugin**
|
|
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+===================+==========+===========+===============================================+
|
|
| **name** | attrib | yes | The name of the plugin. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| **extends** | element | yes | The list of names of module names that |
|
|
| | | | the plugin extends, separated by commas. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| **description** | element | no | A short description of the plugin. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| **configuration** | element | no | The available configuration parameters. See |
|
|
| | | | element |
|
|
| | | | :ref:`configuration<xml-configuration>`. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
|
|
Below is a simple example of how a plugin definition appears in XML.
|
|
|
|
.. code-block:: xml
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<seiscomp>
|
|
<plugin name="NonLinLoc">
|
|
<extends>global</extends>
|
|
<description>
|
|
NonLinLoc locator wrapper plugin for SeisComP.
|
|
NonLinLoc was written by Anthony Lomax (http://alomax.free.fr/nlloc).
|
|
</description>
|
|
<configuration/>
|
|
<command-line/>
|
|
</plugin>
|
|
</seiscomp>
|
|
|
|
|
|
.. _xml-binding:
|
|
|
|
Binding
|
|
-------
|
|
|
|
A binding template can be found in :file:`doc/templates/binding.xml`.
|
|
|
|
It describes the set of configuration parameters to configure a station for a module.
|
|
|
|
Element: **binding**
|
|
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+===================+==========+===========+===============================================+
|
|
| **module** | attrib | yes | The name of the module this binding belongs |
|
|
| | | | to. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| **description** | element | no | A short description of the binding. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
| **configuration** | element | no | The available configuration parameters. See |
|
|
| | | | element |
|
|
| | | | :ref:`configuration<xml-configuration>`. |
|
|
+-------------------+----------+-----------+-----------------------------------------------+
|
|
|
|
Below is an example of how a simple binding definition appears as XML.
|
|
|
|
.. code-block:: xml
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<seiscomp>
|
|
<binding module="seedlink">
|
|
<description>
|
|
Configures sources and parameters of a SeedLink station.
|
|
</description>
|
|
<configuration/>
|
|
</binding>
|
|
</seiscomp>
|
|
|
|
|
|
.. _xml-configuration:
|
|
|
|
Configuration
|
|
-------------
|
|
|
|
This element is used to describe the configuration parameters (not command-line, just
|
|
configuration file) of a module, binding and plugin.
|
|
|
|
Element: **configuration**
|
|
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+===================+==========+===========+===================================================+
|
|
| **parameter** | element | no | A top level parameter that does not contain |
|
|
| | | | dots in the configuration file. |
|
|
| | | | |
|
|
| | | | .. code-block:: sh |
|
|
| | | | |
|
|
| | | | param = value |
|
|
| | | | group.param = "another value" |
|
|
| | | | |
|
|
| | | | Here ``param`` is a top level parameter |
|
|
| | | | whereas ``group.param`` is not. See |
|
|
| | | | :ref:`parameter<xml-configuration-parameter>`. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **struct** | element | no | A top level structure definition. Structures |
|
|
| | | | are different from groups and parameters |
|
|
| | | | as they can be instantiated by an arbitrary |
|
|
| | | | name. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **group** | element | no | A parameter group that describes a logical |
|
|
| | | | grouping of parameters also called "scope" or |
|
|
| | | | "namespace". If a parameter in the |
|
|
| | | | configuration file contains dots, then only |
|
|
| | | | the last part is a parameter all others are |
|
|
| | | | groups. |
|
|
| | | | |
|
|
| | | | .. code-block:: sh |
|
|
| | | | |
|
|
| | | | group1.group2.param = value |
|
|
| | | | |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
|
|
|
|
.. _xml-configuration-parameter:
|
|
|
|
Element: **parameter**
|
|
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+===================+==========+===========+===================================================+
|
|
| **name** | attrib | yes | The name of the parameter. This name must be |
|
|
| | | | unique among all parameters of the same |
|
|
| | | | level. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **type** | attrib | no | An optional description of the parameter |
|
|
| | | | type which can be interpreted by a |
|
|
| | | | configurator to provide specialized input |
|
|
| | | | widgets. It is also important for the user |
|
|
| | | | how the parameter is read by the module. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **unit** | attrib | no | An optional unit such as "s" or "km" or |
|
|
| | | | "deg". |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **default** | attrib | no | The default value the module uses if this |
|
|
| | | | parameter is not configured. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **description** | element | no | Gives a brief description of the parameter. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
|
|
.. _xml-configuration-struct:
|
|
|
|
Element: **struct**
|
|
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+===================+==========+===========+===================================================+
|
|
| **type** | attrib | yes | The name of the struct type. This name is |
|
|
| | | | used in a configurator to give a selection |
|
|
| | | | of available types to be instantiated. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **link** | attrib | no | The absolute reference parameter as it would |
|
|
| | | | appear in the configuration file which |
|
|
| | | | holds all instantiated structures. |
|
|
| | | | |
|
|
| | | | .. code-block:: sh |
|
|
| | | | |
|
|
| | | | # 'link' parameter holding all available |
|
|
| | | | # structures. "local" and "teleseismic" |
|
|
| | | | # are instances of a structure defined |
|
|
| | | | # below. |
|
|
| | | | locator.profiles = local, teleseismic |
|
|
| | | | |
|
|
| | | | # The structure defined in locator.profile |
|
|
| | | | # would have "locator.profiles" as link |
|
|
| | | | # attribute. |
|
|
| | | | locator.profile.local.param = value |
|
|
| | | | locator.profile.teleseismic.param = value |
|
|
| | | | |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **description** | element | no | Gives a brief description of the parameter. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **parameter** | element | no | Describes a parameter in the struct. See |
|
|
| | | | :ref:`parameter<xml-configuration-parameter>`. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **struct** | element | no | Describes a struct part of this struct. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **group** | element | no | Describes a group part of this struct. See |
|
|
| | | | :ref:`group<xml-configuration-group>`. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
|
|
|
|
|
|
.. _xml-configuration-group:
|
|
|
|
Element: **group**
|
|
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+===================+==========+===========+===================================================+
|
|
| **name** | attrib | yes | The name of the group. This name must be |
|
|
| | | | unique among all groups of the same level. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **description** | element | no | Gives a brief description of the parameter. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **parameter** | element | no | Describes a parameter in the group. See |
|
|
| | | | :ref:`parameter<xml-configuration-parameter>`. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **struct** | element | no | Describes a struct part of this group. See |
|
|
| | | | :ref:`struct<xml-configuration-struct>`. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
| **group** | element | no | Describes a group part of this group. |
|
|
+-------------------+----------+-----------+---------------------------------------------------+
|
|
|
|
|
|
Below is an example of the plugin definition for the NonLinLoc plugin. It contains
|
|
groups, parameters and structures.
|
|
|
|
.. code-block:: xml
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<seiscomp>
|
|
<plugin name="NonLinLoc">
|
|
<extends>global</extends>
|
|
<description>...</description>
|
|
<configuration>
|
|
<group name="NonLinLoc">
|
|
<parameter name="publicID" type="string"
|
|
default="NLL.@time/%Y%m%d%H%M%S.%f@.@id@">
|
|
<description>
|
|
PublicID creation pattern for an origin created by NonLinLoc.
|
|
</description>
|
|
</parameter>
|
|
|
|
<parameter name="outputPath" type="path" default="/tmp/sc3.nll">
|
|
<description>
|
|
Defines the output path for all native NonLinLoc input and
|
|
output files.
|
|
</description>
|
|
</parameter>
|
|
|
|
<parameter name="profiles" type="list:string">
|
|
<description>
|
|
Defines a list of active profiles to be used by the plugin.
|
|
</description>
|
|
</parameter>
|
|
|
|
<group name="profile">
|
|
<struct type="NonLinLoc profile" link = "NonLinLoc.profiles">
|
|
<description>
|
|
Defines a regional profile that is used if a prelocation falls
|
|
inside the configured region.
|
|
</description>
|
|
<parameter name="earthModelID" type="string">
|
|
<description>
|
|
earthModelID that is stored in the created origin.
|
|
</description>
|
|
</parameter>
|
|
</struct>
|
|
</group>
|
|
</group>
|
|
</configuration>
|
|
</plugin>
|
|
</seiscomp>
|
|
|
|
|
|
|
|
.. _xml-command-line:
|
|
|
|
Command-line
|
|
------------
|
|
|
|
This element is used to describe the command-line options of a module. The element structure is
|
|
much simpler than the :ref:`configuration<xml-configuration>` element. The command-line only
|
|
contains group elements which in turn have either option or optionReference elements. Through
|
|
the optionReference element it is possible to refer to existing command-line options. This is
|
|
important for all modules that are using the |scname| libraries because they share a set of
|
|
basic command-line options inherited from the Application class.
|
|
|
|
Element: **command-line**
|
|
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+=====================+==========+===========+===============================================+
|
|
| **synopsis** | element | no | Optional description of how to start the |
|
|
| | | | module. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **description** | element | no | Optional description of the command-line |
|
|
| | | | and non option parameters. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **group** | element | no | Describes an option group. See |
|
|
| | | | :ref:`group<xml-command-line-group>`. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
|
|
|
|
.. _xml-command-line-group:
|
|
|
|
Element: **group**
|
|
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+=====================+==========+===========+===============================================+
|
|
| **name** | attrib | yes | The name of the group. This name must be |
|
|
| | | | unique among all groups of the same level. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **option** | element | no | An option part of this group. See |
|
|
| | | | :ref:`option<xml-command-line-option>`. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **optionReference** | element | no | A reference to an existing option using its |
|
|
| | | | publicID. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
|
|
|
|
.. _xml-command-line-option:
|
|
|
|
Element: **option**
|
|
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| Name | XML type | Mandatory | Description |
|
|
+=====================+==========+===========+===============================================+
|
|
| **flag** | attrib | semi | The short option flag. Either this attribute |
|
|
| | | | or long-flag must be set. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **long-flag** | attrib | semi | The long option flag. Either this attribute |
|
|
| | | | or flag must be set. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **param-ref** | attrib | no | Refers to a configuration parameter name that |
|
|
| | | | this parameter overrides. Name is the full |
|
|
| | | | path, e.g. *connection.server* and not just |
|
|
| | | | *server*. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **argument** | attrib | no | The optional argument string. If argument is |
|
|
| | | | not set, the option is a switch. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **default** | attrib | no | The option's default value used if the option |
|
|
| | | | is not given though it is hard in most cases |
|
|
| | | | because command-line options very often |
|
|
| | | | redefine configuration parameters which is |
|
|
| | | | then used as a default value for the option. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **publicID** | attrib | no | The optional publicID of the option to be |
|
|
| | | | able to reference it from an optionReference |
|
|
| | | | element. The publicID must be unique among |
|
|
| | | | all defined options. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
| **description** | element | no | Gives a brief description of the option. |
|
|
+---------------------+----------+-----------+-----------------------------------------------+
|
|
|
|
|
|
Below is an example of the module definition for :program:`scautoloc` (extract).
|
|
|
|
.. code-block:: xml
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<seiscomp>
|
|
<module name="scautoloc" category="Modules/Processing">
|
|
<description>Locates seismic events.</description>
|
|
<configuration>
|
|
...
|
|
</configuration>
|
|
<command-line>
|
|
<group name="Generic">
|
|
<optionReference>generic#help</optionReference>
|
|
<optionReference>generic#version</optionReference>
|
|
<optionReference>generic#config-file</optionReference>
|
|
<optionReference>generic#plugins</optionReference>
|
|
<optionReference>generic#daemon</optionReference>
|
|
<optionReference>generic#auto-shutdown</optionReference>
|
|
<optionReference>generic#shutdown-master-module</optionReference>
|
|
<optionReference>generic#shutdown-master-username</optionReference>
|
|
</group>
|
|
|
|
<group name="Mode">
|
|
<option flag="" long-flag="test" argument="" default="">
|
|
<description>Do not send any object</description>
|
|
</option>
|
|
|
|
<option flag="" long-flag="offline" argument="" default="">
|
|
<description>
|
|
Do not connect to a messaging server. Instead a
|
|
station-locations.conf file can be provided. This implies
|
|
--test and --playback
|
|
</description>
|
|
</option>
|
|
|
|
<option flag="" long-flag="playback" argument="" default="">
|
|
<description>Flush origins immediately without delay</description>
|
|
</option>
|
|
</group>
|
|
</command-line>
|
|
</module>
|
|
</seiscomp>
|
|
|
|
|
|
References
|
|
==========
|
|
|
|
.. target-notes::
|
|
|
|
.. _`SeisComP wiki` : https://www.seiscomp.de/
|
|
.. _`reStructuredText` : https://docutils.sourceforge.io/rst.html
|
|
.. _`Sphinx` : https://www.sphinx-doc.org/
|
|
.. _`Python documentation` : https://docs.python.org/
|
|
.. _`introduction to reST` : https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html
|
|
.. _`directives` : https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html
|
|
.. _`SeisComP on GitHub` : https://github.com/SeisComP
|
|
.. _`discussion forum` : https://forum.seiscomp.de
|