From 54c0136e96e1ef2f66651821df2d6d9387ca8cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Thu, 11 Aug 2022 11:31:48 +0200 Subject: [PATCH 1/5] Change: Use furo theme for sphinx based docs for improved navigation Improve the whole layout of our docs by switching to the furo sphinx theme. --- docs/_static/custom.css | 246 ++++++++++++++++++++++++++++++- docs/_static/logo.svg | 200 +++++++++++++++++++++++++ docs/_templates/sidebarlogo.html | 13 -- docs/conf.py | 78 ++++++---- docs/requirements.txt | 2 +- poetry.lock | 69 ++++++++- pyproject.toml | 1 + 7 files changed, 561 insertions(+), 48 deletions(-) create mode 100644 docs/_static/logo.svg delete mode 100644 docs/_templates/sidebarlogo.html diff --git a/docs/_static/custom.css b/docs/_static/custom.css index b2d1a171e..bb4de967f 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,8 +1,252 @@ +div.document { + width: 1200px; +} + +body { + font-family: Helvetica, Verdana; +} + +div.body { + max-width: 1200px; +} + +h1, h2, h3, h4, h5, h6 { +font-weight:500; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Helvetica, Verdana; + } + +.sphinx-tabs-tab { + color:var(--color-content-foreground); + font-family: Helvetica, Verdana; +} + +a { + color: var(--color-content-foreground); + text-decoration: none; + border-bottom: 1px dotted var(--color-content-foreground); +} + +a:hover { + color: #11AB51; + border-bottom: 1px solid var(--color-content-foreground); +} + +.related-pages a .page-info .title, .bottom-of-page a { + color: var(--color-foreground-secondary); + text-decoration: none; + border-bottom: 1px dotted var(--color-foreground-secondary); +} + +.related-pages a:hover .page-info .title, .bottom-of-page a:hover { + text-decoration: none; + color: #11AB51; + border-bottom: 1px solid var(--color-foreground-secondary); +} + +a.muted-link { + border-bottom:0; +} + +a.muted-link:hover { + border-bottom:0; + color:#11AB51; +} + +a.sidebar-brand, .toctree-l1 > a.reference, .toc-tree a.reference { + border-bottom: 0; +} + +.toctree-l1 > a.reference:hover, .toc-tree a.reference:hover { + border-bottom: 0; + color: #11AB51; +} + +.related-pages a { + border-bottom:0; +} + +.related-pages a:hover { + border-bottom:0; +} + +.toctree-wrapper .caption-text, .sidebar-tree .caption-text { + font-size:2em; + font-weight:500; + color: var(--color-content-foreground); +} + +.sidebar-brand-text { + text-align:left; +} + +.sidebar-search { + color:var(--color-content-foreground); +} + +.sidebar-tree .toctree-l1 > .reference { + color: var(--color-content-foreground); +} + +.toc-tree li.scroll-current > .reference { + color: var(--color-content-foreground); +} + +.toc-tree .reference { + color: var(--color-content-foreground); + font-size:1.1em; +} + +.toc-title { + color: var(--color-content-foreground); + font-size:1.2em; +} + +div.admonition { + background-color:var(--color-background-secondary); + padding: 20px 20px; + border-radius: 4px; +} + +.admonition.note > .admonition-title, .admonition.warning > .admonition-title, .admonition.tip > .admonition-title, .admonition.important > .admonition-title, .admonition.hint > .admonition-title { + background-color:var(--color-background-secondary); + font-family: Helvetica, Verdana; + font-weight: bold; + font-size:1em; +} + +div.body p.caption { + font-size: 240%; + margin-bottom: 0px; +} + +div.sphinxsidebar h3 { + font-family: Helvetica, Verdana; +} + +div.sphinxsidebar a { + border: 0px; +} + +div.sphinxsidebarwrapper p.description { + font-size: 15px; +} + +div.sphinxsidebarwrapper h1.logo { + font-size: 25px; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top:50px; +} + div.sphinxsidebarwrapper p.description { - font-size: 12px; + margin-bottom: 50px; +} + + +div.sphinxsidebarwrapper img { + max-width: 70%; +} + +.highlight-shell-session .go::before { + content: ">"; + padding-right: 1em; +} + +.highlight pre { + border-radius: 6px; + font-family: Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace; + font-size: 0.9em; + line-height: 1.2; + padding: 1.25rem 1.5rem; +} + +.code-block-caption { + font-size:0.7em; + background-color: var(--color-background-secondary); + color: var(--color-foreground-primary); +} + + +.code-block-caption a { + color:var(--color-foreground-primary); +} + +.code-block-caption a:hover { + color:#11AB51; +} + + +div.edit-this-page > a.muted-link, svg.icon-tabler-shadow, svg.theme-icon-when-dark, svg.theme-icon-when-light { + color:var(--color-content-foreground); +} + + +div.edit-this-page > a.muted-link:hover, svg.icon.icon-tabler.icon-tabler-copy:hover, svg.icon-tabler-shadow:hover, svg.theme-icon-when-dark:hover, svg.theme-icon-when-light:hover { + color:#11AB51; +} + +.highlight { + background-color: var(--color-code-background); + color:var(--color-code-foreground); +} + +.highlight button.copybtn { + background-color:transparent; +} + +.highlight button.copybtn:hover { + background-color:transparent; +} + + +svg.icon.icon-tabler.icon-tabler-copy { + color: var(--color-code-foreground); + +} + +.highlight .go { + color: var(--color-code-foreground); + font-weight: normal; +} + +.highlight .l { + color: var(--color-code-foreground); } #contents.toc { background-color: #ffffff; border: none; } + +.back-to-top { + background-color:var(--color-background-secondary); +} + +div.topic { + border-radius: 4px; +} + +div.topic a.reference.internal { + border: 0px; +} + +div.toctree-wrapper.compound a.reference.internal { + border: 0px; +} + +#indices-and-tables a.reference.internal { + border: 0px; +} + +.sidebar-logo { + max-width: 70%; +} diff --git a/docs/_static/logo.svg b/docs/_static/logo.svg new file mode 100644 index 000000000..50f5ed357 --- /dev/null +++ b/docs/_static/logo.svg @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html deleted file mode 100644 index 73e21fc14..000000000 --- a/docs/_templates/sidebarlogo.html +++ /dev/null @@ -1,13 +0,0 @@ -

{{ project }}

- -

-

- Remote Control of Your Greenbone Vulnerability Manager (GVM) -

diff --git a/docs/conf.py b/docs/conf.py index 057d885a5..3d93a1fda 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -82,51 +82,65 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "alabaster" +html_theme = "furo" +html_title = project html_favicon = "favicon.png" -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -html_theme_options = { - "github_user": "greenbone", - "github_repo": "python-gvm", - "github_banner": True, - "show_powered_by": False, -} +html_css_files = ["custom.css"] +html_logo = "_static/logo.svg" -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} -html_sidebars = { - "**": [ - "sidebarlogo.html", - "localtoc.html", - "relations.html", - "searchbox.html", - ] +repo_url = "https://github.com/greenbone/python-gvm/" +html_theme_options = { + "source_repository": repo_url, + "source_branch": "main", + "source_directory": "src/", + "light_css_variables": { + "color-content-foreground": "#4C4C4C", + "color-foreground-primary": "4C4C4C", + "color-foreground-secondary": "#7F7F7F", + "color-code-background": "#333333", + "color-code-foreground": "#E5E5E5", + "color-admonition-title--note": "#11AB51", + "admonition-font-size": "0.9rem", + "color-background-primary": "#FFFFFF", + "color-background-secondary": "#F3F3F3", + "color-sidebar-background": "#F3F3F3", + }, + "dark_css_variables": { + "color-content-foreground": "#F3F3F3", + "color-foreground-primary": "F3F3F3", + "color-foreground-secondary": "#E5E5E5", + "color-code-background": "#333333", + "color-code-foreground": "#E5E5E5", + "color-admonition-title--note": "#11AB51", + "admonition-font-size": "0.9rem", + "color-background-primary": "#171717", + "color-background-secondary": "#4C4C4C", + "color-sidebar-background": "#333333", + }, + "footer_icons": [ + { + "name": "GitHub", + "url": repo_url, + "html": """ + + + + """, + "class": "", + }, + ], } -html_show_sourcelink = False - autodoc_typehints = "description" autodoc_typehints_description_target = "documented" autodoc_class_signature = "separated" +pygments_style = "zenburn" # -- Options for HTMLHelp output --------------------------------------------- diff --git a/docs/requirements.txt b/docs/requirements.txt index 17ed367af..8ed4c2c7c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,4 +2,4 @@ lxml paramiko defusedxml sphinx -sphinx-autodoc-typehints +furo diff --git a/poetry.lock b/poetry.lock index f1e615565..0bc4559a8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -115,6 +115,21 @@ cffi = ">=1.1" tests = ["pytest (>=3.2.1,!=3.3.0)"] typecheck = ["mypy"] +[[package]] +name = "beautifulsoup4" +version = "4.11.1" +description = "Screen-scraping library" +category = "dev" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "22.6.0" @@ -267,6 +282,20 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "furo" +version = "2022.6.21" +description = "A clean customisable Sphinx documentation theme." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +beautifulsoup4 = "*" +pygments = "*" +sphinx = ">=4.0,<6.0" +sphinx-basic-ng = "*" + [[package]] name = "h11" version = "0.12.0" @@ -629,6 +658,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "sphinx" version = "5.1.1" @@ -661,6 +698,20 @@ docs = ["sphinxcontrib-websupport"] lint = ["flake8 (>=3.5.0)", "flake8-comprehensions", "flake8-bugbear", "isort", "mypy (>=0.971)", "sphinx-lint", "docutils-stubs", "types-typed-ast", "types-requests"] test = ["pytest (>=4.6)", "html5lib", "cython", "typed-ast"] +[[package]] +name = "sphinx-basic-ng" +version = "0.0.1a12" +description = "A modern skeleton for Sphinx themes." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +sphinx = ">=4.0,<6.0" + +[package.extras] +docs = ["furo", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs", "ipython"] + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.2" @@ -800,7 +851,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.7.0" -content-hash = "c32709440a126674e550370c389694569dff5517df02da477c031099333c078a" +content-hash = "f0094fb76637971a592835626b7e51b58805b158cdaeaec3afe22cd71f23e90c" [metadata.files] alabaster = [ @@ -848,6 +899,10 @@ bcrypt = [ {file = "bcrypt-3.2.2-cp36-abi3-win_amd64.whl", hash = "sha256:7ff2069240c6bbe49109fe84ca80508773a904f5a8cb960e02a977f7f519b129"}, {file = "bcrypt-3.2.2.tar.gz", hash = "sha256:433c410c2177057705da2a9f2cd01dd157493b2a7ac14c8593a16b3dab6b6bfb"}, ] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] black = [ {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, @@ -1042,6 +1097,10 @@ docutils = [ {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] +furo = [ + {file = "furo-2022.6.21-py3-none-any.whl", hash = "sha256:061b68e323345e27fcba024cf33a1e77f3dfd8d9987410be822749a706e2add6"}, + {file = "furo-2022.6.21.tar.gz", hash = "sha256:9aa983b7488a4601d13113884bfb7254502c8729942e073a0acb87a5512af223"}, +] h11 = [ {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, @@ -1311,10 +1370,18 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] sphinx = [ {file = "Sphinx-5.1.1-py3-none-any.whl", hash = "sha256:309a8da80cb6da9f4713438e5b55861877d5d7976b69d87e336733637ea12693"}, {file = "Sphinx-5.1.1.tar.gz", hash = "sha256:ba3224a4e206e1fbdecf98a4fae4992ef9b24b85ebf7b584bb340156eaf08d89"}, ] +sphinx-basic-ng = [ + {file = "sphinx_basic_ng-0.0.1a12-py3-none-any.whl", hash = "sha256:e8b6efd2c5ece014156de76065eda01ddfca0fee465aa020b1e3c12f84570bbe"}, + {file = "sphinx_basic_ng-0.0.1a12.tar.gz", hash = "sha256:cffffb14914ddd26c94b1330df1d72dab5a42e220aaeb5953076a40b9c50e801"}, +] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, diff --git a/pyproject.toml b/pyproject.toml index cf9b76b8b..047c3d093 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ autohooks-plugin-black = ">=22.7.0" autohooks-plugin-isort = ">=22.3.0" black = ">=22.6.0" pontos = ">=22.7.2" +furo = ">=2022.6.21" [tool.black] line-length = 80 From bb730e64ea613a95fb7c78eb2b0e8b1e97ba8094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Thu, 11 Aug 2022 11:33:20 +0200 Subject: [PATCH 2/5] Remove now obsolete contents directives Because furo already lists the contents in a navigation bar this content directive must be removed. --- docs/install.rst | 5 ----- docs/usage.rst | 5 ----- 2 files changed, 10 deletions(-) diff --git a/docs/install.rst b/docs/install.rst index c15fd3287..f59b1731d 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -3,11 +3,6 @@ Installation of python-gvm ========================== -.. contents:: - :local: - :class: toc - :backlinks: none - .. note:: All commands listed here use the general tool names. If some of these tools are provided by the distribution, the Python 3 version of the tool may have to be used, e.g. :program:`pip3`. diff --git a/docs/usage.rst b/docs/usage.rst index 5a2f2d6d0..ae4390fb0 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -3,11 +3,6 @@ Usage ===== -.. contents:: - :local: - :class: toc - :backlinks: none - Introduction ------------ From d1d602e45724b293ea9aeadf4f3dd6ce83ff0938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Thu, 11 Aug 2022 11:34:13 +0200 Subject: [PATCH 3/5] Change: Improve installation chapter Use the module call for pip (`python3 -m pip`) which should work on all systems. This allows to remove the note for pip3 and restructure the headings. --- docs/install.rst | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/install.rst b/docs/install.rst index f59b1731d..7e1453c89 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -3,13 +3,6 @@ Installation of python-gvm ========================== -.. note:: All commands listed here use the general tool names. If some of these - tools are provided by the distribution, the Python 3 version of the tool may - have to be used, e.g. :program:`pip3`. - -Installing the Latest Stable Release of python-gvm --------------------------------------------------- - For installing the latest stable release of **python-gvm**, `pip`_, `poetry`_ or `pipenv`_ can be used. @@ -17,14 +10,14 @@ If an application or library that uses **python-gvm** internally is developed, it is often better to choose `poetry`_ for handling the dependencies. Using pip -^^^^^^^^^ +--------- For installing **python-gvm** using `pip`_ run:: - pip install python-gvm + python3 -m pip install python-gvm Using poetry -^^^^^^^^^^^^ +------------ For installing **python-gvm** using `poetry`_ run:: @@ -34,7 +27,7 @@ If the usage of `poetry`_ is not familiar, its documentation can be found at https://python-poetry.org/docs/. Using pipenv -^^^^^^^^^^^^ +------------ For installing **python-gvm** using `pipenv`_ run:: @@ -55,7 +48,7 @@ To clone the public repository run:: Once there is a copy of the source, it can be embedded it the own application as follows:: - pip install -e /path/to/python-gvm + python3 -m pip install -e /path/to/python-gvm .. _pip: https://pip.pypa.io/en/stable/ .. _pipenv: https://pipenv.readthedocs.io/en/latest/ From 20622bdddb5672f5a22ca33643631ce78374c65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Thu, 11 Aug 2022 13:38:06 +0200 Subject: [PATCH 4/5] Update autohooks to 22.8.0 --- poetry.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0bc4559a8..9d14c48f2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -40,15 +40,15 @@ wrapt = ">=1.11,<2" [[package]] name = "autohooks" -version = "22.7.2" +version = "22.8.0" description = "Library for managing git hooks" category = "dev" optional = false python-versions = ">=3.7,<4.0" [package.dependencies] -colorful = ">=0.5.4,<0.6.0" -pontos = ">=22.7.0,<23.0.0" +pontos = ">=22.8.0" +rich = ">=12.5.1,<13.0.0" tomlkit = ">=0.5.11" [[package]] @@ -851,7 +851,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.7.0" -content-hash = "f0094fb76637971a592835626b7e51b58805b158cdaeaec3afe22cd71f23e90c" +content-hash = "fd8a9391b1f5eda2b5e3592fb2acf04adf5312d7e52d1e70ba9b7f8865ea1291" [metadata.files] alabaster = [ @@ -867,8 +867,8 @@ astroid = [ {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, ] autohooks = [ - {file = "autohooks-22.7.2-py3-none-any.whl", hash = "sha256:8fd967717ac60ac69f09ff5deb8cfdba6dd007fa293f49903e111ce9a06d626e"}, - {file = "autohooks-22.7.2.tar.gz", hash = "sha256:7dc86b0d85a74968f72c27d7b817978ae6f8100706f730c63321e7b59b1c75b9"}, + {file = "autohooks-22.8.0-py3-none-any.whl", hash = "sha256:3a9ff614c1336aa8e777d826367c47fd763df1e353d49dfeaeec7dae932459fa"}, + {file = "autohooks-22.8.0.tar.gz", hash = "sha256:af718aafc680327b755cf7c7548342541e64c010d5d9aaafd61afc3c93df9928"}, ] autohooks-plugin-black = [ {file = "autohooks-plugin-black-22.8.1.tar.gz", hash = "sha256:cf48a1951b12f8eac9e697fb18edb05ab3519da8f29e7b31135bfc1cdb74b3f5"}, From 8e2a6e355e4cba67add797f970958590df2a14c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Thu, 11 Aug 2022 13:40:49 +0200 Subject: [PATCH 5/5] Update index page and remove indices and tables The indices and tables section has been auto generated automatically initially. --- docs/index.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 1ba5a2dc2..460b955f4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -27,11 +27,3 @@ can be found in this part of the documentation. :maxdepth: 2 api/api - - -Indices and Tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search`