tailor.py: suivre un fichier est optionnel

This commit is contained in:
Jephté Clain 2017-04-12 06:39:48 +04:00
parent 4593ad8f8e
commit bab9c501e5
1 changed files with 37 additions and 21 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
u"""Afficher des lignes en mettant en surbrillance certains patterns"""
u"""Afficher les lignes d'un fichier en mettant en surbrillance certains patterns"""
import sys, subprocess, re
from collections import OrderedDict
@ -40,14 +40,23 @@ def strip_nl(s):
elif s.endswith("\r"): s = s[:-1]
return s
def run_tailor(inputfile=None, patterns=None):
if inputfile is None:
def run_tailor(inputfile=None, follow=False, patterns=None):
if inputfile is None or not follow:
if inputfile is None:
inf = sys.stdin
close = False
else:
inf = open(inputfile, 'rb')
close = True
def next_line():
while True:
try: line = sys.stdin.readline()
except: break
if line == '': break
yield line
try:
while True:
try: line = inf.readline()
except: break
if line == '': break
yield line
finally:
if close: inf.close()
else:
def next_line():
p = subprocess.Popen(
@ -79,22 +88,26 @@ def run_tailor(inputfile=None, patterns=None):
sys.stdout.write('\n')
if __name__ == '__main__':
from argparse import ArgumentParser, RawTextHelpFormatter
from argparse import ArgumentParser
AP = ArgumentParser(
formatter_class=RawTextHelpFormatter,
usage=u"%(prog)s [-f INPUTFILE]",
usage=u"%(prog)s [-f] [INPUTFILE]",
description=__doc__,
)
AP.set_defaults(inputfile=None, patterns=None, defaults=True)
AP.add_argument('-f', '--follow', dest='inputfile',
help=u"Spécifier un fichier dont il faut suivre le contenu")
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""" % {
'formats': ', '.join(FORMATS.keys()),
}
AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT',
help=u"""\
Ajouter une spécification de pattern et le format dans lequel il doit être affiché
Les formats valides sont: %s
Le format par défaut est red""" % ', '.join(FORMATS.keys()))
AP.add_argument('-z', '--no-defaults', action='store_const', dest='defaults', const=False,
help=pattern_help)
AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults',
help=u"Ne pas ajouter les patterns par défaut")
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='?',
help=u"Fichier qu'il faut afficher ou dont il faut suivre le contenu")
o = AP.parse_args()
if o.patterns is None:
@ -109,11 +122,14 @@ Le format par défaut est red""" % ', '.join(FORMATS.keys()))
else:
p = pf
of = 'red'
if p == '': p = None
f = of.lower()
f = FORMAT_ALIASES.get(f, f)
if f not in FORMATS:
raise ValueError("%s: format invalide" % of)
patterns[p] = FORMATS[f]
if o.defaults: patterns.update(DEFAULT_PATTERNS)
if o.defaults:
for p, f in DEFAULT_PATTERNS.items():
patterns.setdefault(p, f)
run_tailor(o.inputfile, patterns)
run_tailor(o.inputfile, o.follow, patterns)