Module pdocs.html_helpers

View Source
import os

import re

import sys

import markdown

import pygments

import pygments.formatters

import pygments.lexers

import pdocs.doc

import pdocs.render

from pdocs import defaults

# From language reference, but adds '.' to allow fully qualified names.

pyident = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_.]+$")

indent = re.compile(r"^\s*")

_markdown = markdown.Markdown(

    output_format="html5",

    extensions=defaults.MARKDOWN_EXTENSIONS,

    extension_configs=defaults.MARKDOWN_EXTENSION_CONFIGS,

)

def _markdown_render(text):

    return _markdown.reset().convert(text)

def decode(s):

    if sys.version_info[0] < 3 and isinstance(s, str):

        return s.decode("utf-8", "ignore")

    return s

def ident(s):

    return '<span class="ident">%s</span>' % s

def sourceid(dobj):

    return "source-%s" % dobj.refname

def clean_source_lines(lines):

    """

  Cleans the source code so that pygments can render it well.

  Returns one string with all of the source code.

  """

    base_indent = len(indent.match(lines[0]).group(0))

    base_indent = 0

    for line in lines:

        if len(line.strip()) > 0:

            base_indent = len(indent.match(lines[0]).group(0))

            break

    lines = [line[base_indent:] for line in lines]

    if sys.version_info[0] < 3:

        pylex = pygments.lexers.PythonLexer()

    else:

        pylex = pygments.lexers.Python3Lexer()

    htmlform = pygments.formatters.HtmlFormatter(cssclass="codehilite")

    return pygments.highlight("".join(lines), pylex, htmlform)

def linkify(parent, match, link_prefix):

    matched = match.group(0)

    ident = matched[1:-1]

    name, url = lookup(parent, ident, link_prefix)

    if name is None:

        return matched

    return "[`%s`](%s)" % (name, url)

def mark(text, module_list=None, linky=True):

    if linky:

        text, _ = re.subn("\b\n\b", " ", text)

    return _markdown_render(text.strip())

def glimpse(s, length=100):

    if len(s) < length:

        return s

    return s[0:length] + "..."

def module_url(parent, m, link_prefix):

    """

        Returns a URL for `m`, which must be an instance of `Module`.

        Also, `m` must be a submodule of the module being documented.

        Namely, '.' import separators are replaced with '/' URL

        separators. Also, packages are translated as directories

        containing `index.html` corresponding to the `__init__` module,

        while modules are translated as regular HTML files with an

        `.m.html` suffix. (Given default values of

        `pdoc.html_module_suffix` and `pdoc.html_package_name`.)

    """

    if parent.name == m.name:

        return ""

    base = m.name.replace(".", "/")

    if len(link_prefix) == 0:

        base = os.path.relpath(base, parent.name.replace(".", "/"))

    url = base[len("../") :] if base.startswith("../") else "" if base == ".." else base

    if m.submodules:

        index = pdocs.render.html_package_name

        url = url + "/" + index if url else index

    else:

        url += pdocs.render.html_module_suffix

    return link_prefix + url

def external_url(refname):

    """

        Attempts to guess an absolute URL for the external identifier

        given.

        Note that this just returns the refname with an ".ext" suffix.

        It will be up to whatever is interpreting the URLs to map it

        to an appropriate documentation page.

    """

    return "/%s.ext" % refname

def is_external_linkable(name):

    return pyident.match(name) and "." in name

def lookup(module, refname, link_prefix):

    """

        Given a fully qualified identifier name, return its refname

        with respect to the current module and a value for a `href`

        attribute. If `refname` is not in the public interface of

        this module or its submodules, then `None` is returned for

        both return values. (Unless this module has enabled external

        linking.)

        In particular, this takes into account sub-modules and external

        identifiers. If `refname` is in the public API of the current

        module, then a local anchor link is given. If `refname` is in the

        public API of a sub-module, then a link to a different page with

        the appropriate anchor is given. Otherwise, `refname` is

        considered external and no link is used.

    """

    d = module.find_ident(refname)

    if isinstance(d, pdocs.doc.External):

        if is_external_linkable(refname):

            return d.refname, external_url(d.refname)

        else:

            return None, None

    if isinstance(d, pdocs.doc.Module):

        return d.refname, module_url(module, d, link_prefix)

    if module.is_public(d.refname):

        return d.name, "#%s" % d.refname

    return d.refname, "%s#%s" % (module_url(module, d.module, link_prefix), d.refname)

def link(parent, refname, link_prefix):

    """

        A convenience wrapper around `href` to produce the full

        `a` tag if `refname` is found. Otherwise, plain text of

        `refname` is returned.

    """

    name, url = lookup(parent, refname, link_prefix)

    if name is None:

        return refname

    return '<a href="%s">%s</a>' % (url, name)

Variables

indent
pyident

Functions

clean_source_lines
def (
    lines
)

Cleans the source code so that pygments can render it well.

Returns one string with all of the source code.

View Source
def clean_source_lines(lines):

    """

  Cleans the source code so that pygments can render it well.

  Returns one string with all of the source code.

  """

    base_indent = len(indent.match(lines[0]).group(0))

    base_indent = 0

    for line in lines:

        if len(line.strip()) > 0:

            base_indent = len(indent.match(lines[0]).group(0))

            break

    lines = [line[base_indent:] for line in lines]

    if sys.version_info[0] < 3:

        pylex = pygments.lexers.PythonLexer()

    else:

        pylex = pygments.lexers.Python3Lexer()

    htmlform = pygments.formatters.HtmlFormatter(cssclass="codehilite")

    return pygments.highlight("".join(lines), pylex, htmlform)
