xref: /petsc/doc/conf.py (revision c69effb2e05caa58810396c101d616d7ad9da0a7)
1# Configuration file for the Sphinx documentation builder.
2#
3# For information on options, see
4#   http://www.sphinx-doc.org/en/master/config
5#
6# This file was generated by running "sphinx-quickstart" and then modified
7
8import os
9import sys
10import subprocess
11import re
12import datetime
13
14sys.path.append(os.getcwd())
15sys.path.append(os.path.abspath('./ext'))
16
17import add_man_page_redirects
18import build_classic_docs
19import fix_man_page_edit_links
20import make_links_relative
21import update_htmlmap_links
22
23
24if not os.path.isdir("images"):
25    print("-----------------------------------------------------------------------------")
26    print("ERROR")
27    print("images directory does not seem to exist.")
28    print("To clone the required repository, try")
29    print("   make images")
30    print("-----------------------------------------------------------------------------")
31    raise Exception("Aborting because images missing")
32
33
34# -- Project information -------------------------------------------------------
35
36project = 'PETSc'
37copyright = '1991-%d, UChicago Argonne, LLC and the PETSc Development Team' % datetime.date.today().year
38author = 'The PETSc Development Team'
39
40with open(os.path.join('..', 'include', 'petscversion.h'),'r') as version_file:
41    buf = version_file.read()
42    petsc_release_flag = re.search(' PETSC_VERSION_RELEASE[ ]*([0-9]*)',buf).group(1)
43    major_version      = re.search(' PETSC_VERSION_MAJOR[ ]*([0-9]*)',buf).group(1)
44    minor_version      = re.search(' PETSC_VERSION_MINOR[ ]*([0-9]*)',buf).group(1)
45    subminor_version   = re.search(' PETSC_VERSION_SUBMINOR[ ]*([0-9]*)',buf).group(1)
46
47    git_describe_version = subprocess.check_output(['git', 'describe', '--always']).strip().decode('utf-8')
48    if petsc_release_flag == '0':
49        version = git_describe_version
50        release = git_describe_version
51    else:
52        version = '.'.join([major_version, minor_version])
53        release = '.'.join([major_version,minor_version,subminor_version])
54
55
56# -- General configuration -----------------------------------------------------
57
58# The information on the next line must also be the same in requirements.txt
59needs_sphinx='5.3'
60nitpicky = True  # checks internal links. For external links, use "make linkcheck"
61master_doc = 'index'
62templates_path = ['_templates']
63exclude_patterns = ['_build*', 'images', 'Thumbs.db', '.DS_Store','community/meetings/pre-2023']
64highlight_language = 'c'
65numfig = True
66
67# -- Extensions ----------------------------------------------------------------
68
69extensions = [
70    'sphinx_copybutton',
71    'sphinx_design',
72    'sphinxcontrib.bibtex',
73    'sphinxcontrib.katex',
74    'sphinxcontrib.rsvgconverter',
75    'myst_parser',
76    'html5_petsc',
77    'sphinx_remove_toctrees',
78]
79
80copybutton_prompt_text = '$ '
81
82bibtex_bibfiles = ['petsc.bib']
83
84myst_enable_extensions = ["dollarmath", "amsmath", "deflist"]
85
86remove_from_toctrees = ['manualpages/*/*','changes/2*','changes/3*']
87
88# -- Options for HTML output ---------------------------------------------------
89
90html_theme = 'pydata_sphinx_theme'
91
92html_logo_light = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc-TAO', 'web', 'PETSc-TAO_RGB.svg')
93html_logo_dark = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc-TAO', 'web', 'PETSc-TAO_RGB_white.svg')
94
95html_static_path = [html_logo_light, html_logo_dark]
96
97html_theme_options = {
98    "icon_links": [
99        {
100            "name": "GitLab",
101            "url": "https://gitlab.com/petsc/petsc",
102            "icon": "fab fa-gitlab",
103        },
104    ],
105    "use_edit_page_button": True,
106    "footer_items": ["copyright", "sphinx-version", "last-updated"],
107#    "secondary_sidebar_items" : ["edit-this-page"],
108     "header_links_before_dropdown": 9,
109    "logo": {
110        "image_light": os.path.basename(html_logo_light),
111        "image_dark": os.path.basename(html_logo_dark)
112    }
113}
114
115try:
116  git_ref = subprocess.check_output(["git", "rev-parse", "HEAD"]).rstrip()
117  git_ref_release = subprocess.check_output(["git", "rev-parse", "origin/release"]).rstrip()
118  edit_branch = "release" if git_ref == git_ref_release else "main"
119except subprocess.CalledProcessError:
120  print("WARNING: determining branch for page edit links failed")
121  edit_branch = "main"
122
123html_context = {
124    "github_url": "https://gitlab.com",
125    "github_user": "petsc",
126    "github_repo": "petsc",
127    "github_version": edit_branch,
128    "doc_path": "doc",
129}
130
131html_logo = html_logo_light
132html_favicon = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc', 'petsc_favicon.png')
133html_last_updated_fmt = r'%Y-%m-%dT%H:%M:%S%z (' + git_describe_version + ')'
134
135
136# -- Options for LaTeX output --------------------------------------------------
137latex_engine = 'xelatex'
138
139# How to arrange the documents into LaTeX files, building only the manual.
140latex_documents = [
141        ('manual/index', 'manual.tex', 'PETSc/TAO Users Manual', author, 'manual', False)
142        ]
143
144latex_additional_files = [
145    'images/manual/anl_tech_report/ArgonneLogo.pdf',
146    'images/manual/anl_tech_report/ArgonneReportTemplateLastPage.pdf',
147    'images/manual/anl_tech_report/ArgonneReportTemplatePage2.pdf',
148    'manual/anl_tech_report/first.inc',
149    'manual/anl_tech_report/last.inc',
150]
151
152latex_elements = {
153    'maketitle': r'\newcommand{\techreportversion}{%s}' % version +
154r'''
155\input{first.inc}
156''',
157    'printindex': r'''
158\printindex
159\input{last.inc}
160''',
161    'fontpkg': r'''
162\setsansfont{DejaVu Sans}
163\setmonofont{DejaVu Sans Mono}
164''',
165    'tableofcontents' : r''
166}
167
168
169# -- Setup and event callbacks -------------------------------------------------
170
171def setup(app):
172        app.connect('builder-inited', builder_init_handler)
173        app.connect('build-finished', build_finished_handler)
174
175
176def builder_init_handler(app):
177    if app.builder.name.endswith('html'):
178        _build_classic_docs(app, 'pre')
179        _copy_classic_docs(app, None, '.', 'pre')
180        _update_htmlmap_links(app)
181
182
183def build_finished_handler(app, exception):
184    if app.builder.name.endswith('html'):
185        _build_classic_docs(app, 'post')
186        _copy_classic_docs(app, exception, app.outdir, 'post')
187        _fix_links(app, exception)
188        _fix_man_page_edit_links(app, exception)
189        if app.builder.name == 'dirhtml':
190            _add_man_page_redirects(app, exception)
191        if app.builder.name == 'html':
192            print("==========================================================================")
193            print("    open %s/index.html in your browser to view the documentation " % app.outdir)
194            print("==========================================================================")
195
196def _add_man_page_redirects(app, exception):
197    if exception is None:
198        print("============================================")
199        print("    Adding man pages redirects")
200        print("============================================")
201        add_man_page_redirects.add_man_page_redirects(app.outdir)
202
203def _build_classic_docs(app, stage):
204    '''Builds the .md versions of the manual pages and the .html version of the source code'''
205    build_classic_docs.main(stage)
206
207
208def _copy_classic_docs(app, exception, destination, stage):
209    if exception is None:
210        print("============================================")
211        print("    Copying classic docs (%s)" % stage)
212        print("============================================")
213        build_classic_docs.copy_classic_docs(destination, stage)
214
215def _fix_man_page_edit_links(app, exception):
216    if exception is None:
217        print("============================================")
218        print("    Fixing man page edit links")
219        print("============================================")
220        fix_man_page_edit_links.fix_man_page_edit_links(app.outdir)
221
222#
223#   The following two scripts are needed because the Sphinx html and dirhtml builds save the output html
224#   files at different levels of the directory hierarchy. file.rst -> file.html with html but
225#   file.rst -> file/index.html with dirhtml and we want both to work correctly using relative links.
226
227def _fix_links(app, exception):
228    """We need to manage our own relative paths in the User's Manual for the source code files which
229       are auto-generated by c2html outside of Sphinx so Sphinx cannot directly handle those links for use.
230       We use the string PETSC_DOC_OUT_ROOT_PLACEHOLDER in URLs in the Sphinx .rst files as a stand in
231       for the root directory that needs to be constructed based on if the Sphinx build is html or dirhtml
232    """
233    if exception is None:
234        print("============================================")
235        print("    Fixing relative links")
236        print("============================================")
237        make_links_relative.make_links_relative(app.outdir)
238
239
240def _update_htmlmap_links(app):
241    """htmlmap maps from manualpage names to relative locations in the generated documentation directory
242       hierarchy. The format of the directory location needs to be different for the Sphinx html and dirhtml
243       builds
244    """
245    print("============================================")
246    print("    Updating htmlmap")
247    print("============================================")
248    update_htmlmap_links.update_htmlmap_links(app.builder)
249