blob: 5720ec8cde56f60ff01761eb7840cd350b2622a7 [file]
# 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 json
import os
from pathlib import Path
import sys
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)
# //docs/sphinx/_extensions must be added to the system path so that Sphinx
# knows where to find the Sphinx extensions that have been custom-built
# for pigweed.dev.
_SPHINX_DIR = Path(__file__).parent
sys.path.append(str(_SPHINX_DIR / '_extensions'))
extensions = [
'bug', # Custom extension to normalize Pigweed bug links.
'toctree',
'cs',
'module_metadata',
'modules_index',
'common',
'pigweed_live',
'pw_docgen.sphinx.google_analytics', # Enables optional Google Analytics
'seed_metadata',
'sitemap', # Custom extension to handle pigweed.dev sitemap nuances.
'sphinx.ext.autodoc', # Automatic documentation for Python code
'sphinx.ext.napoleon', # Parses Google-style docstrings
'sphinxarg.ext', # Automatic documentation of Python argparse
'sphinxcontrib.doxylink',
'sphinxcontrib.mermaid',
'sphinx_design',
'sphinx_copybutton', # Copy-to-clipboard button on code blocks
'sphinx_reredirects',
]
# 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 = '$ '
# 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 = 'https://www.gstatic.com/pigweed/pw_logo.ico'
html_logo = 'https://www.gstatic.com/pigweed/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 = ['_static']
# These paths are either relative to html_static_path
# or fully qualified paths (eg. https://...)
html_css_files = [
'css/pigweed.css',
]
html_js_files = [
# Do not list pigweed.js here. This will cause it to get loaded in <head>.
# To improve load performance we modified //docs/sphinx/layout/layout.html
# to load pigweed.js at the end of <body> instead.
# 'js/pigweed.js',
]
html_extra_path = [
# Note: In this repo the file lives at //docs/sphinx/blog/rss.xml but during the
# Sphinx build it's copied to the root of the website, https://pigweed.dev/rss.xml
'blog/rss.xml',
# In the Bazel build, the fully built rustdoc site is present in the Sphinx
# site's sources directory. Specifying the rustdoc directory here instructs
# Sphinx to copy over the entire directory to its output.
'rustdoc',
# Also copy over the Doxygen-generated HTML subsite.
'doxygen',
]
html_theme_options = {
# https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/branding.html
'logo': {
'text': 'Pigweed',
'image_light': 'https://www.gstatic.com/pigweed/pw_logo.svg',
'image_dark': 'https://www.gstatic.com/pigweed/pw_logo.svg',
},
# Hide default PyData Sphinx Theme navbar elements. Top navigation is now
# provided by //docs/common.
'navbar_center': None,
'navbar_end': None,
'navbar_persistent': None,
'navbar_start': None,
# Hide default PyData breadcrumbs. Universal breadcrumbs are now provided by
# //docs/common.
'article_header_start': [],
# 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',
# Pagefind (//docs/common/search.py) handles search now.
'disable_search': True,
}
# TODO: b/559244998 - Re-enable the staging site announcement banner.
# if 'LUCI_IS_TRY' in os.environ and os.environ['LUCI_IS_TRY'] == '1':
# html_theme_options['announcement'] = (
# "You are viewing Pigweed's docs on an automatically generated staging "
# 'site. <b>The content on this staging site may be incorrect or '
# "unapproved.</b> Pigweed's official, approved docs are only published "
# 'at <a href="https://pigweed.dev">pigweed.dev</a>.'
# )
html_baseurl = 'https://pigweed.dev/'
# The lefthand "Section Navigation" section is empty for these docs. Hide it.
html_sidebars = {
'changelog': [],
'size_optimizations': [],
'index': [],
'toolchain': [],
}
html_context = {
'default_mode': 'dark',
}
if 'GOOGLE_ANALYTICS_ID' in os.environ:
google_analytics_id = os.environ['GOOGLE_ANALYTICS_ID']
# Mermaid style API is very hard to use and full of footguns. The `neutral`
# theme is the only readable default option on both light and dark themes.
mermaid_light_theme = 'neutral'
mermaid_dark_theme = 'neutral'
# Manually start Mermaid in //docs/sphinx/_static/js/pigweed.js to ensure
# that Mermaid does not interfere with the logic that scrolls the current
# page into view in "Section Navigation".
mermaid_init_config = {'startOnLoad': False}
# Client-side redirects. See //docs/sphinx/contributing/docs/website.rst.
#
# TODO: https://pwbug.dev/430133030 - Tidy up the redirects.
redirects = json.loads(Path('redirects.json').read_text(encoding='utf-8'))
templates_path = ['layout']
exclude_patterns = ['docs/templates/**']
doxygen_xml_path = './_doxygen/xml/'
# The location of the generated Doxygen tagfile. Note that this must
# match the final location of the generated Doxygen HTML from the
# perspective of the Sphinx build system. The organization of the
# source files (as Sphinx sees it) can be viewed by running this:
# bazelisk build //docs:sources
tagfile_path = os.path.abspath('doxygen/api/cc/index.tag')
# The relative path that Doxylink should use when creating links.
doxygen_site_path = './api/cc'
doxylink = {
'cc': (tagfile_path, doxygen_site_path),
}
# 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.connect('env-get-outdated', env_get_outdated)
app.connect('autodoc-skip-member', do_not_skip_init)