1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438 |
- .. _reST primer:
- ===========
- reST primer
- ===========
- .. sidebar:: KISS_ and readability_
- Instead of defining more and more roles, we at searx encourage our
- contributors to follow principles like KISS_ and readability_.
- We at searx are using reStructuredText (aka reST_) markup for all kind of
- documentation, with the builders from the Sphinx_ project a HTML output is
- generated and deployed at :docs:`github.io <.>`. For build prerequisites read
- :ref:`docs build`.
- The source files of Searx's documentation are located at :origin:`docs`. Sphinx
- assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
- <make docs-live>` to build HTML while editing.
- .. sidebar:: Further reading
- - Sphinx-Primer_
- - `Sphinx markup constructs`_
- - reST_, docutils_, `docutils FAQ`_
- - Sphinx_, `sphinx-doc FAQ`_
- - `sphinx config`_, doctree_
- - `sphinx cross references`_
- - linuxdoc_
- - intersphinx_
- - sphinx-jinja_
- - `Sphinx's autodoc`_
- - `Sphinx's Python domain`_, `Sphinx's C domain`_
- - SVG_, ImageMagick_
- - DOT_, `Graphviz's dot`_, Graphviz_
- .. contents:: Contents
- :depth: 3
- :local:
- :backlinks: entry
- Sphinx_ and reST_ have their place in the python ecosystem. Over that reST is
- used in popular projects, e.g the Linux kernel documentation `[kernel doc]`_.
- .. _[kernel doc]: https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html
- .. sidebar:: Content matters
- The readability_ of the reST sources has its value, therefore we recommend to
- make sparse usage of reST markup / .. content matters!
- **reST** is a plaintext markup language, its markup is *mostly* intuitive and
- you will not need to learn much to produce well formed articles with. I use the
- word *mostly*: like everything in live, reST has its advantages and
- disadvantages, some markups feel a bit grumpy (especially if you are used to
- other plaintext markups).
- Soft skills
- ===========
- Before going any deeper into the markup let's face on some **soft skills** a
- trained author brings with, to reach a well feedback from readers:
- - Documentation is dedicated to an audience and answers questions from the
- audience point of view.
- - Don't detail things which are general knowledge from the audience point of
- view.
- - Limit the subject, use cross links for any further reading.
- To be more concrete what a *point of view* means. In the (:origin:`docs`)
- folder we have three sections (and the *blog* folder), each dedicate to a
- different group of audience.
- User's POV: :origin:`docs/user`
- A typical user knows about search engines and might have heard about
- meta crawlers and privacy.
- Admin's POV: :origin:`docs/admin`
- A typical Admin knows about setting up services on a linux system, but he does
- not know all the pros and cons of a searx setup.
- Developer's POV: :origin:`docs/dev`
- Depending on the readability_ of code, a typical developer is able to read and
- understand source code. Describe what a item aims to do (e.g. a function).
- If the chronological order matters, describe it. Name the *out-of-limits
- conditions* and all the side effects a external developer will not know.
- .. _reST inline markup:
- Basic inline markup
- ===================
- .. sidebar:: Inline markup
- - :ref:`reST roles`
- - :ref:`reST smart ref`
- Basic inline markup is done with asterisks and backquotes. If asterisks or
- backquotes appear in running text and could be confused with inline markup
- delimiters, they have to be escaped with a backslash (``\*pointer``).
- .. table:: basic inline markup
- :widths: 4 3 7
- ================================================ ==================== ========================
- description rendered markup
- ================================================ ==================== ========================
- one asterisk for emphasis *italics* ``*italics*``
- two asterisks for strong emphasis **boldface** ``**boldface**``
- backquotes for code samples and literals ``foo()`` ````foo()````
- quote asterisks or backquotes \*foo is a pointer ``\*foo is a pointer``
- ================================================ ==================== ========================
- .. _reST basic structure:
- Basic article structure
- =======================
- The basic structure of an article makes use of heading adornments to markup
- chapter, sections and subsections.
- .. _reST template:
- reST template
- -------------
- reST template for an simple article:
- .. code:: reST
- .. _doc refname:
- ==============
- Document title
- ==============
- Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
- :ref:`chapter refname`.
- .. _chapter refname:
- Chapter
- =======
- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
- aliquid ex ea commodi consequat ...
- .. _section refname:
- Section
- -------
- lorem ..
- .. _subsection refname:
- Subsection
- ~~~~~~~~~~
- lorem ..
- Headings
- --------
- #. title - with overline for document title:
- .. code:: reST
- ==============
- Document title
- ==============
- #. chapter - with anchor named ``anchor name``:
- .. code:: reST
- .. _anchor name:
- Chapter
- =======
- #. section
- .. code:: reST
- Section
- -------
- #. subsection
- .. code:: reST
- Subsection
- ~~~~~~~~~~
- Anchors & Links
- ===============
- .. _reST anchor:
- Anchors
- -------
- .. _ref role:
- https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
- To refer a point in the documentation a anchor is needed. The :ref:`reST
- template <reST template>` shows an example where a chapter titled *"Chapters"*
- gets an anchor named ``chapter title``. Another example from *this* document,
- where the anchor named ``reST anchor``:
- .. code:: reST
- .. _reST anchor:
- Anchors
- -------
- To refer a point in the documentation a anchor is needed ...
- To refer anchors use the `ref role`_ markup:
- .. code:: reST
- Visit chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
- bar <reST anchor>`.
- .. admonition:: ``:ref:`` role
- :class: rst-example
- Visist chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
- bar <reST anchor>`.
- .. _reST ordinary ref:
- Link ordinary URL
- -----------------
- If you need to reference external URLs use *named* hyperlinks to maintain
- readability of reST sources. Here is a example taken from *this* article:
- .. code:: reST
- .. _Sphinx Field Lists:
- https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
- With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
- readable.
- And this shows the alternative (less readable) hyperlink markup `Sphinx Field
- Lists
- <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
- .. admonition:: Named hyperlink
- :class: rst-example
- With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
- readable.
- And this shows the alternative (less readable) hyperlink markup `Sphinx Field
- Lists
- <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
- .. _reST smart ref:
- Smart refs
- ----------
- With the power of sphinx.ext.extlinks_ and intersphinx_ referencing external
- content becomes smart.
- .. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
- :widths: 4 3 7
- ========================== ================================== ====================================
- refer ... rendered example markup
- ========================== ================================== ====================================
- :rst:role:`rfc` :rfc:`822` ``:rfc:`822```
- :rst:role:`pep` :pep:`8` ``:pep:`8```
- sphinx.ext.extlinks_
- --------------------------------------------------------------------------------------------------
- project's wiki article :wiki:`Offline-engines` ``:wiki:`Offline-engines```
- to docs public URL :docs:`dev/reST.html` ``:docs:`dev/reST.html```
- files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
- pull request :pull:`1756` ``:pull:`1756```
- patch :patch:`af2cae6` ``:patch:`af2cae6```
- PyPi package :pypi:`searx` ``:pypi:`searx```
- manual page man :man:`bash` ``:man:`bash```
- intersphinx_
- --------------------------------------------------------------------------------------------------
- external anchor :ref:`python:and` ``:ref:`python:and```
- external doc anchor :doc:`jinja:templates` ``:doc:`jinja:templates```
- python code object :py:obj:`datetime.datetime` ``:py:obj:`datetime.datetime```
- flask code object :py:obj:`flask.Flask` ``:py:obj:`flask.Flask```
- ========================== ================================== ====================================
- Intersphinx is configured in :origin:`docs/conf.py`:
- .. code:: python
- intersphinx_mapping = {
- "python": ("https://docs.python.org/3/", None),
- "flask": ("https://flask.palletsprojects.com/", None),
- "jinja": ("https://jinja.palletsprojects.com/", None),
- "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
- "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
- }
- To list all anchors of the inventory (e.g. ``python``) use:
- .. code:: sh
- $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
- ...
- $ python -m sphinx.ext.intersphinx https://searx.github.io/searx/objects.inv
- ...
- Literal blocks
- ==============
- The simplest form of :duref:`literal-blocks` is a indented block introduced by
- two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
- code` directive. To include literals from external files use
- :rst:dir:`literalinclude` or :ref:`kernel-include <kernel-include-directive>`
- directive (latter one expands environment variables in the path name).
- .. _reST literal:
- ``::``
- ------
- .. code:: reST
- ::
- Literal block
- Lorem ipsum dolor::
- Literal block
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
- eirmod tempor invidunt ut labore ::
- Literal block
- .. admonition:: Literal block
- :class: rst-example
- ::
- Literal block
- Lorem ipsum dolor::
- Literal block
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
- eirmod tempor invidunt ut labore ::
- Literal block
- .. _reST code:
- ``code-block``
- --------------
- .. _pygments: https://pygments.org/languages/
- .. sidebar:: Syntax highlighting
- is handled by pygments_.
- The :rst:dir:`code-block` directive is a variant of the :dudir:`code` directive
- with additional options. To learn more about code literals visit
- :ref:`sphinx:code-examples`.
- .. code-block:: reST
- The URL ``/stats`` handle is shown in :ref:`stats-handle`
- .. code-block:: Python
- :caption: python code block
- :name: stats-handle
- @app.route('/stats', methods=['GET'])
- def stats():
- """Render engine statistics page."""
- stats = get_engines_stats()
- return render(
- 'stats.html'
- , stats = stats )
- .. code-block:: reST
- .. admonition:: Code block
- :class: rst-example
- The URL ``/stats`` handle is shown in :ref:`stats-handle`
- .. code-block:: Python
- :caption: python code block
- :name: stats-handle
- @app.route('/stats', methods=['GET'])
- def stats():
- """Render engine statistics page."""
- stats = get_engines_stats()
- return render(
- 'stats.html'
- , stats = stats )
- Unicode substitution
- ====================
- The :dudir:`unicode directive <unicode-character-codes>` converts Unicode
- character codes (numerical values) to characters. This directive can only be
- used within a substitution definition.
- .. code-block:: reST
- .. |copy| unicode:: 0xA9 .. copyright sign
- .. |(TM)| unicode:: U+2122
- Trademark |(TM)| and copyright |copy| glyphs.
- .. admonition:: Unicode
- :class: rst-example
- .. |copy| unicode:: 0xA9 .. copyright sign
- .. |(TM)| unicode:: U+2122
- Trademark |(TM)| and copyright |copy| glyphs.
- .. _reST roles:
- Roles
- =====
- .. sidebar:: Further reading
- - `Sphinx Roles`_
- - :doc:`sphinx:usage/restructuredtext/domains`
- A *custom interpreted text role* (:duref:`ref <roles>`) is an inline piece of
- explicit markup. It signifies that that the enclosed text should be interpreted
- in a specific way.
- The general markup is one of:
- .. code:: reST
- :rolename:`ref-name`
- :rolename:`ref text <ref-name>`
- .. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
- :widths: 4 3 7
- ========================== ================================== ====================================
- role rendered example markup
- ========================== ================================== ====================================
- :rst:role:`guilabel` :guilabel:`&Cancel` ``:guilabel:`&Cancel```
- :rst:role:`kbd` :kbd:`C-x C-f` ``:kbd:`C-x C-f```
- :rst:role:`menuselection` :menuselection:`Open --> File` ``:menuselection:`Open --> File```
- :rst:role:`download` :download:`this file <reST.rst>` ``:download:`this file <reST.rst>```
- math_ :math:`a^2 + b^2 = c^2` ``:math:`a^2 + b^2 = c^2```
- :rst:role:`ref` :ref:`svg image example` ``:ref:`svg image example```
- :rst:role:`command` :command:`ls -la` ``:command:`ls -la```
- :durole:`emphasis` :emphasis:`italic` ``:emphasis:`italic```
- :durole:`strong` :strong:`bold` ``:strong:`bold```
- :durole:`literal` :literal:`foo()` ``:literal:`foo()```
- :durole:`subscript` H\ :sub:`2`\ O ``H\ :sub:`2`\ O``
- :durole:`superscript` E = mc\ :sup:`2` ``E = mc\ :sup:`2```
- :durole:`title-reference` :title:`Time` ``:title:`Time```
- ========================== ================================== ====================================
- Figures & Images
- ================
- .. sidebar:: Image processing
- With the directives from :ref:`linuxdoc <linuxdoc:kfigure>` the build process
- is flexible. To get best results in the generated output format, install
- ImageMagick_ and Graphviz_.
- Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scaleable here means;
- scaleable in sense of the build process. Normally in absence of a converter
- tool, the build process will break. From the authors POV it’s annoying to care
- about the build process when handling with images, especially since he has no
- access to the build process. With :ref:`linuxdoc:kfigure` the build process
- continues and scales output quality in dependence of installed image processors.
- If you want to add an image, you should use the ``kernel-figure`` (inheritance
- of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`)
- directives. E.g. to insert a figure with a scaleable image format use SVG
- (:ref:`svg image example`):
- .. code:: reST
- .. _svg image example:
- .. kernel-figure:: svg_image.svg
- :alt: SVG image example
- Simple SVG image
- To refer the figure, a caption block is needed: :ref:`svg image example`.
- .. _svg image example:
- .. kernel-figure:: svg_image.svg
- :alt: SVG image example
- Simple SVG image.
- To refer the figure, a caption block is needed: :ref:`svg image example`.
- DOT files (aka Graphviz)
- ------------------------
- With :ref:`linuxdoc:kernel-figure` reST support for **DOT** formatted files is
- given.
- - `Graphviz's dot`_
- - DOT_
- - Graphviz_
- A simple example is shown in :ref:`dot file example`:
- .. code:: reST
- .. _dot file example:
- .. kernel-figure:: hello.dot
- :alt: hello world
- DOT's hello world example
- .. admonition:: hello.dot
- :class: rst-example
- .. _dot file example:
- .. kernel-figure:: hello.dot
- :alt: hello world
- DOT's hello world example
- ``kernel-render`` DOT
- ---------------------
- Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
- :ref:`linuxdoc:kernel-render` directive. A simple example of embedded DOT_ is
- shown in figure :ref:`dot render example`:
- .. code:: reST
- .. _dot render example:
- .. kernel-render:: DOT
- :alt: digraph
- :caption: Embedded DOT (Graphviz) code
- digraph foo {
- "bar" -> "baz";
- }
- Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
- render example`.
- Please note :ref:`build tools <linuxdoc:kfigure_build_tools>`. If Graphviz_ is
- installed, you will see an vector image. If not, the raw markup is inserted as
- *literal-block*.
- .. admonition:: kernel-render DOT
- :class: rst-example
- .. _dot render example:
- .. kernel-render:: DOT
- :alt: digraph
- :caption: Embedded DOT (Graphviz) code
- digraph foo {
- "bar" -> "baz";
- }
- Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
- render example`.
- ``kernel-render`` SVG
- ---------------------
- A simple example of embedded SVG_ is shown in figure :ref:`svg render example`:
- .. code:: reST
- .. _svg render example:
- .. kernel-render:: SVG
- :caption: Embedded **SVG** markup
- :alt: so-nw-arrow
- ..
- .. code:: xml
- <?xml version="1.0" encoding="UTF-8"?>
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
- baseProfile="full" width="70px" height="40px"
- viewBox="0 0 700 400"
- >
- <line x1="180" y1="370"
- x2="500" y2="50"
- stroke="black" stroke-width="15px"
- />
- <polygon points="585 0 525 25 585 50"
- transform="rotate(135 525 25)"
- />
- </svg>
- .. admonition:: kernel-render SVG
- :class: rst-example
- .. _svg render example:
- .. kernel-render:: SVG
- :caption: Embedded **SVG** markup
- :alt: so-nw-arrow
- <?xml version="1.0" encoding="UTF-8"?>
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
- baseProfile="full" width="70px" height="40px"
- viewBox="0 0 700 400"
- >
- <line x1="180" y1="370"
- x2="500" y2="50"
- stroke="black" stroke-width="15px"
- />
- <polygon points="585 0 525 25 585 50"
- transform="rotate(135 525 25)"
- />
- </svg>
- .. _reST lists:
- List markups
- ============
- Bullet list
- -----------
- List markup (:duref:`ref <bullet-lists>`) is simple:
- .. code:: reST
- - This is a bulleted list.
- 1. Nested lists are possible, but be aware that they must be separated from
- the parent list items by blank line
- 2. Second item of nested list
- - It has two items, the second
- item uses two lines.
- #. This is a numbered list.
- #. It has two items too.
- .. admonition:: bullet list
- :class: rst-example
- - This is a bulleted list.
- 1. Nested lists are possible, but be aware that they must be separated from
- the parent list items by blank line
- 2. Second item of nested list
- - It has two items, the second
- item uses two lines.
- #. This is a numbered list.
- #. It has two items too.
- Horizontal list
- ---------------
- The :rst:dir:`.. hlist:: <hlist>` transforms a bullet list into a more compact
- list.
- .. code:: reST
- .. hlist::
- - first list item
- - second list item
- - third list item
- ...
- .. admonition:: hlist
- :class: rst-example
- .. hlist::
- - first list item
- - second list item
- - third list item
- - next list item
- - next list item xxxx
- - next list item yyyy
- - next list item zzzz
- Definition list
- ---------------
- .. sidebar:: Note ..
- - the term cannot have more than one line of text
- - there is **no blank line between term and definition block** // this
- distinguishes definition lists (:duref:`ref <definition-lists>`) from block
- quotes (:duref:`ref <block-quotes>`).
- Each definition list (:duref:`ref <definition-lists>`) item contains a term,
- optional classifiers and a definition. A term is a simple one-line word or
- phrase. Optional classifiers may follow the term on the same line, each after
- an inline ' : ' (**space, colon, space**). A definition is a block indented
- relative to the term, and may contain multiple paragraphs and other body
- elements. There may be no blank line between a term line and a definition block
- (*this distinguishes definition lists from block quotes*). Blank lines are
- required before the first and after the last definition list item, but are
- optional in-between.
- Definition lists are created as follows:
- .. code:: reST
- term 1 (up to a line of text)
- Definition 1.
- See the typo : this line is not a term!
- And this is not term's definition. **There is a blank line** in between
- the line above and this paragraph. That's why this paragraph is taken as
- **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
- term 2
- Definition 2, paragraph 1.
- Definition 2, paragraph 2.
- term 3 : classifier
- Definition 3.
- term 4 : classifier one : classifier two
- Definition 4.
- .. admonition:: definition list
- :class: rst-example
- term 1 (up to a line of text)
- Definition 1.
- See the typo : this line is not a term!
- And this is not term's definition. **There is a blank line** in between
- the line above and this paragraph. That's why this paragraph is taken as
- **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
- term 2
- Definition 2, paragraph 1.
- Definition 2, paragraph 2.
- term 3 : classifier
- Definition 3.
- term 4 : classifier one : classifier two
- Quoted paragraphs
- -----------------
- Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
- them more than the surrounding paragraphs. Line blocks (:duref:`ref
- <line-blocks>`) are a way of preserving line breaks:
- .. code:: reST
- normal paragraph ...
- lorem ipsum.
- Quoted paragraph ...
- lorem ipsum.
- | These lines are
- | broken exactly like in
- | the source file.
- .. admonition:: Quoted paragraph and line block
- :class: rst-example
- normal paragraph ...
- lorem ipsum.
- Quoted paragraph ...
- lorem ipsum.
- | These lines are
- | broken exactly like in
- | the source file.
- .. _reST field list:
- Field Lists
- -----------
- .. _Sphinx Field Lists:
- https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
- .. sidebar:: bibliographic fields
- First lines fields are bibliographic fields, see `Sphinx Field Lists`_.
- Field lists are used as part of an extension syntax, such as options for
- directives, or database-like records meant for further processing. Field lists
- are mappings from field names to field bodies. They marked up like this:
- .. code:: reST
- :fieldname: Field content
- :foo: first paragraph in field foo
- second paragraph in field foo
- :bar: Field content
- .. admonition:: Field List
- :class: rst-example
- :fieldname: Field content
- :foo: first paragraph in field foo
- second paragraph in field foo
- :bar: Field content
- They are commonly used in Python documentation:
- .. code:: python
- def my_function(my_arg, my_other_arg):
- """A function just for me.
- :param my_arg: The first of my arguments.
- :param my_other_arg: The second of my arguments.
- :returns: A message (just for me, of course).
- """
- Further list blocks
- -------------------
- - field lists (:duref:`ref <field-lists>`, with caveats noted in
- :ref:`reST field list`)
- - option lists (:duref:`ref <option-lists>`)
- - quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
- - doctest blocks (:duref:`ref <doctest-blocks>`)
- Admonitions
- ===========
- Sidebar
- -------
- Sidebar is an eye catcher, often used for admonitions pointing further stuff or
- site effects. Here is the source of the sidebar :ref:`on top of this page <reST
- primer>`.
- .. code:: reST
- .. sidebar:: KISS_ and readability_
- Instead of defining more and more roles, we at searx encourage our
- contributors to follow principles like KISS_ and readability_.
- Generic admonition
- ------------------
- The generic :dudir:`admonition <admonitions>` needs a title:
- .. code:: reST
- .. admonition:: generic admonition title
- lorem ipsum ..
- .. admonition:: generic admonition title
- lorem ipsum ..
- Specific admonitions
- --------------------
- Specific admonitions: :dudir:`hint`, :dudir:`note`, :dudir:`tip` :dudir:`attention`,
- :dudir:`caution`, :dudir:`danger`, :dudir:`error`, , :dudir:`important`, and
- :dudir:`warning` .
- .. code:: reST
- .. hint::
- lorem ipsum ..
- .. note::
- lorem ipsum ..
- .. warning::
- lorem ipsum ..
- .. hint::
- lorem ipsum ..
- .. note::
- lorem ipsum ..
- .. tip::
- lorem ipsum ..
- .. attention::
- lorem ipsum ..
- .. caution::
- lorem ipsum ..
- .. danger::
- lorem ipsum ..
- .. important::
- lorem ipsum ..
- .. error::
- lorem ipsum ..
- .. warning::
- lorem ipsum ..
- Tables
- ======
- .. sidebar:: Nested tables
- Nested tables are ugly! Not all builder support nested tables, don't use
- them!
- ASCII-art tables like :ref:`reST simple table` and :ref:`reST grid table` might
- be comfortable for readers of the text-files, but they have huge disadvantages
- in the creation and modifying. First, they are hard to edit. Think about
- adding a row or a column to a ASCII-art table or adding a paragraph in a cell,
- it is a nightmare on big tables.
- .. sidebar:: List tables
- For meaningful patch and diff use :ref:`reST flat table`.
- Second the diff of modifying ASCII-art tables is not meaningful, e.g. widening a
- cell generates a diff in which also changes are included, which are only
- ascribable to the ASCII-art. Anyway, if you prefer ASCII-art for any reason,
- here are some helpers:
- * `Emacs Table Mode`_
- * `Online Tables Generator`_
- .. _reST simple table:
- Simple tables
- -------------
- :duref:`Simple tables <simple-tables>` allow *colspan* but not *rowspan*. If
- your table need some metadata (e.g. a title) you need to add the ``.. table::
- directive`` :dudir:`(ref) <table>` in front and place the table in its body:
- .. code:: reST
- .. table:: foo gate truth table
- :widths: grid
- :align: left
- ====== ====== ======
- Inputs Output
- ------------- ------
- A B A or B
- ====== ====== ======
- False
- --------------------
- True
- --------------------
- True False True
- (foo)
- ------ ------ ------
- False True
- (foo)
- ====== =============
- .. admonition:: Simple ASCII table
- :class: rst-example
- .. table:: foo gate truth table
- :widths: grid
- :align: left
- ====== ====== ======
- Inputs Output
- ------------- ------
- A B A or B
- ====== ====== ======
- False
- --------------------
- True
- --------------------
- True False True
- (foo)
- ------ ------ ------
- False True
- (foo)
- ====== =============
- .. _reST grid table:
- Grid tables
- -----------
- :duref:`Grid tables <grid-tables>` allow colspan *colspan* and *rowspan*:
- .. code:: reST
- .. table:: grid table example
- :widths: 1 1 5
- +------------+------------+-----------+
- | Header 1 | Header 2 | Header 3 |
- +============+============+===========+
- | body row 1 | column 2 | column 3 |
- +------------+------------+-----------+
- | body row 2 | Cells may span columns.|
- +------------+------------+-----------+
- | body row 3 | Cells may | - Cells |
- +------------+ span rows. | - contain |
- | body row 4 | | - blocks. |
- +------------+------------+-----------+
- .. admonition:: ASCII grid table
- :class: rst-example
- .. table:: grid table example
- :widths: 1 1 5
- +------------+------------+-----------+
- | Header 1 | Header 2 | Header 3 |
- +============+============+===========+
- | body row 1 | column 2 | column 3 |
- +------------+------------+-----------+
- | body row 2 | Cells may span columns.|
- +------------+------------+-----------+
- | body row 3 | Cells may | - Cells |
- +------------+ span rows. | - contain |
- | body row 4 | | - blocks. |
- +------------+------------+-----------+
- .. _reST flat table:
- flat-table
- ----------
- The ``flat-table`` is a further developed variant of the :ref:`list tables
- <linuxdoc:list-table-directives>`. It is a double-stage list similar to the
- :dudir:`list-table` with some additional features:
- column-span: ``cspan``
- with the role ``cspan`` a cell can be extended through additional columns
- row-span: ``rspan``
- with the role ``rspan`` a cell can be extended through additional rows
- auto-span:
- spans rightmost cell of a table row over the missing cells on the right side
- of that table-row. With Option ``:fill-cells:`` this behavior can changed
- from *auto span* to *auto fill*, which automatically inserts (empty) cells
- instead of spanning the last cell.
- options:
- :header-rows: [int] count of header rows
- :stub-columns: [int] count of stub columns
- :widths: [[int] [int] ... ] widths of columns
- :fill-cells: instead of auto-span missing cells, insert missing cells
- roles:
- :cspan: [int] additional columns (*morecols*)
- :rspan: [int] additional rows (*morerows*)
- The example below shows how to use this markup. The first level of the staged
- list is the *table-row*. In the *table-row* there is only one markup allowed,
- the list of the cells in this *table-row*. Exception are *comments* ( ``..`` )
- and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
- .. code:: reST
- .. flat-table:: ``flat-table`` example
- :header-rows: 2
- :stub-columns: 1
- :widths: 1 1 1 1 2
- * - :rspan:`1` head / stub
- - :cspan:`3` head 1.1-4
- * - head 2.1
- - head 2.2
- - head 2.3
- - head 2.4
- * .. row body 1 / this is a comment
- - row 1
- - :rspan:`2` cell 1-3.1
- - cell 1.2
- - cell 1.3
- - cell 1.4
- * .. Comments and targets are allowed on *table-row* stage.
- .. _`row body 2`:
- - row 2
- - cell 2.2
- - :rspan:`1` :cspan:`1`
- cell 2.3 with a span over
- * col 3-4 &
- * row 2-3
- * - row 3
- - cell 3.2
- * - row 4
- - cell 4.1
- - cell 4.2
- - cell 4.3
- - cell 4.4
- * - row 5
- - cell 5.1 with automatic span to rigth end
- * - row 6
- - cell 6.1
- - ..
- .. admonition:: List table
- :class: rst-example
- .. flat-table:: ``flat-table`` example
- :header-rows: 2
- :stub-columns: 1
- :widths: 1 1 1 1 2
- * - :rspan:`1` head / stub
- - :cspan:`3` head 1.1-4
- * - head 2.1
- - head 2.2
- - head 2.3
- - head 2.4
- * .. row body 1 / this is a comment
- - row 1
- - :rspan:`2` cell 1-3.1
- - cell 1.2
- - cell 1.3
- - cell 1.4
- * .. Comments and targets are allowed on *table-row* stage.
- .. _`row body 2`:
- - row 2
- - cell 2.2
- - :rspan:`1` :cspan:`1`
- cell 2.3 with a span over
- * col 3-4 &
- * row 2-3
- * - row 3
- - cell 3.2
- * - row 4
- - cell 4.1
- - cell 4.2
- - cell 4.3
- - cell 4.4
- * - row 5
- - cell 5.1 with automatic span to rigth end
- * - row 6
- - cell 6.1
- - ..
- CSV table
- ---------
- CSV table might be the choice if you want to include CSV-data from a outstanding
- (build) process into your documentation.
- .. code:: reST
- .. csv-table:: CSV table example
- :header: .. , Column 1, Column 2
- :widths: 2 5 5
- :stub-columns: 1
- :file: csv_table.txt
- Content of file ``csv_table.txt``:
- .. literalinclude:: csv_table.txt
- .. admonition:: CSV table
- :class: rst-example
- .. csv-table:: CSV table example
- :header: .. , Column 1, Column 2
- :widths: 3 5 5
- :stub-columns: 1
- :file: csv_table.txt
- Templating
- ==========
- .. sidebar:: Build environment
- All *generic-doc* tasks are running in the :ref:`build environment <make
- pyenv>`.
- Templating is suitable for documentation which is created generic at the build
- time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
- environment <make pyenv>` (with searx modules installed). We use this e.g. to
- build chapter: :ref:`engines generic`. Below the jinja directive from the
- :origin:`docs/admin/engines.rst` is shown:
- .. literalinclude:: ../admin/engines.rst
- :language: reST
- :start-after: .. _configured engines:
- The context for the template is selected in the line ``.. jinja:: searx``. In
- sphinx's build configuration (:origin:`docs/conf.py`) the ``searx`` context
- contains the ``engines`` and ``plugins``.
- .. code:: py
- import searx.search
- import searx.engines
- import searx.plugins
- searx.search.initialize()
- jinja_contexts = {
- 'searx': {
- 'engines': searx.engines.engines,
- 'plugins': searx.plugins.plugins
- },
- }
- Tabbed views
- ============
- .. _sphinx-tabs: https://github.com/djungelorm/sphinx-tabs
- .. _basic-tabs: https://github.com/djungelorm/sphinx-tabs#basic-tabs
- .. _group-tabs: https://github.com/djungelorm/sphinx-tabs#group-tabs
- .. _code-tabs: https://github.com/djungelorm/sphinx-tabs#code-tabs
- With `sphinx-tabs`_ extension we have *tabbed views*. To provide installation
- instructions with one tab per distribution we use the `group-tabs`_ directive,
- others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
- :ref:`docs build` is shown:
- .. literalinclude:: ../admin/buildhosts.rst
- :language: reST
- :start-after: .. SNIP sh lint requirements
- :end-before: .. SNAP sh lint requirements
- .. _math:
- Math equations
- ==============
- .. _Mathematics: https://en.wikibooks.org/wiki/LaTeX/Mathematics
- .. _amsmath user guide:
- http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/macros/latex/required/amsmath/amsldoc.pdf
- .. sidebar:: About LaTeX
- - `amsmath user guide`_
- - Mathematics_
- - :ref:`docs build`
- The input language for mathematics is LaTeX markup using the :ctan:`amsmath`
- package.
- To embed LaTeX markup in reST documents, use role :rst:role:`:math: <math>` for
- inline and directive :rst:dir:`.. math:: <math>` for block markup.
- .. code:: reST
- In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
- is shown.
- .. math::
- :label: schroedinger general
- \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
- \hat{H} |\,\psi (t) \rangle.
- .. admonition:: LaTeX math equation
- :class: rst-example
- In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
- is shown.
- .. math::
- :label: schroedinger general
- \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
- \hat{H} |\,\psi (t) \rangle.
- The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
- (*displaystyle*) used in a inline markup or another fraction.
- .. code:: reST
- ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
- ``\dfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
- .. admonition:: Line spacing
- :class: rst-example
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
- eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
- voluptua. ...
- ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
- gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
- eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
- voluptua. ...
- ``\tfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
- gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- .. _KISS: https://en.wikipedia.org/wiki/KISS_principle
- .. _readability: https://docs.python-guide.org/writing/style/
- .. _Sphinx-Primer:
- https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
- .. _reST: https://docutils.sourceforge.io/rst.html
- .. _Sphinx Roles:
- https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
- .. _Sphinx: https://www.sphinx-doc.org
- .. _`sphinx-doc FAQ`: https://www.sphinx-doc.org/en/stable/faq.html
- .. _Sphinx markup constructs:
- https://www.sphinx-doc.org/en/stable/markup/index.html
- .. _`sphinx cross references`:
- https://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
- .. _sphinx.ext.extlinks:
- https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
- .. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
- .. _sphinx config: https://www.sphinx-doc.org/en/stable/config.html
- .. _Sphinx's autodoc: https://www.sphinx-doc.org/en/stable/ext/autodoc.html
- .. _Sphinx's Python domain:
- https://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
- .. _Sphinx's C domain:
- https://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
- .. _doctree:
- https://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
- .. _docutils: http://docutils.sourceforge.net/docs/index.html
- .. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
- .. _linuxdoc: https://return42.github.io/linuxdoc
- .. _jinja: https://jinja.palletsprojects.com/
- .. _sphinx-jinja: https://github.com/tardyp/sphinx-jinja
- .. _SVG: https://www.w3.org/TR/SVG11/expanded-toc.html
- .. _DOT: https://graphviz.gitlab.io/_pages/doc/info/lang.html
- .. _`Graphviz's dot`: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf
- .. _Graphviz: https://graphviz.gitlab.io
- .. _ImageMagick: https://www.imagemagick.org
- .. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
- .. _`Online Tables Generator`: https://www.tablesgenerator.com/text_tables
- .. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
|