Conductor
fe618055ca
feat(markdown): pure-Python port of imgui_md with overlap fix
...
ADD src/md_renderer_py.py: Full port of mekhontsev/imgui_md to pure Python.
- Uses markdown-it-py (already a transitive dep) for AST parsing.
- Walks the token tree, calling imgui primitives directly.
- Mirrors the C++ API surface: MarkdownOptions, MarkdownCallbacks,
MarkdownRenderer.render(), render_unindented().
- Code blocks delegated via set_external_code_block_handler callback.
- All other content (paragraphs, headings, lists, code, tables, hr,
emphasis, strong, links, blockquotes) rendered natively.
ROOT CAUSE OF BULLET OVERLAP (now fixed at the source):
imgui-md C++ BLOCK_P guards NewLine() behind 'if (!m_list_stack.empty())'
(imgui_md.cpp line ~145). Inside lists, paragraph transitions don't
advance the cursor Y. The Python port calls imgui.new_line() explicitly
between paragraphs in a list item, eliminating the overlap.
ROOT CAUSE OF '*' BULLET Y-OVERLAP (now fixed at the source):
imgui-md C++ BLOCK_LI for '*' delim calls ImGui::Bullet() without
ImGui::SameLine() (imgui_md.cpp line ~95). The Python port calls
imgui.bullet() + imgui.same_line() for all markers uniformly.
REMOVED in src/markdown_helper.py:
- _normalize_bullet_delimiters (no longer needed)
- _normalize_nested_list_endings (no longer needed)
- _normalize_list_continuations (no longer needed)
- parse_tables / render_table (renderer handles tables natively)
- All 'imgui_md' body rendering (replaced by Python port)
TESTS:
- tests/test_md_renderer_py.py (new): 16 unit tests for the Python port
covering paragraphs, headings, lists, nested lists, emphasis, strong,
code, links, tables, hr, unindented.
- tests/test_markdown_helper_bullets.py (rewritten): 13 tests for the
integration with the public MarkdownRenderer class.
- tests/test_markdown_render_robust.py (updated): 2 tests verifying
table content is routed through the new Python renderer (not imgui_md).
- tests/test_markdown_table.py / _render.py / _columns.py / _wrapped.py:
unchanged (test the standalone render_table which is still used by
the new renderer as a fallback for any unhandled cases).
42/42 markdown tests pass. 1-space indentation. 1 C++ dependency
removed (imgui_md is no longer used at runtime).
NOT FIXED (known limitations of the new renderer):
- Inline code rendering uses a tinted small_button (not monospace)
- Heading fonts use the default font (no separate bold/large fonts)
- Image rendering shows a placeholder text
- These can be improved by subclassing MarkdownRenderer
2026-06-03 22:43:41 -04:00
..
2026-03-02 22:56:32 -05:00
2026-05-10 15:38:16 -04:00
2026-03-02 22:56:32 -05:00
2026-06-02 01:27:32 -04:00
2026-05-07 15:02:00 -04:00
2026-05-04 21:52:39 -04:00
2026-05-14 22:23:48 -04:00
2026-05-13 22:35:52 -04:00
2026-03-05 17:13:59 -05:00
2026-03-05 14:04:17 -05:00
2026-05-06 13:48:47 -04:00
2026-05-09 17:44:15 -04:00
2026-03-07 12:13:08 -05:00
2026-05-16 03:00:20 -04:00
2026-03-06 12:59:18 -05:00
2026-05-13 22:35:52 -04:00
2026-05-09 15:00:35 -04:00
2026-03-11 23:14:09 -04:00
2026-03-05 19:21:57 -05:00
2026-05-12 19:06:54 -04:00
2026-03-12 19:28:21 -04:00
2026-03-11 23:04:42 -04:00
2026-03-12 15:33:37 -04:00
2026-05-13 22:35:52 -04:00
2026-06-02 21:34:56 -04:00
2026-05-16 03:00:20 -04:00
2026-05-16 03:00:20 -04:00
2026-06-02 17:30:46 -04:00
2026-05-10 15:14:54 -04:00
2026-05-20 07:51:58 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 11:22:41 -04:00
2026-05-08 22:01:15 -04:00
2026-03-06 12:48:02 -05:00
2026-05-06 13:48:47 -04:00
2026-03-10 10:25:09 -04:00
2026-03-10 09:53:59 -04:00
2026-03-10 09:27:12 -04:00
2026-06-03 00:52:08 -04:00
2026-05-13 22:35:52 -04:00
2026-03-04 10:01:55 -05:00
2026-06-02 22:41:59 -04:00
2026-06-02 22:54:52 -04:00
2026-06-03 14:25:59 -04:00
2026-06-03 14:53:05 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-06 20:37:48 -04:00
2026-05-16 03:00:20 -04:00
2026-05-16 11:22:41 -04:00
2026-05-16 03:00:20 -04:00
2026-05-16 03:00:20 -04:00
2026-05-11 20:03:01 -04:00
2026-05-20 07:51:58 -04:00
2026-05-20 07:51:58 -04:00
2026-03-22 12:59:10 -04:00
2026-05-16 11:22:41 -04:00
2026-05-16 17:58:19 -04:00
2026-03-06 17:05:48 -05:00
2026-03-05 16:37:30 -05:00
2026-05-11 17:15:04 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 03:00:20 -04:00
2026-06-02 01:42:41 -04:00
2026-06-02 01:42:41 -04:00
2026-06-03 11:27:04 -04:00
2026-05-09 15:00:35 -04:00
2026-06-03 11:27:04 -04:00
2026-06-03 08:33:10 -04:00
2026-05-09 12:35:58 -04:00
2026-03-06 12:48:02 -05:00
2026-05-13 22:35:52 -04:00
2026-05-07 21:21:05 -04:00
2026-05-16 03:00:20 -04:00
2026-03-12 15:58:36 -04:00
2026-05-16 03:00:20 -04:00
2026-03-12 15:41:01 -04:00
2026-05-13 22:35:52 -04:00
2026-06-03 12:24:51 -04:00
2026-05-20 07:51:58 -04:00
2026-05-16 03:00:20 -04:00
2026-03-06 12:48:02 -05:00
2026-05-16 03:00:20 -04:00
2026-03-06 12:48:02 -05:00
2026-03-06 12:48:02 -05:00
2026-05-10 11:43:50 -04:00
2026-05-13 22:35:52 -04:00
2026-06-03 12:41:13 -04:00
2026-05-10 15:38:16 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 14:32:38 -04:00
2026-03-13 12:05:49 -04:00
2026-05-06 13:48:47 -04:00
2026-05-13 22:35:52 -04:00
2026-06-03 11:27:04 -04:00
2026-03-12 19:28:21 -04:00
2026-06-03 11:27:04 -04:00
2026-05-16 15:59:40 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-06-03 11:27:04 -04:00
2026-05-16 14:45:06 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 03:00:20 -04:00
2026-06-03 11:27:04 -04:00
2026-05-16 14:45:06 -04:00
2026-06-02 17:30:46 -04:00
2026-06-02 02:20:07 -04:00
2026-05-13 22:35:52 -04:00
2026-06-02 17:30:46 -04:00
2026-05-16 01:21:27 -04:00
2026-03-12 19:28:21 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-06-02 01:27:32 -04:00
2026-05-16 03:00:20 -04:00
2026-05-05 17:50:55 -04:00
2026-05-09 15:00:35 -04:00
2026-06-01 17:56:24 -04:00
2026-05-16 03:00:20 -04:00
2026-05-12 19:02:30 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 01:21:27 -04:00
2026-06-03 17:37:44 -04:00
2026-05-13 22:35:52 -04:00
2026-06-03 13:47:08 -04:00
2026-06-03 11:28:36 -04:00
2026-05-16 14:45:06 -04:00
2026-03-06 12:48:02 -05:00
2026-03-07 12:43:29 -05:00
2026-05-09 15:00:35 -04:00
2026-03-06 16:43:11 -05:00
2026-03-07 16:25:44 -05:00
2026-06-03 22:43:41 -04:00
2026-06-03 22:43:41 -04:00
2026-06-03 21:14:16 -04:00
2026-06-03 11:08:58 -04:00
2026-06-03 21:33:47 -04:00
2026-06-03 10:59:57 -04:00
2026-05-06 13:48:47 -04:00
2026-03-12 15:31:10 -04:00
2026-03-05 17:13:59 -05:00
2026-05-05 19:48:38 -04:00
2026-06-03 22:43:41 -04:00
2026-05-10 14:58:29 -04:00
2026-05-09 15:00:35 -04:00
2026-05-09 15:00:35 -04:00
2026-05-16 14:45:06 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 03:00:20 -04:00
2026-05-16 14:45:06 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 03:00:20 -04:00
2026-05-16 03:00:20 -04:00
2026-03-05 16:37:30 -05:00
2026-03-07 20:32:59 -05:00
2026-05-13 22:35:52 -04:00
2026-03-06 12:48:02 -05:00
2026-03-02 13:26:20 -05:00
2026-03-06 22:03:59 -05:00
2026-03-06 16:43:11 -05:00
2026-03-05 17:13:59 -05:00
2026-05-13 17:22:34 -04:00
2026-03-06 16:55:45 -05:00
2026-05-13 22:35:52 -04:00
2026-03-07 00:15:06 -05:00
2026-03-12 19:08:51 -04:00
2026-03-07 16:41:47 -05:00
2026-05-06 14:59:34 -04:00
2026-05-06 14:59:34 -04:00
2026-05-06 14:30:22 -04:00
2026-03-10 11:09:11 -04:00
2026-03-10 23:21:14 -04:00
2026-03-10 23:21:14 -04:00
2026-03-12 19:28:21 -04:00
2026-05-10 15:46:53 -04:00
2026-05-04 18:49:18 -04:00
2026-03-07 16:36:04 -05:00
2026-05-09 15:00:35 -04:00
2026-05-09 15:00:35 -04:00
2026-05-09 15:00:35 -04:00
2026-06-03 15:18:18 -04:00
2026-06-03 14:08:01 -04:00
2026-05-13 22:35:52 -04:00
2026-03-07 11:24:05 -05:00
2026-05-06 13:48:47 -04:00
2026-03-05 15:10:53 -05:00
2026-03-12 19:08:51 -04:00
2026-05-09 15:00:35 -04:00
2026-05-16 15:59:40 -04:00
2026-05-09 15:00:35 -04:00
2026-05-16 15:59:40 -04:00
2026-05-14 23:38:23 -04:00
2026-05-16 15:59:40 -04:00
2026-05-16 01:21:27 -04:00
2026-05-20 07:51:58 -04:00
2026-05-20 07:51:58 -04:00
2026-05-14 23:38:23 -04:00
2026-05-13 22:35:52 -04:00
2026-05-09 17:36:07 -04:00
2026-05-16 15:59:40 -04:00
2026-05-16 14:45:06 -04:00
2026-03-08 20:51:27 -04:00
2026-03-12 19:08:51 -04:00
2026-03-06 16:43:11 -05:00
2026-05-16 14:45:06 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-05-13 22:35:52 -04:00
2026-03-07 11:54:11 -05:00
2026-05-11 18:19:50 -04:00
2026-03-06 12:48:02 -05:00
2026-05-15 17:17:05 -04:00
2026-05-04 04:52:40 -04:00
2026-05-04 05:20:03 -04:00
2026-03-07 15:20:39 -05:00
2026-05-15 17:17:05 -04:00
2026-05-09 15:00:35 -04:00
2026-05-09 15:00:35 -04:00
2026-03-19 19:53:09 -04:00
2026-05-02 18:31:36 -04:00
2026-05-13 22:35:52 -04:00
2026-05-16 14:45:06 -04:00
2026-03-09 23:16:02 -04:00
2026-03-09 00:55:09 -04:00
2026-03-11 23:49:23 -04:00
2026-03-09 01:13:23 -04:00
2026-03-08 21:55:35 -04:00
2026-05-16 15:59:40 -04:00
2026-05-16 03:00:20 -04:00
2026-03-13 21:55:29 -04:00
2026-05-06 20:37:48 -04:00
2026-05-16 03:00:20 -04:00
2026-03-07 00:10:35 -05:00
2026-05-16 03:00:20 -04:00
2026-05-10 10:13:56 -04:00
2026-03-06 12:59:18 -05:00
2026-05-16 15:59:40 -04:00
2026-05-02 13:23:00 -04:00
2026-03-10 09:53:59 -04:00
2026-03-11 20:30:09 -04:00
2026-05-09 15:00:35 -04:00
2026-03-10 09:27:12 -04:00
2026-03-10 09:27:12 -04:00
2026-03-10 01:23:57 -04:00
2026-05-13 22:35:52 -04:00
2026-05-09 15:00:35 -04:00
2026-05-13 22:35:52 -04:00
2026-05-20 07:51:58 -04:00
2026-05-20 07:51:58 -04:00
2026-05-04 05:18:04 -04:00
2026-05-16 11:22:41 -04:00
2026-05-09 16:55:45 -04:00
2026-03-09 23:25:06 -04:00
2026-03-07 21:40:40 -05:00
2026-06-03 11:31:29 -04:00
2026-05-11 18:31:56 -04:00
2026-05-09 16:55:45 -04:00
2026-05-16 03:00:20 -04:00
2026-06-02 02:20:07 -04:00
2026-05-13 22:35:52 -04:00
2026-03-04 09:46:02 -05:00
2026-05-20 07:51:58 -04:00
2026-03-04 10:01:55 -05:00
2026-05-05 20:51:03 -04:00
2026-05-13 22:35:52 -04:00
2026-05-14 23:13:17 -04:00