mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-06-28 13:36:14 +02:00
* fix missed statement from last PR * replace print statement for adding an entry to a journal * clean up linting and format * change print statement over to new print_msg function * make print_msg always print to stderr * change print statement over to new print_msg function * update importer to use new message function * update yaml format to use new message function * code cleanup * update yaml format to use new message function * update yaml format to use new exception handling * update Journal class to use new message function * update install module to use new message function * update config module to use new message function * update upgrade module to properly use new message and exception handling * fix typo * update upgrade module to use new message handling * update welcome message to use new handling * update upgrade module to use new message handling * update upgrade module journal summaries to use new message handling * take out old code * update upgrade module to use new message handling * update upgrade module to use new message handling * update more modules to use new message handling * take out old comment * update deprecated_cmd to use new message handling * update text_exporter with new message handling, get rid of old color constants * get rid of hardcoded text * whitespace changes * rework MsgType into MsgStyle so messages can have different styles * add comment * Move around code to separate concerns of each function a bit more * update create_password and yesno prompt functions for new messaging * fix missing newline for keyboard interrupts * fix misc linting * fix bug with panel titles always showing 'error' after one error * fix missing import * update debug output after uncaught exception * update exception for new exception handling * rewrite yesno function to use new centralized messages * reduce the debug output slightly * clean up print_msgs function * clean up create_password function * clean up misc linting * rename screen_input to hide_input to be more clear * update encrypted journal prompt to use new messaging functionality * fix typo in message key * move rich console into function so we can mock properly * update password mock to use rich console instead of getpass * add more helpful output to then step * fix test by updating expected output * update message to use new functionality * rework mocks in test suite for new messaging functionality * fix linting issue * fix more tests * fix more tests * fix more tests * fix more tests * fix merge bug * update prompt_action_entries to use new messaging functionality * Add new input_method "type" This does the same thing as input_method "pipe" but is more clear what it's doing (typing text into the builtin composer) * get rid of old commented code * get rid of unused code * move some files around Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
74 lines
2.9 KiB
Python
74 lines
2.9 KiB
Python
import re
|
|
from string import punctuation
|
|
from string import whitespace
|
|
|
|
import colorama
|
|
|
|
from .os_compat import on_windows
|
|
|
|
if on_windows():
|
|
colorama.init()
|
|
|
|
|
|
def colorize(string, color, bold=False):
|
|
"""Returns the string colored with colorama.Fore.color. If the color set by
|
|
the user is "NONE" or the color doesn't exist in the colorama.Fore attributes,
|
|
it returns the string without any modification."""
|
|
color_escape = getattr(colorama.Fore, color.upper(), None)
|
|
if not color_escape:
|
|
return string
|
|
elif not bold:
|
|
return color_escape + string + colorama.Fore.RESET
|
|
else:
|
|
return colorama.Style.BRIGHT + color_escape + string + colorama.Style.RESET_ALL
|
|
|
|
|
|
def highlight_tags_with_background_color(entry, text, color, is_title=False):
|
|
"""
|
|
Takes a string and colorizes the tags in it based upon the config value for
|
|
color.tags, while colorizing the rest of the text based on `color`.
|
|
:param entry: Entry object, for access to journal config
|
|
:param text: Text to be colorized
|
|
:param color: Color for non-tag text, passed to colorize()
|
|
:param is_title: Boolean flag indicating if the text is a title or not
|
|
:return: Colorized str
|
|
"""
|
|
|
|
def colorized_text_generator(fragments):
|
|
"""Efficiently generate colorized tags / text from text fragments.
|
|
Taken from @shobrook. Thanks, buddy :)
|
|
:param fragments: List of strings representing parts of entry (tag or word).
|
|
:rtype: List of tuples
|
|
:returns [(colorized_str, original_str)]"""
|
|
for part in fragments:
|
|
if part and part[0] not in config["tagsymbols"]:
|
|
yield (colorize(part, color, bold=is_title), part)
|
|
elif part:
|
|
yield (colorize(part, config["colors"]["tags"], bold=True), part)
|
|
|
|
config = entry.journal.config
|
|
if config["highlight"]: # highlight tags
|
|
text_fragments = re.split(entry.tag_regex(config["tagsymbols"]), text)
|
|
|
|
# Colorizing tags inside of other blocks of text
|
|
final_text = ""
|
|
previous_piece = ""
|
|
for colorized_piece, piece in colorized_text_generator(text_fragments):
|
|
# If this piece is entirely punctuation or whitespace or the start
|
|
# of a line or the previous piece was a tag or this piece is a tag,
|
|
# then add it to the final text without a leading space.
|
|
if (
|
|
all(char in punctuation + whitespace for char in piece)
|
|
or previous_piece.endswith("\n")
|
|
or (previous_piece and previous_piece[0] in config["tagsymbols"])
|
|
or piece[0] in config["tagsymbols"]
|
|
):
|
|
final_text += colorized_piece
|
|
else:
|
|
# Otherwise add a leading space and then append the piece.
|
|
final_text += " " + colorized_piece
|
|
|
|
previous_piece = piece
|
|
return final_text.lstrip()
|
|
else:
|
|
return text
|