Skip to content

Instantly share code, notes, and snippets.

@dsedivec
Created October 25, 2012 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dsedivec/3949926 to your computer and use it in GitHub Desktop.
Save dsedivec/3949926 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import sys
import re
import argparse
CSI = "\033["
RESET = CSI + "0m"
COLORS = dict((name, value) for value, name
in enumerate(("black", "red", "green", "yellow", "blue",
"magenta", "cyan", "white")))
def parse_color_spec(color_spec):
color_spec = re.sub(r"\s", "", color_spec).lower()
sgr_args = []
if color_spec.startswith("bright"):
sgr_args.append(1)
color_spec = color_spec[6:]
split_spec = color_spec.split("/", 1)
sgr_args.append(30 + COLORS[split_spec[0]])
if len(split_spec) == 2:
sgr_args.append(40 + COLORS[split_spec[1]])
return "%s%sm" % (CSI, ";".join(str(arg) for arg in sgr_args))
def main(argv=None):
if argv is None:
argv = sys.argv
parser = argparse.ArgumentParser(prog=argv[0])
parser.add_argument("--ignore-case", "-i", default=False,
action="store_true")
parser.add_argument("--highlight", "-m", nargs=2, action="append",
metavar=("REGEX", "COLOR-SPEC"), default=[])
parser.add_argument("input_file", nargs="?", type=argparse.FileType("rt"),
default=sys.stdin)
args = parser.parse_args(args=argv[1:])
re_flags = 0
if args.ignore_case:
re_flags |= re.I
patterns_and_replacements = [
(re.compile(pattern, re_flags),
r"%s\g<0>%s" % (parse_color_spec(color_spec), RESET))
for pattern, color_spec in args.highlight]
output = sys.stdout
# This looks a little funny, but doing "for line in
# args.input_file" uses undesirable buffering.
while True:
line = args.input_file.readline()
for pattern, replacement in patterns_and_replacements:
line = pattern.sub(replacement, line)
output.write(line)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment