|
| 1 | +import logging |
1 | 2 | import tkinter as tk |
2 | 3 | from datetime import datetime |
3 | 4 | from pathlib import Path |
|
8 | 9 | from note_model import NoteManager |
9 | 10 | from search_engine import KnowledgeGraph, SearchEngine |
10 | 11 |
|
| 12 | +logger = logging.getLogger(__name__) |
| 13 | + |
11 | 14 |
|
12 | 15 | class SmartNotesApp: |
13 | 16 | def __init__(self, root): |
@@ -636,12 +639,43 @@ def _render_markdown_preview(self, content): |
636 | 639 | pt.insert(tk.END, '\n') |
637 | 640 | pt.config(state='disabled') |
638 | 641 |
|
| 642 | + @staticmethod |
| 643 | + def _html_preview_widget(parent): |
| 644 | + """Return an HTMLScrolledText if tkhtmlview is installed, else None.""" |
| 645 | + try: |
| 646 | + from tkhtmlview import HTMLScrolledText # noqa: PLC0415 |
| 647 | + except ImportError: |
| 648 | + return None |
| 649 | + return HTMLScrolledText(parent, html="") |
| 650 | + |
639 | 651 | def toggle_preview(self): |
| 652 | + content = self.editor_text.get(1.0, tk.END) |
| 653 | + # If an HTML preview backend is available, prefer it; otherwise fall |
| 654 | + # back to the Tk-tag renderer introduced earlier. |
| 655 | + if getattr(self, '_html_preview', 'unset') == 'unset': |
| 656 | + self._html_preview = self._html_preview_widget(self.editor_text.master) |
| 657 | + |
| 658 | + if self._html_preview is not None: |
| 659 | + if self._html_preview.winfo_ismapped(): |
| 660 | + self._html_preview.pack_forget() |
| 661 | + self.editor_text.pack(fill='both', expand=True) |
| 662 | + else: |
| 663 | + self.editor_text.pack_forget() |
| 664 | + self._html_preview.pack(fill='both', expand=True) |
| 665 | + try: |
| 666 | + html = self.markdown_parser.parse_to_styled_html(content) |
| 667 | + self._html_preview.set_html(html) |
| 668 | + except Exception: |
| 669 | + logger.exception("HTML 预览渲染失败,回退到标签渲染") |
| 670 | + self._html_preview.pack_forget() |
| 671 | + self.preview_text.pack(fill='both', expand=True) |
| 672 | + self._render_markdown_preview(content) |
| 673 | + return |
| 674 | + |
640 | 675 | if self.preview_text.winfo_ismapped(): |
641 | 676 | self.preview_text.pack_forget() |
642 | 677 | self.editor_text.pack(fill='both', expand=True) |
643 | 678 | else: |
644 | | - content = self.editor_text.get(1.0, tk.END) |
645 | 679 | self.editor_text.pack_forget() |
646 | 680 | self.preview_text.pack(fill='both', expand=True) |
647 | 681 | self._render_markdown_preview(content) |
|
0 commit comments