blob: 954b1d2b988c3f4029e35e4f143fb901774bdf24 [file] [log] [blame]
# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Pigweed's Sphinx configuration."""
from datetime import date
import pygments
import sphinx
from pw_console.pigweed_code_style import PigweedCodeStyle
from pw_console.pigweed_code_style import PigweedCodeLightStyle
# The suffix of source filenames.
source_suffix = ['.rst']
# The master toctree document. # inclusive-language: ignore
master_doc = 'index'
# General information about the project.
project = 'Pigweed'
copyright = f'{date.today().year} The Pigweed Authors' # pylint: disable=redefined-builtin
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.1'
# The full version, including alpha/beta/rc tags.
release = '0.1.0'
# Pygments plugin approach (https://pygments.org/docs/plugins/) for getting
# Sphinx to use our custom styles doesn't work. Use this approach instead:
# https://stackoverflow.com/q/48615629/1669860
def pygments_monkeypatch_style(mod_name, cls):
import sys
import pygments.styles
cls_name = cls.__name__
mod = type(__import__('os'))(mod_name)
setattr(mod, cls_name, cls)
setattr(pygments.styles, mod_name, mod)
sys.modules['pygments.styles.' + mod_name] = mod
from pygments.styles import STYLE_MAP
STYLE_MAP[mod_name] = mod_name + '::' + cls_name
pygments_monkeypatch_style('pigweed_code_style', PigweedCodeStyle)
pygments_monkeypatch_style('pigweed_code_light_style', PigweedCodeLightStyle)
extensions = [
"pw_docgen.sphinx.bug",
"pw_docgen.sphinx.google_analytics", # Enables optional Google Analytics
"pw_docgen.sphinx.kconfig",
"pw_docgen.sphinx.module_metadata",
"pw_docgen.sphinx.modules_index",
"pw_docgen.sphinx.pigweed_live",
"pw_docgen.sphinx.pw_status_codes",
"pw_docgen.sphinx.seed_metadata",
"sphinx.ext.autodoc", # Automatic documentation for Python code
"sphinx.ext.napoleon", # Parses Google-style docstrings
"sphinxarg.ext", # Automatic documentation of Python argparse
"sphinxcontrib.mermaid",
"sphinx_design",
"breathe",
"sphinx_copybutton", # Copy-to-clipboard button on code blocks
"sphinx_reredirects",
"sphinx_sitemap",
]
# When a user clicks the copy-to-clipboard button the `$ ` prompt should not be
# copied: https://sphinx-copybutton.readthedocs.io/en/latest/use.html
copybutton_prompt_text = "$ "
_DIAG_HTML_IMAGE_FORMAT = 'SVG'
blockdiag_html_image_format = _DIAG_HTML_IMAGE_FORMAT
nwdiag_html_image_format = _DIAG_HTML_IMAGE_FORMAT
seqdiag_html_image_format = _DIAG_HTML_IMAGE_FORMAT
actdiag_html_image_format = _DIAG_HTML_IMAGE_FORMAT
rackdiag_html_image_format = _DIAG_HTML_IMAGE_FORMAT
packetdiag_html_image_format = _DIAG_HTML_IMAGE_FORMAT
# Tell m2r to parse links to .md files and add them to the build.
m2r_parse_relative_links = True
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'pydata_sphinx_theme'
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = 'Pigweed'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
html_use_smartypants = True
# If false, no module index is generated.
html_domain_indices = True
html_favicon = 'docs/_static/pw_logo.ico'
html_logo = 'docs/_static/pw_logo.svg'
# If false, no index is generated.
html_use_index = True
# If true, the index is split into individual pages for each letter.
html_split_index = False
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = False
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# These folders are copied to the documentation's HTML output
html_static_path = ['docs/_static']
# These paths are either relative to html_static_path
# or fully qualified paths (eg. https://...)
html_css_files = [
"css/pigweed.css",
# We could potentially merge the Google Fonts stylesheets into a single network
# request but we already preconnect with the service in //docs/layout/layout.html
# so the performance impact of keeping these as 3 separate calls should be
# negligible.
"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap",
"https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap",
"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap",
# FontAwesome for mermaid and sphinx-design
"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css",
]
html_js_files = [
"js/pigweed.js",
# Needed for sidebar search
"https://cdnjs.cloudflare.com/ajax/libs/fuzzysort/2.0.4/fuzzysort.js",
]
html_theme_options = {
# https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/header-links.html#navigation-bar-dropdown-links
'header_links_before_dropdown': 5,
# https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/header-links.html#icon-links
'icon_links': [
{
'name': 'Source code',
'url': 'https://cs.opensource.google/pigweed/pigweed/',
'icon': 'fa-solid fa-code',
},
{
'name': 'Issue tracker',
'url': 'https://pwbug.dev',
'icon': 'fa-solid fa-bug',
},
{
'name': 'Discord',
'url': 'https://discord.com/channels/691686718377558037/691686718377558040',
'icon': 'fa-brands fa-discord',
},
],
# https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/branding.html
'logo': {
'text': 'Pigweed',
'image_light': '_static/pw_logo.svg',
'image_dark': '_static/pw_logo.svg',
},
# https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/layout.html#configure-the-navbar-center-alignment
'navbar_align': 'right',
# https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/styling.html#configure-pygments-theme
'pygments_light_style': 'pigweed_code_light_style',
'pygments_dark_style': 'pigweed_code_style',
}
# sphinx-sitemap needs this:
# https://sphinx-sitemap.readthedocs.io/en/latest/getting-started.html#usage
html_baseurl = 'https://pigweed.dev/'
# Hide "Section Navigation" on homepage and changelog.
html_sidebars = {'index': [], 'changelog': []}
html_context = {
'default_mode': 'dark',
}
# https://sphinx-sitemap.readthedocs.io/en/latest/advanced-configuration.html
sitemap_url_scheme = '{link}'
mermaid_init_js = '''
mermaid.initialize({
// Mermaid is manually started in //docs/_static/js/pigweed.js.
startOnLoad: false,
// sequenceDiagram Note text alignment
noteAlign: "left",
// Set mermaid theme to the current furo theme
theme: localStorage.getItem("theme") == "dark" ? "dark" : "default"
});
'''
# Output file base name for HTML help builder.
htmlhelp_basename = 'Pigweeddoc'
# Client-side redirects. See //docs/contributing/docs/website.rst.
# Use relative URLs and provide the full path to ensure that the
# redirects work when developing locally. An example of using the
# full path is `./example/docs.html`. Using just `./example/`
# assumes that the redirect will work, which may not be true during
# local development.
redirects = {
'docs/contributing': './contributing/index.html',
'docs/contributing/changelog': './docs/changelog.html',
'docs/contributing/module_docs': './docs/modules.html',
'docs/getting_started': './get_started/index.html',
'docs/infra/github': '../get_started/github.html',
'docs/os_abstraction_layers': './os/index.html',
'docs/release_notes/index': '../../changelog.html',
'docs/release_notes/2022_jan': '../../changelog.html',
# Can be deleted after pw_enviro stuff gets published.
'drafts/pw_enviro/index': 'https://storage.googleapis.com/pigweed-docs-try/220311/docs/showcases/pw_enviro/tutorial.html',
'live/index': 'https://docs.google.com/document/d/1zcXQoMX6NDSe4cdxzt8afLbDcs8GSmI_Bsy5hTF_RVM/edit',
'module_guides': './modules.html',
'pw_sys_io_pico/docs': '../pw_sys_io_rp2040/docs.html',
'pw_tokenizer/cli': './docs.html',
'pw_tokenizer/guides': './docs.html',
}
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [('index', 'pigweed', 'Pigweed', ['Google'], 1)]
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(
'index',
'Pigweed',
'Pigweed',
'Google',
'Pigweed',
'Firmware framework',
'Miscellaneous',
),
]
templates_path = ['docs/layout']
exclude_patterns = ['docs/templates/**']
breathe_projects = {
# Assuming doxygen output is at out/docs/doxygen/
# This dir should be relative to out/docs/gen/docs/pw_docgen_tree/
"Pigweed": "./../../../doxygen/xml/",
}
breathe_default_project = "Pigweed"
breathe_debug_trace_directives = True
# (b/295023422) Disable the inaccurate `#include` statements that are generated
# when `doxygennamespace` is used.
breathe_show_include = False
# Treat these as valid attributes in function signatures.
cpp_id_attributes = [
"PW_EXTERN_C_START",
"PW_NO_LOCK_SAFETY_ANALYSIS",
]
# This allows directives like this to work:
# .. cpp:function:: inline bool try_lock_for(
# chrono::SystemClock::duration timeout) PW_EXCLUSIVE_TRYLOCK_FUNCTION(true)
cpp_paren_attributes = [
"PW_EXCLUSIVE_TRYLOCK_FUNCTION",
"PW_EXCLUSIVE_LOCK_FUNCTION",
"PW_UNLOCK_FUNCTION",
"PW_NO_SANITIZE",
]
# inclusive-language: disable
# Info on cpp_id_attributes and cpp_paren_attributes
# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-cpp_id_attributes
# inclusive-language: enable
# Disable Python type hints
# autodoc_typehints = 'none'
# Break class and function signature arguments into one arg per line if the
# total length exceeds 130 characters. 130 seems about right for keeping one or
# two parameters on a single line.
maximum_signature_line_length = 130
def do_not_skip_init(app, what, name, obj, would_skip, options):
if name == "__init__":
return False # never skip __init__ functions
return would_skip
# Problem: CSS files aren't copied after modifying them. Solution:
# https://github.com/sphinx-doc/sphinx/issues/2090#issuecomment-572902572
def env_get_outdated(app, env, added, changed, removed):
return ['index']
def setup(app):
app.add_css_file('css/pigweed.css')
app.connect('env-get-outdated', env_get_outdated)
app.connect("autodoc-skip-member", do_not_skip_init)