Skip to content

Commit 885d1ae

Browse files
committed
Fix Rich markup parsing error on JSON preview strings
Text.from_markup() replaces Label(markup=True) to avoid MarkupError on strings containing ["
1 parent 0b235cc commit 885d1ae

2 files changed

Lines changed: 28 additions & 21 deletions

File tree

archinstall/lib/global_menu.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -509,14 +509,25 @@ def _prev_install_invalid_config(self, item: MenuItem) -> str | None:
509509
warnings_text += f'- {_escape_markup(w)}\n'
510510
warnings_text = warnings_text.rstrip('\n') + '[/yellow]'
511511

512+
blocks = ''
513+
512514
if missing := self._missing_configs():
513515
text = f'[red]{_escape_markup(tr("Missing configurations:"))}\n'
514516
for m in missing:
515517
text += f'- {_escape_markup(m)}\n'
516-
return text.rstrip('\n') + '[/red]' + warnings_text
517-
518-
if error := self._validate_bootloader():
519-
return f'[red]{_escape_markup(tr(f"Invalid configuration: {error}"))}[/red]' + warnings_text
518+
blocks += text.rstrip('\n') + '[/red]'
519+
520+
disk_item = self._item_group.find_by_key('disk_config')
521+
if disk_item.has_value():
522+
if error := self._validate_bootloader():
523+
if blocks:
524+
blocks += '\n\n'
525+
text = f'[red]{_escape_markup(tr("Invalid configuration:"))}\n'
526+
text += f'- {_escape_markup(error)}'
527+
blocks += text + '[/red]'
528+
529+
if blocks:
530+
return blocks + warnings_text
520531

521532
summary = config_output.as_summary()
522533
if summary:

archinstall/tui/ui/components.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from enum import Enum, auto
66
from typing import Any, ClassVar, Literal, TypeVar, cast, override
77

8-
from rich.markup import escape as _escape_markup
8+
from rich.text import Text
99
from textual import work
1010
from textual.app import App, ComposeResult
1111
from textual.binding import Binding, BindingsMap
@@ -281,7 +281,7 @@ def compose(self) -> ComposeResult:
281281
with Container():
282282
yield option_list
283283
yield Rule(orientation=rule_orientation)
284-
yield ScrollableContainer(Label('', id='preview_content', markup=True))
284+
yield ScrollableContainer(Label('', id='preview_content', markup=False))
285285

286286
if self._filter:
287287
yield Input(placeholder='/filter', id='filter-input')
@@ -360,9 +360,8 @@ def _set_preview(self, item_id: str) -> None:
360360
maybe_preview = item.preview_action(item)
361361

362362
if maybe_preview is not None:
363-
if not item.preview_markup:
364-
maybe_preview = _escape_markup(maybe_preview)
365-
preview_widget.update(maybe_preview)
363+
content = Text.from_markup(maybe_preview) if item.preview_markup else maybe_preview
364+
preview_widget.update(content)
366365
return
367366

368367
preview_widget.update('')
@@ -513,7 +512,7 @@ def compose(self) -> ComposeResult:
513512
with Container():
514513
yield selection_list
515514
yield Rule(orientation=rule_orientation)
516-
yield ScrollableContainer(Label('', id='preview_content', markup=True))
515+
yield ScrollableContainer(Label('', id='preview_content', markup=False))
517516

518517
if self._filter:
519518
yield Input(placeholder='/filter', id='filter-input')
@@ -604,9 +603,8 @@ def _set_preview(self, item: MenuItem) -> None:
604603
if item.preview_action is not None:
605604
maybe_preview = item.preview_action(item)
606605
if maybe_preview is not None:
607-
if not item.preview_markup:
608-
maybe_preview = _escape_markup(maybe_preview)
609-
preview_widget.update(maybe_preview)
606+
content = Text.from_markup(maybe_preview) if item.preview_markup else maybe_preview
607+
preview_widget.update(content)
610608
return
611609

612610
preview_widget.update('')
@@ -693,7 +691,7 @@ def compose(self) -> ComposeResult:
693691
yield Rule(orientation='horizontal')
694692
if self._preview_header is not None:
695693
yield Label(self._preview_header, classes='preview-header', id='preview_header')
696-
yield ScrollableContainer(Label('', id='preview_content', markup=True))
694+
yield ScrollableContainer(Label('', id='preview_content', markup=False))
697695

698696
yield Footer()
699697

@@ -731,9 +729,8 @@ def _update_selection(self) -> None:
731729
else:
732730
text = focused.preview_action(focused)
733731
if text is not None:
734-
if not focused.preview_markup:
735-
text = _escape_markup(text)
736-
preview.update(text)
732+
content = Text.from_markup(text) if focused.preview_markup else text
733+
preview.update(content)
737734
else:
738735
button.remove_class('-active')
739736

@@ -1023,7 +1020,7 @@ def compose(self) -> ComposeResult:
10231020
yield Rule(orientation='horizontal')
10241021
if self._preview_header is not None:
10251022
yield Label(self._preview_header, classes='preview-header', id='preview-header')
1026-
yield ScrollableContainer(Label('', id='preview_content', markup=True))
1023+
yield ScrollableContainer(Label('', id='preview_content', markup=False))
10271024

10281025
yield Footer()
10291026

@@ -1133,9 +1130,8 @@ def on_data_table_row_highlighted(self, event: DataTable.RowHighlighted) -> None
11331130

11341131
maybe_preview = item.preview_action(item)
11351132
if maybe_preview is not None:
1136-
if not item.preview_markup:
1137-
maybe_preview = _escape_markup(maybe_preview)
1138-
preview_widget.update(maybe_preview)
1133+
content = Text.from_markup(maybe_preview) if item.preview_markup else maybe_preview
1134+
preview_widget.update(content)
11391135
return
11401136

11411137
preview_widget.update('')

0 commit comments

Comments
 (0)