borg_domain.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from sphinx import addnodes
  2. from sphinx.domains import Domain, ObjType
  3. from sphinx.locale import l_, _
  4. from sphinx.directives import ObjectDescription
  5. from sphinx.domains.std import ws_re
  6. class BorgObject(ObjectDescription):
  7. indextemplate = l_('%s')
  8. parse_node = None # type: Callable[[GenericObject, BuildEnvironment, unicode, addnodes.desc_signature], unicode] # NOQA
  9. def handle_signature(self, sig, signode):
  10. # type: (unicode, addnodes.desc_signature) -> unicode
  11. pass
  12. def add_target_and_index(self, name, sig, signode):
  13. # type: (str, str, addnodes.desc_signature) -> None
  14. # ^ ignore this one, don't insert any markup.
  15. # v- the human text v- the target name
  16. # "borg key change-passphrase" -> "borg-key-change-passphrase"
  17. del name # ignored
  18. targetname = sig.replace(' ', '-')
  19. if self.indextemplate:
  20. colon = self.indextemplate.find(':')
  21. if colon != -1:
  22. indextype = self.indextemplate[:colon].strip()
  23. indexentry = self.indextemplate[colon + 1:].strip() % (sig,)
  24. else:
  25. indextype = 'single'
  26. indexentry = self.indextemplate % (sig,)
  27. self.indexnode['entries'].append((indextype, indexentry, targetname, '', None))
  28. self.env.domaindata['borg']['objects'][targetname] = self.env.docname, self.objtype, sig
  29. def run(self):
  30. super().run()
  31. return [self.indexnode]
  32. class BorgCommand(BorgObject):
  33. """
  34. Inserts an index entry and an anchor for a borg command.
  35. For example, the following snippet creates an index entry about the "borg foo-and-bar"
  36. command as well as a "borg-foo-and-bar" anchor (id).
  37. .. borg:command:: borg foo-and-bar
  38. """
  39. indextemplate = l_('%s (command)')
  40. class BorgEnvVar(BorgObject):
  41. """
  42. Inserts an index entry and an anchor for an environment variable.
  43. (Currently not used)
  44. """
  45. indextemplate = l_('%s (environment variable)')
  46. class BorgDomain(Domain):
  47. """Land of the Borg."""
  48. name = 'borg'
  49. label = 'Borg'
  50. object_types = {
  51. 'command': ObjType(l_('command')),
  52. 'env_var': ObjType(l_('env_var')),
  53. }
  54. directives = {
  55. 'command': BorgCommand,
  56. 'env_var': BorgEnvVar,
  57. }
  58. roles = {}
  59. initial_data = {
  60. 'objects': {}, # fullname -> docname, objtype
  61. }
  62. def clear_doc(self, docname):
  63. # required for incremental builds
  64. try:
  65. del self.data['objects'][docname]
  66. except KeyError:
  67. pass
  68. def merge_domaindata(self, docnames, otherdata):
  69. # needed due to parallel_read_safe
  70. for fullname, (docname, objtype, sig) in otherdata['objects'].items():
  71. if docname in docnames:
  72. self.data['objects'][fullname] = (docname, objtype, sig)
  73. def get_objects(self):
  74. for refname, (docname, objtype, sig) in list(self.data['objects'].items()):
  75. yield sig, sig, objtype, docname, refname, 1
  76. def setup(app):
  77. app.add_domain(BorgDomain)
  78. return {
  79. 'version': 1,
  80. 'parallel_read_safe': True,
  81. 'parallel_write_safe': True,
  82. }