I'm using a slightly modified version of the catppuccin config, and I have issues with highlighting with tags. I believe it is with the color highlighting.
kamfurdev@hp-garuda in ~/.config/dooit via v3.13.3
❯ dooit
╭──────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────╮
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/model_tree.py:158 in on_mount │
│ │
│ 155 │ │ self.refresh_options() ╭─────────────────── locals ───────────────────╮ │
│ 156 │ │ self = TodosTree(id='TodosTree_Workspace_3') │ │
│ 157 │ def on_mount(self): ╰──────────────────────────────────────────────╯ │
│ ❱ 158 │ │ self.force_refresh() │
│ 159 │ │
│ 160 │ @require_highlighted_node │
│ 161 │ def start_sort(self): │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/_decorators.py:17 in wrapper │
│ │
│ 14 │ │ highlighted_id = self.node.id if self.highlighted is not None else None │
│ 15 │ │ highlighted_index = self.highlighted │
│ 16 │ │ │
│ ❱ 17 │ │ func(self, *args, **kwargs) │
│ 18 │ │ │
│ 19 │ │ try: │
│ 20 │ │ │ if highlighted_id is None: │
│ │
│ ╭───────────────────────── locals ──────────────────────────╮ │
│ │ args = () │ │
│ │ highlighted_id = None │ │
│ │ highlighted_index = None │ │
│ │ kwargs = {} │ │
│ │ self = TodosTree(id='TodosTree_Workspace_3') │ │
│ ╰───────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/model_tree.py:129 in force_refresh │
│ │
│ 126 │ ╭─────────────────── locals ───────────────────╮ │
│ 127 │ @fix_highlight │ self = TodosTree(id='TodosTree_Workspace_3') │ │
│ 128 │ def force_refresh(self) -> None: ╰──────────────────────────────────────────────╯ │
│ ❱ 129 │ │ self._force_refresh() │
│ 130 │ │ self.get_column_width.cache_clear() │
│ 131 │ │
│ 132 │ def _force_refresh(self) -> None: │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/model_tree.py:155 in _force_refresh │
│ │
│ 152 │ │ │
│ 153 │ │ has_options = bool(options) │
│ 154 │ │ self.empty_message.display = not has_options │
│ ❱ 155 │ │ self.refresh_options() │
│ 156 │ │
│ 157 │ def on_mount(self): │
│ 158 │ │ self.force_refresh() │
│ │
│ ╭────────────────────── locals ───────────────────────╮ │
│ │ has_options = True │ │
│ │ highlighted = None │ │
│ │ options = [Option(prompt='', id='Todo_7')] │ │
│ │ self = TodosTree(id='TodosTree_Workspace_3') │ │
│ ╰─────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/model_tree.py:220 in refresh_options │
│ │
│ 217 │ def refresh_options(self) -> None: ╭─────────────────── locals ───────────────────╮ │
│ 218 │ │ for i in self._options: │ i = Option(prompt='', id='Todo_7') │ │
│ 219 │ │ │ assert i.id is not None │ self = TodosTree(id='TodosTree_Workspace_3') │ │
│ ❱ 220 │ │ │ new_prompt = self._renderers[i.id].prompt ╰──────────────────────────────────────────────╯ │
│ 221 │ │ │ if i.prompt != new_prompt: │
│ 222 │ │ │ │ i.set_prompt(self._renderers[i.id].prompt) │
│ 223 │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/renderers/base_renderer.py:40 in prompt │
│ │
│ 37 │ │
│ 38 │ @property │
│ 39 │ def prompt(self) -> RenderableType: │
│ ❱ 40 │ │ return self.make_renderable() │
│ 41 │ │
│ 42 │ @property │
│ 43 │ def model(self) -> ModelType: │
│ │
│ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮ │
│ │ self = <dooit.ui.widgets.renderers.todo_renderer.TodoRender object at 0x72165a0d60d0> │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/renderers/base_renderer.py:72 in make_renderable │
│ │
│ 69 │ │ │ attr = item.value │
│ 70 │ │ │ component = self._get_component(attr) │
│ 71 │ │ │ │
│ ❱ 72 │ │ │ if len(component.render()) > self._get_max_width(attr): │
│ 73 │ │ │ │ self.tree.get_column_width.cache_clear() │
│ 74 │ │ │ │
│ 75 │ │ │ if component.is_editing: │
│ │
│ ╭─────────────────────────────────────────────────── locals ───────────────────────────────────────────────────╮ │
│ │ attr = 'description' │ │
│ │ component = <dooit.ui.widgets.inputs.model_inputs.TodoDescription object at 0x72165a0d6210> │ │
│ │ formatter = <dooit.ui.api.api_components.formatters.model_formatters.TodoFormatter object at 0x72165b24e120> │ │
│ │ item = <TodoWidget.description: 'description'> │ │
│ │ layout = [ │ │
│ │ │ <TodoWidget.status: 'status'>, │ │
│ │ │ <TodoWidget.urgency: 'urgency'>, │ │
│ │ │ <TodoWidget.description: 'description'>, │ │
│ │ │ <TodoWidget.due: 'due'> │ │
│ │ ] │ │
│ │ nest = 0 │ │
│ │ rendered = <text '' [Span(0, 0, 'bold #f38ba8')] ''> │ │
│ │ row = [<text '\uf10c' [Span(0, 1, '#f9e2af')] ''>, <text '' [Span(0, 0, 'bold #f38ba8')] ''>] │ │
│ │ self = <dooit.ui.widgets.renderers.todo_renderer.TodoRender object at 0x72165a0d60d0> │ │
│ │ table = <rich.table.Table object at 0x72165a0d6990> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/renderers/base_renderer.py:56 in _get_max_width │
│ │
│ 53 │ │ return max(len(component.value) + 1, len(rendered)) │
│ 54 │ │
│ 55 │ def _get_max_width(self, attr: str) -> int: │
│ ❱ 56 │ │ return self.tree.get_column_width(attr) │
│ 57 │ │
│ 58 │ def make_renderable(self) -> Table: │
│ 59 │ │ layout = self.table_layout │
│ │
│ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮ │
│ │ attr = 'description' │ │
│ │ self = <dooit.ui.widgets.renderers.todo_renderer.TodoRender object at 0x72165a0d60d0> │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/model_tree.py:56 in get_column_width │
│ │
│ 53 │ ╭─────────────────── locals ───────────────────╮ │
│ 54 │ @cache │ attr = 'description' │ │
│ 55 │ def get_column_width(self, attr: str) -> int: │ self = TodosTree(id='TodosTree_Workspace_3') │ │
│ ❱ 56 │ │ return max(i._get_attr_width(attr) for i in self._renderers.values()) ╰──────────────────────────────────────────────╯ │
│ 57 │ │
│ 58 │ @property │
│ 59 │ def formatter(self) -> "ModelFormatterBase": │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/trees/model_tree.py:56 in <genexpr> │
│ │
│ 53 │ │
│ 54 │ @cache │
│ 55 │ def get_column_width(self, attr: str) -> int: │
│ ❱ 56 │ │ return max(i._get_attr_width(attr) for i in self._renderers.values()) │
│ 57 │ │
│ 58 │ @property │
│ 59 │ def formatter(self) -> "ModelFormatterBase": │
│ │
│ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮ │
│ │ .0 = <dict_valueiterator object at 0x721659eac680> │ │
│ │ attr = 'description' │ │
│ │ i = <dooit.ui.widgets.renderers.todo_renderer.TodoRender object at 0x72165a0d60d0> │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/widgets/renderers/base_renderer.py:49 in _get_attr_width │
│ │
│ 46 │ def _get_attr_width(self, attr: str) -> int: │
│ 47 │ │ component = self._get_component(attr) │
│ 48 │ │ formatter = self.tree.formatter │
│ ❱ 49 │ │ rendered: str = getattr(formatter, attr).format_value( │
│ 50 │ │ │ component.model_value, component.model │
│ 51 │ │ ) │
│ 52 │
│ │
│ ╭─────────────────────────────────────────────────── locals ───────────────────────────────────────────────────╮ │
│ │ attr = 'description' │ │
│ │ component = <dooit.ui.widgets.inputs.model_inputs.TodoDescription object at 0x72165a0d6210> │ │
│ │ formatter = <dooit.ui.api.api_components.formatters.model_formatters.TodoFormatter object at 0x72165b24e120> │ │
│ │ self = <dooit.ui.widgets.renderers.todo_renderer.TodoRender object at 0x72165a0d60d0> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/dooit/ui/api/api_components/formatters/formatter_store.py:129 in format_value │
│ │
│ 126 │ │ │ │ value = str(res) │
│ 127 │ │ │
│ 128 │ │ if value: │
│ ❱ 129 │ │ │ return Text.from_markup(value) │
│ 130 │ │ │
│ 131 │ │ return Text("-", justify="center", style="dim") │
│ 132 │
│ │
│ ╭───────────────────────────────────────────────── locals ──────────────────────────────────────────────────╮ │
│ │ model = <dooit.api.todo.Todo object at 0x72165a0c0890> │ │
│ │ params = {'api': <dooit.ui.api.dooit_api.DooitAPI object at 0x72165b24d550>} │ │
│ │ res = None │ │
│ │ self = <dooit.ui.api.api_components.formatters.formatter_store.FormatterStore object at 0x72165b24e270> │ │
│ │ value = 'tags are [#b4befe[#b4befe]\uf02b \uf02b re[/#b4befe]ally[/#b4befe] @cool' │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/rich/text.py:287 in from_markup │
│ │
│ /home/kamfurdev/.local/share/mamba/lib/python3.13/site-packages/rich/markup.py:167 in render │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
MarkupError: closing tag '[/#b4befe]' at position 46 doesn't match any open tag
If dooit crashes with tags next to each other, I either have to remove the config, or remove the tags using an SQL editor.
I'm using a slightly modified version of the catppuccin config, and I have issues with highlighting with tags. I believe it is with the color highlighting.
Tags not next to each other
With Config
Without Config
Tags next to each other
With Config
CRASH
Without Config
If dooit crashes with tags next to each other, I either have to remove the config, or remove the tags using an SQL editor.