added highlight bool

This commit is contained in:
Will McGugan 2020-12-18 14:36:29 +00:00
parent c231cb7786
commit 865fe7ca9f
4 changed files with 29 additions and 10 deletions

View File

@ -19,6 +19,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added rich.reconfigure - Added rich.reconfigure
- Added `Color.__rich__` - Added `Color.__rich__`
- Added Console.style parameter - Added Console.style parameter
- Added Table.highlight parameter to enable highlighting of cells
- Added Panel.highlight parameter to enable highlighting of panel title
- Added highlight to ConsoleOptions
### Fixed ### Fixed

View File

@ -102,6 +102,8 @@ class ConsoleOptions:
"""Overflow value override for renderable.""" """Overflow value override for renderable."""
no_wrap: Optional[bool] = False no_wrap: Optional[bool] = False
"""Disable wrapping for text.""" """Disable wrapping for text."""
highlight: Optional[bool] = None
"""Highlight override for render_str."""
@property @property
def ascii_only(self) -> bool: def ascii_only(self) -> bool:
@ -116,6 +118,7 @@ class ConsoleOptions:
justify: JustifyMethod = None, justify: JustifyMethod = None,
overflow: OverflowMethod = None, overflow: OverflowMethod = None,
no_wrap: bool = None, no_wrap: bool = None,
highlight: bool = None,
) -> "ConsoleOptions": ) -> "ConsoleOptions":
"""Update values, return a copy.""" """Update values, return a copy."""
options = replace(self) options = replace(self)
@ -131,6 +134,8 @@ class ConsoleOptions:
options.overflow = overflow options.overflow = overflow
if no_wrap is not None: if no_wrap is not None:
options.no_wrap = no_wrap options.no_wrap = no_wrap
if highlight is not None:
options.highlight = highlight
return options return options
@ -857,7 +862,9 @@ class Console:
if isinstance(renderable, ConsoleRenderable): if isinstance(renderable, ConsoleRenderable):
render_iterable = renderable.__rich_console__(self, _options) render_iterable = renderable.__rich_console__(self, _options)
elif isinstance(renderable, str): elif isinstance(renderable, str):
yield from self.render(self.render_str(renderable), _options) yield from self.render(
self.render_str(renderable, highlight=options.highlight), _options
)
return return
else: else:
raise errors.NotRenderableError( raise errors.NotRenderableError(
@ -919,6 +926,7 @@ class Console:
overflow: OverflowMethod = None, overflow: OverflowMethod = None,
emoji: bool = None, emoji: bool = None,
markup: bool = None, markup: bool = None,
highlight: bool = None,
highlighter: HighlighterType = None, highlighter: HighlighterType = None,
) -> "Text": ) -> "Text":
"""Convert a string to a Text instance. This is is called automatically if """Convert a string to a Text instance. This is is called automatically if
@ -931,6 +939,7 @@ class Console:
overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``.
emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default.
markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default.
highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default.
highlighter (HighlighterType, optional): Optional highlighter to apply. highlighter (HighlighterType, optional): Optional highlighter to apply.
Returns: Returns:
ConsoleRenderable: Renderable object. ConsoleRenderable: Renderable object.
@ -938,6 +947,7 @@ class Console:
""" """
emoji_enabled = emoji or (emoji is None and self._emoji) emoji_enabled = emoji or (emoji is None and self._emoji)
markup_enabled = markup or (markup is None and self._markup) markup_enabled = markup or (markup is None and self._markup)
highlight_enabled = highlight or (highlight is None and self._highlight)
if markup_enabled: if markup_enabled:
rich_text = render_markup(text, style=style, emoji=emoji_enabled) rich_text = render_markup(text, style=style, emoji=emoji_enabled)
@ -951,8 +961,9 @@ class Console:
style=style, style=style,
) )
if highlighter is not None: _highlighter = (highlighter or self.highlighter) if highlight_enabled else None
highlight_text = highlighter(str(rich_text)) if _highlighter is not None:
highlight_text = _highlighter(str(rich_text))
highlight_text.copy_styles(rich_text) highlight_text.copy_styles(rich_text)
return highlight_text return highlight_text
@ -1041,10 +1052,7 @@ class Console:
if isinstance(renderable, str): if isinstance(renderable, str):
append_text( append_text(
self.render_str( self.render_str(
renderable, renderable, emoji=emoji, markup=markup, highlighter=_highlighter
emoji=emoji,
markup=markup,
highlighter=_highlighter,
) )
) )
elif isinstance(renderable, ConsoleRenderable): elif isinstance(renderable, ConsoleRenderable):

