Refactored (5)

- Extracted `Colorize` class out of `Util` class. (The latter now only
  contains static methods.)
- Renamed methods in `Colorize` class for improved clarity.
- Refactored as necessary to accommodate the changes above.
This commit is contained in:
Chris Lane 2019-01-31 17:43:21 -05:00
parent 878d7e7e1b
commit 7c4fc54681
6 changed files with 72 additions and 64 deletions

View File

@ -36,11 +36,11 @@ Examples:
# require the dependencies # require the dependencies
from __future__ import print_function from __future__ import print_function
from cheat.colorize import Colorize
from cheat.configuration import Configuration from cheat.configuration import Configuration
from cheat.editor import Editor from cheat.editor import Editor
from cheat.sheet import Sheet from cheat.sheet import Sheet
from cheat.sheets import Sheets from cheat.sheets import Sheets
from cheat.utils import Utils
from docopt import docopt from docopt import docopt
if __name__ == '__main__': if __name__ == '__main__':
@ -54,8 +54,9 @@ if __name__ == '__main__':
# bootsrap # bootsrap
editor = Editor(config) editor = Editor(config)
sheets = Sheets(config) colorize = Colorize(config)
utils = Utils(config)
sheets = Sheets(config, colorize)
sheet = Sheet(sheets, editor) sheet = Sheet(sheets, editor)
# list directories # list directories
@ -72,8 +73,8 @@ if __name__ == '__main__':
# search among the cheatsheets # search among the cheatsheets
elif options['--search']: elif options['--search']:
print(utils.colorize(sheets.search(options['<keyword>'])), end="") print(colorize.syntax(sheets.search(options['<keyword>'])), end="")
# print the cheatsheet # print the cheatsheet
else: else:
print(utils.colorize(sheet.read(options['<cheatsheet>'])), end="") print(colorize.syntax(sheet.read(options['<cheatsheet>'])), end="")

61
cheat/colorize.py Normal file
View File

@ -0,0 +1,61 @@
from __future__ import print_function
import sys
class Colorize:
def __init__(self, config):
self._config = config
def search(self, needle, haystack):
""" Colorizes search results matched within a line """
# if a highlight color is not configured, exit early
if not self._config.cheat_highlight:
return haystack
# otherwise, attempt to import the termcolor library
try:
from termcolor import colored
# if the import fails, return uncolored text
except ImportError:
return haystack
# if the import succeeds, colorize the needle in haystack
return haystack.replace(needle, colored(needle, self._config.cheat_highlight))
def syntax(self, sheet_content):
""" Applies syntax highlighting """
# only colorize if cheat_colors is true, and stdout is a tty
if (self._config.cheat_colors is False or not sys.stdout.isatty()):
return sheet_content
# don't attempt to colorize an empty cheatsheet
if not sheet_content.strip():
return ""
# otherwise, attempt to import the pygments library
try:
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import TerminalFormatter
# if the import fails, return uncolored text
except ImportError:
return sheet_content
# otherwise, attempt to colorize
first_line = sheet_content.splitlines()[0]
lexer = get_lexer_by_name('bash')
# apply syntax-highlighting if the first line is a code-fence
if first_line.startswith('```'):
sheet_content = '\n'.join(sheet_content.split('\n')[1:-2])
try:
lexer = get_lexer_by_name(first_line[3:])
except Exception:
pass
return highlight(sheet_content, lexer, TerminalFormatter())

View File

@ -1,4 +1,5 @@
from __future__ import print_function from __future__ import print_function
from cheat.utils import Utils
import subprocess import subprocess

View File

@ -1,3 +1,4 @@
from cheat.utils import Utils
import io import io
import os import os
import shutil import shutil

View File

@ -6,9 +6,9 @@ from cheat.utils import Utils
class Sheets: class Sheets:
def __init__(self, config): def __init__(self, config, colorize):
self._config = config self._config = config
self._utils = Utils(config) self._colorize = colorize;
def default_path(self): def default_path(self):
""" Returns the default cheatsheet path """ """ Returns the default cheatsheet path """
@ -95,7 +95,7 @@ class Sheets:
match = '' match = ''
for line in io.open(cheatsheet[1], encoding='utf-8'): for line in io.open(cheatsheet[1], encoding='utf-8'):
if term in line: if term in line:
match += ' ' + self._utils.highlight(term, line) match += ' ' + self._colorize.search(term, line)
if match != '': if match != '':
result += cheatsheet[0] + ":\n" + match + "\n" result += cheatsheet[0] + ":\n" + match + "\n"

View File

@ -4,62 +4,6 @@ import sys
class Utils: class Utils:
def __init__(self, config):
self._config = config
def highlight(self, needle, haystack):
""" Highlights a search term matched within a line """
# if a highlight color is not configured, exit early
if not self._config.cheat_highlight:
return haystack
# otherwise, attempt to import the termcolor library
try:
from termcolor import colored
# if the import fails, return uncolored text
except ImportError:
return haystack
# if the import succeeds, colorize the needle in haystack
return haystack.replace(needle, colored(needle, self._config.cheat_highlight))
def colorize(self, sheet_content):
""" Colorizes cheatsheet content if so configured """
# only colorize if cheat_colors is true, and stdout is a tty
if (self._config.cheat_colors is False or not sys.stdout.isatty()):
return sheet_content
# don't attempt to colorize an empty cheatsheet
if not sheet_content.strip():
return ""
# otherwise, attempt to import the pygments library
try:
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import TerminalFormatter
# if the import fails, return uncolored text
except ImportError:
return sheet_content
# otherwise, attempt to colorize
first_line = sheet_content.splitlines()[0]
lexer = get_lexer_by_name('bash')
# apply syntax-highlighting if the first line is a code-fence
if first_line.startswith('```'):
sheet_content = '\n'.join(sheet_content.split('\n')[1:-2])
try:
lexer = get_lexer_by_name(first_line[3:])
except Exception:
pass
return highlight(sheet_content, lexer, TerminalFormatter())
@staticmethod @staticmethod
def die(message): def die(message):
""" Prints a message to stderr and then terminates """ """ Prints a message to stderr and then terminates """