cve_role.py 877 B

123456789101112131415161718192021222324252627
  1. """
  2. An interpreted text role to link docs to CVE issues. To use: :cve:`XXXXX`
  3. """
  4. from docutils import nodes, utils
  5. from docutils.parsers.rst import roles
  6. def cve_role(name, rawtext, text, lineno, inliner, options=None, content=None):
  7. if options is None:
  8. options = {}
  9. url_pattern = inliner.document.settings.env.app.config.cve_url
  10. if url_pattern is None:
  11. msg = inliner.reporter.warning("cve not configured: please configure cve_url in conf.py")
  12. prb = inliner.problematic(rawtext, rawtext, msg)
  13. return [prb], [msg]
  14. url = url_pattern % text
  15. roles.set_classes(options)
  16. node = nodes.reference(rawtext, utils.unescape('CVE-%s' % text), refuri=url, **options)
  17. return [node], []
  18. def setup(app):
  19. app.add_config_value('cve_url', None, 'env')
  20. app.add_role('cve', cve_role)
  21. return {'parallel_read_safe': True}