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