decode
def (
    s
)
View Source
def decode(s):

    if sys.version_info[0] < 3 and isinstance(s, str):

        return s.decode("utf-8", "ignore")

    return s
external_url
def (
    refname
)

Attempts to guess an absolute URL for the external identifier given.

Note that this just returns the refname with an ".ext" suffix. It will be up to whatever is interpreting the URLs to map it to an appropriate documentation page.

View Source
def external_url(refname):

    """

        Attempts to guess an absolute URL for the external identifier

        given.

        Note that this just returns the refname with an ".ext" suffix.

        It will be up to whatever is interpreting the URLs to map it

        to an appropriate documentation page.

    """

    return "/%s.ext" % refname
glimpse
def (
    s,
    length=100
)
View Source
def glimpse(s, length=100):

    if len(s) < length:

        return s

    return s[0:length] + "..."
ident
def (
    s
)
View Source
def ident(s):

    return '<span class="ident">%s</span>' % s
is_external_linkable
def (
    name
)
View Source
def is_external_linkable(name):

    return pyident.match(name) and "." in name
def (
    parent,
    refname,
    link_prefix
)

A convenience wrapper around href to produce the full a tag if refname is found. Otherwise, plain text of refname is returned.

View Source
def link(parent, refname, link_prefix):

    """

        A convenience wrapper around `href` to produce the full

        `a` tag if `refname` is found. Otherwise, plain text of

        `refname` is returned.

    """

    name, url = lookup(parent, refname, link_prefix)

    if name is None:

        return refname

    return '<a href="%s">%s</a>' % (url, name)
linkify
def (
    parent,
    match,
    link_prefix
)
View Source
def linkify(parent, match, link_prefix):

    matched = match.group(0)

    ident = matched[1:-1]

    name, url = lookup(parent, ident, link_prefix)

    if name is None:

        return matched

    return "[`%s`](%s)" % (name, url)
lookup
def (
    module,
    refname,
    link_prefix
)

Given a fully qualified identifier name, return its refname with respect to the current module and a value for a href attribute. If refname is not in the public interface of this module or its submodules, then None is returned for both return values. (Unless this module has enabled external linking.)

In particular, this takes into account sub-modules and external identifiers. If refname is in the public API of the current module, then a local anchor link is given. If refname is in the public API of a sub-module, then a link to a different page with the appropriate anchor is given. Otherwise, refname is considered external and no link is used.

View Source
def lookup(module, refname, link_prefix):

    """

        Given a fully qualified identifier name, return its refname

        with respect to the current module and a value for a `href`

        attribute. If `refname` is not in the public interface of

        this module or its submodules, then `None` is returned for

        both return values. (Unless this module has enabled external

        linking.)

        In particular, this takes into account sub-modules and external

        identifiers. If `refname` is in the public API of the current

        module, then a local anchor link is given. If `refname` is in the

        public API of a sub-module, then a link to a different page with

        the appropriate anchor is given. Otherwise, `refname` is

        considered external and no link is used.

    """

    d = module.find_ident(refname)

    if isinstance(d, pdocs.doc.External):

        if is_external_linkable(refname):

            return d.refname, external_url(d.refname)

        else:

            return None, None

    if isinstance(d, pdocs.doc.Module):

        return d.refname, module_url(module, d, link_prefix)

    if module.is_public(d.refname):

        return d.name, "#%s" % d.refname

    return d.refname, "%s#%s" % (module_url(module, d.module, link_prefix), d.refname)
mark
def (
    text,
    module_list=None,
    linky=True
)
View Source
def mark(text, module_list=None, linky=True):

    if linky:

        text, _ = re.subn("\b\n\b", " ", text)

    return _markdown_render(text.strip())
module_url
def (
    parent,
    m,
    link_prefix
)

Returns a URL for m, which must be an instance of Module. Also, m must be a submodule of the module being documented.

Namely, '.' import separators are replaced with '/' URL separators. Also, packages are translated as directories containing index.html corresponding to the __init__ module, while modules are translated as regular HTML files with an .m.html suffix. (Given default values of pdoc.html_module_suffix and pdoc.html_package_name.)

View Source
def module_url(parent, m, link_prefix):

    """

        Returns a URL for `m`, which must be an instance of `Module`.

        Also, `m` must be a submodule of the module being documented.

        Namely, '.' import separators are replaced with '/' URL

        separators. Also, packages are translated as directories

        containing `index.html` corresponding to the `__init__` module,

        while modules are translated as regular HTML files with an

        `.m.html` suffix. (Given default values of

        `pdoc.html_module_suffix` and `pdoc.html_package_name`.)

    """

    if parent.name == m.name:

        return ""

    base = m.name.replace(".", "/")

    if len(link_prefix) == 0:

        base = os.path.relpath(base, parent.name.replace(".", "/"))

    url = base[len("../") :] if base.startswith("../") else "" if base == ".." else base

    if m.submodules:

        index = pdocs.render.html_package_name

        url = url + "/" + index if url else index

    else:

        url += pdocs.render.html_module_suffix

    return link_prefix + url
sourceid
def (
    dobj
)
View Source
def sourceid(dobj):

    return "source-%s" % dobj.refname