mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	Merge branch 'main' into react/collections
This commit is contained in:
		
							
								
								
									
										5
									
								
								.github/workflows/deploy-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/deploy-docs.yml
									
									
									
									
										vendored
									
									
								
							| @@ -103,6 +103,11 @@ jobs: | ||||
|             fi | ||||
|           } | ||||
|  | ||||
|       - name: Fix HTML Links | ||||
|         run: | | ||||
|           # Remove .md extensions from links in generated HTML | ||||
|           pnpm tsx ./scripts/fix-html-links.ts site | ||||
|  | ||||
|       - name: Validate Built Site | ||||
|         run: | | ||||
|           # Basic validation that important files exist | ||||
|   | ||||
| @@ -67,7 +67,7 @@ | ||||
|     "@types/xml2js": "0.4.14", | ||||
|     "archiver": "7.0.1", | ||||
|     "async-mutex": "0.5.0", | ||||
|     "axios": "1.11.0", | ||||
|     "axios": "1.12.0", | ||||
|     "bindings": "1.5.0", | ||||
|     "bootstrap": "5.3.8", | ||||
|     "chardet": "2.1.0", | ||||
|   | ||||
| @@ -424,5 +424,9 @@ | ||||
|     "board_status_todo": "待办", | ||||
|     "board_status_progress": "进行中", | ||||
|     "board_status_done": "已完成" | ||||
|   }, | ||||
|   "sql_init": { | ||||
|     "db_not_initialized_desktop": "数据库尚未初始化,请依照屏幕提示操作。", | ||||
|     "db_not_initialized_server": "数据库尚未初始化,请访问设置页面 http://[your-server-host]:{{port}} 查看如何初始化 Trilium。" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,48 @@ | ||||
|     "scroll-to-active-note": "Scroll naar actieve notitie in de notitieboom", | ||||
|     "quick-search": "Snelle zoekbalk activeren", | ||||
|     "search-in-subtree": "Zoek naar notities in de subboom van de actieve notitie", | ||||
|     "expand-subtree": "Subboom van huidige notitie uitbreiden" | ||||
|     "expand-subtree": "Subboom van huidige notitie uitbreiden", | ||||
|     "collapse-tree": "Vouwt de volledige notitieboom samen", | ||||
|     "collapse-subtree": "Vouwt de subboom van de huidige notitie samen", | ||||
|     "sort-child-notes": "Kindnotities sorteren", | ||||
|     "creating-and-moving-notes": "Notities maken en verplaatsen", | ||||
|     "create-note-after": "Maak notitie na actieve notitie", | ||||
|     "create-note-into": "Maak notitie als onderliggende notitie van actieve notitie", | ||||
|     "create-note-into-inbox": "Maak een notitie in de inbox (indien gedefinieerd) of dagnotitie", | ||||
|     "delete-note": "Notitie verwijderen", | ||||
|     "move-note-up": "Notitie naar boven verplaatsen", | ||||
|     "move-note-down": "Notitie naar beneden verplaatsen", | ||||
|     "move-note-up-in-hierarchy": "Notitie hoger in hiërarchie plaatsen", | ||||
|     "move-note-down-in-hierarchy": "Verplaats nota in hiërarchie", | ||||
|     "edit-note-title": "Spring van de boom naar de notitie en de titel", | ||||
|     "edit-branch-prefix": "Dialoogvenster \"Bewerk takvoorvoegsel\" weergeven", | ||||
|     "clone-notes-to": "Geselecteerde notities klonen", | ||||
|     "move-notes-to": "Geselecteerde notities verplaatsen", | ||||
|     "note-clipboard": "Notitieblok", | ||||
|     "copy-notes-to-clipboard": "Kopieer geselecteerde notities naar het klembord", | ||||
|     "paste-notes-from-clipboard": "Plak notities uit het klembord in de actieve notitie", | ||||
|     "cut-notes-to-clipboard": "Geselecteerde notities naar het klembord knippen", | ||||
|     "select-all-notes-in-parent": "Selecteer alle notities van het huidige notitieniveau", | ||||
|     "add-note-above-to-the-selection": "Voeg bovenstaande opmerking toe aan de selectie", | ||||
|     "add-note-below-to-selection": "Voeg onderstaande opmerking toe aan de selectie", | ||||
|     "duplicate-subtree": "Duplicaat subboom", | ||||
|     "tabs-and-windows": "Tabbladen en vensters", | ||||
|     "open-new-tab": "Nieuw tabblad openen", | ||||
|     "close-active-tab": "Sluit actief tabblad", | ||||
|     "reopen-last-tab": "Het laatst gesloten tabblad opnieuw openen", | ||||
|     "activate-next-tab": "Tabblad rechts activeren", | ||||
|     "activate-previous-tab": "Tabblad links activeren", | ||||
|     "open-new-window": "Nieuw leeg venster openen", | ||||
|     "toggle-tray": "De toepassing weergeven/verbergen in het systeemvak", | ||||
|     "first-tab": "Activeer het eerste tabblad in de lijst", | ||||
|     "second-tab": "Activeer het tweede tabblad in de lijst", | ||||
|     "third-tab": "Activeer het derde tabblad in de lijst", | ||||
|     "fourth-tab": "Activeer het vierde tabblad in de lijst", | ||||
|     "fifth-tab": "Activeer het vijfde tabblad in de lijst", | ||||
|     "sixth-tab": "Activeer het zesde tabblad in de lijst", | ||||
|     "seventh-tab": "Activeer het zevende tabblad in de lijst", | ||||
|     "eight-tab": "Activeer het achtste tabblad in de lijst", | ||||
|     "ninth-tab": "Activeer het negende tabblad in de lijst", | ||||
|     "last-tab": "Activeer het laatste tabblad in de lijst" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -424,5 +424,9 @@ | ||||
|     "board_status_todo": "待辦", | ||||
|     "board_status_progress": "進行中", | ||||
|     "board_status_done": "已完成" | ||||
|   }, | ||||
|   "sql_init": { | ||||
|     "db_not_initialized_desktop": "資料庫尚未初始化,請依螢幕指示操作。", | ||||
|     "db_not_initialized_server": "資料庫尚未初始化,請前往設定頁面 http://[your-server-host]:{{port}} 查看如何初始化 Trilium。" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -163,6 +163,7 @@ function setExpandedForSubtree(req: Request) { | ||||
|             SELECT branches.branchId, branches.noteId FROM branches | ||||
|                 JOIN tree ON branches.parentNoteId = tree.noteId | ||||
|             WHERE branches.isDeleted = 0 | ||||
|                 AND branches.isExpanded = 1 | ||||
|         ) | ||||
|         SELECT branchId FROM tree`, | ||||
|         [branchId] | ||||
|   | ||||
| @@ -26,20 +26,8 @@ function checkAuth(req: Request, res: Response, next: NextFunction) { | ||||
|     if (isElectron || noAuthentication) { | ||||
|         next(); | ||||
|         return; | ||||
|     } else if (currentTotpStatus !== lastAuthState.totpEnabled || currentSsoStatus !== lastAuthState.ssoEnabled) { | ||||
|         req.session.destroy((err) => { | ||||
|             if (err) console.error('Error destroying session:', err); | ||||
|             res.redirect('login'); | ||||
|         }); | ||||
|         return; | ||||
|     } else if (currentSsoStatus) { | ||||
|         if (req.oidc?.isAuthenticated() && req.session.loggedIn) { | ||||
|             next(); | ||||
|             return; | ||||
|         } | ||||
|         res.redirect('login'); | ||||
|         return; | ||||
|     } else if (!req.session.loggedIn && !noAuthentication) { | ||||
|         // check redirectBareDomain option first | ||||
|  | ||||
|         // cannot use options.getOptionBool currently => it will throw an error on new installations | ||||
|         // TriliumNextTODO: look into potentially creating an getOptionBoolOrNull instead | ||||
| @@ -54,6 +42,19 @@ function checkAuth(req: Request, res: Response, next: NextFunction) { | ||||
|             } | ||||
|         } | ||||
|         res.redirect(hasRedirectBareDomain ? "share" : "login"); | ||||
|     } else if (currentTotpStatus !== lastAuthState.totpEnabled || currentSsoStatus !== lastAuthState.ssoEnabled) { | ||||
|         req.session.destroy((err) => { | ||||
|             if (err) console.error('Error destroying session:', err); | ||||
|             res.redirect('login'); | ||||
|         }); | ||||
|         return; | ||||
|     } else if (currentSsoStatus) { | ||||
|         if (req.oidc?.isAuthenticated() && req.session.loggedIn) { | ||||
|             next(); | ||||
|             return; | ||||
|         } | ||||
|         res.redirect('login'); | ||||
|         return; | ||||
|     } else { | ||||
|         next(); | ||||
|     } | ||||
|   | ||||
							
								
								
									
										14
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @@ -567,8 +567,8 @@ importers: | ||||
|         specifier: 0.5.0 | ||||
|         version: 0.5.0 | ||||
|       axios: | ||||
|         specifier: 1.11.0 | ||||
|         version: 1.11.0(debug@4.4.1) | ||||
|         specifier: 1.12.0 | ||||
|         version: 1.12.0(debug@4.4.1) | ||||
|       bindings: | ||||
|         specifier: 1.5.0 | ||||
|         version: 1.5.0 | ||||
| @@ -5842,8 +5842,8 @@ packages: | ||||
|     resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} | ||||
|     engines: {node: '>=6.0.0'} | ||||
|  | ||||
|   axios@1.11.0: | ||||
|     resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} | ||||
|   axios@1.12.0: | ||||
|     resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} | ||||
|  | ||||
|   axobject-query@4.1.0: | ||||
|     resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} | ||||
| @@ -15113,8 +15113,6 @@ snapshots: | ||||
|       '@ckeditor/ckeditor5-table': 46.1.0 | ||||
|       '@ckeditor/ckeditor5-utils': 46.1.0 | ||||
|       ckeditor5: 46.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
|   '@ckeditor/ckeditor5-emoji@46.1.0': | ||||
|     dependencies: | ||||
| @@ -20474,7 +20472,7 @@ snapshots: | ||||
|  | ||||
|   await-to-js@3.0.0: {} | ||||
|  | ||||
|   axios@1.11.0(debug@4.4.1): | ||||
|   axios@1.12.0(debug@4.4.1): | ||||
|     dependencies: | ||||
|       follow-redirects: 1.15.9(debug@4.4.1) | ||||
|       form-data: 4.0.4 | ||||
| @@ -20967,6 +20965,8 @@ snapshots: | ||||
|   ckeditor5-collaboration@46.1.0: | ||||
|     dependencies: | ||||
|       '@ckeditor/ckeditor5-collaboration-core': 46.1.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
|   ckeditor5-premium-features@46.1.0(bufferutil@4.0.9)(ckeditor5@46.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5): | ||||
|     dependencies: | ||||
|   | ||||
							
								
								
									
										79
									
								
								scripts/fix-html-links.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								scripts/fix-html-links.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| #!/usr/bin/env node | ||||
| /** | ||||
|  * Post-process HTML files generated by MkDocs to remove .md extensions from links | ||||
|  */ | ||||
|  | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
|  | ||||
| /** | ||||
|  * Process HTML content to remove .md extensions from links | ||||
|  */ | ||||
| function fixHtmlLinks(content: string): string { | ||||
|     // Replace .md extensions in href attributes | ||||
|     // Handle both quoted and unquoted href attributes | ||||
|  | ||||
|     // First, handle quoted hrefs: href="...something.md" or href="...something.md#anchor" | ||||
|     content = content.replace(/href="([^"]*?)\.md(#[^"]*)?"/g, 'href="$1$2"'); | ||||
|  | ||||
|     // Then, handle unquoted hrefs: href=...something.md or href=...something.md#anchor | ||||
|     // This matches href= followed by a non-whitespace URL ending in .md | ||||
|     content = content.replace(/href=([^\s>]*?)\.md(#[^\s>]*)?(?=[\s>])/g, 'href=$1$2'); | ||||
|  | ||||
|     return content; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Recursively process all HTML files in a directory | ||||
|  */ | ||||
| function processDirectory(dir: string): number { | ||||
|     let filesProcessed = 0; | ||||
|  | ||||
|     const entries = fs.readdirSync(dir, { withFileTypes: true }); | ||||
|  | ||||
|     for (const entry of entries) { | ||||
|         const fullPath = path.join(dir, entry.name); | ||||
|  | ||||
|         if (entry.isDirectory()) { | ||||
|             // Recursively process subdirectories | ||||
|             filesProcessed += processDirectory(fullPath); | ||||
|         } else if (entry.isFile() && entry.name.endsWith('.html')) { | ||||
|             // Process HTML files | ||||
|             const content = fs.readFileSync(fullPath, 'utf-8'); | ||||
|             const fixedContent = fixHtmlLinks(content); | ||||
|  | ||||
|             if (content !== fixedContent) { | ||||
|                 fs.writeFileSync(fullPath, fixedContent, 'utf-8'); | ||||
|                 console.log(`Fixed: ${path.relative(process.cwd(), fullPath)}`); | ||||
|                 filesProcessed++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return filesProcessed; | ||||
| } | ||||
|  | ||||
| function main(): number { | ||||
|     const args = process.argv.slice(2); | ||||
|     const siteDir = args[0] || 'site'; | ||||
|  | ||||
|     const fullPath = path.resolve(siteDir); | ||||
|  | ||||
|     if (!fs.existsSync(fullPath)) { | ||||
|         console.error(`Error: Directory '${fullPath}' does not exist`); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     console.log(`Processing HTML files in: ${fullPath}`); | ||||
|     console.log('-'.repeat(50)); | ||||
|  | ||||
|     const filesProcessed = processDirectory(fullPath); | ||||
|  | ||||
|     console.log('-'.repeat(50)); | ||||
|     console.log(`Processed ${filesProcessed} HTML files`); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| // Run the main function | ||||
| process.exit(main()); | ||||
		Reference in New Issue
	
	Block a user