# -*- 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")
