From f296b6e0e36a89b9e09abe98dd2c1579d3df24ab Mon Sep 17 00:00:00 2001 From: Laurent Bachelier Date: Tue, 23 Nov 2010 22:47:56 +0100 Subject: [PATCH] Horrible tool to create manpages Far from enough to replace the current manpages as of now, so they are put in the man2/ directory. --- tools/make_man.py | 105 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100755 tools/make_man.py diff --git a/tools/make_man.py b/tools/make_man.py new file mode 100755 index 00000000..c8f6dcb1 --- /dev/null +++ b/tools/make_man.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Laurent Bachelier +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import sys, os, tempfile +import imp, inspect +import optparse +import re +import time + +from weboob.tools.application.base import BaseApplication + +BASE_PATH = os.path.join(os.path.dirname(__file__), os.pardir) + +class ManpageHelpFormatter(optparse.HelpFormatter): + def __init__ (self, + indent_increment=0, + max_help_position=0, + width=80, + short_first=1): + optparse.HelpFormatter.__init__(self, indent_increment, max_help_position, width, short_first) + + def format_heading(self, heading): + return ".SH %s\n" % heading.upper() + + def format_option_strings(self, option): + opts = optparse.HelpFormatter.format_option_strings(self, option).split(", ") + + return ".TP\n"+", ".join(["\\fB%s\\fR" % opt for opt in opts]) + + +def main(): + scripts_path = os.path.join(BASE_PATH, "scripts") + files = os.listdir(scripts_path) + + # Create a fake "scripts" modules to import the scripts into + sys.modules["scripts"] = imp.new_module("scripts") + + for fname in files: + fpath = os.path.join(scripts_path, fname) + if os.path.isfile(fpath) and os.access(fpath, os.X_OK): + with open(fpath) as f: + # Python will likely want create a compiled file, we provide a place + tmpdir = os.path.join(tempfile.gettempdir(), \ + "weboob", "make_man") + if not os.path.isdir(tmpdir): + os.makedirs(tmpdir) + tmpfile = os.path.join(tmpdir, fname) + + desc = ("", "U", imp.PY_SOURCE) + try: + script = imp.load_module("scripts.%s" % fname, f, tmpfile, desc) + except ImportError, e: + print >> sys.stderr, "Unable to load the %s script (%s)" \ + % (fname, e) + else: + print "Loaded %s" % fname + # Find the applications we can handle + for klass in script.__dict__.itervalues(): + if inspect.isclass(klass) and issubclass(klass, BaseApplication): + analyze_application(klass, fname) + finally: + # Cleanup compiled files if needed + if (os.path.isfile(tmpfile+"c")): + os.unlink(tmpfile+"c") + +def format_title(title): + return re.sub(r'^(.+):$', r'.SH \1\n.TP', title.group().upper()) + +def analyze_application(app, script_name): + formatter = ManpageHelpFormatter() + application = app() + + # patch the application + application._parser.prog = ".B %s\n" % script_name + helptext = application._parser.format_help(formatter) + + cmd_re = re.compile(r'^.+ Commands:$', re.MULTILINE) + helptext = re.sub(cmd_re, format_title, helptext) + usg_re = re.compile(r'^\s*Usage:\s+', re.MULTILINE) + helptext = re.sub(usg_re, ".SH SYNOPSIS\n", helptext) + helptext = helptext.replace("-", r"\-") + header = '.TH %s 1 "%s"' % (script_name.upper(), time.strftime("%d %B %Y").upper()) + name = ".SH NAME\n%s" % script_name + mantext = "%s\n%s\n%s" % (header, name, helptext) + with open(os.path.join(BASE_PATH, "man2", "%s.1" % script_name), 'w+') as manfile: + manfile.write(mantext) + print "wrote man2/%s.1" % script_name + +if __name__ == '__main__': + sys.exit(main())