rtems-docs/common/rtemsdomain.py
2016-05-02 20:51:26 -04:00

128 lines
3.6 KiB
Python

from docutils import nodes
from docutils.parsers.rst import directives
from sphinx import addnodes
from sphinx.roles import XRefRole
from sphinx.locale import l_, _
from sphinx.directives import ObjectDescription
from sphinx.domains import Domain, ObjType, Index
from sphinx.util.compat import Directive
from sphinx.util.nodes import make_refnode
from sphinx.util.docfields import Field, TypedField
"""
:r:bsp:`sparc/sis`
:r:arch:`sparc`
:r:board:`...`
:r:user:`amar`
:r:list:`devel`
"""
role_name = {
"bsp": "BSP",
"arch": "Architecture",
"board": "Board",
"user": "User",
"list": "Mailing List",
"rtems": "`RTEMS`",
}
role_url = {
"trac": ("Trac", "https://devel.rtems.org"),
"devel": ("Developer Site", "https://devel.rtems.org"),
"www": ("RTEMS Home", "https://www.rtems.org/"),
"buildbot": ("Buildbot Instance", "https://buildbot.rtems.org/"),
"builder": ("Builder Site", "https://builder.rtems.org/"),
"docs": ("Documentation Site", "https://docs.rtems.org/"),
"lists": ("Mailing Lists", "https://lists.rtems.org/"),
"git": ("Git Repositories", "https://git.rtems.org/"),
"ftp": ("FTP File Server", "https://ftp.rtems.org/"),
"review": ("Gerrit Code Review", "https://review.rtems.org/"),
"bugs": ("Bugs Database", "https://devel.rtems.org/wiki/Bugs/"),
"gsoc": ("Google Summer of Code", "https://devel.rtems.org/wiki/GSoC/"),
"socis": ("ESA SOCIS", "https://devel.rtems.org/wiki/SOCIS/")
}
role_list = {
"announce": ("Announce Mailing List", "https://lists.rtems.org/mailman/listinfo/announce/"),
"bugs": ("Bugs Mailing List", "https://lists.rtems.org/mailman/listinfo/bugs/"),
"devel": ("Developers Mailing List", "https://lists.rtems.org/mailman/listinfo/devel/"),
"build": ("Build logs", "https://lists.rtems.org/mailman/listinfo/build"),
"users": ("Users Mailing List", "https://lists.rtems.org/mailman/listinfo/users/"),
"vc": ("Version Control Mailing List", "https://lists.rtems.org/mailman/listinfo/vc/"),
}
def rtems_resolve_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
role = name.split(":")[1] #XXX: is there a better way?
try:
if role == "list":
text, url = role_list[text]
elif role == "url":
text, url = role_url[text]
except KeyError:
msg = inliner.reporter.error("rtems_resolve_role: '%s' is not a valid %s" % (text, role))
err = inliner.problematic("ERROR: %s" % rawtext, None, msg)
return [err], [msg]
# XXX: how do you add an alt tag?
node = nodes.reference(rawtext, text, refuri=url, **options)
return [node], []
class RTEMSXrefRole(XRefRole):
def __init__(self, item, title, **kwargs):
XRefRole.__init__(self, **kwargs)
self.item = item
self.title = title
def process_link(self, env, refnode, has_explicit_title, title, target):
if has_explicit_title:
title = has_explicit_title
return has_explicit_title or self.title, target
class RTEMSDomain(Domain):
"""RTEMS domain."""
name = "r"
label = "RTEMS"
directives = {}
object_types = {}
roles = {
"bsp": RTEMSXrefRole("bsp", "BSP"),
"arch": RTEMSXrefRole("arch", "Architecture"),
"user": RTEMSXrefRole("user", "User"),
"list": rtems_resolve_role,
"url": rtems_resolve_role,
}
def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
info = "*info*"
anchor = "*anchor*"
title = "*title*"
return make_refnode(builder, fromdocname, info, anchor, contnode, title)
def merge_domaindata(self, docnames, otherdata):
pass # XXX is this needed?
def setup(app):
app.add_domain(RTEMSDomain)
return {'version': "1.0", 'parallel_read_safe': True}