commit
4e35011699
6 changed files with 93 additions and 104 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -2,3 +2,4 @@
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
colout.egg-info/
|
colout.egg-info/
|
||||||
|
.eggs/
|
||||||
|
|
|
||||||
15
.travis.yml
Normal file
15
.travis.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- "2.7"
|
||||||
|
- "3.3"
|
||||||
|
- "3.4"
|
||||||
|
- "3.5"
|
||||||
|
- "3.6"
|
||||||
|
- "3.7-dev"
|
||||||
|
- "pypy"
|
||||||
|
- "pypy3"
|
||||||
|
install:
|
||||||
|
- pip install .
|
||||||
|
script:
|
||||||
|
- colout --help
|
||||||
|
- echo heyoo | colout hey yellow
|
||||||
66
README.md
66
README.md
|
|
@ -1,13 +1,13 @@
|
||||||
colout(1) -- Color Up Arbitrary Command Output
|
colout(1) -- Color Up Arbitrary Command Output
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
## SYNOPSIS
|
## Synopsis
|
||||||
|
|
||||||
`colout` [-h] [-r RESOURCE]
|
`colout` [-h] [-r RESOURCE]
|
||||||
|
|
||||||
`colout` [-g] [-c] [-l min,max] [-a] [-t] [-T DIR] [-P DIR] [-d COLORMAP] [-s] [-e CHAR] [-E CHAR] [--debug] PATTERN [COLOR(S) [STYLE(S)]]
|
`colout` [-g] [-c] [-l min,max] [-a] [-t] [-T DIR] [-P DIR] [-d COLORMAP] [-s] [-e CHAR] [-E CHAR] [--debug] PATTERN [COLOR(S) [STYLE(S)]]
|
||||||
|
|
||||||
## DESCRIPTION
|
## Description
|
||||||
|
|
||||||
`colout` read lines of text stream on the standard input and output characters
|
`colout` read lines of text stream on the standard input and output characters
|
||||||
matching a given regular expression *PATTERN* in given *COLOR* and *STYLE*.
|
matching a given regular expression *PATTERN* in given *COLOR* and *STYLE*.
|
||||||
|
|
@ -54,8 +54,8 @@ 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.
|
||||||
|
|
||||||
If the python3-pygments library is installed, you can use the name of a
|
You can use the name of a syntax-coloring ["lexer"](http://pygments.org/docs/lexers/)
|
||||||
syntax-coloring "lexer" as a color (for example: "Cpp", "ruby", "xml+django", etc.).
|
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).
|
||||||
|
|
@ -68,8 +68,7 @@ When not specified, a *COLOR* defaults to _red_ and a *STYLE* defaults to _bold_
|
||||||
`colout` comes with some predefined themes to rapidly color well-known outputs
|
`colout` comes with some predefined themes to rapidly color well-known outputs
|
||||||
(see the `-t` switch below).
|
(see the `-t` switch below).
|
||||||
|
|
||||||
If the python3-pygments library is available, `colout` can be used as an interface
|
`colout` can be used as an interface to pygments (see also the `--source` switch below).
|
||||||
to it (see also the `-s` switch below).
|
|
||||||
|
|
||||||
To have a list of all colors, styles, special colormaps, themes, palettes and lexers,
|
To have a list of all colors, styles, special colormaps, themes, palettes and lexers,
|
||||||
use the `-r` switch (see below).
|
use the `-r` switch (see below).
|
||||||
|
|
@ -77,37 +76,28 @@ use the `-r` switch (see below).
|
||||||
`colout` is released under the GNU Public License v3.
|
`colout` is released under the GNU Public License v3.
|
||||||
|
|
||||||
|
|
||||||
## INSTALLATION
|
## Installation
|
||||||
|
|
||||||
sudo python3 setup.py install
|
The reccomended method is using [pipsi](https://github.com/mitsuhiko/pipsi)
|
||||||
|
```
|
||||||
|
pipsi install colout
|
||||||
|
```
|
||||||
|
|
||||||
and then soft link `/usr/local/bin/colout` to your colout.py under your installation
|
Another method is to use pip to install the package for the local user:
|
||||||
directory, which is usually something like
|
|
||||||
|
|
||||||
/usr/local/lib/python3/dist-packages/colout-0.1-py3.egg/colout/colout.py
|
```
|
||||||
|
pip install --user colout
|
||||||
|
```
|
||||||
|
|
||||||
|
There is also a PPA for Ubuntu 16.04 (Xenial)/18.04 (Bionic)
|
||||||
|
|
||||||
## OTHER INSTALLATION METHOD
|
```
|
||||||
|
sudo add-apt-repository ppa:csaba-kertesz/random
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get/aptitude install colout
|
||||||
|
```
|
||||||
|
|
||||||
Pypi (the Python Package Index)
|
## Options
|
||||||
|
|
||||||
sudo pip install colout
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
sudo easy_install colout
|
|
||||||
|
|
||||||
Ubuntu 13.04's ppa
|
|
||||||
|
|
||||||
sudo add-apt-repository ppa:ciici123/colout
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get/aptitude install colout
|
|
||||||
|
|
||||||
Gentoo
|
|
||||||
|
|
||||||
sudo emerge colout
|
|
||||||
|
|
||||||
## OPTIONS
|
|
||||||
|
|
||||||
* `-h`, `--help`:
|
* `-h`, `--help`:
|
||||||
Show a help message and exit
|
Show a help message and exit
|
||||||
|
|
@ -164,7 +154,7 @@ Gentoo
|
||||||
Debug mode: print what's going on internally, if you want to check what features are available.
|
Debug mode: print what's going on internally, if you want to check what features are available.
|
||||||
|
|
||||||
|
|
||||||
## REGULAR EXPRESSIONS
|
## Regular expressions
|
||||||
|
|
||||||
A regular expression (or _regex_) is a pattern that describes a set of strings
|
A regular expression (or _regex_) is a pattern that describes a set of strings
|
||||||
that matches it.
|
that matches it.
|
||||||
|
|
@ -174,15 +164,7 @@ that matches it.
|
||||||
special characters that would be recognize by your shell.
|
special characters that would be recognize by your shell.
|
||||||
|
|
||||||
|
|
||||||
## DEPENDENCIES
|
## Limitations
|
||||||
|
|
||||||
Recommended packages:
|
|
||||||
|
|
||||||
* `pygments` for the source code syntax coloring
|
|
||||||
* `babel` for a locale-aware number parsing
|
|
||||||
|
|
||||||
|
|
||||||
## LIMITATIONS
|
|
||||||
|
|
||||||
Don't use nested groups or colout will duplicate the corresponding input text
|
Don't use nested groups or colout will duplicate the corresponding input text
|
||||||
with each matching colors.
|
with each matching colors.
|
||||||
|
|
@ -192,7 +174,7 @@ Using a default colormap that is incompatible with the special colormap's mode
|
||||||
|
|
||||||
Color pairs ("foreground.background") work in 8-colors mode for simple coloring, but may fail with `--colormap`.
|
Color pairs ("foreground.background") work in 8-colors mode for simple coloring, but may fail with `--colormap`.
|
||||||
|
|
||||||
## EXAMPLES
|
## Examples
|
||||||
|
|
||||||
### Simple
|
### Simple
|
||||||
|
|
||||||
|
|
|
||||||
11
bin/colout
11
bin/colout
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Copyright (c) 2013 Martin Ueding <dev@martin-ueding.de>
|
|
||||||
|
|
||||||
# Small launcher script for the main module.
|
|
||||||
|
|
||||||
# Licence: GPL 3
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -u
|
|
||||||
|
|
||||||
python3 -m colout.colout "$@"
|
|
||||||
|
|
@ -20,6 +20,7 @@ import logging
|
||||||
import argparse
|
import argparse
|
||||||
import importlib
|
import importlib
|
||||||
import functools
|
import functools
|
||||||
|
import babel.numbers as bn
|
||||||
|
|
||||||
# set the SIGPIPE handler to kill the program instead of
|
# set the SIGPIPE handler to kill the program instead of
|
||||||
# ending in a write error when a broken pipe occurs
|
# ending in a write error when a broken pipe occurs
|
||||||
|
|
@ -42,6 +43,8 @@ context["styles"] = {
|
||||||
"reverse": 7, "conceal": 8
|
"reverse": 7, "conceal": 8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
error_codes = {"UnknownColor": 1, "DuplicatedPalette": 2, "MixedModes": 3, "UnknownLexer": 4}
|
||||||
|
|
||||||
# Available color names in 8-colors mode.
|
# Available color names in 8-colors mode.
|
||||||
eight_colors = ["black","red","green","yellow","blue","magenta","cyan","white"]
|
eight_colors = ["black","red","green","yellow","blue","magenta","cyan","white"]
|
||||||
# Given in that order, the ASCII code is the index.
|
# Given in that order, the ASCII code is the index.
|
||||||
|
|
@ -290,32 +293,31 @@ def load_lexers():
|
||||||
global context
|
global context
|
||||||
# load available pygments lexers
|
# load available pygments lexers
|
||||||
lexers = []
|
lexers = []
|
||||||
|
global get_lexer_by_name
|
||||||
|
from pygments.lexers import get_lexer_by_name
|
||||||
|
|
||||||
|
global highlight
|
||||||
|
from pygments import highlight
|
||||||
|
|
||||||
|
global Terminal256Formatter
|
||||||
|
from pygments.formatters import Terminal256Formatter
|
||||||
|
|
||||||
|
global TerminalFormatter
|
||||||
|
from pygments.formatters import TerminalFormatter
|
||||||
|
|
||||||
|
from pygments.lexers import get_all_lexers
|
||||||
try:
|
try:
|
||||||
global get_lexer_by_name
|
|
||||||
from pygments.lexers import get_lexer_by_name
|
|
||||||
|
|
||||||
global highlight
|
|
||||||
from pygments import highlight
|
|
||||||
|
|
||||||
global Terminal256Formatter
|
|
||||||
from pygments.formatters import Terminal256Formatter
|
|
||||||
|
|
||||||
global TerminalFormatter
|
|
||||||
from pygments.formatters import TerminalFormatter
|
|
||||||
|
|
||||||
from pygments.lexers import get_all_lexers
|
|
||||||
except ImportError:
|
|
||||||
logging.warning("the pygments module has not been found, syntax coloring is not available")
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
for lexer in get_all_lexers():
|
for lexer in get_all_lexers():
|
||||||
try:
|
try:
|
||||||
lexers.append(lexer[1][0])
|
lexers.append(lexer[1][0])
|
||||||
except IndexError:
|
except IndexError:
|
||||||
logging.warning("cannot load lexer: %s" % lexer[1][0])
|
logging.warning("cannot load lexer: %s" % lexer[1][0])
|
||||||
pass
|
pass
|
||||||
lexers.sort()
|
except:
|
||||||
logging.debug("loaded %i lexers: %s" % (len(lexers), ", ".join(lexers)))
|
logging.warning("error while executing the pygment module, syntax coloring is not available")
|
||||||
|
|
||||||
|
lexers.sort()
|
||||||
|
logging.debug("loaded %i lexers: %s" % (len(lexers), ", ".join(lexers)))
|
||||||
|
|
||||||
context["lexers"] = lexers
|
context["lexers"] = lexers
|
||||||
|
|
||||||
|
|
@ -406,23 +408,11 @@ def color_scale( name, text ):
|
||||||
nb = "".join([i for i in filter(allowed.__contains__, text)])
|
nb = "".join([i for i in filter(allowed.__contains__, text)])
|
||||||
|
|
||||||
# interpret as decimal
|
# interpret as decimal
|
||||||
# First, try with the babel module, if available
|
|
||||||
# if not, use python itself,
|
|
||||||
# if thoses fails, try to `eval` the string
|
|
||||||
# (this allow strings like "1/2+0.9*2")
|
|
||||||
f = None
|
f = None
|
||||||
try:
|
try:
|
||||||
# babel is a specialized module
|
f = float(bn.parse_decimal(nb))
|
||||||
import babel.numbers as bn
|
except bn.NumberFormatError:
|
||||||
try:
|
pass
|
||||||
f = float(bn.parse_decimal(nb))
|
|
||||||
except bn.NumberFormatError:
|
|
||||||
pass
|
|
||||||
except ImportError:
|
|
||||||
try:
|
|
||||||
f = float(nb)
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
if f is not None:
|
if f is not None:
|
||||||
# normalize with scale if it's a number
|
# normalize with scale if it's a number
|
||||||
f = (f - context["scale"][0]) / (context["scale"][1]-context["scale"][0])
|
f = (f - context["scale"][0]) / (context["scale"][1]-context["scale"][0])
|
||||||
|
|
@ -827,11 +817,6 @@ def _args_parse(argv, usage=""):
|
||||||
help="A regular expression")
|
help="A regular expression")
|
||||||
|
|
||||||
pygments_warn=" You can use a language name to activate syntax coloring (see `-r all` for a list)."
|
pygments_warn=" You can use a language name to activate syntax coloring (see `-r all` for a list)."
|
||||||
try:
|
|
||||||
import pygments
|
|
||||||
except ImportError:
|
|
||||||
pygments_warn=" (WARNING: python3-pygments is not available, \
|
|
||||||
install it if you want to be able to use syntax coloring)"
|
|
||||||
|
|
||||||
parser.add_argument("color", metavar="COLOR", type=str, nargs='?',
|
parser.add_argument("color", metavar="COLOR", type=str, nargs='?',
|
||||||
default="red",
|
default="red",
|
||||||
|
|
@ -851,12 +836,6 @@ def _args_parse(argv, usage=""):
|
||||||
(cycle the colors at each match)")
|
(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:
|
|
||||||
# babel is a specialized module
|
|
||||||
import babel.numbers
|
|
||||||
except ImportError:
|
|
||||||
babel_warn=" (WARNING: python3-babel is not available, install it \
|
|
||||||
if you want to be able to parse numbers according to your locale)"
|
|
||||||
|
|
||||||
parser.add_argument("-l", "--scale", metavar="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 \
|
||||||
|
|
@ -924,10 +903,8 @@ def write_all( as_all, stream_in, stream_out, function, *args ):
|
||||||
map_write( stream_in, stream_out, function, *args )
|
map_write( stream_in, stream_out, function, *args )
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
def main():
|
||||||
|
global context
|
||||||
error_codes = {"UnknownColor":1, "DuplicatedPalette":2, "MixedModes":3}
|
|
||||||
|
|
||||||
usage = "A regular expression based formatter that color up an arbitrary text stream."
|
usage = "A regular expression based formatter that color up an arbitrary text stream."
|
||||||
|
|
||||||
#####################
|
#####################
|
||||||
|
|
@ -1072,7 +1049,9 @@ if __name__ == "__main__":
|
||||||
# if pygments
|
# if pygments
|
||||||
elif as_source:
|
elif as_source:
|
||||||
logging.debug("asked for lexer: %s" % pattern.lower())
|
logging.debug("asked for lexer: %s" % pattern.lower())
|
||||||
assert(pattern.lower() in context["lexers"])
|
if pattern.lower() not in context["lexers"]:
|
||||||
|
logging.error("Lexer %r is not available. Run with \"--resources all\" to see the options.")
|
||||||
|
sys.exit(error_codes["UnknownLexer"])
|
||||||
lexer = get_lexer_by_name(pattern.lower())
|
lexer = get_lexer_by_name(pattern.lower())
|
||||||
# Python => 256 colors, python => 8 colors
|
# Python => 256 colors, python => 8 colors
|
||||||
ask_256 = pattern[0].isupper()
|
ask_256 = pattern[0].isupper()
|
||||||
|
|
@ -1105,3 +1084,6 @@ if __name__ == "__main__":
|
||||||
+ " Check the following 'color:mode' pairs: %s." % e )
|
+ " Check the following 'color:mode' pairs: %s." % e )
|
||||||
sys.exit( error_codes["MixedModes"] )
|
sys.exit( error_codes["MixedModes"] )
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
|
||||||
28
setup.py
28
setup.py
|
|
@ -9,17 +9,36 @@ except ImportError:
|
||||||
from distutils.core import setup
|
from distutils.core import setup
|
||||||
|
|
||||||
if sys.argv[-1] == 'publish':
|
if sys.argv[-1] == 'publish':
|
||||||
os.system('python3 setup.py sdist upload')
|
os.system('python setup.py bdist_wheel --universal upload')
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
packages = ['colout']
|
packages = ['colout']
|
||||||
|
|
||||||
requires = ['argparse; python_version < "2.7"', 'pygments', 'babel']
|
requires = ['pygments', 'babel']
|
||||||
|
|
||||||
|
setup_requires = ['setuptools_scm']
|
||||||
|
|
||||||
|
classifiers = """
|
||||||
|
Environment :: Console
|
||||||
|
License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
||||||
|
Programming Language :: Python :: 2
|
||||||
|
Programming Language :: Python :: 2.7
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Programming Language :: Python :: 3.3
|
||||||
|
Programming Language :: Python :: 3.4
|
||||||
|
Programming Language :: Python :: 3.5
|
||||||
|
Programming Language :: Python :: 3.6
|
||||||
|
Programming Language :: Python :: 3.7
|
||||||
|
""".strip().split('\n')
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='colout',
|
name='colout',
|
||||||
version='0.6',
|
use_scm_version=True,
|
||||||
|
classifiers=classifiers,
|
||||||
description='Color Up Arbitrary Command Output.',
|
description='Color Up Arbitrary Command Output.',
|
||||||
|
entry_points={
|
||||||
|
'console_scripts': ['colout=colout.colout:main'],
|
||||||
|
},
|
||||||
long_description=open('README.md').read(),
|
long_description=open('README.md').read(),
|
||||||
author='nojhan',
|
author='nojhan',
|
||||||
author_email='nojhan@nojhan.net',
|
author_email='nojhan@nojhan.net',
|
||||||
|
|
@ -27,7 +46,8 @@ setup(
|
||||||
packages=packages,
|
packages=packages,
|
||||||
package_data={'': ['LICENSE', 'README.md']},
|
package_data={'': ['LICENSE', 'README.md']},
|
||||||
package_dir={'colout': 'colout'},
|
package_dir={'colout': 'colout'},
|
||||||
scripts=['bin/colout'],
|
python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*',
|
||||||
|
setup_requires=setup_requires,
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
install_requires=requires,
|
install_requires=requires,
|
||||||
license='GPLv3',
|
license='GPLv3',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue