mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/main' into react/settings
; Conflicts: ; apps/client/package.json ; apps/client/src/translations/en/translation.json ; apps/client/src/translations/tw/translation.json ; pnpm-lock.yaml
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| <p>Trilium supports configuration via a file named <code>config.ini</code> and | ||||
|   environment variables. Please review the file named <a href="https://github.com/TriliumNext/Trilium/blob/develop/apps/server/src/assets/config-sample.ini">config-sample.ini</a> in | ||||
|   the <a href="https://github.com/TriliumNext/Trilium">Notes</a> repository | ||||
|   environment variables. Please review the file named <a href="https://github.com/TriliumNext/Trilium/blob/main/apps/server/src/assets/config-sample.ini">config-sample.ini</a> in | ||||
|   the <a href="https://github.com/TriliumNext/Trilium">Trilium</a> repository | ||||
|   to see what values are supported.</p> | ||||
| <p>You can provide the same values via environment variables instead of the <code>config.ini</code> file, | ||||
|   and these environment variables use the following format:</p> | ||||
|   | ||||
| @@ -231,23 +231,17 @@ | ||||
|   first, then adds fuzzy matching when needed.</p> | ||||
| <h3>How Progressive Search Works</h3> | ||||
| <ol> | ||||
|   <li> | ||||
|     <p><strong>Phase 1 - Exact Matching</strong>: When you search, Trilium first | ||||
|       looks for exact matches of your search terms. This handles the vast majority | ||||
|       of searches (90%+) and returns results almost instantly.</p> | ||||
|   </li> | ||||
|   <li> | ||||
|     <p><strong>Phase 2 - Fuzzy Fallback</strong>: If Phase 1 doesn't find enough | ||||
|       high-quality results (fewer than 5 results with good relevance scores), | ||||
|       Trilium automatically adds fuzzy matching to find results with typos or | ||||
|       spelling variations.</p> | ||||
|   </li> | ||||
|   <li> | ||||
|     <p><strong>Result Ordering</strong>: Exact matches always appear before fuzzy | ||||
|       matches, regardless of individual scores. This ensures that when you search | ||||
|       for "project", notes containing the exact word "project" will appear before | ||||
|       notes containing similar words like "projects" or "projection".</p> | ||||
|   </li> | ||||
|   <li><strong>Phase 1 - Exact Matching</strong>: When you search, Trilium first | ||||
|     looks for exact matches of your search terms. This handles the vast majority | ||||
|     of searches (90%+) and returns results almost instantly.</li> | ||||
|   <li><strong>Phase 2 - Fuzzy Fallback</strong>: If Phase 1 doesn't find enough | ||||
|     high-quality results (fewer than 5 results with good relevance scores), | ||||
|     Trilium automatically adds fuzzy matching to find results with typos or | ||||
|     spelling variations.</li> | ||||
|   <li><strong>Result Ordering</strong>: Exact matches always appear before fuzzy | ||||
|     matches, regardless of individual scores. This ensures that when you search | ||||
|     for "project", notes containing the exact word "project" will appear before | ||||
|     notes containing similar words like "projects" or "projection".</li> | ||||
| </ol> | ||||
| <h3>Progressive Search Behavior</h3> | ||||
| <ul> | ||||
|   | ||||
| @@ -2,9 +2,9 @@ | ||||
| <p>There are two types of error logs, both of which are useful when reporting | ||||
|   bugs.</p> | ||||
| <ul> | ||||
|   <li data-list-item-id="e5d891396e04bcb9d78ea10421e8ee6be"><a class="reference-link" href="#root/pOsGYCXsbNQG/BgmBlOIl72jZ/qzNzp9LYQyPT/_help_bnyigUA2UK7s">Backend (server) logs</a> | ||||
|   <li><a class="reference-link" href="#root/_help_bnyigUA2UK7s">Backend (server) logs</a> | ||||
|   </li> | ||||
|   <li data-list-item-id="e94ecb76c9af944e47bf8b5c5dabf027a"><a class="reference-link" href="#root/pOsGYCXsbNQG/BgmBlOIl72jZ/qzNzp9LYQyPT/_help_9yEHzMyFirZR">Frontend logs</a> | ||||
|   <li><a class="reference-link" href="#root/_help_9yEHzMyFirZR">Frontend logs</a> | ||||
|   </li> | ||||
| </ul> | ||||
| <h2>Providing sensitive data</h2> | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| <h2>Accessing via the backend log</h2> | ||||
| <p>In the <a class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_x3i7MxGccDuM">Global menu</a>, | ||||
| <p>In the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>, | ||||
|   go to Advanced → Show backend log</p> | ||||
| <h2>Location on the disk</h2> | ||||
| <p>Backend logs are stored on the file system. To find them, open the  | ||||
|   <a | ||||
|   class="reference-link" href="#root/pOsGYCXsbNQG/Otzi9La2YAUX/_help_tAassRL4RSQL">Data directory</a>, go to the <code>log</code> subdirectory and find the | ||||
|   class="reference-link" href="#root/_help_tAassRL4RSQL">Data directory</a>, go to the <code>log</code> subdirectory and find the | ||||
|     latest log file, e.g. <code>trilium-2022-12-14.log</code>. </p> | ||||
| <h2>Reporting backend bugs</h2> | ||||
| <p>You can attach the whole file to the bug report (preferable) or open it | ||||
| @@ -15,12 +15,18 @@ | ||||
|   in order to reduce the space consumption.</p> | ||||
| <p>It's possible to change the retention period by modifying the  | ||||
|   <a | ||||
|   class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_Gzjqa934BdH4">Configuration (config.ini or environment variables)</a> via the <code>.ini</code> file:</p><pre><code class="language-text-x-trilium-auto">[Logging] | ||||
|   class="reference-link" href="#root/_help_Gzjqa934BdH4">Configuration (config.ini or environment variables)</a> via the <code>.ini</code> file:</p><pre><code class="language-text-x-trilium-auto">[Logging] | ||||
| retentionDays=7</code></pre> | ||||
| <p>Or via the environment variable <code>TRILIUM_LOGGING_RETENTION_DAYS</code>.</p> | ||||
| <aside | ||||
| class="admonition note"> | ||||
| <p>Special cases:</p> | ||||
| <ul> | ||||
|   <li>Positive values indicate the number of days worth of logs to keep</li> | ||||
|   <li>A value of 0 results with the default value (90 days) to be used</li> | ||||
|   <li>Negative values (e.g. <code>-1</code>) result with all logs to be kept, | ||||
|     irrespective how ancient and numerous (and</li> | ||||
| </ul> | ||||
| <aside class="admonition note"> | ||||
|   <p>If you set the retention days to a low number, you might notice that not | ||||
|     all the log files are being deleted. This is because a minimum number of | ||||
|     logs (7 at the time of writing) is maintained at all times.</p> | ||||
|   </aside> | ||||
| </aside> | ||||
| @@ -5,9 +5,9 @@ | ||||
|   console is cleared on app restart.</p> | ||||
| <p>If that doesn't work, then:</p> | ||||
| <ul> | ||||
|   <li data-list-item-id="e1f836ac8425c0d56072614c40c996bbd">in Trilium desktop app, go to top-left menu button -> Advanced -> | ||||
|   <li>in Trilium desktop app, go to top-left menu button -> Advanced -> | ||||
|     Open Dev Tools</li> | ||||
|   <li data-list-item-id="e8bd27605bedefe884b826a1899413a6d">In Firefox/Chrome right-click anywhere in the page and click Inspect:</li> | ||||
|   <li>In Firefox/Chrome right-click anywhere in the page and click Inspect:</li> | ||||
| </ul> | ||||
| <p> | ||||
|   <img src="Frontend logs_error-logs-f.png"> | ||||
|   | ||||
							
								
								
									
										14
									
								
								apps/server/src/assets/translations/fa/server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								apps/server/src/assets/translations/fa/server.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| { | ||||
|   "keyboard_actions": { | ||||
|     "back-in-note-history": "به یادداشت قبلی در تاریخچه", | ||||
|     "forward-in-note-history": "به یادداشت بعدی در تاریخچه برو", | ||||
|     "open-jump-to-note-dialog": "باز کردن پنجرهٔ «پرش به یادداشت»", | ||||
|     "open-command-palette": "باز کردن پالت دستورات", | ||||
|     "scroll-to-active-note": "پیمایش درخت یادداشت به یادداشت جاری", | ||||
|     "quick-search": "فعالسازی نوار جستجوی سریع", | ||||
|     "search-in-subtree": "جستجوی یادداشتها در زیردرخت یادداشت فعال", | ||||
|     "expand-subtree": "باز کردن زیردرخت یادداشت جاری", | ||||
|     "collapse-tree": "بستن کامل درخت یادداشتها", | ||||
|     "collapse-subtree": "بستن زیرشاخههای یادداشت فعلی" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										10
									
								
								apps/server/src/assets/translations/fi/server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								apps/server/src/assets/translations/fi/server.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| { | ||||
|   "keyboard_actions": { | ||||
|     "quick-search": "Aktivoi pikahakupalkki", | ||||
|     "collapse-tree": "Kutista valmis muistiinpanopuu", | ||||
|     "creating-and-moving-notes": "Luo ja siirrä muistioita", | ||||
|     "delete-note": "Poista muistio", | ||||
|     "move-note-up": "Siirrä muistio ylös", | ||||
|     "open-command-palette": "Avaa komentovalikko" | ||||
|   } | ||||
| } | ||||
| @@ -134,7 +134,7 @@ | ||||
|   }, | ||||
|   "setup_sync-from-desktop": { | ||||
|     "heading": "Synchroniser depuis une application de bureau", | ||||
|     "description": "Cette procédure doit être réalisée depuis l'application de bureau:", | ||||
|     "description": "Cette procédure doit être réalisée depuis l'application de bureau :", | ||||
|     "step1": "Ouvrez l'application Trilium Notes.", | ||||
|     "step2": "Dans le menu Trilium, cliquez sur Options.", | ||||
|     "step3": "Cliquez sur la catégorie Synchroniser.", | ||||
| @@ -310,6 +310,46 @@ | ||||
|     "clone-notes-to": "Cloner les notes vers", | ||||
|     "move-notes-to": "Déplacer les notes vers", | ||||
|     "copy-notes-to-clipboard": "Copier les notes dans le presse-papiers", | ||||
|     "paste-notes-from-clipboard": "Coller les notes depuis le presse-papiers" | ||||
|     "paste-notes-from-clipboard": "Coller les notes depuis le presse-papiers", | ||||
|     "cut-notes-to-clipboard": "Couper les notes vers le presse-papier", | ||||
|     "select-all-notes-in-parent": "Selectionner toutes les notes dans le parent", | ||||
|     "add-note-above-to-selection": "Ajouter la note au-dessus à la selection", | ||||
|     "add-note-below-to-selection": "Ajouter la note dessous à la selection", | ||||
|     "duplicate-subtree": "Dupliquer la sous-arborescence", | ||||
|     "open-new-tab": "Ouvrir un nouvel onglet", | ||||
|     "close-active-tab": "Fermer l'onglet actif", | ||||
|     "reopen-last-tab": "Réouvrir le dernier onglet", | ||||
|     "activate-next-tab": "Activer l'onglet suivant", | ||||
|     "activate-previous-tab": "Activer l'onglet précédent", | ||||
|     "open-new-window": "Ouvrir une nouvelle fenêtre", | ||||
|     "toggle-system-tray-icon": "Activer/Désactiver l'icone de la barre d'état", | ||||
|     "toggle-zen-mode": "Activer/Désactiver le mode Zen", | ||||
|     "switch-to-first-tab": "Aller au premier onglet", | ||||
|     "switch-to-second-tab": "Aller au second onglet", | ||||
|     "switch-to-third-tab": "Aller au troisième onglet", | ||||
|     "switch-to-fourth-tab": "Aller au quatrième onglet", | ||||
|     "switch-to-fifth-tab": "Aller au cinquième onglet", | ||||
|     "switch-to-sixth-tab": "Aller au sixième onglet", | ||||
|     "switch-to-seventh-tab": "Aller au septième onglet", | ||||
|     "switch-to-eighth-tab": "Aller au huitième onglet", | ||||
|     "switch-to-ninth-tab": "Aller au neuvième onglet", | ||||
|     "switch-to-last-tab": "Aller au dernier onglet", | ||||
|     "show-note-source": "Afficher la source de la note", | ||||
|     "show-options": "Afficher les options", | ||||
|     "show-revisions": "Afficher les révisions", | ||||
|     "show-recent-changes": "Afficher les changements récents", | ||||
|     "show-sql-console": "Afficher la console SQL", | ||||
|     "show-backend-log": "Afficher le journal du backend", | ||||
|     "show-help": "Afficher l'aide", | ||||
|     "show-cheatsheet": "Afficher la fiche de triche", | ||||
|     "add-link-to-text": "Ajouter un lien au texte", | ||||
|     "follow-link-under-cursor": "Suivre le lien en dessous du curseur", | ||||
|     "insert-date-and-time-to-text": "Insérer la date et l'heure dans le texte", | ||||
|     "paste-markdown-into-text": "Coller du Markdown dans le texte", | ||||
|     "cut-into-note": "Couper dans une note", | ||||
|     "add-include-note-to-text": "Ajouter une note inclusion au texte", | ||||
|     "edit-read-only-note": "Modifier une note en lecture seule", | ||||
|     "add-new-label": "Ajouter une nouvelle étiquette", | ||||
|     "add-new-relation": "Ajouter une nouvelle relation" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										1
									
								
								apps/server/src/assets/translations/hu/server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								apps/server/src/assets/translations/hu/server.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| {} | ||||
| @@ -6,20 +6,20 @@ | ||||
|     "open-command-palette": "コマンドパレットを開く", | ||||
|     "scroll-to-active-note": "ノートツリーをアクティブなノートまでスクロールする", | ||||
|     "search-in-subtree": "アクティブなノートのサブツリー内でノートを検索する", | ||||
|     "expand-subtree": "現在のノートのサブツリーを展開する", | ||||
|     "expand-subtree": "現在のノートのサブツリーを展開", | ||||
|     "collapse-tree": "ノートツリー全体を折りたたむ", | ||||
|     "collapse-subtree": "現在のノートのサブツリーを折りたたむ", | ||||
|     "creating-and-moving-notes": "ノートの作成と移動", | ||||
|     "create-note-after": "アクティブなノートの後にノートを作成する", | ||||
|     "create-note-into": "アクティブなノートの子ノートを作成する", | ||||
|     "delete-note": "ノートを削除する", | ||||
|     "move-note-up": "ノートを上に移動する", | ||||
|     "move-note-down": "ノートを下に移動する", | ||||
|     "move-note-up-in-hierarchy": "ノートを上の階層に移動する", | ||||
|     "move-note-down-in-hierarchy": "ノートを下の階層に移動する", | ||||
|     "delete-note": "ノートを削除", | ||||
|     "move-note-up": "ノートを上に移動", | ||||
|     "move-note-down": "ノートを下に移動", | ||||
|     "move-note-up-in-hierarchy": "ノートを上の階層に移動", | ||||
|     "move-note-down-in-hierarchy": "ノートを下の階層に移動", | ||||
|     "edit-note-title": "ツリーからノートの詳細にジャンプして、タイトルを編集", | ||||
|     "clone-notes-to": "選択したノートを複製する", | ||||
|     "move-notes-to": "選択したノートを移動する", | ||||
|     "clone-notes-to": "選択したノートを複製", | ||||
|     "move-notes-to": "選択したノートを移動", | ||||
|     "copy-notes-to-clipboard": "選択したノートをクリップボードにコピー", | ||||
|     "paste-notes-from-clipboard": "クリップボードからアクティブなノートにノートを貼り付け", | ||||
|     "cut-notes-to-clipboard": "選択したノートをクリップボードにカット", | ||||
|   | ||||
							
								
								
									
										66
									
								
								apps/server/src/assets/translations/pl/server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								apps/server/src/assets/translations/pl/server.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| { | ||||
|   "keyboard_actions": { | ||||
|     "back-in-note-history": "Nawigacja do poprzedniej notatki w historii", | ||||
|     "forward-in-note-history": "Nawigacja do następnej notatki w historii", | ||||
|     "open-jump-to-note-dialog": "Otwórz dialog \"Skocz do notatki\"", | ||||
|     "open-command-palette": "Otwórz paletę komend", | ||||
|     "scroll-to-active-note": "Przewiń drzewo notatek do aktywnej notatki", | ||||
|     "quick-search": "Aktywuj szybki pasek wyszukiwania", | ||||
|     "search-in-subtree": "Szukaj notatek w sub-drzewie aktywnej notatki", | ||||
|     "expand-subtree": "Rozszerz sub-drzewo obecnej notatki", | ||||
|     "collapse-tree": "Schowaj kompletne drzewo notatek", | ||||
|     "collapse-subtree": "Schowaj sub-drzewo aktualnej notatki", | ||||
|     "sort-child-notes": "Sortuj podnotatki", | ||||
|     "creating-and-moving-notes": "Tworzenie oraz przestawianie notatek", | ||||
|     "create-note-after": "Utwórz notatkę po aktywnej notatce", | ||||
|     "create-note-into": "Utwórz notatkę jako podnotatka aktywnej notatki", | ||||
|     "create-note-into-inbox": "Utwórz notatkę w skrzyncę (jeśli zdefiniowana) lub jako notatka dnia", | ||||
|     "delete-note": "Usuń notatkę", | ||||
|     "move-note-up": "Przestaw notatkę wyżej", | ||||
|     "move-note-down": "Przestaw notatkę niżej", | ||||
|     "move-note-up-in-hierarchy": "Przestaw notatkę wyżej w hierarchii", | ||||
|     "move-note-down-in-hierarchy": "Przestaw notatkę niżej w hierarchii", | ||||
|     "edit-note-title": "Przeskocz z drzewa do detali notatki i edytuj tytuł", | ||||
|     "edit-branch-prefix": "Pokaż dialog \"Edytuj prefiks gałęzi\"", | ||||
|     "clone-notes-to": "Sklonuj zaznaczone notatki", | ||||
|     "move-notes-to": "Przestaw zaznaczone notatki", | ||||
|     "note-clipboard": "Schowek notatki", | ||||
|     "copy-notes-to-clipboard": "Skopiuj zaznaczone notatki do schowka", | ||||
|     "paste-notes-from-clipboard": "Wklej notatki ze schowka do aktywnej notatki", | ||||
|     "cut-notes-to-clipboard": "Wytnij zaznaczone notatki do schowka", | ||||
|     "select-all-notes-in-parent": "Zaznacz wszystkie notatki z poziomu aktualnej notatki", | ||||
|     "add-note-above-to-the-selection": "Dodaj notatkę nad zaznaczeniem", | ||||
|     "add-note-below-to-selection": "Dodaj notatkę pod zaznaczeniem", | ||||
|     "duplicate-subtree": "Duplikuj sub-drzewo", | ||||
|     "tabs-and-windows": "Karty i Okna", | ||||
|     "open-new-tab": "Otwórz nową kartę", | ||||
|     "close-active-tab": "Zamknij aktywną kartę", | ||||
|     "reopen-last-tab": "Otwórz ponownie ostatnio zamkniętą kartę", | ||||
|     "activate-next-tab": "Aktywuj kartę po prawej", | ||||
|     "activate-previous-tab": "Aktywuj kartę po lewej", | ||||
|     "open-new-window": "Otwórz nowe puste okno", | ||||
|     "toggle-tray": "Pokaż/schowaj aplikację z zasobnika systemowego", | ||||
|     "first-tab": "Aktywuj piewszą kartę z listy", | ||||
|     "second-tab": "Aktywuj drugą kartę z listy", | ||||
|     "third-tab": "Aktywuj trzecią kartę z listy", | ||||
|     "fourth-tab": "Aktywuj czwartą kartę z listy", | ||||
|     "fifth-tab": "Aktywuj piątą kartę z listy", | ||||
|     "sixth-tab": "Aktywuj szóstą kartę z listy", | ||||
|     "seventh-tab": "Aktywuj siódmą kartę z listy", | ||||
|     "eight-tab": "Aktywuj ósmą kartę z listy", | ||||
|     "ninth-tab": "Aktywuj dziewiątą kartę z listy", | ||||
|     "last-tab": "Aktywuj ostatnią kartę z listy", | ||||
|     "dialogs": "Okna dialogowe", | ||||
|     "show-note-source": "Pokaż dialog \"Źródło notatki\"", | ||||
|     "show-options": "Pokaż stronę \"Opcje\"", | ||||
|     "show-revisions": "Pokaż dialog \"Rewizje notatki\"", | ||||
|     "show-recent-changes": "Pokaż dialog \"Ostatnie zmiany\"", | ||||
|     "show-sql-console": "Pokaż stronę \"Konsola SQL\"", | ||||
|     "show-backend-log": "Pokaż stronę \"Logi Backendu\"", | ||||
|     "show-help": "Pokaż wbudowany poradnik użytkownika", | ||||
|     "show-cheatsheet": "Pokaż dialog z częstymi operacjami klawiatury", | ||||
|     "text-note-operations": "Operacje tekstowe notatki", | ||||
|     "add-link-to-text": "Otwórz dialog dodawania linku do tekstu", | ||||
|     "follow-link-under-cursor": "Podążaj za linkiem, w którym znajduje się kursor" | ||||
|   } | ||||
| } | ||||
| @@ -1 +1,34 @@ | ||||
| {} | ||||
| { | ||||
|   "keyboard_actions": { | ||||
|     "open-command-palette": "Открыть палитру команд", | ||||
|     "quick-search": "Активировать панель быстрого поиска", | ||||
|     "move-note-up": "Переместить заметку вверх", | ||||
|     "move-note-down": "Переместить заметку вниз", | ||||
|     "move-note-up-in-hierarchy": "Переместить заметку вверх в иерархии", | ||||
|     "move-note-down-in-hierarchy": "Переместить заметку вниз в иерархии", | ||||
|     "delete-note": "Удалить заметку", | ||||
|     "back-in-note-history": "Перейти к предыдущей заметке в истории", | ||||
|     "forward-in-note-history": "Перейти к следующей заметке в истории", | ||||
|     "scroll-to-active-note": "Прокрутить дерево заметок до активной заметки", | ||||
|     "search-in-subtree": "Искать заметки в поддереве активной заметки", | ||||
|     "expand-subtree": "Развернуть поддерево текущей заметки", | ||||
|     "collapse-tree": "Свернуть дерево заметок полностью", | ||||
|     "collapse-subtree": "Свернуть поддерево текущей заметки", | ||||
|     "sort-child-notes": "Сортировка дочерних заметок", | ||||
|     "creating-and-moving-notes": "Создание и перемещение заметок", | ||||
|     "create-note-after": "Создать заметку после активной заметки", | ||||
|     "create-note-into": "Создать заметку как дочернюю для активной заметки", | ||||
|     "edit-note-title": "Перейти от дерева к деталям заметки и отредактировать заголовок", | ||||
|     "clone-notes-to": "Клонировать выбранные заметки", | ||||
|     "move-notes-to": "Переместить выбранные заметки", | ||||
|     "note-clipboard": "Буфер обмена заметок", | ||||
|     "copy-notes-to-clipboard": "Скопировать выбранные заметки в буфер обмена", | ||||
|     "paste-notes-from-clipboard": "Вставить заметки из буфера обмена в активную заметку", | ||||
|     "cut-notes-to-clipboard": "Вырезать выбранные заметки в буфер обмена", | ||||
|     "duplicate-subtree": "Дублировать поддерево", | ||||
|     "tabs-and-windows": "Вкладки и окна", | ||||
|     "open-new-tab": "Открыть новую вкладку", | ||||
|     "close-active-tab": "Закрыть активную вкладку", | ||||
|     "reopen-last-tab": "Повторно открыть последнюю закрытую вкладку" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -13,24 +13,24 @@ | ||||
|     "move-note-down": "下移筆記", | ||||
|     "move-note-up-in-hierarchy": "將筆記層級上移", | ||||
|     "move-note-down-in-hierarchy": "將筆記層級下移", | ||||
|     "edit-note-title": "從筆記樹跳轉至筆記詳情並編輯標題", | ||||
|     "edit-note-title": "從筆記樹跳轉至筆記內容並編輯標題", | ||||
|     "edit-branch-prefix": "顯示編輯分支前綴對話方塊", | ||||
|     "note-clipboard": "筆記剪貼簿", | ||||
|     "copy-notes-to-clipboard": "複製選定的筆記至剪貼簿", | ||||
|     "copy-notes-to-clipboard": "複製所選的筆記至剪貼簿", | ||||
|     "paste-notes-from-clipboard": "從剪貼簿貼上筆記至目前筆記中", | ||||
|     "cut-notes-to-clipboard": "剪下選定的筆記至剪貼簿", | ||||
|     "select-all-notes-in-parent": "選擇當前筆記級別的所有筆記", | ||||
|     "cut-notes-to-clipboard": "剪下所選的筆記至剪貼簿", | ||||
|     "select-all-notes-in-parent": "選擇目前筆記級別的所有筆記", | ||||
|     "add-note-above-to-the-selection": "加入上方筆記至選擇中", | ||||
|     "add-note-below-to-selection": "加入下方筆記至選擇中", | ||||
|     "duplicate-subtree": "複製子階層", | ||||
|     "tabs-and-windows": "分頁和視窗", | ||||
|     "open-new-tab": "打開新分頁", | ||||
|     "close-active-tab": "關閉活動分頁", | ||||
|     "close-active-tab": "關閉使用中分頁", | ||||
|     "reopen-last-tab": "重新打開最後關閉的分頁", | ||||
|     "activate-next-tab": "切換至右側分頁", | ||||
|     "activate-previous-tab": "切換至左側分頁", | ||||
|     "open-new-window": "打開新空白視窗", | ||||
|     "toggle-tray": "從系統匣顯示/隱藏應用程式", | ||||
|     "toggle-tray": "從系統匣顯示 / 隱藏應用程式", | ||||
|     "first-tab": "切換至列表中第一個分頁", | ||||
|     "second-tab": "切換至列表中第二個分頁", | ||||
|     "third-tab": "切換至列表中第三個分頁", | ||||
| @@ -44,7 +44,7 @@ | ||||
|     "dialogs": "對話方塊", | ||||
|     "show-note-source": "顯示筆記來源對話方塊", | ||||
|     "show-options": "打開選項頁面", | ||||
|     "show-revisions": "顯示筆記修改歷史對話方塊", | ||||
|     "show-revisions": "顯示筆記歷史版本對話方塊", | ||||
|     "show-recent-changes": "顯示最近更改對話方塊", | ||||
|     "show-sql-console": "打開 SQL 控制台頁面", | ||||
|     "show-backend-log": "打開後端日誌頁面", | ||||
| @@ -54,18 +54,18 @@ | ||||
|     "insert-date-and-time-to-text": "插入目前日期和時間", | ||||
|     "paste-markdown-into-text": "將剪貼簿中的 Markdown 文字貼上", | ||||
|     "cut-into-note": "從目前筆記剪下選擇的部分並新增至子筆記", | ||||
|     "add-include-note-to-text": "打開對話方塊以包含筆記", | ||||
|     "add-include-note-to-text": "打開對話方塊以內嵌筆記", | ||||
|     "edit-readonly-note": "編輯唯讀筆記", | ||||
|     "attributes-labels-and-relations": "屬性(標籤和關係)", | ||||
|     "add-new-label": "新增新標籤", | ||||
|     "create-new-relation": "新增新關聯", | ||||
|     "ribbon-tabs": "功能區分頁", | ||||
|     "toggle-basic-properties": "顯示基本屬性", | ||||
|     "toggle-file-properties": "顯示文件屬性", | ||||
|     "toggle-file-properties": "顯示檔案屬性", | ||||
|     "toggle-image-properties": "顯示圖像屬性", | ||||
|     "toggle-owned-attributes": "顯示擁有的屬性", | ||||
|     "toggle-inherited-attributes": "顯示繼承的屬性", | ||||
|     "toggle-promoted-attributes": "顯示提升的屬性", | ||||
|     "toggle-owned-attributes": "顯示自有屬性", | ||||
|     "toggle-inherited-attributes": "顯示繼承屬性", | ||||
|     "toggle-promoted-attributes": "顯示升級的屬性", | ||||
|     "toggle-link-map": "顯示連結地圖", | ||||
|     "toggle-note-info": "顯示筆記資訊", | ||||
|     "toggle-note-paths": "顯示筆記路徑", | ||||
| @@ -73,9 +73,9 @@ | ||||
|     "other": "其他", | ||||
|     "toggle-right-pane": "切換右側面板的顯示,包括目錄和高亮", | ||||
|     "print-active-note": "列印目前筆記", | ||||
|     "open-note-externally": "以預設應用程式打開筆記文件", | ||||
|     "open-note-externally": "以預設應用程式打開筆記檔案", | ||||
|     "render-active-note": "渲染(重新渲染)目前筆記", | ||||
|     "run-active-note": "執行目前的 JavaScript(前端/後端)程式碼筆記", | ||||
|     "run-active-note": "執行目前的 JavaScript(前端 / 後端)程式碼筆記", | ||||
|     "toggle-note-hoisting": "聚焦目前筆記", | ||||
|     "unhoist": "取消任何聚焦", | ||||
|     "reload-frontend-app": "重新載入前端應用", | ||||
| @@ -86,24 +86,24 @@ | ||||
|     "zoom-in": "放大", | ||||
|     "note-navigation": "筆記導航", | ||||
|     "reset-zoom-level": "重設縮放比例", | ||||
|     "copy-without-formatting": "以純文字複製選定文字", | ||||
|     "force-save-revision": "強制新增/儲存目前筆記的新版本", | ||||
|     "copy-without-formatting": "以純文字複製所選文字", | ||||
|     "force-save-revision": "強制新增 / 儲存目前筆記的新版本", | ||||
|     "show-help": "顯示用戶說明", | ||||
|     "toggle-book-properties": "顯示集合屬性", | ||||
|     "back-in-note-history": "跳轉至歷史記錄中的上一個筆記", | ||||
|     "forward-in-note-history": "跳轉至歷史記錄中的下一個筆記", | ||||
|     "open-command-palette": "打開命令面板", | ||||
|     "scroll-to-active-note": "滾動筆記樹至目前筆記", | ||||
|     "scroll-to-active-note": "捲動筆記樹至目前筆記", | ||||
|     "quick-search": "開啟快速搜尋列", | ||||
|     "create-note-after": "新增筆記於目前筆記之後", | ||||
|     "create-note-into": "新增目前筆記的子筆記", | ||||
|     "clone-notes-to": "克隆選定的筆記至", | ||||
|     "move-notes-to": "移動選定的筆記至", | ||||
|     "clone-notes-to": "克隆所選的筆記至", | ||||
|     "move-notes-to": "移動所選的筆記至", | ||||
|     "show-cheatsheet": "顯示常用鍵盤快捷鍵", | ||||
|     "find-in-text": "顯示搜尋面板", | ||||
|     "toggle-classic-editor-toolbar": "顯示固定工具列編輯器的格式分頁", | ||||
|     "export-as-pdf": "匯出目前筆記為 PDF", | ||||
|     "toggle-zen-mode": "啟用/禁用禪模式(極簡界面以專注編輯)" | ||||
|     "toggle-zen-mode": "啟用 / 禁用禪模式(極簡界面以專注編輯)" | ||||
|   }, | ||||
|   "login": { | ||||
|     "title": "登入", | ||||
| @@ -214,7 +214,7 @@ | ||||
|     "back-in-note-history": "返回筆記歷史", | ||||
|     "forward-in-note-history": "前進筆記歷史", | ||||
|     "jump-to-note": "跳轉至…", | ||||
|     "scroll-to-active-note": "滾動至目前筆記", | ||||
|     "scroll-to-active-note": "捲動至目前筆記", | ||||
|     "quick-search": "快速搜尋", | ||||
|     "search-in-subtree": "在子階層中搜尋", | ||||
|     "expand-subtree": "展開子階層", | ||||
| @@ -246,8 +246,8 @@ | ||||
|     "activate-next-tab": "切換至下一分頁", | ||||
|     "activate-previous-tab": "切換至上一分頁", | ||||
|     "open-new-window": "打開新視窗", | ||||
|     "toggle-system-tray-icon": "顯示/隱藏系統匣圖示", | ||||
|     "toggle-zen-mode": "啟用/禁用禪模式", | ||||
|     "toggle-system-tray-icon": "顯示 / 隱藏系統匣圖示", | ||||
|     "toggle-zen-mode": "啟用 / 禁用禪模式", | ||||
|     "switch-to-first-tab": "切換至第一個分頁", | ||||
|     "switch-to-second-tab": "切換至第二個分頁", | ||||
|     "switch-to-third-tab": "切換至第三個分頁", | ||||
| @@ -260,7 +260,7 @@ | ||||
|     "switch-to-last-tab": "切換至第最後一個分頁", | ||||
|     "show-note-source": "顯示筆記原始碼", | ||||
|     "show-options": "顯示選項", | ||||
|     "show-revisions": "顯示修改歷史", | ||||
|     "show-revisions": "顯示歷史版本", | ||||
|     "show-recent-changes": "顯示最近更改", | ||||
|     "show-sql-console": "顯示 SQL 控制台", | ||||
|     "show-backend-log": "顯示後端日誌", | ||||
| @@ -271,18 +271,18 @@ | ||||
|     "insert-date-and-time-to-text": "插入日期和時間", | ||||
|     "paste-markdown-into-text": "貼上 Markdown 文字", | ||||
|     "cut-into-note": "剪下至筆記", | ||||
|     "add-include-note-to-text": "新增包含筆記", | ||||
|     "add-include-note-to-text": "新增內嵌筆記", | ||||
|     "edit-read-only-note": "編輯唯讀筆記", | ||||
|     "add-new-label": "新增標籤", | ||||
|     "add-new-relation": "新增關聯", | ||||
|     "toggle-ribbon-tab-classic-editor": "顯示功能區分頁:經典編輯器", | ||||
|     "toggle-ribbon-tab-basic-properties": "顯示功能區分頁:基本屬性", | ||||
|     "toggle-ribbon-tab-book-properties": "顯示功能區分頁:書籍屬性", | ||||
|     "toggle-ribbon-tab-file-properties": "顯示功能區分頁:文件屬性", | ||||
|     "toggle-ribbon-tab-file-properties": "顯示功能區分頁:檔案屬性", | ||||
|     "toggle-ribbon-tab-image-properties": "顯示功能區分頁:圖片屬性", | ||||
|     "toggle-ribbon-tab-owned-attributes": "顯示功能區分頁:自有屬性", | ||||
|     "toggle-ribbon-tab-inherited-attributes": "顯示功能區分頁:繼承屬性", | ||||
|     "toggle-ribbon-tab-promoted-attributes": "顯示功能區分頁:提升屬性", | ||||
|     "toggle-ribbon-tab-promoted-attributes": "顯示功能區分頁:升級屬性", | ||||
|     "toggle-ribbon-tab-note-map": "顯示功能區分頁:筆記地圖", | ||||
|     "toggle-ribbon-tab-note-info": "顯示功能區分頁:筆記資訊", | ||||
|     "toggle-ribbon-tab-note-paths": "顯示功能區分頁:筆記路徑", | ||||
| @@ -313,15 +313,15 @@ | ||||
|     "bulk-action-title": "批次操作", | ||||
|     "backend-log-title": "後端日誌", | ||||
|     "user-hidden-title": "隱藏的用戶", | ||||
|     "launch-bar-templates-title": "啟動列模版", | ||||
|     "launch-bar-templates-title": "啟動欄模版", | ||||
|     "base-abstract-launcher-title": "基礎摘要啟動器", | ||||
|     "command-launcher-title": "命令啟動器", | ||||
|     "note-launcher-title": "筆記啟動器", | ||||
|     "script-launcher-title": "腳本啟動器", | ||||
|     "built-in-widget-title": "內建小工具", | ||||
|     "spacer-title": "空白占位", | ||||
|     "custom-widget-title": "自訂小工具", | ||||
|     "launch-bar-title": "啟動列", | ||||
|     "built-in-widget-title": "內建元件", | ||||
|     "spacer-title": "分隔元件", | ||||
|     "custom-widget-title": "自訂元件", | ||||
|     "launch-bar-title": "啟動欄", | ||||
|     "available-launchers-title": "可用啟動器", | ||||
|     "go-to-previous-note-title": "跳轉至前一筆記", | ||||
|     "go-to-next-note-title": "跳轉至後一筆記", | ||||
| @@ -349,7 +349,7 @@ | ||||
|     "etapi-title": "ETAPI", | ||||
|     "backup-title": "備份", | ||||
|     "sync-title": "同步", | ||||
|     "ai-llm-title": "AI/LLM", | ||||
|     "ai-llm-title": "AI / LLM", | ||||
|     "other": "其他", | ||||
|     "advanced-title": "進階", | ||||
|     "visible-launchers-title": "可見啟動器", | ||||
| @@ -373,7 +373,7 @@ | ||||
|     "export_filter": "PDF 文件 (*.pdf)", | ||||
|     "unable-to-export-message": "目前筆記無法被匯出為 PDF 。", | ||||
|     "unable-to-export-title": "無法匯出為 PDF", | ||||
|     "unable-to-save-message": "選定文件無法被寫入。請重試或選擇其他路徑。" | ||||
|     "unable-to-save-message": "所選檔案無法被寫入。請重試或選擇其他路徑。" | ||||
|   }, | ||||
|   "tray": { | ||||
|     "tooltip": "Trilium 筆記", | ||||
|   | ||||
							
								
								
									
										12
									
								
								apps/server/src/assets/translations/uk/server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								apps/server/src/assets/translations/uk/server.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| { | ||||
|   "keyboard_actions": { | ||||
|     "back-in-note-history": "Перейти до минулої нотатки в історії", | ||||
|     "forward-in-note-history": "Перейти до наступної нотатки в історії", | ||||
|     "open-command-palette": "Відкрити палітру команд", | ||||
|     "scroll-to-active-note": "Прокрутити дерево нотаток до активної нотатки", | ||||
|     "quick-search": "Показати панель швидкого пошуку", | ||||
|     "search-in-subtree": "Пошук нотаток в піддереві активної нотатки", | ||||
|     "expand-subtree": "Розкрити піддерево поточної нотатки", | ||||
|     "collapse-tree": "Згорнути все дерево нотаток" | ||||
|   } | ||||
| } | ||||
| @@ -35,6 +35,8 @@ class SearchResult { | ||||
|     highlightedNotePathTitle?: string; | ||||
|     contentSnippet?: string; | ||||
|     highlightedContentSnippet?: string; | ||||
|     attributeSnippet?: string; | ||||
|     highlightedAttributeSnippet?: string; | ||||
|     private fuzzyScore: number; // Track fuzzy score separately | ||||
|  | ||||
|     constructor(notePathArray: string[]) { | ||||
|   | ||||
| @@ -468,8 +468,13 @@ function extractContentSnippet(noteId: string, searchTokens: string[], maxLength | ||||
|             content = striptags(content); | ||||
|         } | ||||
|  | ||||
|         // Normalize whitespace | ||||
|         content = content.replace(/\s+/g, " ").trim(); | ||||
|         // Normalize whitespace while preserving paragraph breaks | ||||
|         // First, normalize multiple newlines to double newlines (paragraph breaks) | ||||
|         content = content.replace(/\n\s*\n/g, "\n\n"); | ||||
|         // Then normalize spaces within lines | ||||
|         content = content.split('\n').map(line => line.replace(/\s+/g, " ").trim()).join('\n'); | ||||
|         // Finally trim the whole content | ||||
|         content = content.trim(); | ||||
|  | ||||
|         if (!content) { | ||||
|             return ""; | ||||
| @@ -495,21 +500,36 @@ function extractContentSnippet(noteId: string, searchTokens: string[], maxLength | ||||
|         // Extract snippet | ||||
|         let snippet = content.substring(snippetStart, snippetStart + maxLength); | ||||
|          | ||||
|         // Try to start/end at word boundaries | ||||
|         if (snippetStart > 0) { | ||||
|             const firstSpace = snippet.indexOf(" "); | ||||
|             if (firstSpace > 0 && firstSpace < 20) { | ||||
|                 snippet = snippet.substring(firstSpace + 1); | ||||
|             } | ||||
|             snippet = "..." + snippet; | ||||
|         } | ||||
|          | ||||
|         if (snippetStart + maxLength < content.length) { | ||||
|             const lastSpace = snippet.lastIndexOf(" "); | ||||
|             if (lastSpace > snippet.length - 20) { | ||||
|                 snippet = snippet.substring(0, lastSpace); | ||||
|             } | ||||
|         // If snippet contains linebreaks, limit to max 4 lines and override character limit | ||||
|         const lines = snippet.split('\n'); | ||||
|         if (lines.length > 4) { | ||||
|             snippet = lines.slice(0, 4).join('\n'); | ||||
|             // Add ellipsis if we truncated lines | ||||
|             snippet = snippet + "..."; | ||||
|         } else if (lines.length > 1) { | ||||
|             // For multi-line snippets, just limit to 4 lines (keep existing snippet) | ||||
|             snippet = lines.slice(0, 4).join('\n'); | ||||
|             if (lines.length > 4) { | ||||
|                 snippet = snippet + "..."; | ||||
|             } | ||||
|         } else { | ||||
|             // Single line content - apply original word boundary logic | ||||
|             // Try to start/end at word boundaries | ||||
|             if (snippetStart > 0) { | ||||
|                 const firstSpace = snippet.search(/\s/); | ||||
|                 if (firstSpace > 0 && firstSpace < 20) { | ||||
|                     snippet = snippet.substring(firstSpace + 1); | ||||
|                 } | ||||
|                 snippet = "..." + snippet; | ||||
|             } | ||||
|              | ||||
|             if (snippetStart + maxLength < content.length) { | ||||
|                 const lastSpace = snippet.search(/\s[^\s]*$/); | ||||
|                 if (lastSpace > snippet.length - 20 && lastSpace > 0) { | ||||
|                     snippet = snippet.substring(0, lastSpace); | ||||
|                 } | ||||
|                 snippet = snippet + "..."; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return snippet; | ||||
| @@ -519,6 +539,90 @@ function extractContentSnippet(noteId: string, searchTokens: string[], maxLength | ||||
|     } | ||||
| } | ||||
|  | ||||
| function extractAttributeSnippet(noteId: string, searchTokens: string[], maxLength: number = 200): string { | ||||
|     const note = becca.notes[noteId]; | ||||
|     if (!note) { | ||||
|         return ""; | ||||
|     } | ||||
|  | ||||
|     try { | ||||
|         // Get all attributes for this note | ||||
|         const attributes = note.getAttributes(); | ||||
|         if (!attributes || attributes.length === 0) { | ||||
|             return ""; | ||||
|         } | ||||
|  | ||||
|         let matchingAttributes: Array<{name: string, value: string, type: string}> = []; | ||||
|          | ||||
|         // Look for attributes that match the search tokens | ||||
|         for (const attr of attributes) { | ||||
|             const attrName = attr.name?.toLowerCase() || ""; | ||||
|             const attrValue = attr.value?.toLowerCase() || ""; | ||||
|             const attrType = attr.type || ""; | ||||
|              | ||||
|             // Check if any search token matches the attribute name or value | ||||
|             const hasMatch = searchTokens.some(token => { | ||||
|                 const normalizedToken = normalizeString(token.toLowerCase()); | ||||
|                 return attrName.includes(normalizedToken) || attrValue.includes(normalizedToken); | ||||
|             }); | ||||
|              | ||||
|             if (hasMatch) { | ||||
|                 matchingAttributes.push({ | ||||
|                     name: attr.name || "", | ||||
|                     value: attr.value || "", | ||||
|                     type: attrType | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (matchingAttributes.length === 0) { | ||||
|             return ""; | ||||
|         } | ||||
|  | ||||
|         // Limit to 4 lines maximum, similar to content snippet logic | ||||
|         const lines: string[] = []; | ||||
|         for (const attr of matchingAttributes.slice(0, 4)) { | ||||
|             let line = ""; | ||||
|             if (attr.type === "label") { | ||||
|                 line = attr.value ? `#${attr.name}="${attr.value}"` : `#${attr.name}`; | ||||
|             } else if (attr.type === "relation") { | ||||
|                 // For relations, show the target note title if possible | ||||
|                 const targetNote = attr.value ? becca.notes[attr.value] : null; | ||||
|                 const targetTitle = targetNote ? targetNote.title : attr.value; | ||||
|                 line = `~${attr.name}="${targetTitle}"`; | ||||
|             } | ||||
|              | ||||
|             if (line) { | ||||
|                 lines.push(line); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         let snippet = lines.join('\n'); | ||||
|          | ||||
|         // Apply length limit while preserving line structure | ||||
|         if (snippet.length > maxLength) { | ||||
|             // Try to truncate at word boundaries but keep lines intact | ||||
|             const truncated = snippet.substring(0, maxLength); | ||||
|             const lastNewline = truncated.lastIndexOf('\n'); | ||||
|              | ||||
|             if (lastNewline > maxLength / 2) { | ||||
|                 // If we can keep most content by truncating to last complete line | ||||
|                 snippet = truncated.substring(0, lastNewline); | ||||
|             } else { | ||||
|                 // Otherwise just truncate and add ellipsis | ||||
|                 const lastSpace = truncated.lastIndexOf(' '); | ||||
|                 snippet = truncated.substring(0, lastSpace > maxLength / 2 ? lastSpace : maxLength - 3); | ||||
|                 snippet = snippet + "..."; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return snippet; | ||||
|     } catch (e) { | ||||
|         log.error(`Error extracting attribute snippet for note ${noteId}: ${e}`); | ||||
|         return ""; | ||||
|     } | ||||
| } | ||||
|  | ||||
| function searchNotesForAutocomplete(query: string, fastSearch: boolean = true) { | ||||
|     const searchContext = new SearchContext({ | ||||
|         fastSearch: fastSearch, | ||||
| @@ -533,9 +637,10 @@ function searchNotesForAutocomplete(query: string, fastSearch: boolean = true) { | ||||
|  | ||||
|     const trimmed = allSearchResults.slice(0, 200); | ||||
|  | ||||
|     // Extract content snippets | ||||
|     // Extract content and attribute snippets | ||||
|     for (const result of trimmed) { | ||||
|         result.contentSnippet = extractContentSnippet(result.noteId, searchContext.highlightedTokens); | ||||
|         result.attributeSnippet = extractAttributeSnippet(result.noteId, searchContext.highlightedTokens); | ||||
|     } | ||||
|  | ||||
|     highlightSearchResults(trimmed, searchContext.highlightedTokens, searchContext.ignoreInternalAttributes); | ||||
| @@ -549,6 +654,8 @@ function searchNotesForAutocomplete(query: string, fastSearch: boolean = true) { | ||||
|             highlightedNotePathTitle: result.highlightedNotePathTitle, | ||||
|             contentSnippet: result.contentSnippet, | ||||
|             highlightedContentSnippet: result.highlightedContentSnippet, | ||||
|             attributeSnippet: result.attributeSnippet, | ||||
|             highlightedAttributeSnippet: result.highlightedAttributeSnippet, | ||||
|             icon: icon ?? "bx bx-note" | ||||
|         }; | ||||
|     }); | ||||
| @@ -574,7 +681,18 @@ function highlightSearchResults(searchResults: SearchResult[], highlightedTokens | ||||
|          | ||||
|         // Initialize highlighted content snippet | ||||
|         if (result.contentSnippet) { | ||||
|             result.highlightedContentSnippet = escapeHtml(result.contentSnippet).replace(/[<{}]/g, ""); | ||||
|             // Escape HTML but preserve newlines for later conversion to <br> | ||||
|             result.highlightedContentSnippet = escapeHtml(result.contentSnippet); | ||||
|             // Remove any stray < { } that might interfere with our highlighting markers | ||||
|             result.highlightedContentSnippet = result.highlightedContentSnippet.replace(/[<{}]/g, ""); | ||||
|         } | ||||
|          | ||||
|         // Initialize highlighted attribute snippet | ||||
|         if (result.attributeSnippet) { | ||||
|             // Escape HTML but preserve newlines for later conversion to <br> | ||||
|             result.highlightedAttributeSnippet = escapeHtml(result.attributeSnippet); | ||||
|             // Remove any stray < { } that might interfere with our highlighting markers | ||||
|             result.highlightedAttributeSnippet = result.highlightedAttributeSnippet.replace(/[<{}]/g, ""); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -612,6 +730,16 @@ function highlightSearchResults(searchResults: SearchResult[], highlightedTokens | ||||
|                     contentRegex.lastIndex += 2; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Highlight in attribute snippet | ||||
|             if (result.highlightedAttributeSnippet) { | ||||
|                 const attributeRegex = new RegExp(escapeRegExp(token), "gi"); | ||||
|                 while ((match = attributeRegex.exec(normalizeString(result.highlightedAttributeSnippet))) !== null) { | ||||
|                     result.highlightedAttributeSnippet = wrapText(result.highlightedAttributeSnippet, match.index, token.length, "{", "}"); | ||||
|                     // 2 characters are added, so we need to adjust the index | ||||
|                     attributeRegex.lastIndex += 2; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -621,7 +749,17 @@ function highlightSearchResults(searchResults: SearchResult[], highlightedTokens | ||||
|         } | ||||
|          | ||||
|         if (result.highlightedContentSnippet) { | ||||
|             // Replace highlighting markers with HTML tags | ||||
|             result.highlightedContentSnippet = result.highlightedContentSnippet.replace(/{/g, "<b>").replace(/}/g, "</b>"); | ||||
|             // Convert newlines to <br> tags for HTML display | ||||
|             result.highlightedContentSnippet = result.highlightedContentSnippet.replace(/\n/g, "<br>"); | ||||
|         } | ||||
|          | ||||
|         if (result.highlightedAttributeSnippet) { | ||||
|             // Replace highlighting markers with HTML tags | ||||
|             result.highlightedAttributeSnippet = result.highlightedAttributeSnippet.replace(/{/g, "<b>").replace(/}/g, "</b>"); | ||||
|             // Convert newlines to <br> tags for HTML display | ||||
|             result.highlightedAttributeSnippet = result.highlightedAttributeSnippet.replace(/\n/g, "<br>"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user