# -*- coding: utf-8 -*-
# Copyright 2022 GlobalFoundries PDK 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.
#
# SPDX-License-Identifier: Apache-2.0

#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config

# -- Path setup --------------------------------------------------------------

# 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.
#
import docutils
import os
import re
# import sys
# sys.path.insert(0, os.path.abspath('.'))


# -- Project information -----------------------------------------------------

project = 'GlobalFoundries GF180MCU PDK'
copyright = '2022, GlobalFoundries PDK Authors'
author = 'GlobalFoundries PDK Authors'

# The short X.Y version
version = ''
# The full version, including alpha/beta/rc tags
release = ''

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

# 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.autodoc',
    'sphinx.ext.autosectionlabel',
    'sphinx.ext.githubpages',
    'sphinx.ext.ifconfig',
    'sphinx.ext.mathjax',
    'sphinx.ext.napoleon',
    'sphinx.ext.todo',
    'sphinxcontrib.rsvgconverter',
]

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

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'

# The master toctree document.
master_doc = 'index'

# Enable github links when not on readthedocs
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if not on_rtd:
    html_context = {
        "display_github": True,              # Integrate GitHub
        "github_user": "google",             # Username
        "github_repo": "gf180mcu-pdk",       # Repo name
        "github_version": "main",            # Version
        "conf_py_path": "/docs/",
    }
else:
    docs_dir = os.path.abspath(os.path.dirname(__file__))
    print("Docs dir is:", docs_dir)
    import subprocess
    subprocess.call('git fetch origin --unshallow', cwd=docs_dir, shell=True)
    subprocess.check_call('git fetch origin --tags', cwd=docs_dir, shell=True)

# 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 full version, including alpha/beta/rc tags.
release = re.sub('^v', '', os.popen('git describe ').read().strip())
# The short X.Y version.
version = release

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'en'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = [
    '_build',
    'env',
    'venv',
    'Thumbs.db',
    '.DS_Store',
]

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

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

# Prefix each section label with the name of the document it is in, followed by
# a colon. For example, index:Introduction for a section called Introduction
# that appears in document index.rst. Useful for avoiding ambiguity when the
# same section heading appears in different documents.
#autosectionlabel_prefix_document = True


# -- 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 = "sphinx_symbiflow_theme"

html_logo = "_static/gf180mcu-pdk-logo-top.png"

# 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.
# https://sphinx-symbiflow-theme.readthedocs.io/en/latest/customization.html
html_theme_options = {
    'nav_title': 'GlobalFoundries GF180MCU PDK',

    'color_primary': 'orange',
    'color_accent': 'teal',

    # Set the repo location to get a badge with stats
    'github_url': 'https://github.com/google/gf180mcu-pdk',
    'repo_name': 'gf180mcu-pdk',
    'repo_type': 'github',

    'globaltoc_depth': 0,
    'globaltoc_collapse': True,

    # Hide the symbiflow links
    'hide_symbiflow_links': True,
    'license_url' : 'https://www.apache.org/licenses/LICENSE-2.0',
}

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


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

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    ('gf180mcu-pdk', 'GlobalFoundries 0.18UM PDK Documentation',
     [author], 1)
]

latex_elements = {
     'preamble': r'\DeclareUnicodeCharacter{03A9}{\ensuremath{\Omega}}' +
                 r'\DeclareUnicodeCharacter{03BC}{\ensuremath{\mu}}' +
                 r'\DeclareUnicodeCharacter{2184}{\ensuremath{\supset}}' +
                 r'\DeclareUnicodeCharacter{2295}{\ensuremath{\oplus}}' +
                 r'\DeclareUnicodeCharacter{2228}{\ensuremath{\vee}}' +
                 r'\DeclareUnicodeCharacter{22BB}{\ensuremath{\veebar}}' +
                 r'\DeclareUnicodeCharacter{01C1}{\ensuremath{\parallel}}' +
                 r'\DeclareUnicodeCharacter{2220}{\ensuremath{\angle}}' +
                 r'\DeclareUnicodeCharacter{2227}{\ensuremath{\wedge}}' +
                 r'\DeclareUnicodeCharacter{25A1}{\ensuremath{\Box}}' +
                 r'\DeclareUnicodeCharacter{F06D}{\ensuremath{\Box}}' +
                 r'\DeclareUnicodeCharacter{F057}{\ensuremath{\otimes}}'
}

def setup(app):
    app.add_css_file('GF_theme.css')
