Source code for tahrir.utils.docs
import codecs
import os
import docutils
import docutils.examples
import markupsafe
from flask import current_app
[docs]
def modify_rst(rst):
"""Downgrade some of our rst directives if docutils is too old."""
try:
# The rst features we need were introduced in this version
minimum = [0, 9]
version = [int(elem) for elem in docutils.__version__.split(".")]
# If we're at or later than that version, no need to downgrade
if version >= minimum:
return rst
except Exception:
# If there was some error parsing or comparing versions, run the
# substitutions just to be safe.
pass
# Otherwise, make code-blocks into just literal blocks.
substitutions = {
".. code-block:: javascript": "::",
}
for old, new in substitutions.items():
rst = rst.replace(old, new)
return rst
[docs]
def modify_html(html):
"""Perform style substitutions where docutils doesn't do what we want."""
substitutions = {
'<tt class="docutils literal">': "<code>",
"</tt>": "</code>",
}
for old, new in substitutions.items():
html = html.replace(old, new)
return html
def _load_docs(directory, endpoint):
"""Utility to load an RST file and turn it into fancy HTML."""
fname = os.path.join(directory, endpoint + ".rst")
with codecs.open(fname, "r", "utf-8") as f:
rst = f.read()
rst = modify_rst(rst)
api_docs = docutils.examples.html_body(rst)
api_docs = modify_html(api_docs)
api_docs = markupsafe.Markup(api_docs)
return api_docs
htmldocs = {}
[docs]
def load_docs(key):
possible_keys = ["about", "footer"]
# Load from disk only once on first request.
if not htmldocs:
directory = os.path.join(
current_app.root_path, current_app.config["TAHRIR_SITEDOCS_SUBDIR"]
)
for k in possible_keys:
htmldocs[k] = _load_docs(directory, k)
if key not in htmldocs:
raise KeyError(f"{key!r} is not permitted.")
return htmldocs[key]