~yade-dev/yade/0.80

« back to all changes in this revision

Viewing changes to py/manpage.py

  • Committer: Anton Gladky
  • Date: 2012-05-02 21:50:42 UTC
  • Revision ID: gladky.anton@gmail.com-20120502215042-v1fa9r65usqe7kfk
0.80.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# coding: utf-8
 
2
#
 
3
# Thanks to logilab for this code.
 
4
#
 
5
# Copied from the logilab.common.optik_ext module (GPL-licensed) and modified for yade.
 
6
#
 
7
 
 
8
import optparse,time
 
9
 
 
10
class ManHelpFormatter(optparse.HelpFormatter):
 
11
        """Format help using man pages ROFF format"""
 
12
        def __init__(self,indent_increment=0,max_help_position=24,width=79,short_first=0):
 
13
                optparse.HelpFormatter.__init__(self, indent_increment, max_help_position, width, short_first)
 
14
        def format_heading(self, heading):
 
15
                return '.SH %s\n' % heading.upper()
 
16
        def format_description(self, description):
 
17
                return description
 
18
        def format_option(self, option):
 
19
                try:
 
20
                        optstring = option.option_strings
 
21
                except AttributeError:
 
22
                        optstring = self.format_option_strings(option)
 
23
                if option.help:
 
24
                        help = ' '.join([l.strip() for l in option.help.splitlines()])
 
25
                else:
 
26
                        help = ''
 
27
                return '''.IP "%s"
 
28
%s
 
29
''' % (optstring, help)
 
30
        def format_head(self, optparser, metadata, section=1):
 
31
                pgm = optparser.get_prog_name()
 
32
                short_desc = self.format_short_description(pgm, metadata['short_desc'])
 
33
                long_desc = self.format_long_description(pgm, metadata['long_desc'])
 
34
                return '%s\n%s\n%s\n%s' % (self.format_title(pgm, section), short_desc, self.format_synopsis(optparser), long_desc)
 
35
        def format_title(self, pgm, section):
 
36
                date = '-'.join([str(num) for num in time.localtime()[:3]])
 
37
                return '.TH %s %s "%s" %s' % (pgm, section, date, pgm)
 
38
        def format_short_description(self, pgm, short_desc):
 
39
                return '''.SH NAME
 
40
.B %s 
 
41
\- %s
 
42
''' % (pgm, short_desc.strip())
 
43
        def _markup(self, txt):
 
44
                """Prepares txt to be used in man pages."""
 
45
                return txt.replace('-', '\\-')
 
46
        def format_synopsis(self, optparser):
 
47
                synopsis = optparser.get_usage()
 
48
                pgm=optparser.get_prog_name()                                    
 
49
                if synopsis:                                                           
 
50
                        synopsis = synopsis.replace('Usage: %s '%pgm, '')                   
 
51
                        return '.SH SYNOPSIS\n.B %s\n%s\n' % (self._markup(pgm),synopsis)
 
52
        def format_long_description(self, pgm, long_desc):
 
53
                long_desc = '\n'.join([line.lstrip()
 
54
                                                                for line in long_desc.splitlines()])
 
55
                long_desc = long_desc.replace('\n.\n', '\n\n')
 
56
                if long_desc.lower().startswith(pgm):
 
57
                        long_desc = long_desc[len(pgm):]
 
58
                return '''.SH DESCRIPTION
 
59
.B %s 
 
60
%s
 
61
''' % (pgm, long_desc.strip())
 
62
                 
 
63
        def format_tail(self, metadata, seealso=None):
 
64
                
 
65
                return ('.SH SEE ALSO\n%s\n'%seealso if seealso else '')+'''.SH COPYRIGHT 
 
66
%s %s
 
67
 
 
68
%s
 
69
 
 
70
.SH BUGS 
 
71
Please report bugs to the project\'s bug tracker at
 
72
.br
 
73
%s
 
74
 
 
75
.SH AUTHOR
 
76
%s (%s)
 
77
''' % (metadata['copyright'],metadata['author'],metadata['license'],metadata['bugtracker'],metadata['author'],metadata['author_contact'])
 
78
 
 
79
 
 
80
def generate_manpage(optparser,metadata,fileOut,seealso=None,section=1):
 
81
        """generate a man page from an optparse parser"""
 
82
        out=open(fileOut,'w')
 
83
        formatter=ManHelpFormatter()
 
84
        formatter.parser=optparser
 
85
        out.write(formatter.format_head(optparser,metadata,section))
 
86
        out.write(optparser.format_option_help(formatter))
 
87
        out.write(formatter.format_tail(metadata,seealso))
 
88