mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	Compare commits
	
		
			10 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 84feaabc52 | ||
|  | a6036859b8 | ||
|  | 93dcce2217 | ||
|  | 686af0c6a1 | ||
|  | d07f02b95f | ||
|  | ad74952194 | ||
|  | 10f3df3ed4 | ||
|  | 18e2e6779b | ||
|  | ed129c307b | ||
|  | 8742e4bfe9 | 
							
								
								
									
										5
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,12 +1,11 @@ | ||||
| { | ||||
|   "name": "trilium", | ||||
|   "version": "0.62.1-beta", | ||||
|   "version": "0.62.2", | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "trilium", | ||||
|       "version": "0.62.1-beta", | ||||
|       "version": "0.62.2", | ||||
|       "hasInstallScript": true, | ||||
|       "license": "AGPL-3.0-only", | ||||
|       "dependencies": { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   "name": "trilium", | ||||
|   "productName": "Trilium Notes", | ||||
|   "description": "Trilium Notes", | ||||
|   "version": "0.62.2", | ||||
|   "version": "0.62.3", | ||||
|   "license": "AGPL-3.0-only", | ||||
|   "main": "electron.js", | ||||
|   "bin": { | ||||
|   | ||||
| @@ -117,14 +117,14 @@ async function renderCode(note, $renderedContent) { | ||||
| } | ||||
|  | ||||
| function renderImage(entity, $renderedContent, options = {}) { | ||||
|     const sanitizedTitle = entity.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|     const encodedTitle = encodeURIComponent(entity.title); | ||||
|  | ||||
|     let url; | ||||
|  | ||||
|     if (entity instanceof FNote) { | ||||
|         url = `api/images/${entity.noteId}/${sanitizedTitle}?${Math.random()}`; | ||||
|         url = `api/images/${entity.noteId}/${encodedTitle}?${Math.random()}`; | ||||
|     } else if (entity instanceof FAttachment) { | ||||
|         url = `api/attachments/${entity.attachmentId}/image/${sanitizedTitle}?${entity.utcDateModified}">`; | ||||
|         url = `api/attachments/${entity.attachmentId}/image/${encodedTitle}?${entity.utcDateModified}">`; | ||||
|     } | ||||
|  | ||||
|     $renderedContent // styles needed for the zoom to work well | ||||
|   | ||||
| @@ -42,6 +42,7 @@ async function createLink(notePath, options = {}) { | ||||
|     const showNotePath = options.showNotePath === undefined ? false : options.showNotePath; | ||||
|     const showNoteIcon = options.showNoteIcon === undefined ? false : options.showNoteIcon; | ||||
|     const referenceLink = options.referenceLink === undefined ? false : options.referenceLink; | ||||
|     const autoConvertToImage = options.autoConvertToImage === undefined ? false : options.autoConvertToImage; | ||||
|  | ||||
|     const { noteId, parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(notePath); | ||||
|     const viewScope = options.viewScope || {}; | ||||
| @@ -58,6 +59,16 @@ async function createLink(notePath, options = {}) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const note = await froca.getNote(noteId); | ||||
|  | ||||
|     if (autoConvertToImage && ['image', 'canvas', 'mermaid'].includes(note.type) && viewMode === 'default') { | ||||
|         const encodedTitle = encodeURIComponent(linkTitle); | ||||
|  | ||||
|         return $("<img>") | ||||
|             .attr("src", `api/images/${noteId}/${encodedTitle}?${Math.random()}`) | ||||
|             .attr("alt", linkTitle); | ||||
|     } | ||||
|  | ||||
|     const $container = $("<span>"); | ||||
|  | ||||
|     if (showNoteIcon) { | ||||
|   | ||||
| @@ -97,7 +97,7 @@ export default class IncludeNoteDialog extends BasicWidget { | ||||
|  | ||||
|         const boxSize = $("input[name='include-note-box-size']:checked").val(); | ||||
|  | ||||
|         if (note.type === 'image') { | ||||
|         if (['image', 'canvas', 'mermaid'].includes(note.type)) { | ||||
|             // there's no benefit to use insert note functionlity for images, | ||||
|             // so we'll just add an IMG tag | ||||
|             this.textTypeWidget.addImage(noteId); | ||||
|   | ||||
| @@ -274,16 +274,16 @@ export default class RevisionsDialog extends BasicWidget { | ||||
|  | ||||
|             this.$content.html($table); | ||||
|         } else if (revisionItem.type === 'canvas') { | ||||
|             const sanitizedTitle = revisionItem.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|             const encodedTitle = encodeURIComponent(revisionItem.title); | ||||
|  | ||||
|             this.$content.html($("<img>") | ||||
|                 .attr("src", `api/revisions/${revisionItem.revisionId}/image/${sanitizedTitle}?${Math.random()}`) | ||||
|                 .attr("src", `api/revisions/${revisionItem.revisionId}/image/${encodedTitle}?${Math.random()}`) | ||||
|                 .css("max-width", "100%")); | ||||
|         } else if (revisionItem.type === 'mermaid') { | ||||
|             const sanitizedTitle = revisionItem.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|             const encodedTitle = encodeURIComponent(revisionItem.title); | ||||
|  | ||||
|             this.$content.html($("<img>") | ||||
|                 .attr("src", `api/revisions/${revisionItem.revisionId}/image/${sanitizedTitle}?${Math.random()}`) | ||||
|                 .attr("src", `api/revisions/${revisionItem.revisionId}/image/${encodedTitle}?${Math.random()}`) | ||||
|                 .css("max-width", "100%")); | ||||
|  | ||||
|             this.$content.append($("<pre>").text(fullRevision.content)); | ||||
|   | ||||
| @@ -56,7 +56,6 @@ export default class HighlightsListWidget extends RightPanelWidget { | ||||
|                 .class("icon-action"), | ||||
|             new OnClickButtonWidget() | ||||
|                 .icon("bx-x") | ||||
|                 .title("Close Highlights List") | ||||
|                 .titlePlacement("left") | ||||
|                 .onClick(widget => widget.triggerCommand("closeHlt")) | ||||
|                 .class("icon-action") | ||||
|   | ||||
| @@ -258,10 +258,11 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | ||||
|                         .append($("<h2>").text(this.note.title)) | ||||
|                         .append($promotedAttributes) | ||||
|                         .prop('outerHTML'), | ||||
|  | ||||
|             footer: ` | ||||
| <script src="${assetPath}/libraries/katex/katex.min.js"></script> | ||||
| <script src="${assetPath}/libraries/katex/mhchem.min.js"></script> | ||||
| <script src="${assetPath}/libraries/katex/auto-render.min.js"></script> | ||||
| <script src="${assetPath}/node_modules/katex/dist/katex.min.js"></script> | ||||
| <script src="${assetPath}/node_modules/katex/dist/contrib/mhchem.min.js"></script> | ||||
| <script src="${assetPath}/node_modules/katex/dist/contrib/auto-render.min.js"></script> | ||||
| <script> | ||||
|     document.body.className += ' ck-content printed-content'; | ||||
|      | ||||
| @@ -273,7 +274,7 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | ||||
|                 `${assetPath}/libraries/codemirror/codemirror.css`, | ||||
|                 `${assetPath}/libraries/ckeditor/ckeditor-content.css`, | ||||
|                 `${assetPath}/libraries/bootstrap/css/bootstrap.min.css`, | ||||
|                 `${assetPath}/libraries/katex/katex.min.css`, | ||||
|                 `${assetPath}/node_modules/katex/dist/katex.min.css`, | ||||
|                 `${assetPath}/stylesheets/print.css`, | ||||
|                 `${assetPath}/stylesheets/relation_map.css`, | ||||
|                 `${assetPath}/stylesheets/ckeditor-theme.css` | ||||
|   | ||||
| @@ -402,11 +402,11 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { | ||||
|                     })); | ||||
|  | ||||
|                     if (notes.length === 1) { | ||||
|                         linkService.createLink(notes[0].noteId, {referenceLink: true}) | ||||
|                         linkService.createLink(notes[0].noteId, {referenceLink: true, autoConvertToImage: true}) | ||||
|                             .then($link => data.dataTransfer.setData("text/html", $link[0].outerHTML)); | ||||
|                     } | ||||
|                     else { | ||||
|                         Promise.all(notes.map(note => linkService.createLink(note.noteId, {referenceLink: true}))).then(links => { | ||||
|                         Promise.all(notes.map(note => linkService.createLink(note.noteId, {referenceLink: true, autoConvertToImage: true}))).then(links => { | ||||
|                             const $list = $("<ul>").append(...links.map($link => $("<li>").append($link))); | ||||
|  | ||||
|                             data.dataTransfer.setData("text/html", $list[0].outerHTML); | ||||
|   | ||||
| @@ -8,8 +8,14 @@ import options from "../../services/options.js"; | ||||
| import utils from "../../services/utils.js"; | ||||
|  | ||||
| const TPL = ` | ||||
| <div> | ||||
| <div class="promoted-attributes-widget"> | ||||
|     <style> | ||||
|     body.mobile .promoted-attributes-widget { | ||||
|         /* https://github.com/zadam/trilium/issues/4468 */ | ||||
|         flex-shrink: 0.4; | ||||
|         overflow: auto; | ||||
|     } | ||||
|      | ||||
|     .promoted-attributes-container { | ||||
|         margin: auto; | ||||
|         display: flex; | ||||
|   | ||||
| @@ -68,7 +68,6 @@ export default class TocWidget extends RightPanelWidget { | ||||
|                 .class("icon-action"), | ||||
|             new OnClickButtonWidget() | ||||
|                 .icon("bx-x") | ||||
|                 .title("Close Table of Contents") | ||||
|                 .titlePlacement("left") | ||||
|                 .onClick(widget => widget.triggerCommand("closeToc")) | ||||
|                 .class("icon-action") | ||||
|   | ||||
| @@ -365,12 +365,10 @@ export default class EditableTextTypeWidget extends AbstractTextTypeWidget { | ||||
|         const note = await froca.getNote(noteId); | ||||
|  | ||||
|         this.watchdog.editor.model.change( writer => { | ||||
|             const sanitizedTitle = note.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|             const src = `api/images/${note.noteId}/${sanitizedTitle}`; | ||||
|             const encodedTitle = encodeURIComponent(note.title); | ||||
|             const src = `api/images/${note.noteId}/${encodedTitle}`; | ||||
|  | ||||
|             const imageElement = writer.createElement( 'image',  { 'src': src } ); | ||||
|  | ||||
|             this.watchdog.editor.model.insertContent(imageElement, this.watchdog.editor.model.document.selection); | ||||
|             this.watchdog.editor.execute( 'insertImage', { source: src } ); | ||||
|         } ); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -153,8 +153,9 @@ function processContent(images, note, content) { | ||||
|             const buffer = Buffer.from(dataUrl.split(",")[1], 'base64'); | ||||
|  | ||||
|             const attachment = imageService.saveImageToAttachment(note.noteId, buffer, filename, true); | ||||
|             const sanitizedTitle = attachment.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|             const url = `api/attachments/${attachment.attachmentId}/image/${sanitizedTitle}`; | ||||
|  | ||||
|             const encodedTitle = encodeURIComponent(attachment.title); | ||||
|             const url = `api/attachments/${attachment.attachmentId}/image/${encodedTitle}`; | ||||
|  | ||||
|             log.info(`Replacing '${imageId}' with '${url}' in note '${note.noteId}'`); | ||||
|  | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| module.exports = { buildDate:"2023-11-21T20:49:24+01:00", buildRevision: "e2b1421bf3d764ffe444a103c118e67d8c563673" }; | ||||
| module.exports = { buildDate:"2023-11-27T23:37:24+01:00", buildRevision: "a6036859b8bd24be31dfcf6318e57cf696fa25bc" }; | ||||
|   | ||||
| @@ -303,8 +303,8 @@ function importEnex(taskContext, file, parentNote) { | ||||
|  | ||||
|                     const attachment = imageService.saveImageToAttachment(noteEntity.noteId, resource.content, originalName, taskContext.data.shrinkImages); | ||||
|  | ||||
|                     const sanitizedTitle = attachment.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|                     const url = `api/attachments/${attachment.attachmentId}/image/${sanitizedTitle}`; | ||||
|                     const encodedTitle = encodeURIComponent(attachment.title); | ||||
|                     const url = `api/attachments/${attachment.attachmentId}/image/${encodedTitle}`; | ||||
|                     const imageLink = `<img src="${url}">`; | ||||
|  | ||||
|                     content = content.replace(mediaRegex, imageLink); | ||||
|   | ||||
| @@ -529,9 +529,9 @@ function downloadImages(noteId, content) { | ||||
|             const imageService = require('../services/image'); | ||||
|             const attachment = imageService.saveImageToAttachment(noteId, imageBuffer, "inline image", true, true); | ||||
|  | ||||
|             const sanitizedTitle = attachment.title.replace(/[^a-z0-9-.]/gi, ""); | ||||
|             const encodedTitle = encodeURIComponent(attachment.title); | ||||
|  | ||||
|             content = `${content.substr(0, imageMatch.index)}<img src="api/attachments/${attachment.attachmentId}/image/${sanitizedTitle}"${content.substr(imageMatch.index + imageMatch[0].length)}`; | ||||
|             content = `${content.substr(0, imageMatch.index)}<img src="api/attachments/${attachment.attachmentId}/image/${encodedTitle}"${content.substr(imageMatch.index + imageMatch[0].length)}`; | ||||
|         } | ||||
|         else if (!url.includes('api/images/') && !/api\/attachments\/.+\/image\/?.*/.test(url) | ||||
|             // this is an exception for the web clipper's "imageId" | ||||
| @@ -889,6 +889,10 @@ function scanForLinks(note, content) { | ||||
|  * Things which have to be executed after updating content, but asynchronously (separate transaction) | ||||
|  */ | ||||
| async function asyncPostProcessContent(note, content) { | ||||
|     if (note.hasStringContent() && !utils.isString(content)) { | ||||
|         content = content.toString(); | ||||
|     } | ||||
|  | ||||
|     scanForLinks(note, content); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -63,6 +63,8 @@ function isElectron() { | ||||
| } | ||||
|  | ||||
| function hash(text) { | ||||
|     text = text.normalize(); | ||||
|  | ||||
|     return crypto.createHash('sha1').update(text).digest('base64'); | ||||
| } | ||||
|  | ||||
| @@ -303,6 +305,10 @@ function toMap(list, key) { | ||||
|     return map; | ||||
| } | ||||
|  | ||||
| function isString(x) { | ||||
|     return Object.prototype.toString.call(x) === "[object String]"; | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|     randomSecureToken, | ||||
|     randomString, | ||||
| @@ -335,4 +341,5 @@ module.exports = { | ||||
|     normalize, | ||||
|     hashedBlobId, | ||||
|     toMap, | ||||
|     isString | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user