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 sphinx.util.osutil import ustrftime 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 if builder.config.today: 72 self._docinfo['date'] = builder.config.today 73 else: 74 self._docinfo['date'] = ustrftime(builder.config.today_fmt 75 or _('%B %d, %Y')) 76 self._docinfo['copyright'] = builder.config.copyright 77 self._docinfo['version'] = builder.config.version 78 self._docinfo['manual_group'] = builder.config.project 79 80 # In docutils < 0.11 self.append_header() was never called 81 if docutils_version_info < (0, 11): 82 self.body.append(MACRO_DEF) 83 84 # overwritten -- don't wrap literal_block with font calls 85 self.defs['literal_block'] = ('.sp\n.nf\n', '\n.fi\n') 86 87 88 # overwritten -- don't assume indentation 89 def visit_literal_block(self, node): 90 self.body.append(self.defs['literal_block'][0]) 91 self._in_literal = True 92 93 94 def depart_literal_block(self, node): 95 self._in_literal = False 96 self.body.append(self.defs['literal_block'][1]) 97