reST.rst 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. .. _reST primer:
  2. ===========
  3. reST primer
  4. ===========
  5. .. sidebar:: KISS_ and readability_
  6. Instead of defining more and more roles, we at searx encourage our
  7. contributors to follow principles like KISS_ and readability_.
  8. We at searx are using reStructuredText (aka reST_) markup for all kind of
  9. documentation, with the builders from the Sphinx_ project a HTML output is
  10. generated and deployed at :docs:`github.io <.>`.
  11. The sources of Searx's documentation are located at :origin:`docs`. Run
  12. :ref:`make docs-live <make docs-live>` to build HTML while editing.
  13. .. sidebar:: Further reading
  14. - Sphinx-Primer_
  15. - `Sphinx markup constructs`_
  16. - reST_, docutils_, `docutils FAQ`_
  17. - Sphinx_, `sphinx-doc FAQ`_
  18. - `sphinx config`_, doctree_
  19. - `sphinx cross references`_
  20. - linuxdoc_
  21. - intersphinx_
  22. - `Sphinx's autodoc`_
  23. - `Sphinx's Python domain`_, `Sphinx's C domain`_
  24. - SVG_, ImageMagick_
  25. - DOT_, `Graphviz's dot`_, Graphviz_
  26. .. contents:: Contents
  27. :depth: 3
  28. :local:
  29. :backlinks: entry
  30. Sphinx_ and reST_ have their place in the python ecosystem. Over that reST is
  31. used in popular projects, e.g the Linux kernel documentation `[kernel doc]`_.
  32. .. _[kernel doc]: https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html
  33. .. sidebar:: Content matters
  34. The readability_ of the reST sources has its value, therefore we recommend to
  35. make sparse usage of reST markup / .. content matters!
  36. **reST** is a plaintext markup language, its markup is *mostly* intuitive and
  37. you will not need to learn much to produce well formed articles with. I use the
  38. word *mostly*: like everything in live, reST has its advantages and
  39. disadvantages, some markups feel a bit grumpy (especially if you are used to
  40. other plaintext markups).
  41. Soft skills
  42. ===========
  43. Before going any deeper into the markup let's face on some **soft skills** a
  44. trained author brings with, to reach a well feedback from readers:
  45. - Documentation is dedicated to an audience and answers questions from the
  46. audience point of view.
  47. - Don't detail things which are general knowledge from the audience point of
  48. view.
  49. - Limit the subject, use cross links for any further reading.
  50. To be more concrete what a *point of view* means. In the (:origin:`docs`)
  51. folder we have three sections (and the *blog* folder), each dedicate to a
  52. different group of audience.
  53. User's POV: :origin:`docs/user`
  54. A typical user knows about search engines and might have heard about
  55. meta crawlers and privacy.
  56. Admin's POV: :origin:`docs/admin`
  57. A typical Admin knows about setting up services on a linux system, but he does
  58. not know all the pros and cons of a searx setup.
  59. Developer's POV: :origin:`docs/dev`
  60. Depending on the readability_ of code, a typical developer is able to read and
  61. understand source code. Describe what a item aims to do (e.g. a function).
  62. If the chronological order matters, describe it. Name the *out-of-limits
  63. conditions* and all the side effects a external developer will not know.
  64. .. _reST inline markup:
  65. Basic inline markup
  66. ===================
  67. .. sidebar:: Inline markup
  68. - :ref:`reST roles`
  69. - :ref:`reST smart ref`
  70. Basic inline markup is done with asterisks and backquotes. If asterisks or
  71. backquotes appear in running text and could be confused with inline markup
  72. delimiters, they have to be escaped with a backslash (``\*pointer``).
  73. ================================================ ==================== ========================
  74. description rendered markup
  75. ================================================ ==================== ========================
  76. one asterisk for emphasis *italics* ``*italics*``
  77. two asterisks for strong emphasis **boldface** ``**boldface**``
  78. backquotes for code samples and literals ``foo()`` ````foo()````
  79. quote asterisks or backquotes \*foo is a pointer ``\*foo is a pointer``
  80. ================================================ ==================== ========================
  81. .. _reST basic structure:
  82. Basic article structure
  83. =======================
  84. The basic structure of an article makes use of heading adornments to markup
  85. chapter, sections and subsections.
  86. .. _reST template:
  87. reST template
  88. -------------
  89. reST template for an simple article:
  90. .. code:: reST
  91. .. _doc refname:
  92. ==============
  93. Document title
  94. ==============
  95. Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
  96. :ref:`chapter refname`.
  97. .. _chapter refname:
  98. Chapter
  99. =======
  100. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
  101. aliquid ex ea commodi consequat ...
  102. .. _section refname:
  103. Section
  104. -------
  105. lorem ..
  106. .. _subsection refname:
  107. Subsection
  108. ~~~~~~~~~~
  109. lorem ..
  110. Headings
  111. --------
  112. #. title - with overline for document title:
  113. .. code:: reST
  114. ==============
  115. Document title
  116. ==============
  117. #. chapter - with anchor named ``anchor name``:
  118. .. code:: reST
  119. .. _anchor name:
  120. Chapter
  121. =======
  122. #. section
  123. .. code:: reST
  124. Section
  125. -------
  126. #. subsection
  127. .. code:: reST
  128. Subsection
  129. ~~~~~~~~~~
  130. Anchors & Links
  131. ===============
  132. .. _reST anchor:
  133. Anchors
  134. -------
  135. .. _ref role:
  136. https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
  137. To refer a point in the documentation a anchor is needed. The :ref:`reST
  138. template <reST template>` shows an example where a chapter titled *"Chapters"*
  139. gets an anchor named ``chapter title``. Another example from *this* document,
  140. where the anchor named ``reST anchor``:
  141. .. code:: reST
  142. .. _reST anchor:
  143. Anchors
  144. -------
  145. To refer a point in the documentation a anchor is needed ...
  146. To refer anchors use the `ref role`_ markup:
  147. .. code:: reST
  148. Visit chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
  149. bar <reST anchor>`.
  150. .. admonition:: ``:ref:`` role
  151. :class: rst-example
  152. Visist chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
  153. bar <reST anchor>`.
  154. .. _reST ordinary ref:
  155. Link ordinary URL
  156. -----------------
  157. If you need to reference external URLs use *named* hyperlinks to maintain
  158. readability of reST sources. Here is a example taken from *this* article:
  159. .. code:: reST
  160. .. _Sphinx Field Lists:
  161. https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
  162. With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
  163. readable.
  164. And this shows the alternative (less readable) hyperlink markup `Sphinx Field
  165. Lists
  166. <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
  167. .. admonition:: Named hyperlink
  168. :class: rst-example
  169. With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
  170. readable.
  171. And this shows the alternative (less readable) hyperlink markup `Sphinx Field
  172. Lists
  173. <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
  174. .. _reST smart ref:
  175. Smart refs
  176. ----------
  177. With the power of sphinx.ext.extlinks_ and intersphinx_ referencing external
  178. content becomes smart.
  179. ========================== ================================== ====================================
  180. refer ... rendered example markup
  181. ========================== ================================== ====================================
  182. :rst:role:`rfc` :rfc:`822` ``:rfc:`822```
  183. :rst:role:`pep` :pep:`8` ``:pep:`8```
  184. sphinx.ext.extlinks_
  185. --------------------------------------------------------------------------------------------------
  186. project's wiki article :wiki:`Searx-instances` ``:wiki:`Searx-instances```
  187. to docs public URL :docs:`dev/reST.html` ``:docs:`dev/reST.html```
  188. files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
  189. pull request :pull:`1756` ``:pull:`1756```
  190. patch :patch:`af2cae6` ``:patch:`af2cae6```
  191. PyPi package :pypi:`searx` ``:pypi:`searx```
  192. manual page man :man:`bash` ``:man:`bash```
  193. intersphinx_
  194. --------------------------------------------------------------------------------------------------
  195. external anchor :ref:`python:and` ``:ref:`python:and```
  196. external doc anchor :doc:`jinja:templates` ``:doc:`jinja:templates```
  197. python code object :py:obj:`datetime.datetime` ``:py:obj:`datetime.datetime```
  198. flask code object :py:obj:`flask.Flask` ``:py:obj:`flask.Flask```
  199. ========================== ================================== ====================================
  200. Intersphinx is configured in :origin:`docs/conf.py`:
  201. .. code:: python
  202. intersphinx_mapping = {
  203. "python": ("https://docs.python.org/3/", None),
  204. "flask": ("https://flask.palletsprojects.com/", None),
  205. "jinja": ("https://jinja.palletsprojects.com/", None),
  206. "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
  207. "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
  208. }
  209. To list all anchors of the inventory (e.g. ``python``) use:
  210. .. code:: sh
  211. $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
  212. .. _reST roles:
  213. Roles
  214. =====
  215. A *custom interpreted text role* (:duref:`ref <roles>`) is an inline piece of
  216. explicit markup. It signifies that that the enclosed text should be interpreted
  217. in a specific way. The general syntax is ``:rolename:`content```.
  218. ========================== ================================== ====================================
  219. role rendered example markup
  220. ========================== ================================== ====================================
  221. :rst:role:`guilabel` :guilabel:`&Cancel` ``:guilabel:`&Cancel```
  222. :rst:role:`kbd` :kbd:`C-x C-f` ``:kbd:`C-x C-f```
  223. :rst:role:`menuselection` :menuselection:`Open --> File` ``:menuselection:`Open --> File```
  224. :rst:role:`download` :download:`this file <reST.rst>` ``:download:`this file <reST.rst>```
  225. :rst:role:`math` :math:`a^2 + b^2 = c^2` ``:math:`a^2 + b^2 = c^2```
  226. :rst:role:`ref` :ref:`svg image example` ``:ref:`svg image example```
  227. :rst:role:`command` :command:`ls -la` ``:command:`ls -la```
  228. :durole:`emphasis` :emphasis:`italic` ``:emphasis:`italic```
  229. :durole:`strong` :strong:`bold` ``:strong:`bold```
  230. :durole:`literal` :literal:`foo()` ``:literal:`foo()```
  231. :durole:`subscript` H\ :sub:`2`\ O ``H\ :sub:`2`\ O``
  232. :durole:`superscript` E = mc\ :sup:`2` ``E = mc\ :sup:`2```
  233. :durole:`title-reference` :title:`Time` ``:title:`Time```
  234. ========================== ================================== ====================================
  235. Refer to `Sphinx Roles`_ for roles added by Sphinx.
  236. Figures & Images
  237. ================
  238. .. sidebar:: Image processing
  239. With the directives from :ref:`linuxdoc <linuxdoc:kfigure>` the build process
  240. is flexible. To get best results in the generated output format, install
  241. ImageMagick_ and Graphviz_.
  242. Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means;
  243. scalable in sense of the build process. Normally in absence of a converter
  244. tool, the build process will break. From the authors POV it’s annoying to care
  245. about the build process when handling with images, especially since he has no
  246. access to the build process. With :ref:`linuxdoc:kfigure` the build process
  247. continues and scales output quality in dependence of installed image processors.
  248. If you want to add an image, you should use the ``kernel-figure`` and
  249. ``kernel-image`` directives. E.g. to insert a figure with a scalable image
  250. format use SVG (:ref:`svg image example`):
  251. .. code:: reST
  252. .. _svg image example:
  253. .. kernel-figure:: svg_image.svg
  254. :alt: SVG image example
  255. simple SVG image
  256. To refer the figure, a caption block is needed: :ref:`svg image example`.
  257. .. _svg image example:
  258. .. kernel-figure:: svg_image.svg
  259. :alt: SVG image example
  260. simple SVG image
  261. To refer the figure, a caption block is needed: :ref:`svg image example`.
  262. DOT files (aka Graphviz)
  263. ------------------------
  264. With :ref:`linuxdoc:kernel-figure` reST support for **DOT** formatted files is
  265. given.
  266. - `Graphviz's dot`_
  267. - DOT_
  268. - Graphviz_
  269. A simple example is shown in :ref:`dot file example`:
  270. .. code:: reST
  271. .. _dot file example:
  272. .. kernel-figure:: hello.dot
  273. :alt: hello world
  274. DOT's hello world example
  275. .. admonition:: hello.dot
  276. :class: rst-example
  277. .. _dot file example:
  278. .. kernel-figure:: hello.dot
  279. :alt: hello world
  280. DOT's hello world example
  281. ``kernel-render`` DOT
  282. ---------------------
  283. Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
  284. :ref:`linuxdoc:kernel-render` directive. A simple example of embedded DOT_ is
  285. shown in figure :ref:`dot render example`:
  286. .. code-block:: rst
  287. .. _dot render example:
  288. .. kernel-render:: DOT
  289. :alt: digraph
  290. :caption: Embedded DOT (Graphviz) code
  291. digraph foo {
  292. "bar" -> "baz";
  293. }
  294. Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
  295. render example`.
  296. Please note :ref:`build tools <linuxdoc:kfigure_build_tools>`. If Graphviz_ is
  297. installed, you will see an vector image. If not, the raw markup is inserted as
  298. *literal-block*.
  299. .. admonition:: kernel-render DOT
  300. :class: rst-example
  301. .. _dot render example:
  302. .. kernel-render:: DOT
  303. :alt: digraph
  304. :caption: Embedded DOT (Graphviz) code
  305. digraph foo {
  306. "bar" -> "baz";
  307. }
  308. Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
  309. render example`.
  310. ``kernel-render`` SVG
  311. ---------------------
  312. A simple example of embedded SVG_ is shown in figure :ref:`svg render example`:
  313. .. code-block:: rst
  314. .. _svg render example:
  315. .. kernel-render:: SVG
  316. :caption: Embedded **SVG** markup
  317. :alt: so-nw-arrow
  318. ..
  319. .. code:: xml
  320. <?xml version="1.0" encoding="UTF-8"?>
  321. <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
  322. baseProfile="full" width="70px" height="40px"
  323. viewBox="0 0 700 400"
  324. >
  325. <line x1="180" y1="370"
  326. x2="500" y2="50"
  327. stroke="black" stroke-width="15px"
  328. />
  329. <polygon points="585 0 525 25 585 50"
  330. transform="rotate(135 525 25)"
  331. />
  332. </svg>
  333. .. admonition:: kernel-render SVG
  334. :class: rst-example
  335. .. _svg render example:
  336. .. kernel-render:: SVG
  337. :caption: Embedded **SVG** markup
  338. :alt: so-nw-arrow
  339. <?xml version="1.0" encoding="UTF-8"?>
  340. <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
  341. baseProfile="full" width="70px" height="40px"
  342. viewBox="0 0 700 400"
  343. >
  344. <line x1="180" y1="370"
  345. x2="500" y2="50"
  346. stroke="black" stroke-width="15px"
  347. />
  348. <polygon points="585 0 525 25 585 50"
  349. transform="rotate(135 525 25)"
  350. />
  351. </svg>
  352. .. _reST lists:
  353. List markups
  354. ============
  355. Bullet list
  356. -----------
  357. List markup (:duref:`ref <bullet-lists>`) is simple:
  358. .. code:: reST
  359. - This is a bulleted list.
  360. 1. Nested lists are possible, but be aware that they must be separated from
  361. the parent list items by blank line
  362. 2. Second item of nested list
  363. - It has two items, the second
  364. item uses two lines.
  365. #. This is a numbered list.
  366. #. It has two items too.
  367. .. admonition:: bullet list
  368. :class: rst-example
  369. - This is a bulleted list.
  370. 1. Nested lists are possible, but be aware that they must be separated from
  371. the parent list items by blank line
  372. 2. Second item of nested list
  373. - It has two items, the second
  374. item uses two lines.
  375. #. This is a numbered list.
  376. #. It has two items too.
  377. Definition list
  378. ---------------
  379. .. sidebar:: definition term
  380. Note that the term cannot have more than one line of text.
  381. Definition lists (:duref:`ref <definition-lists>`) are created as follows:
  382. .. code:: reST
  383. term (up to a line of text)
  384. Definition of the term, which must be indented
  385. and can even consist of multiple paragraphs
  386. next term
  387. Description.
  388. .. admonition:: definition list
  389. :class: rst-example
  390. term (up to a line of text)
  391. Definition of the term, which must be indented
  392. and can even consist of multiple paragraphs
  393. next term
  394. Description.
  395. Quoted paragraphs
  396. -----------------
  397. Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
  398. them more than the surrounding paragraphs. Line blocks (:duref:`ref
  399. <line-blocks>`) are a way of preserving line breaks:
  400. .. code:: reST
  401. normal paragraph ...
  402. lorem ipsum.
  403. Quoted paragraph ...
  404. lorem ipsum.
  405. | These lines are
  406. | broken exactly like in
  407. | the source file.
  408. .. admonition:: Quoted paragraph and line block
  409. :class: rst-example
  410. normal paragraph ...
  411. lorem ipsum.
  412. Quoted paragraph ...
  413. lorem ipsum.
  414. | These lines are
  415. | broken exactly like in
  416. | the source file.
  417. .. _reST field list:
  418. Field Lists
  419. -----------
  420. .. _Sphinx Field Lists:
  421. https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
  422. .. sidebar:: bibliographic fields
  423. First lines fields are bibliographic fields, see `Sphinx Field Lists`_.
  424. Field lists are used as part of an extension syntax, such as options for
  425. directives, or database-like records meant for further processing. Field lists
  426. are mappings from field names to field bodies. They marked up like this:
  427. .. code:: reST
  428. :fieldname: Field content
  429. :foo: first paragraph in field foo
  430. second paragraph in field foo
  431. :bar: Field content
  432. .. admonition:: Field List
  433. :class: rst-example
  434. :fieldname: Field content
  435. :foo: first paragraph in field foo
  436. second paragraph in field foo
  437. :bar: Field content
  438. They are commonly used in Python documentation:
  439. .. code:: python
  440. def my_function(my_arg, my_other_arg):
  441. """A function just for me.
  442. :param my_arg: The first of my arguments.
  443. :param my_other_arg: The second of my arguments.
  444. :returns: A message (just for me, of course).
  445. """
  446. Further list blocks
  447. -------------------
  448. - field lists (:duref:`ref <field-lists>`, with caveats noted in
  449. :ref:`reST field list`)
  450. - option lists (:duref:`ref <option-lists>`)
  451. - quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
  452. - doctest blocks (:duref:`ref <doctest-blocks>`)
  453. Admonitions
  454. ===========
  455. Sidebar
  456. -------
  457. Sidebar is an eye catcher, often used for admonitions pointing further stuff or
  458. site effects. Here is the source of the sidebar :ref:`on top of this page <reST
  459. primer>`.
  460. .. code:: reST
  461. .. sidebar:: KISS_ and readability_
  462. Instead of defining more and more roles, we at searx encourage our
  463. contributors to follow principles like KISS_ and readability_.
  464. Generic admonition
  465. ------------------
  466. The generic :dudir:`admonition <admonitions>` needs a title:
  467. .. code:: reST
  468. .. admonition:: generic admonition title
  469. lorem ipsum ..
  470. .. admonition:: generic admonition title
  471. lorem ipsum ..
  472. Specific admonitions
  473. --------------------
  474. Specific admonitions: :dudir:`hint`, :dudir:`note`, :dudir:`tip` :dudir:`attention`,
  475. :dudir:`caution`, :dudir:`danger`, :dudir:`error`, , :dudir:`important`, and
  476. :dudir:`warning` .
  477. .. code:: reST
  478. .. hint::
  479. lorem ipsum ..
  480. .. note::
  481. lorem ipsum ..
  482. .. warning::
  483. lorem ipsum ..
  484. .. hint::
  485. lorem ipsum ..
  486. .. note::
  487. lorem ipsum ..
  488. .. tip::
  489. lorem ipsum ..
  490. .. attention::
  491. lorem ipsum ..
  492. .. caution::
  493. lorem ipsum ..
  494. .. danger::
  495. lorem ipsum ..
  496. .. important::
  497. lorem ipsum ..
  498. .. error::
  499. lorem ipsum ..
  500. .. warning::
  501. lorem ipsum ..
  502. .. _KISS: https://en.wikipedia.org/wiki/KISS_principle
  503. .. _readability: https://docs.python-guide.org/writing/style/
  504. .. _Sphinx-Primer:
  505. http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
  506. .. _reST: https://docutils.sourceforge.io/rst.html
  507. .. _Sphinx Roles:
  508. https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
  509. .. _Sphinx: http://www.sphinx-doc.org
  510. .. _`sphinx-doc FAQ`: http://www.sphinx-doc.org/en/stable/faq.html
  511. .. _Sphinx markup constructs:
  512. http://www.sphinx-doc.org/en/stable/markup/index.html
  513. .. _`sphinx cross references`:
  514. http://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
  515. .. _sphinx.ext.extlinks:
  516. https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
  517. .. _intersphinx: http://www.sphinx-doc.org/en/stable/ext/intersphinx.html
  518. .. _sphinx config: http://www.sphinx-doc.org/en/stable/config.html
  519. .. _Sphinx's autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
  520. .. _Sphinx's Python domain:
  521. http://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
  522. .. _Sphinx's C domain:
  523. http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
  524. .. _doctree:
  525. http://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
  526. .. _docutils: http://docutils.sourceforge.net/docs/index.html
  527. .. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
  528. .. _linuxdoc: https://return42.github.io/linuxdoc
  529. .. _SVG: https://www.w3.org/TR/SVG11/expanded-toc.html
  530. .. _DOT: https://graphviz.gitlab.io/_pages/doc/info/lang.html
  531. .. _`Graphviz's dot`: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf
  532. .. _Graphviz: https://graphviz.gitlab.io
  533. .. _ImageMagick: https://www.imagemagick.org