|
31 | 31 | 'kbd': nodes.literal, |
32 | 32 | 'mailheader': addnodes.literal_emphasis, |
33 | 33 | 'makevar': addnodes.literal_strong, |
34 | | - 'manpage': addnodes.manpage, |
35 | 34 | 'mimetype': addnodes.literal_emphasis, |
36 | 35 | 'newsgroup': addnodes.literal_emphasis, |
37 | 36 | 'program': addnodes.literal_strong, # XXX should be an x-ref |
@@ -342,6 +341,29 @@ def run(self) -> tuple[list[Node], list[system_message]]: |
342 | 341 | return [nodes.abbreviation(self.rawtext, text, **options)], [] |
343 | 342 |
|
344 | 343 |
|
| 344 | +class Manpage(ReferenceRole): |
| 345 | + _manpage_re = re.compile(r'^(?P<path>(?P<page>.+)[(.](?P<section>[1-9]\w*)?\)?)$') |
| 346 | + |
| 347 | + def run(self) -> tuple[list[Node], list[system_message]]: |
| 348 | + manpage = ws_re.sub(' ', self.target) |
| 349 | + if m := self._manpage_re.match(manpage): |
| 350 | + info = m.groupdict() |
| 351 | + else: |
| 352 | + info = {'path': manpage, 'page': manpage, 'section': ''} |
| 353 | + |
| 354 | + inner: nodes.Node |
| 355 | + text = self.title[1:] if self.disabled else self.title |
| 356 | + if not self.disabled and self.config.manpages_url: |
| 357 | + uri = self.config.manpages_url.format(**info) |
| 358 | + inner = nodes.reference('', text, classes=[self.name], refuri=uri) |
| 359 | + else: |
| 360 | + inner = nodes.Text(text) |
| 361 | + node = addnodes.manpage(self.rawtext, '', inner, |
| 362 | + classes=[self.name], **info) |
| 363 | + |
| 364 | + return [node], [] |
| 365 | + |
| 366 | + |
345 | 367 | # Sphinx provides the `code-block` directive for highlighting code blocks. |
346 | 368 | # Docutils provides the `code` role which in theory can be used similarly by |
347 | 369 | # defining a custom role for a given programming language: |
@@ -408,6 +430,7 @@ def code_role(name: str, rawtext: str, text: str, lineno: int, |
408 | 430 | 'file': EmphasizedLiteral(), |
409 | 431 | 'samp': EmphasizedLiteral(), |
410 | 432 | 'abbr': Abbreviation(), |
| 433 | + 'manpage': Manpage(), |
411 | 434 | } |
412 | 435 |
|
413 | 436 |
|
|
0 commit comments