12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439 |
- .. _reST primer:
- ===========
- reST primer
- ===========
- .. sidebar:: KISS_ and readability_
- Instead of defining more and more roles, we at SearXNG encourage our
- contributors to follow principles like KISS_ and readability_.
- We at SearXNG 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.searxng.org_. For build prerequisites read
- :ref:`docs build`.
- .. _docs.searxng.org: https://docs.searxng.org/
- The source files of SearXNG's documentation are located at :origin:`docs`.
- Sphinx assumes source files to be encoded in UTF-8 by default. 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::
- :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 SearXNG 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 manually :ref:`foo
- bar <reST anchor>`.
- .. admonition:: ``:ref:`` role
- :class: rst-example
- Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :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:`4` ``:pull:`4```
- patch :patch:`af2cae6` ``:patch:`af2cae6```
- PyPi package :pypi:`httpx` ``:pypi:`httpx```
- 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://docs.searxng.org/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_.
- SearXNG's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means;
- scalable 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 scalable 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 SearXNG 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 right 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 right 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:`make install`.
- Templating is suitable for documentation which is created generic at the build
- time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
- install` (with SearXNG modules installed). We use this e.g. to build chapter:
- :ref:`configured engines`. Below the jinja directive from the
- :origin:`docs/admin/engines.rst` is shown:
- .. literalinclude:: ../user/configured_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
|