tailor.py: suivre un fichier est optionnel
This commit is contained in:
parent
4593ad8f8e
commit
bab9c501e5
58
tailor.py
58
tailor.py
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
# -*- 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
|
import sys, subprocess, re
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
@ -40,14 +40,23 @@ def strip_nl(s):
|
||||||
elif s.endswith("\r"): s = s[:-1]
|
elif s.endswith("\r"): s = s[:-1]
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def run_tailor(inputfile=None, patterns=None):
|
def run_tailor(inputfile=None, follow=False, patterns=None):
|
||||||
if inputfile is 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():
|
def next_line():
|
||||||
while True:
|
try:
|
||||||
try: line = sys.stdin.readline()
|
while True:
|
||||||
except: break
|
try: line = inf.readline()
|
||||||
if line == '': break
|
except: break
|
||||||
yield line
|
if line == '': break
|
||||||
|
yield line
|
||||||
|
finally:
|
||||||
|
if close: inf.close()
|
||||||
else:
|
else:
|
||||||
def next_line():
|
def next_line():
|
||||||
p = subprocess.Popen(
|
p = subprocess.Popen(
|
||||||
|
@ -79,22 +88,26 @@ def run_tailor(inputfile=None, patterns=None):
|
||||||
sys.stdout.write('\n')
|
sys.stdout.write('\n')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
from argparse import ArgumentParser, RawTextHelpFormatter
|
from argparse import ArgumentParser
|
||||||
AP = ArgumentParser(
|
AP = ArgumentParser(
|
||||||
formatter_class=RawTextHelpFormatter,
|
usage=u"%(prog)s [-f] [INPUTFILE]",
|
||||||
usage=u"%(prog)s [-f INPUTFILE]",
|
|
||||||
description=__doc__,
|
description=__doc__,
|
||||||
)
|
)
|
||||||
AP.set_defaults(inputfile=None, patterns=None, defaults=True)
|
AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True)
|
||||||
AP.add_argument('-f', '--follow', dest='inputfile',
|
pattern_help = u"""\
|
||||||
help=u"Spécifier un fichier dont il faut suivre le contenu")
|
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',
|
AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT',
|
||||||
help=u"""\
|
help=pattern_help)
|
||||||
Ajouter une spécification de pattern et le format dans lequel il doit être affiché
|
AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults',
|
||||||
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=u"Ne pas ajouter les patterns par défaut")
|
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()
|
o = AP.parse_args()
|
||||||
|
|
||||||
if o.patterns is None:
|
if o.patterns is None:
|
||||||
|
@ -109,11 +122,14 @@ Le format par défaut est red""" % ', '.join(FORMATS.keys()))
|
||||||
else:
|
else:
|
||||||
p = pf
|
p = pf
|
||||||
of = 'red'
|
of = 'red'
|
||||||
|
if p == '': p = None
|
||||||
f = of.lower()
|
f = of.lower()
|
||||||
f = FORMAT_ALIASES.get(f, f)
|
f = FORMAT_ALIASES.get(f, f)
|
||||||
if f not in FORMATS:
|
if f not in FORMATS:
|
||||||
raise ValueError("%s: format invalide" % of)
|
raise ValueError("%s: format invalide" % of)
|
||||||
patterns[p] = FORMATS[f]
|
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)
|
||||||
|
|
Loading…
Reference in New Issue