Teach Broxygen :bro:see: role for referencing any identifier in Bro domain.

This commit is contained in:
Jon Siwek 2011-11-17 16:55:51 -06:00
parent ec33453d2d
commit 5227eb73c8
3 changed files with 40 additions and 11 deletions

View file

@ -19,6 +19,11 @@ from docutils.parsers.rst import directives
from docutils.parsers.rst.roles import set_classes from docutils.parsers.rst.roles import set_classes
class BroGeneric(ObjectDescription): class BroGeneric(ObjectDescription):
def update_type_map(self, idname):
if 'idtypes' not in self.env.domaindata['bro']:
self.env.domaindata['bro']['idtypes'] = {}
self.env.domaindata['bro']['idtypes'][idname] = self.objtype
def add_target_and_index(self, name, sig, signode): def add_target_and_index(self, name, sig, signode):
targetname = self.objtype + '-' + name targetname = self.objtype + '-' + name
if targetname not in self.state.document.ids: if targetname not in self.state.document.ids:
@ -29,9 +34,6 @@ class BroGeneric(ObjectDescription):
objects = self.env.domaindata['bro']['objects'] objects = self.env.domaindata['bro']['objects']
key = (self.objtype, name) key = (self.objtype, name)
# this is commented out mostly just to avoid having a special directive
# for events in order to avoid the duplicate warnings in that case
"""
if key in objects: if key in objects:
self.env.warn(self.env.docname, self.env.warn(self.env.docname,
'duplicate description of %s %s, ' % 'duplicate description of %s %s, ' %
@ -39,8 +41,9 @@ class BroGeneric(ObjectDescription):
'other instance in ' + 'other instance in ' +
self.env.doc2path(objects[key]), self.env.doc2path(objects[key]),
self.lineno) self.lineno)
"""
objects[key] = self.env.docname objects[key] = self.env.docname
self.update_type_map(name)
indextext = self.get_index_text(self.objtype, name) indextext = self.get_index_text(self.objtype, name)
if indextext: if indextext:
self.indexnode['entries'].append(('single', indextext, self.indexnode['entries'].append(('single', indextext,
@ -65,6 +68,8 @@ class BroNamespace(BroGeneric):
objects = self.env.domaindata['bro']['objects'] objects = self.env.domaindata['bro']['objects']
key = (self.objtype, name) key = (self.objtype, name)
objects[key] = self.env.docname objects[key] = self.env.docname
self.update_type_map(name)
indextext = self.get_index_text(self.objtype, name) indextext = self.get_index_text(self.objtype, name)
self.indexnode['entries'].append(('single', indextext, self.indexnode['entries'].append(('single', indextext,
targetname, targetname)) targetname, targetname))
@ -91,6 +96,8 @@ class BroEnum(BroGeneric):
objects = self.env.domaindata['bro']['objects'] objects = self.env.domaindata['bro']['objects']
key = (self.objtype, name) key = (self.objtype, name)
objects[key] = self.env.docname objects[key] = self.env.docname
self.update_type_map(name)
indextext = self.get_index_text(self.objtype, name) indextext = self.get_index_text(self.objtype, name)
#self.indexnode['entries'].append(('single', indextext, #self.indexnode['entries'].append(('single', indextext,
# targetname, targetname)) # targetname, targetname))
@ -140,6 +147,7 @@ class BroDomain(Domain):
'id': XRefRole(), 'id': XRefRole(),
'enum': XRefRole(), 'enum': XRefRole(),
'attr': XRefRole(), 'attr': XRefRole(),
'see': XRefRole(),
} }
initial_data = { initial_data = {
@ -154,6 +162,17 @@ class BroDomain(Domain):
def resolve_xref(self, env, fromdocname, builder, typ, target, node, def resolve_xref(self, env, fromdocname, builder, typ, target, node,
contnode): contnode):
objects = self.data['objects'] objects = self.data['objects']
if typ == "see":
if target not in self.data['idtypes']:
self.env.warn(fromdocname,
'unknown target for ":bro:see:`%s`' % (target))
return []
objtype = self.data['idtypes'][target]
return make_refnode(builder, fromdocname,
objects[objtype, target],
objtype + '-' + target,
contnode, target + ' ' + objtype)
else:
objtypes = self.objtypes_for_role(typ) objtypes = self.objtypes_for_role(typ)
for objtype in objtypes: for objtype in objtypes:
if (objtype, target) in objects: if (objtype, target) in objects:

View file

@ -5,6 +5,11 @@
##! (reST) document's summary section. ##! (reST) document's summary section.
##! ##!
##! .. tip:: You can embed directives and roles within ``##``-stylized comments. ##! .. tip:: You can embed directives and roles within ``##``-stylized comments.
##!
##! There's also a custom role to reference any identifier node in
##! the Bro Sphinx domain that's good for "see alsos", e.g.
##! "see also :bro:see:`Example::a_var`, :bro:see:`Example::ONE`, and
##! :bro:see:`SSH::Info`"
# Comments that use a single pound sign (#) are not significant to # Comments that use a single pound sign (#) are not significant to
# a script's auto-generated documentation, but ones that use a # a script's auto-generated documentation, but ones that use a

View file

@ -15,6 +15,11 @@ these comments are transferred directly into the auto-generated
.. tip:: You can embed directives and roles within ``##``-stylized comments. .. tip:: You can embed directives and roles within ``##``-stylized comments.
There's also a custom role to reference any identifier node in
the Bro Sphinx domain that's good for "see alsos", e.g.
"see also :bro:see:`Example::a_var`, :bro:see:`Example::ONE`, and
:bro:see:`SSH::Info`"
:Imports: :doc:`policy/frameworks/software/vulnerable </scripts/policy/frameworks/software/vulnerable>` :Imports: :doc:`policy/frameworks/software/vulnerable </scripts/policy/frameworks/software/vulnerable>`
Summary Summary