# -*- 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.
from __future__ import print_function

import sys, os, re
from datetime import date

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']

# Unless we only generate the basic manpage we need the plugin for generating
# the Python API documentation.
if not building_man_page:
    extensions.append('sphinx_automodapi.automodapi')

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

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

try:
  import recommonmark
except ImportError:
  # manpages do not use any .md sources
  if not building_man_page:
    raise
else:
  import sphinx
  if sphinx.version_info >= (3, 0):
    # This requires 0.5 or later.
    extensions.append('recommonmark')
  else:
    source_parsers = {'.md': 'recommonmark.parser.CommonMarkParser'}
  source_suffix['.md'] = 'markdown'

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

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = u'LLDB'
copyright = u'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 = 'alabaster'

# 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 = {
    'font_size': '11pt',
    # Don't generate any links to GitHub.
    'github_button' : 'false',
}

# 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 = 'The LLDB Debugger'

# 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_context = {
    'css_files': [
        '_static/lldb.css'
        ],
    }

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', u'LLDB Documentation',
   u'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', u'LLDB Documentation', [u'LLVM project'], 1),
             ('man/lldb-server', 'lldb-server', u'LLDB Documentation', [u'LLVM project'], 1),
             ]

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

def process_md(name):
    file_subpath = os.path.join(command_guide_subpath, name)
    with open(os.path.join(command_guide_path, name)) as f:
        title = f.readline().rstrip('\n')

        m = re.match(r'^# (\S+) - (.+)$', title)
        if m is None:
            print("error: invalid title in %r "
                  "(expected '# <name> - <description>')" % file_subpath,
                  file=sys.stderr)
        else:
            man_pages.append((file_subpath.replace('.md',''), m.group(1),
                              m.group(2), man_page_authors, 1))

# -- 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', u'LLDB Documentation',
   u'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 cleanup_source(app, docname, source):
    """ Cleans up 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 setup(app):
    app.connect('source-read', cleanup_source)
