Adds default colormaps and update README

And bugfix: --debug in 256-colors mode
This commit is contained in:
Johann Dreo 2014-04-07 11:40:13 +02:00
commit 3e0535db25
2 changed files with 63 additions and 23 deletions

View file

@ -5,7 +5,7 @@ colout(1) -- Color Up Arbitrary Command Output
`colout` [-h] [-r RESOURCE] `colout` [-h] [-r RESOURCE]
`colout` [-g] [-c] [-l] [-a] [-t] [-T] [-P] [-s] PATTERN [COLOR(S) [STYLE(S)]] `colout` [-g] [-c] [-l min,max] [-a] [-t] [-T DIR] [-P DIR] [-d COLORMAP] [-s] [--debug] PATTERN [COLOR(S) [STYLE(S)]]
## DESCRIPTION ## DESCRIPTION
@ -21,25 +21,32 @@ If you ask for fewer colors, the last one will be duplicated across remaining
groups. groups.
Available colors are: blue, black, yellow, cyan, green, magenta, white, red, Available colors are: blue, black, yellow, cyan, green, magenta, white, red,
rainbow, random, Random, scale, none, an RGB hexadecimal triplet or any number rainbow, random, Random, Spectrum, spectrum, scale, Scale, hash, Hash, none, an
between 0 and 255. RGB hexadecimal triplet or any number between 0 and 255.
Available styles are: normal, bold, faint, italic, underline, blink, Available styles are: normal, bold, faint, italic, underline, blink,
rapid_blink, reverse, conceal or random (some styles may have no effect, depending rapid\_blink, reverse, conceal or random (some styles may have no effect, depending
on your terminal). on your terminal).
`rainbow` will cycle over a 8 colors rainbow at each matching pattern. `rainbow` will cycle over a 6 colors rainbow at each matching pattern.
`Rainbow` will do the same over 24 colors (this requires a terminal that supports `Rainbow` will do the same over 24 colors (this requires a terminal that supports
the 256 color escape sequences). the 256 color escape sequences).
`Random` will color each matching pattern with a random color among the 255 `Random` will color each matching pattern with a random color among the 255
available in the ANSI table. `random` will do the same in 8 colors mode. available in the ANSI table. `random` will do the same in 8 colors mode.
`scale` (8 colors) and `Scale` (36 colors) will parse the numbers characters in `spectrum` and `Spectrum` are like rainbows, but with more colors (8 and 36
the matching text as a decimal number and apply the rainbow colormap according colors).
`scale` (8 colors) and `Scale` (256 colors) will parse the numbers characters in
the matching text as a decimal number and apply the default colormap according
to its position on the scale defined by the `-l` option (see below, "0,100" by to its position on the scale defined by the `-l` option (see below, "0,100" by
default). default).
`hash` (8 colors) and `Hash` (256 colors) will take a fingerprint of the matching
text and apply the default colormap according to it. This ensure that matching
texts appearing several times will always get the same color.
Before interpreting the matched string as a number, colout will remove any Before interpreting the matched string as a number, colout will remove any
character not supposed to be used to write down numbers. This permits to apply character not supposed to be used to write down numbers. This permits to apply
this special color on a large group, while interpreting only its numerical part. this special color on a large group, while interpreting only its numerical part.
@ -47,7 +54,7 @@ this special color on a large group, while interpreting only its numerical part.
If the python3-pygments library is installed, you can use the name of a If the python3-pygments library is installed, you can use the name of a
syntax-coloring "lexer" as a color (for example: "Cpp", "ruby", "xml+django", etc.). syntax-coloring "lexer" as a color (for example: "Cpp", "ruby", "xml+django", etc.).
If GIMP palettes files (*.gpl) are available, you can also use their names as a If GIMP palettes files (\*.gpl) are available, you can also use their names as a
colormap (see the `-P` switch below). colormap (see the `-P` switch below).
Note that the RGB colors (either the hex triplets or the palettes's colors) will Note that the RGB colors (either the hex triplets or the palettes's colors) will
@ -120,10 +127,17 @@ Gentoo
Interpret PATTERN as a predefined theme (perm, cmake, g++, etc.). Interpret PATTERN as a predefined theme (perm, cmake, g++, etc.).
* `-T DIR`, `--themes-dir DIR`: * `-T DIR`, `--themes-dir DIR`:
Search for additional themes (colout_*.py files) in this directory. Search for additional themes (colout\_\*.py files) in this directory.
* `-P DIR`, `--palettes-dir DIR`: * `-P DIR`, `--palettes-dir DIR`:
Search for additional palettes (*.gpl files) in this directory. Search for additional palettes (\*.gpl files) in this directory.
* `-d COLORMAP`, `--default COLORMAP`:
When using special colormaps (`scale` or `hash`), use this COLORMAP instead of the `spectrum` one.
This can be either one of the available colormaps or a comma-separated list of colors.
WARNING: be sure to specify a default colormap that is compatible with the special colormap's mode.
For instance, if you indicate `scale`, you can use `-d red,green,blue`, but `-d 12,13,14` will fail.
Also, if you specify `Scale`, you cannot use `-d red,green,blue`, but `-d Rainbow` will work.
* `-r TYPE(S)`, `--resources TYPE(S)`: * `-r TYPE(S)`, `--resources TYPE(S)`:
Print the names of available resources. Use a comma-separated list of resources names Print the names of available resources. Use a comma-separated list of resources names
@ -160,7 +174,11 @@ Recommended packages:
## LIMITATIONS ## LIMITATIONS
Don't use nested groups or colout will duplicate the corresponding input text with each matching colors. Don't use nested groups or colout will duplicate the corresponding input text
with each matching colors.
Using a default colormap that is incompatible with the special colormap's mode
will end badly.
## EXAMPLES ## EXAMPLES
@ -228,11 +246,14 @@ Don't use nested groups or colout will duplicate the corresponding input text wi
related to the value of the progress (from 0%=blue to 100%=red): related to the value of the progress (from 0%=blue to 100%=red):
`cmake .. && make | colout "^(\[\s*[0-9]+%\])" Scale` `cmake .. && make | colout "^(\[\s*[0-9]+%\])" Scale`
* Color hosts and users in `auth.log`, with consistent colors:
`cat /var/log/auth.log | colout "^(\S+\s+){3}(\S+)\s(\S+\s+){3}(\S+)\s+(\S+\s+){2}(\S+)\s*" none,hash,none,hash,none,hash`
### Bash alias ### Bash alias
The following bash function color the output of any command with the The following bash function color the output of any command with the
cmake and g77 themes: cmake and g++ themes:
function cm() function cm()
{ {

View file

@ -365,7 +365,8 @@ def colorin(text, color="red", style="normal"):
if color[0].islower(): if color[0].islower():
mode = 8 mode = 8
cmap = colormaps["spectrum"] # Use the default colormap in lower case = 8-colors mode
cmap = colormap
# normalize and scale over the nb of colors in cmap # normalize and scale over the nb of colors in cmap
i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) ) i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) )
@ -375,7 +376,7 @@ def colorin(text, color="red", style="normal"):
else: else:
mode = 256 mode = 256
cmap = colormaps["Spectrum"] cmap = colormap
i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) ) i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) )
color = cmap[i] color = cmap[i]
color_code = str(color) color_code = str(color)
@ -391,7 +392,7 @@ def colorin(text, color="red", style="normal"):
if color[0].islower(): if color[0].islower():
mode = 8 mode = 8
cmap = colormaps["rainbow"] cmap = colormap
# normalize and scale over the nb of colors in cmap # normalize and scale over the nb of colors in cmap
i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) ) i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) )
@ -401,7 +402,7 @@ def colorin(text, color="red", style="normal"):
else: else:
mode = 256 mode = 256
cmap = colormaps["Rainbow"] cmap = colormap
i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) ) i = int( math.ceil( (f - scale[0]) / (scale[1]-scale[0]) * (len(cmap)-1) ) )
color = cmap[i] color = cmap[i]
color_code = str(color) color_code = str(color)
@ -472,7 +473,7 @@ def colorin(text, color="red", style="normal"):
if not debug: if not debug:
return start + style_code + endmarks[mode] + color_code + "m" + text + stop return start + style_code + endmarks[mode] + color_code + "m" + text + stop
else: else:
return start + style_code + endmarks[mode] + color_code + "m<" + color + ">" + text + "</" + color + ">" + stop return start + style_code + endmarks[mode] + color_code + "m<" + str(color) + ">" + text + "</" + str(color) + ">" + stop
def colorout(text, match, prev_end, color="red", style="normal", group=0): def colorout(text, match, prev_end, color="red", style="normal", group=0):
@ -731,7 +732,8 @@ def __args_parse__(argv, usage=""):
in the pattern instead of over patterns") in the pattern instead of over patterns")
parser.add_argument("-c", "--colormap", action="store_true", parser.add_argument("-c", "--colormap", action="store_true",
help="Use the given colors as a colormap (cycle the colors at each match)") help="Interpret the given COLOR comma-separated list of colors as a colormap \
(cycle the colors at each match)")
babel_warn=" (numbers will be parsed according to your locale)" babel_warn=" (numbers will be parsed according to your locale)"
try: try:
@ -741,7 +743,7 @@ def __args_parse__(argv, usage=""):
babel_warn=" (WARNING: python3-babel is not available, install it \ babel_warn=" (WARNING: python3-babel is not available, install it \
if you want to be able to parse numbers according to your locale)" if you want to be able to parse numbers according to your locale)"
parser.add_argument("-l", "--scale", parser.add_argument("-l", "--scale", metavar="SCALE",
help="When using the 'scale' colormap, parse matches as decimal numbers \ help="When using the 'scale' colormap, parse matches as decimal numbers \
and apply the rainbow colormap linearly between the given SCALE=min,max" + babel_warn) and apply the rainbow colormap linearly between the given SCALE=min,max" + babel_warn)
@ -759,6 +761,11 @@ def __args_parse__(argv, usage=""):
parser.add_argument("-P", "--palettes-dir", metavar="DIR", action="append", parser.add_argument("-P", "--palettes-dir", metavar="DIR", action="append",
help="Search for additional palettes (*.gpl files) in the given directory") help="Search for additional palettes (*.gpl files) in the given directory")
parser.add_argument("-d", "--default", metavar="COLORMAP", default="spectrum",
help="When using special colormaps (`scale` or `hash`), use this COLORMAP. \
This can be either one of the available colormaps or a comma-separated list of colors. \
WARNING: be sure to specify a default colormap that is compatible with the special colormap's mode.")
# This normally should be an option with an argument, but this would end in an error, # This normally should be an option with an argument, but this would end in an error,
# as no regexp is supposed to be passed after calling this option, # as no regexp is supposed to be passed after calling this option,
# we use it as the argument to this option. # we use it as the argument to this option.
@ -781,7 +788,7 @@ def __args_parse__(argv, usage=""):
return args.pattern[0], args.color, args.style, args.groups, \ return args.pattern[0], args.color, args.style, args.groups, \
args.colormap, args.theme, args.source, args.all, args.scale, args.debug, args.resources, args.palettes_dir, \ args.colormap, args.theme, args.source, args.all, args.scale, args.debug, args.resources, args.palettes_dir, \
args.themes_dir args.themes_dir, args.default
def write_all( as_all, stream_in, stream_out, function, *args ): def write_all( as_all, stream_in, stream_out, function, *args ):
@ -816,7 +823,7 @@ if __name__ == "__main__":
# if argparse is available # if argparse is available
else: else:
pattern, color, style, on_groups, as_colormap, as_theme, as_source, as_all, myscale, \ pattern, color, style, on_groups, as_colormap, as_theme, as_source, as_all, myscale, \
debug, resources, palettes_dirs, themes_dirs \ debug, resources, palettes_dirs, themes_dirs, default_colormap \
= __args_parse__(sys.argv, usage) = __args_parse__(sys.argv, usage)
if debug: if debug:
@ -917,8 +924,20 @@ if __name__ == "__main__":
scale = tuple([float(i) for i in myscale.split(",")]) scale = tuple([float(i) for i in myscale.split(",")])
logging.debug("user-defined scale: %f,%f" % scale) logging.debug("user-defined scale: %f,%f" % scale)
# use the generator: output lines as they come if default_colormap and default_colormap not in colormaps:
if as_colormap is True and color != "rainbow": colormap = default_colormap.split(",")
logging.debug("used-defined default colormap: %s" % ",".join([str(i) for i in colormap]) )
elif default_colormap and default_colormap in colormaps:
# Configure the default colormap to be in the same mode than the given color
if color[0].islower():
cmap = default_colormap.lower()
else:
cmap = default_colormap[0].upper() + default_colormap[1:]
logging.debug("used-defined default colormap: %s" % cmap )
colormap = colormaps[cmap]
logging.debug("used-defined default colormap: %s" % colormap )
if as_colormap is True and color not in colormaps:
colormap = color.split(",") # replace the colormap by the given colors colormap = color.split(",") # replace the colormap by the given colors
color = "colormap" # use the keyword to switch to colormap instead of list of colors color = "colormap" # use the keyword to switch to colormap instead of list of colors
logging.debug("used-defined colormap: %s" % ",".join(colormap) ) logging.debug("used-defined colormap: %s" % ",".join(colormap) )