diff --git a/chrono.py b/chrono.py index e82f521..fde9efe 100755 --- a/chrono.py +++ b/chrono.py @@ -273,26 +273,55 @@ def run_chronometre(timeout=None, autostart=False): Application(timeout, autostart).mainloop() if __name__ == '__main__': - from argparse import ArgumentParser, RawTextHelpFormatter + from argparse import ArgumentParser, HelpFormatter + if sys.argv[1:2] == ['--compat']: + # Avec l'argument --compat, désactiver la classe FancyHelpFormatter qui + # se base sur une API non documentée + sys.argv = sys.argv[0:1] + sys.argv[2:] + FancyHelpFormatter = HelpFormatter + else: + class FancyHelpFormatter(HelpFormatter): + """Comme HelpFormatter, mais ne touche pas aux lignes qui commencent par les + caractères '>>>'. Cela permet de mixer du texte formaté et du texte non + formaté. + """ + def _fill_text(self, text, width, indent): + return ''.join([indent + line for line in text.splitlines(True)]) + def _split_lines(self, text, width): + lines = [''] + for line in text.splitlines(): + if line.startswith('>>>'): + lines.append(line) + lines.append('') + else: + lines[-1] += '\n' + line + lines = filter(None, lines) + texts = [] + for line in lines: + if line.startswith('>>>'): + texts.append(line[3:]) + else: + texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width)) + return texts AP = ArgumentParser( - formatter_class=RawTextHelpFormatter, usage=u"%(prog)s [options] [TIMEOUT]", description=u"Afficher un chronomètre", - epilog=u"Si TIMEOUT est spécifié, par défaut le décompte démarre automatiquement." + epilog=u"Si TIMEOUT est spécifié, par défaut le décompte démarre automatiquement.", + formatter_class=FancyHelpFormatter, ) AP.set_defaults(autostart=None, timeout=None) AP.add_argument('timeout', metavar='TIMEOUT', nargs='?', help=u"""\ -(valeur vide) - chronomètre qui démarre à 0:00 et ne s'arrête pas -H:M:S (heures:minutes:secondes) -ou M:S (minutes:secondes) -ou M (minutes) - minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin - du décompte, une sonnerie retentit. -@H[:M[:S]] - minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure - d'arrivée, et que la durée est calculée automatiquement""") +>>> (valeur vide) +chronomètre qui démarre à 0:00 et ne s'arrête pas +>>> H:M:S (heures:minutes:secondes) +>>> ou M:S (minutes:secondes) +>>> ou M (minutes) +minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin +du décompte, une sonnerie retentit. +>>> @H[:M[:S]] +minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure +d'arrivée, et que la durée est calculée automatiquement""") AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false', help=u"Ne pas démarrer automatiquement le décompte même si TIMEOUT est spécifié.") AP.add_argument('-s', '--autostart', dest='autostart', action='store_true', diff --git a/tailor.py b/tailor.py index cceea19..4620f62 100755 --- a/tailor.py +++ b/tailor.py @@ -88,22 +88,58 @@ def run_tailor(inputfile=None, follow=False, patterns=None): sys.stdout.write('\n') if __name__ == '__main__': - from argparse import ArgumentParser + from argparse import ArgumentParser, HelpFormatter + if sys.argv[1:2] == ['--compat']: + # Avec l'argument --compat, désactiver la classe FancyHelpFormatter qui + # se base sur une API non documentée + sys.argv = sys.argv[0:1] + sys.argv[2:] + FancyHelpFormatter = HelpFormatter + else: + class FancyHelpFormatter(HelpFormatter): + """Comme HelpFormatter, mais ne touche pas aux lignes qui commencent par les + caractères '>>>'. Cela permet de mixer du texte formaté et du texte non + formaté. + """ + def _fill_text(self, text, width, indent): + return ''.join([indent + line for line in text.splitlines(True)]) + def _split_lines(self, text, width): + lines = [''] + for line in text.splitlines(): + if line.startswith('>>>'): + lines.append(line) + lines.append('') + else: + lines[-1] += '\n' + line + lines = filter(None, lines) + texts = [] + for line in lines: + if line.startswith('>>>'): + texts.append(line[3:]) + else: + texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width)) + return texts AP = ArgumentParser( usage=u"%(prog)s [-f] [INPUTFILE]", description=__doc__, + formatter_class=FancyHelpFormatter, ) AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True) pattern_help = u"""\ Ajouter une spécification de pattern et le format dans lequel il doit être affiché. -Le format par défaut est red. -Les formats valides sont: %(formats)s""" % { +Le format par défaut est red. Les formats valides sont: +>>> %(formats)s""" % { 'formats': ', '.join(FORMATS.keys()), } AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT', help=pattern_help) + default_patterns = [u"%s:%s" % (p or '', f.__name__[:-1]) for (p, f) in DEFAULT_PATTERNS.items()] + no_defaults_help = u"""\ +Ne pas ajouter les patterns par défaut. Sans cette option, les patterns par défaut sont: +%(default_patterns)s""" % { + 'default_patterns': '\n'.join([u">>> %s" % pattern for pattern in default_patterns]), +} AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults', - help=u"Ne pas ajouter les patterns par défaut") + help=no_defaults_help) AP.add_argument('-f', '--follow', action='store_true', dest='follow', help=u"Suivre le contenu du fichier spécifié") AP.add_argument('inputfile', metavar='INPUTFILE', nargs='?',