View File

@ -31,6 +31,7 @@ class Panel(JupyterMixin):
border_style (str, optional): The style of the border. Defaults to "none". border_style (str, optional): The style of the border. Defaults to "none".
width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect.
padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0. padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0.
highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False.
""" """
def __init__( def __init__(
@ -46,6 +47,7 @@ class Panel(JupyterMixin):
border_style: StyleType = "none", border_style: StyleType = "none",
width: Optional[int] = None, width: Optional[int] = None,
padding: PaddingDimensions = (0, 1), padding: PaddingDimensions = (0, 1),
highlight: bool = False,
) -> None: ) -> None:
self.renderable = renderable self.renderable = renderable
self.box = box self.box = box
@ -57,6 +59,7 @@ class Panel(JupyterMixin):
self.border_style = border_style self.border_style = border_style
self.width = width self.width = width
self.padding = padding self.padding = padding
self.highlight = highlight
@classmethod @classmethod
def fit( def fit(
@ -131,7 +134,7 @@ class Panel(JupyterMixin):
) )
width = child_width + 2 width = child_width + 2
child_options = options.update(width=child_width) child_options = options.update(width=child_width, highlight=self.highlight)
lines = console.render_lines(renderable, child_options, style=style) lines = console.render_lines(renderable, child_options, style=style)
line_start = Segment(box.mid_left, border_style) line_start = Segment(box.mid_left, border_style)

View File

@ -129,6 +129,7 @@ class Table(JupyterMixin):
caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. caption_style (Union[str, Style], optional): Style of the caption. Defaults to None.
title_justify (str, optional): Justify method for title. Defaults to "center". title_justify (str, optional): Justify method for title. Defaults to "center".
caption_justify (str, optional): Justify method for caption. Defaults to "center". caption_justify (str, optional): Justify method for caption. Defaults to "center".
highlight (bool, optional): Highlight cell contents (if str). Defaults to False.
""" """
columns: List[Column] columns: List[Column]
@ -161,6 +162,7 @@ class Table(JupyterMixin):
caption_style: StyleType = None, caption_style: StyleType = None,
title_justify: "JustifyMethod" = "center", title_justify: "JustifyMethod" = "center",
caption_justify: "JustifyMethod" = "center", caption_justify: "JustifyMethod" = "center",
highlight: bool = False
) -> None: ) -> None:
self.columns: List[Column] = [] self.columns: List[Column] = []
@ -196,6 +198,7 @@ class Table(JupyterMixin):
self.caption_style = caption_style self.caption_style = caption_style
self.title_justify = title_justify self.title_justify = title_justify
self.caption_justify = caption_justify self.caption_justify = caption_justify
self.highlight = highlight
self.row_styles = list(row_styles or []) self.row_styles = list(row_styles or [])
@classmethod @classmethod
@ -413,13 +416,15 @@ class Table(JupyterMixin):
widths = self._calculate_column_widths(console, max_width - extra_width) widths = self._calculate_column_widths(console, max_width - extra_width)
table_width = sum(widths) + extra_width table_width = sum(widths) + extra_width
render_options = options.update(width=table_width) render_options = options.update(width=table_width, highlight=self.highlight)
def render_annotation( def render_annotation(
text: TextType, style: StyleType, justify: "JustifyMethod" = "center" text: TextType, style: StyleType, justify: "JustifyMethod" = "center"
) -> "RenderResult": ) -> "RenderResult":
render_text = ( render_text = (
console.render_str(text, style=style) if isinstance(text, str) else text console.render_str(text, style=style, highlight=False)
if isinstance(text, str)
else text
) )
return console.render( return console.render(
render_text, options=render_options.update(justify=justify) render_text, options=render_options.update(justify=justify)