Skip to content

Commit

Permalink
Refactor docs to be deployed as a static content
Browse files Browse the repository at this point in the history
  • Loading branch information
ivankravets committed Apr 28, 2021
1 parent 99e3293 commit dda03f5
Show file tree
Hide file tree
Showing 10 changed files with 366 additions and 473 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
_build
_ext/__pycache__
183 changes: 13 additions & 170 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,177 +1,20 @@
# Makefile for Sphinx documentation
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build

# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif

# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext

# Put it first so that "make" without argument is like "make help".
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"

clean:
rm -rf $(BUILDDIR)/*

html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."

json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."

htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."

qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PlatformIO.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PlatformIO.qhc"

devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/PlatformIO"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PlatformIO"
@echo "# devhelp"

epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."

latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."

man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."

info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."

gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."

changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."

linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."

doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: help Makefile

pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
127 changes: 127 additions & 0 deletions _ext/redirects.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Copyright (c) 2014-present PlatformIO <[email protected]>
#
# 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
#
# http://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.

import os
from string import Template


REDIRECT_TEMPLATE = Template(
r"""
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Redirecting&hellip;</title>
<script>
var redirect_url = "$redirect_url";
if (window.location.search) {
redirect_url += "?" + window.location.search;
}
if (window.location.hash) {
redirect_url += "#" + window.location.hash;
}
window.location.href = redirect_url;
</script>
<link rel="canonical" href="$redirect_url" />
<meta charset="utf-8" />
<meta http-equiv="refresh" content="1; URL=$redirect_url" />
<meta name="robots" content="noindex" />
</head>
<body>
<h1>Redirecting&hellip;</h1>
<p><a href="$redirect_url">Click here if you are not redirected.</a></p>
</body>
</html>
"""
)


def load_redirects(src_dir):
redirects_txt = os.path.join(src_dir, "redirects.txt")
assert os.path.isfile(redirects_txt)
result = {}
with open(redirects_txt) as fp:
for line in fp.readlines():
line = line.strip()
skip_conds = [
not line,
not line.startswith("/"),
"->" not in line,
]
if any(skip_conds):
continue
from_path, to_path = line.split("->")
from_path = from_path.strip()
to_path = to_path.strip()
assert from_path.endswith(".html")
assert to_path.endswith(".html")
result[from_path] = to_path
return result


def build_redirect_pages(app, exception):
if app.builder.name != "html":
return
is_latest = app.config.html_context.get("is_latest")
redirects = load_redirects(app.srcdir)
for from_path, to_path in redirects.items():
out_dir = app.outdir
if os.path.dirname(from_path) != "/":
out_dir = os.path.join(out_dir, os.path.dirname(from_path)[1:])
os.makedirs(out_dir, exist_ok=True)
with open(os.path.join(out_dir, os.path.basename(from_path)), "w") as fp:
fp.write(
REDIRECT_TEMPLATE.substitute(
redirect_url="%s/en/%s%s"
% (
app.config.html_baseurl,
("latest" if is_latest else "stable"),
to_path,
)
).strip()
)
print("Built %d redirect pages" % len(redirects))


def build_legacy_rtd_pages(app, exception):
if app.builder.name != "html":
return
for root, dirs, files in os.walk(app.outdir):
for name in files:
if not name.endswith(".html"):
continue
out_dir = os.path.join(os.path.dirname(app.outdir), "rtdpage")
relative_dir = root[len(os.path.commonpath([app.outdir, root])) :] or "/"
if relative_dir != "/":
out_dir = os.path.join(out_dir, relative_dir[1:])
os.makedirs(out_dir, exist_ok=True)
with open(os.path.join(out_dir, name), "w") as fp:
fp.write(
REDIRECT_TEMPLATE.substitute(
redirect_url="%s/en/latest%s%s"
% (
app.config.html_baseurl,
relative_dir,
name,
)
).strip()
)


def setup(app):
app.connect("build-finished", build_redirect_pages)
app.connect("build-finished", build_legacy_rtd_pages)
return {
"parallel_read_safe": True,
"parallel_write_safe": True,
}
3 changes: 1 addition & 2 deletions _static/css/extra.css
Original file line number Diff line number Diff line change
Expand Up @@ -529,8 +529,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus {
max-width: 1000px !important;
}

.wy-side-scroll .wy-side-nav-search .icon,
.wy-side-scroll .wy-side-nav-search .version {
.wy-side-scroll .wy-side-nav-search .icon {
display: none;
visibility: none;
}
Expand Down
14 changes: 14 additions & 0 deletions _templates/layout.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{% extends "!layout.html" %}

{% block extrahead %}
{{ super() }}
<link rel="stylesheet" href="{{ pathto('_static/css/extra.css', 1) }}" type="text/css" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<!-- <script src="http://dl.platformio.org/misc/abplus.js"></script> -->
{% endblock %}

{% block footer %}
{% include "pio-versions.html" %}
{{ super() }}
{% include "navigation.html" %}
{% endblock %}
8 changes: 0 additions & 8 deletions _templates/footer.html → _templates/navigation.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
{% extends "!footer.html" %}

{% block extrafooter %}
<link rel="stylesheet" href="{{ pathto('_static/css/extra.css', 1) }}" type="text/css" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<!-- <script src="http://dl.platformio.org/misc/abplus.js"></script> -->
<script>
var navBarHTML = '\
<div>\
Expand Down Expand Up @@ -107,5 +101,3 @@
});
})();
</script>
{{ super() }}
{% endblock %}
26 changes: 26 additions & 0 deletions _templates/pio-versions.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{# Keep in sync with https://github.com/readthedocs/sphinx_rtd_theme/blob/master/sphinx_rtd_theme/versions.html #}
{# Add rst-badge after rst-versions for small badge style. #}
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="{{ _('Versions') }}">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Documentation</span>
v{{ release }} ({{ "latest" if is_latest else "stable" }})
<span class="fa fa-caret-down"></span>
</span>
<div class="rst-other-versions">
<dl>
<dt>{{ _('Versions') }}</dt>
{% for slug, url in versions %}
<dd><a href="{{ url }}">{{ slug }}</a></dd>
{% endfor %}
</dl>
<dl>
<dt>{{ _('On Github') }}</dt>
<dd><a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}"> {{ _('View') }}</a></dd>
<dd><a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/edit/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}"> {{ _('Edit') }}</a></dd>
</dl>
<dl>
<dt>{{ _('Search') }}</dt>
<dd>{% include "searchbox.html" %}</dd>
</dl>
</div>
</div>
Loading

0 comments on commit dda03f5

Please sign in to comment.