# -*- coding: utf-8 -*-
#
# LLDB documentation build configuration file, created by
# sphinx-quickstart on Sun Dec  9 20:01:55 2012.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os, re, shutil
from datetime import date

# Add path for llvm_slug module.
sys.path.insert(0, os.path.abspath(os.path.join("..", "..", "llvm", "docs")))

building_man_page = tags.has("builder-man")

# For the website we need to setup the path to the generated LLDB module that
# we can generate documentation for its API.
if not building_man_page:
    # If extensions (or modules to document with autodoc) are in another directory,
    # add these directories to sys.path here. If the directory is relative to the
    # documentation root, use os.path.abspath to make it absolute, like shown here.

    # Add the current directory that contains the mock _lldb native module which
    # is imported by the `lldb` module.
    sys.path.insert(0, os.path.abspath("."))
    # Add the build directory that contains the `lldb` module. LLDB_SWIG_MODULE is
    # set by CMake.
    sys.path.insert(0, os.getenv("LLDB_SWIG_MODULE"))

# Put the generated Python API documentation in the 'python_api' folder. This
# also defines the URL these files will have in the generated website.
automodapi_toctreedirnm = "python_api"

# -- General configuration -----------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ["sphinx.ext.todo", "sphinx.ext.mathjax", "sphinx.ext.intersphinx"]

# When building man pages, we do not use the markdown pages,
# So, we can continue without the myst_parser dependencies.
# Doing so reduces dependencies of some packaged llvm distributions.
try:
    import myst_parser

    extensions.append("myst_parser")
except ImportError:
    if not tags.has("builder-man"):
        raise

# Automatic anchors for markdown titles
myst_heading_anchors = 6
myst_heading_slug_func = "llvm_slug.make_slug"

autodoc_default_options = {"special-members": True}

# The suffix of source filenames.
source_suffix = {
    ".rst": "restructuredtext",
}

# Unless we only generate the basic manpage we need the plugin for generating
# the Python API documentation.
if not building_man_page:
    try:
        import sphinx_automodapi.automodapi
    except ModuleNotFoundError:
        print(
            f"install sphinx_automodapi with {sys.executable} -m pip install sphinx_automodapi"
        )
    extensions.append("sphinx_automodapi.automodapi")

    try:
        import furo
    except ModuleNotFoundError:
        print(f"install sphinx furo theme with {sys.executable} -m pip install furo")
    # The theme to use for HTML and HTML Help pages.  See the documentation for
    # a list of builtin themes.
    html_theme = "furo"

    # Since man pages do not use markdown, we do not need to register a markdown
    # parser.
    source_suffix[".md"] = "markdown"

# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]

# The encoding of source files.
# source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = "index"

# General information about the project.
project = "LLDB"
copyright = "2007-%d, The LLDB Team" % date.today().year

# 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. These are currently set to zero because we don't use them.
# Should somebody consider in the future to change them, they need to be updated
# everytime a new release comes out.
#
# The short version.
# version = '0'
# The full version, including alpha/beta/rc tags.
# release = '0'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ["_build", "analyzer"]
# Ignore the generated Python documentation that is only used on the website.
# Without this we will get a lot of warnings about doc pages that aren't
# included by any doctree (as the manpage ignores those pages but they are
# potentially still around from a previous website generation).
if building_man_page:
    exclude_patterns.append(automodapi_toctreedirnm)
# Use the recommended 'any' rule so that referencing SB API classes is possible
# by just writing `SBData`.
default_role = "any"

# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "friendly"

# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []


# -- Options for HTML output ---------------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = "furo"

# 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 = {
    "source_repository": "https://github.com/llvm/llvm-project",
    "source_branch": "main",
    "source_directory": "lldb/docs/",
}

# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
html_title = "🐛 LLDB"

# A shorter title for the navigation bar.  Default is the same as html_title.
# html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None

# The name of an image file (within the static path) to use as favicon of the
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None

# 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"]

html_extra_path = [".htaccess"]

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = "%b %d, %Y"

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}

# If false, no module index is generated.
# html_domain_indices = True

# 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 = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None

# Output file base name for HTML help builder.
htmlhelp_basename = "LLDBdoc"

# If true, the reST sources are included in the HTML build as
# _sources/name. The default is True.
html_copy_source = False

# -- Options for LaTeX output --------------------------------------------------

latex_elements = {
    # The paper size ('letterpaper' or 'a4paper').
    #'papersize': 'letterpaper',
    # The font size ('10pt', '11pt' or '12pt').
    #'pointsize': '10pt',
    # Additional stuff for the LaTeX preamble.
    #'preamble': '',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
    ("index", "LLDB.tex", "LLDB Documentation", "The LLDB Team", "manual"),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False

# If true, show page references after internal links.
# latex_show_pagerefs = False

# If true, show URL addresses after external links.
# latex_show_urls = False

# Documents to append as an appendix to all manuals.
# latex_appendices = []

# If false, no module index is generated.
# latex_domain_indices = True


# -- Options for manual page output --------------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    ("man/lldb", "lldb", "LLDB Documentation", ["LLVM project"], 1),
    ("man/lldb-server", "lldb-server", "LLDB Documentation", ["LLVM project"], 1),
]

# If true, show URL addresses after external links.
# man_show_urls = False

# -- Options for Texinfo output ------------------------------------------------

# 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",
        "LLDB",
        "LLDB Documentation",
        "The LLDB Team",
        "LLDB",
        "One line description of project.",
        "Miscellaneous",
    ),
]

# Documents to append as an appendix to all manuals.
# texinfo_appendices = []

# If false, no module index is generated.
# texinfo_domain_indices = True

# How to display URL addresses: 'footnote', 'no', or 'inline'.
# texinfo_show_urls = 'footnote'

empty_attr_summary = re.compile(
    r"\.\. rubric:: Attributes Summary\s*\.\. autosummary::\s*\.\. rubric::"
)
empty_attr_documentation = re.compile(
    r"\.\. rubric:: Attributes Documentation\s*\.\. rubric::"
)


def preprocess_source(app, docname, source):
    """Preprocesses source files generated by automodapi."""
    # Don't cleanup anything beside automodapi-generated sources.
    if not automodapi_toctreedirnm in docname:
        return
    processed = source[0]

    # Don't show the list of inheritance info as there is no inheritance in the
    # SBI API. This avoids all the repeated text on all doc pages that a
    # class inherits from 'object'.

    processed = processed.replace(":show-inheritance:", "")
    # Remove the SWIG generated 'thisown' attribute. It just bloats the generated
    # documentation and users shouldn't fiddle with the value anyway.
    processed = re.sub(r"~SB[a-zA-Z]+\.thisown", "", processed)
    processed = processed.replace("  .. autoattribute:: thisown", "")

    # After removing 'thisown', many objects don't have any attributes left.
    # Remove all now empty attribute summary/documentation sections with
    # some rather ugly regex.
    processed = empty_attr_summary.sub(".. rubric::", processed)
    processed = empty_attr_documentation.sub(".. rubric::", processed)

    # Replace the original source with the processed one (source is a single
    # element list).
    source[0] = processed


def cleanup_source(app, exception):
    """Remove files generated by automodapi in the source tree."""
    if hasattr(app.config, "automodapi_toctreedirnm"):
        api_source_dir = os.path.join(app.srcdir, app.config.automodapi_toctreedirnm)
        shutil.rmtree(api_source_dir, ignore_errors=True)


def setup(app):
    app.connect("source-read", preprocess_source)
    app.connect("build-finished", cleanup_source)
