1# -*- coding: utf-8 -*-
2"""
3    sphinxlocal.writers.manpage
4    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6    A replacement for the manpage builder which come bundled with Sphinx.
7
8    :version: 0.1
9    :author: Nic Bernstein <nic@onlight.com>
10
11    :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
12    :license: BSD, see LICENSE for details.
13"""
14
15import docutils
16from docutils import nodes
17from sphinx.writers.manpage import (
18    ManualPageWriter,
19    ManualPageTranslator as BaseTranslator
20)
21
22docutils_version_info = tuple(map(int, docutils.__version__.split('.')))
23if docutils_version_info < (0, 11):
24  from sphinx.writers.manpage import MACRO_DEF
25
26
27from sphinx import addnodes
28from sphinx.locale import admonitionlabels, _
29from time import strftime
30
31class CyrusManualPageWriter(ManualPageWriter):
32
33    #settings_spec = (u'No options defined.', u'', ())
34    #settings_defaults = {}
35
36    def __init__(self, builder):
37        ManualPageWriter.__init__(self, builder)
38        self.builder = builder
39
40    def translate(self):
41        visitor = CyrusManualPageTranslator(self.builder, self.document)
42        self.visitor = visitor
43        self.document.walkabout(visitor)
44        self.output = visitor.astext()
45
46
47class CyrusManualPageTranslator(BaseTranslator):
48    """
49    Custom translator.
50    """
51
52    def __init__(self, builder, *args, **kwds):
53        BaseTranslator.__init__(self, builder, *args, **kwds)
54        self.builder = builder
55
56        self.in_productionlist = 0
57
58        # first title is the manpage title
59        self.section_level = -1
60
61        # docinfo set by man_pages config value
62        self._docinfo['title'] = self.document.settings.title
63        self._docinfo['subtitle'] = self.document.settings.subtitle
64        if self.document.settings.authors:
65            # don't set it if no author given
66            self._docinfo['author'] = self.document.settings.authors
67        self._docinfo['manual_section'] = self.document.settings.section
68
69        # docinfo set by other config values
70        self._docinfo['title_upper'] = self._docinfo['title'].upper()
71        self._docinfo['date'] = builder.config.today or strftime(builder.config.today_fmt or _('%B %d, %Y'))
72        self._docinfo['copyright'] = builder.config.copyright
73        self._docinfo['version'] = builder.config.version
74        self._docinfo['manual_group'] = builder.config.project
75
76        # In docutils < 0.11 self.append_header() was never called
77        if docutils_version_info < (0, 11):
78          self.body.append(MACRO_DEF)
79
80        # overwritten -- don't wrap literal_block with font calls
81        self.defs['literal_block'] = ('.sp\n.nf\n', '\n.fi\n')
82
83
84    # overwritten -- don't assume indentation
85    def visit_literal_block(self, node):
86        self.body.append(self.defs['literal_block'][0])
87        self._in_literal = True
88
89
90    def depart_literal_block(self, node):
91        self._in_literal = False
92        self.body.append(self.defs['literal_block'][1])
93