mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/stable'
# Conflicts: # db/demo.zip # src/services/notes.js # src/services/request.js
This commit is contained in:
		| @@ -1,10 +1,18 @@ | |||||||
|  | /* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */ | ||||||
|  |  | ||||||
|  | .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */ | ||||||
|  |     display: none; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * CKEditor 5 (v19.1.1) content styles. |  * CKEditor 5 (v21.0.0) content styles. | ||||||
|  * Generated on Fri, 19 Jun 2020 01:26:44 GMT. |  * Generated on Wed, 29 Jul 2020 12:14:43 GMT. | ||||||
|  * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/content-styles.html |  * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/content-styles.html | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| :root { | :root { | ||||||
|  |     --ck-color-mention-background: hsla(341, 100%, 30%, 0.1); | ||||||
|  |     --ck-color-mention-text: hsl(341, 100%, 30%); | ||||||
|     --ck-highlight-marker-blue: hsl(201, 97%, 72%); |     --ck-highlight-marker-blue: hsl(201, 97%, 72%); | ||||||
|     --ck-highlight-marker-green: hsl(120, 93%, 68%); |     --ck-highlight-marker-green: hsl(120, 93%, 68%); | ||||||
|     --ck-highlight-marker-pink: hsl(345, 96%, 73%); |     --ck-highlight-marker-pink: hsl(345, 96%, 73%); | ||||||
| @@ -15,6 +23,81 @@ | |||||||
|     --ck-todo-list-checkmark-size: 16px; |     --ck-todo-list-checkmark-size: 16px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* ckeditor5-image/theme/image.css */ | ||||||
|  | .ck-content .image { | ||||||
|  |     display: table; | ||||||
|  |     clear: both; | ||||||
|  |     text-align: center; | ||||||
|  |     margin: 1em auto; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/image.css */ | ||||||
|  | .ck-content .image img { | ||||||
|  |     display: block; | ||||||
|  |     margin: 0 auto; | ||||||
|  |     max-width: 100%; | ||||||
|  |     min-width: 50px; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imagecaption.css */ | ||||||
|  | .ck-content .image > figcaption { | ||||||
|  |     display: table-caption; | ||||||
|  |     caption-side: bottom; | ||||||
|  |     word-break: break-word; | ||||||
|  |     color: hsl(0, 0%, 20%); | ||||||
|  |     background-color: hsl(0, 0%, 97%); | ||||||
|  |     padding: .6em; | ||||||
|  |     font-size: .75em; | ||||||
|  |     outline-offset: -1px; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imageresize.css */ | ||||||
|  | .ck-content .image.image_resized { | ||||||
|  |     max-width: 100%; | ||||||
|  |     display: block; | ||||||
|  |     box-sizing: border-box; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imageresize.css */ | ||||||
|  | .ck-content .image.image_resized img { | ||||||
|  |     width: 100%; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imageresize.css */ | ||||||
|  | .ck-content .image.image_resized > figcaption { | ||||||
|  |     display: block; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imagestyle.css */ | ||||||
|  | .ck-content .image-style-side { | ||||||
|  |     float: right; | ||||||
|  |     margin-left: var(--ck-image-style-spacing); | ||||||
|  |     max-width: 50%; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imagestyle.css */ | ||||||
|  | .ck-content .image-style-align-left { | ||||||
|  |     float: left; | ||||||
|  |     margin-right: var(--ck-image-style-spacing); | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imagestyle.css */ | ||||||
|  | .ck-content .image-style-align-center { | ||||||
|  |     margin-left: auto; | ||||||
|  |     margin-right: auto; | ||||||
|  | } | ||||||
|  | /* ckeditor5-image/theme/imagestyle.css */ | ||||||
|  | .ck-content .image-style-align-right { | ||||||
|  |     float: right; | ||||||
|  |     margin-left: var(--ck-image-style-spacing); | ||||||
|  | } | ||||||
|  | /* ckeditor5-block-quote/theme/blockquote.css */ | ||||||
|  | .ck-content blockquote { | ||||||
|  |     overflow: hidden; | ||||||
|  |     padding-right: 1.5em; | ||||||
|  |     padding-left: 1.5em; | ||||||
|  |     margin-left: 0; | ||||||
|  |     margin-right: 0; | ||||||
|  |     font-style: italic; | ||||||
|  |     border-left: solid 5px hsl(0, 0%, 80%); | ||||||
|  | } | ||||||
|  | /* ckeditor5-block-quote/theme/blockquote.css */ | ||||||
|  | .ck-content[dir="rtl"] blockquote { | ||||||
|  |     border-left: 0; | ||||||
|  |     border-right: solid 5px hsl(0, 0%, 80%); | ||||||
|  | } | ||||||
| /* ckeditor5-list/theme/todolist.css */ | /* ckeditor5-list/theme/todolist.css */ | ||||||
| .ck-content .todo-list { | .ck-content .todo-list { | ||||||
|     list-style: none; |     list-style: none; | ||||||
| @@ -82,12 +165,54 @@ | |||||||
| .ck-content .todo-list .todo-list__label .todo-list__label__description { | .ck-content .todo-list .todo-list__label .todo-list__label__description { | ||||||
|     vertical-align: middle; |     vertical-align: middle; | ||||||
| } | } | ||||||
| /* ckeditor5-media-embed/theme/mediaembed.css */ | /* ckeditor5-horizontal-line/theme/horizontalline.css */ | ||||||
| .ck-content .media { | .ck-content hr { | ||||||
|     clear: both; |     margin: 15px 0; | ||||||
|     margin: 1em 0; |     height: 4px; | ||||||
|     display: block; |     background: hsl(0, 0%, 87%); | ||||||
|     min-width: 15em; |     border: 0; | ||||||
|  | } | ||||||
|  | /* ckeditor5-highlight/theme/highlight.css */ | ||||||
|  | .ck-content .marker-yellow { | ||||||
|  |     background-color: var(--ck-highlight-marker-yellow); | ||||||
|  | } | ||||||
|  | /* ckeditor5-highlight/theme/highlight.css */ | ||||||
|  | .ck-content .marker-green { | ||||||
|  |     background-color: var(--ck-highlight-marker-green); | ||||||
|  | } | ||||||
|  | /* ckeditor5-highlight/theme/highlight.css */ | ||||||
|  | .ck-content .marker-pink { | ||||||
|  |     background-color: var(--ck-highlight-marker-pink); | ||||||
|  | } | ||||||
|  | /* ckeditor5-highlight/theme/highlight.css */ | ||||||
|  | .ck-content .marker-blue { | ||||||
|  |     background-color: var(--ck-highlight-marker-blue); | ||||||
|  | } | ||||||
|  | /* ckeditor5-highlight/theme/highlight.css */ | ||||||
|  | .ck-content .pen-red { | ||||||
|  |     color: var(--ck-highlight-pen-red); | ||||||
|  |     background-color: transparent; | ||||||
|  | } | ||||||
|  | /* ckeditor5-highlight/theme/highlight.css */ | ||||||
|  | .ck-content .pen-green { | ||||||
|  |     color: var(--ck-highlight-pen-green); | ||||||
|  |     background-color: transparent; | ||||||
|  | } | ||||||
|  | /* ckeditor5-font/theme/fontsize.css */ | ||||||
|  | .ck-content .text-tiny { | ||||||
|  |     font-size: .7em; | ||||||
|  | } | ||||||
|  | /* ckeditor5-font/theme/fontsize.css */ | ||||||
|  | .ck-content .text-small { | ||||||
|  |     font-size: .85em; | ||||||
|  | } | ||||||
|  | /* ckeditor5-font/theme/fontsize.css */ | ||||||
|  | .ck-content .text-big { | ||||||
|  |     font-size: 1.4em; | ||||||
|  | } | ||||||
|  | /* ckeditor5-font/theme/fontsize.css */ | ||||||
|  | .ck-content .text-huge { | ||||||
|  |     font-size: 1.8em; | ||||||
| } | } | ||||||
| /* ckeditor5-basic-styles/theme/code.css */ | /* ckeditor5-basic-styles/theme/code.css */ | ||||||
| .ck-content code { | .ck-content code { | ||||||
| @@ -95,21 +220,6 @@ | |||||||
|     padding: .15em; |     padding: .15em; | ||||||
|     border-radius: 2px; |     border-radius: 2px; | ||||||
| } | } | ||||||
| /* ckeditor5-block-quote/theme/blockquote.css */ |  | ||||||
| .ck-content blockquote { |  | ||||||
|     overflow: hidden; |  | ||||||
|     padding-right: 1.5em; |  | ||||||
|     padding-left: 1.5em; |  | ||||||
|     margin-left: 0; |  | ||||||
|     margin-right: 0; |  | ||||||
|     font-style: italic; |  | ||||||
|     border-left: solid 5px hsl(0, 0%, 80%); |  | ||||||
| } |  | ||||||
| /* ckeditor5-block-quote/theme/blockquote.css */ |  | ||||||
| .ck-content[dir="rtl"] blockquote { |  | ||||||
|     border-left: 0; |  | ||||||
|     border-right: solid 5px hsl(0, 0%, 80%); |  | ||||||
| } |  | ||||||
| /* ckeditor5-table/theme/table.css */ | /* ckeditor5-table/theme/table.css */ | ||||||
| .ck-content .table { | .ck-content .table { | ||||||
|     margin: 1em auto; |     margin: 1em auto; | ||||||
| @@ -143,98 +253,6 @@ | |||||||
| .ck-content[dir="ltr"] .table th { | .ck-content[dir="ltr"] .table th { | ||||||
|     text-align: left; |     text-align: left; | ||||||
| } | } | ||||||
| /* ckeditor5-image/theme/imageresize.css */ |  | ||||||
| .ck-content .image.image_resized { |  | ||||||
|     max-width: 100%; |  | ||||||
|     display: block; |  | ||||||
|     box-sizing: border-box; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imageresize.css */ |  | ||||||
| .ck-content .image.image_resized img { |  | ||||||
|     width: 100%; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imageresize.css */ |  | ||||||
| .ck-content .image.image_resized > figcaption { |  | ||||||
|     display: block; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/image.css */ |  | ||||||
| .ck-content .image { |  | ||||||
|     display: table; |  | ||||||
|     clear: both; |  | ||||||
|     text-align: center; |  | ||||||
|     margin: 1em auto; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/image.css */ |  | ||||||
| .ck-content .image img { |  | ||||||
|     display: block; |  | ||||||
|     margin: 0 auto; |  | ||||||
|     max-width: 100%; |  | ||||||
|     min-width: 50px; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imagecaption.css */ |  | ||||||
| .ck-content .image > figcaption { |  | ||||||
|     display: table-caption; |  | ||||||
|     caption-side: bottom; |  | ||||||
|     word-break: break-word; |  | ||||||
|     color: hsl(0, 0%, 20%); |  | ||||||
|     background-color: hsl(0, 0%, 97%); |  | ||||||
|     padding: .6em; |  | ||||||
|     font-size: .75em; |  | ||||||
|     outline-offset: -1px; |  | ||||||
| } |  | ||||||
| /* ckeditor5-highlight/theme/highlight.css */ |  | ||||||
| .ck-content .marker-yellow { |  | ||||||
|     background-color: var(--ck-highlight-marker-yellow); |  | ||||||
| } |  | ||||||
| /* ckeditor5-highlight/theme/highlight.css */ |  | ||||||
| .ck-content .marker-green { |  | ||||||
|     background-color: var(--ck-highlight-marker-green); |  | ||||||
| } |  | ||||||
| /* ckeditor5-highlight/theme/highlight.css */ |  | ||||||
| .ck-content .marker-pink { |  | ||||||
|     background-color: var(--ck-highlight-marker-pink); |  | ||||||
| } |  | ||||||
| /* ckeditor5-highlight/theme/highlight.css */ |  | ||||||
| .ck-content .marker-blue { |  | ||||||
|     background-color: var(--ck-highlight-marker-blue); |  | ||||||
| } |  | ||||||
| /* ckeditor5-highlight/theme/highlight.css */ |  | ||||||
| .ck-content .pen-red { |  | ||||||
|     color: var(--ck-highlight-pen-red); |  | ||||||
|     background-color: transparent; |  | ||||||
| } |  | ||||||
| /* ckeditor5-highlight/theme/highlight.css */ |  | ||||||
| .ck-content .pen-green { |  | ||||||
|     color: var(--ck-highlight-pen-green); |  | ||||||
|     background-color: transparent; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imagestyle.css */ |  | ||||||
| .ck-content .image-style-side, |  | ||||||
| .ck-content .image-style-align-left, |  | ||||||
| .ck-content .image-style-align-center, |  | ||||||
| .ck-content .image-style-align-right { |  | ||||||
|     max-width: 50%; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imagestyle.css */ |  | ||||||
| .ck-content .image-style-side { |  | ||||||
|     float: right; |  | ||||||
|     margin-left: var(--ck-image-style-spacing); |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imagestyle.css */ |  | ||||||
| .ck-content .image-style-align-left { |  | ||||||
|     float: left; |  | ||||||
|     margin-right: var(--ck-image-style-spacing); |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imagestyle.css */ |  | ||||||
| .ck-content .image-style-align-center { |  | ||||||
|     margin-left: auto; |  | ||||||
|     margin-right: auto; |  | ||||||
| } |  | ||||||
| /* ckeditor5-image/theme/imagestyle.css */ |  | ||||||
| .ck-content .image-style-align-right { |  | ||||||
|     float: right; |  | ||||||
|     margin-left: var(--ck-image-style-spacing); |  | ||||||
| } |  | ||||||
| /* ckeditor5-page-break/theme/pagebreak.css */ | /* ckeditor5-page-break/theme/pagebreak.css */ | ||||||
| .ck-content .page-break { | .ck-content .page-break { | ||||||
|     position: relative; |     position: relative; | ||||||
| @@ -271,21 +289,12 @@ | |||||||
|     -ms-user-select: none; |     -ms-user-select: none; | ||||||
|     user-select: none; |     user-select: none; | ||||||
| } | } | ||||||
| /* ckeditor5-font/theme/fontsize.css */ | /* ckeditor5-media-embed/theme/mediaembed.css */ | ||||||
| .ck-content .text-tiny { | .ck-content .media { | ||||||
|     font-size: .7em; |     clear: both; | ||||||
| } |     margin: 1em 0; | ||||||
| /* ckeditor5-font/theme/fontsize.css */ |     display: block; | ||||||
| .ck-content .text-small { |     min-width: 15em; | ||||||
|     font-size: .85em; |  | ||||||
| } |  | ||||||
| /* ckeditor5-font/theme/fontsize.css */ |  | ||||||
| .ck-content .text-big { |  | ||||||
|     font-size: 1.4em; |  | ||||||
| } |  | ||||||
| /* ckeditor5-font/theme/fontsize.css */ |  | ||||||
| .ck-content .text-huge { |  | ||||||
|     font-size: 1.8em; |  | ||||||
| } | } | ||||||
| /* ckeditor5-code-block/theme/codeblock.css */ | /* ckeditor5-code-block/theme/codeblock.css */ | ||||||
| .ck-content pre { | .ck-content pre { | ||||||
| @@ -307,12 +316,10 @@ | |||||||
|     padding: 0; |     padding: 0; | ||||||
|     border-radius: 0; |     border-radius: 0; | ||||||
| } | } | ||||||
| /* ckeditor5-horizontal-line/theme/horizontalline.css */ | /* ckeditor5-mention/theme/mention.css */ | ||||||
| .ck-content hr { | .ck-content .mention { | ||||||
|     margin: 15px 0; |     background: var(--ck-color-mention-background); | ||||||
|     height: 4px; |     color: var(--ck-color-mention-text); | ||||||
|     background: hsl(0, 0%, 87%); |  | ||||||
|     border: 0; |  | ||||||
| } | } | ||||||
| @media print { | @media print { | ||||||
|     /* ckeditor5-page-break/theme/pagebreak.css */ |     /* ckeditor5-page-break/theme/pagebreak.css */ | ||||||
| @@ -324,9 +331,3 @@ | |||||||
|         display: none; |         display: none; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| /* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */ |  | ||||||
|  |  | ||||||
| .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */ |  | ||||||
|     display: none; |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								libraries/ckeditor/ckeditor.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/ckeditor/ckeditor.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -81,6 +81,8 @@ function setupGlobs() { | |||||||
|  |  | ||||||
|     $("body").on("click", "a.external", function () { |     $("body").on("click", "a.external", function () { | ||||||
|         window.open($(this).attr("href"), '_blank'); |         window.open($(this).attr("href"), '_blank'); | ||||||
|  |  | ||||||
|  |         return false; | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ async function getRenderedContent(note) { | |||||||
|             .attr("src", `api/images/${note.noteId}/${note.title}`) |             .attr("src", `api/images/${note.noteId}/${note.title}`) | ||||||
|             .css("max-width", "100%"); |             .css("max-width", "100%"); | ||||||
|     } |     } | ||||||
|     else if (type === 'file') { |     else if (type === 'file' || type === 'pdf') { | ||||||
|         function getFileUrl() { |         function getFileUrl() { | ||||||
|             return utils.getUrlForDownload("api/notes/" + note.noteId + "/download"); |             return utils.getUrlForDownload("api/notes/" + note.noteId + "/download"); | ||||||
|         } |         } | ||||||
| @@ -47,19 +47,21 @@ async function getRenderedContent(note) { | |||||||
|         // open doesn't work for protected notes since it works through browser which isn't in protected session |         // open doesn't work for protected notes since it works through browser which isn't in protected session | ||||||
|         $openButton.toggle(!note.isProtected); |         $openButton.toggle(!note.isProtected); | ||||||
|  |  | ||||||
|         $rendered = $('<div>'); |         $rendered = $('<div style="display: flex; flex-direction: column; height: 100%;">'); | ||||||
|  |  | ||||||
|         if (note.mime === 'application/pdf' && utils.isElectron()) { |         if (type === 'pdf') { | ||||||
|             const $pdfPreview = $('<iframe class="pdf-preview" style="width: 100%; height: 100%; flex-grow: 100;"></iframe>'); |             const $pdfPreview = $('<iframe class="pdf-preview" style="width: 100%; flex-grow: 100;"></iframe>'); | ||||||
|             $pdfPreview.attr("src", utils.getUrlForDownload("api/notes/" + note.noteId + "/open")); |             $pdfPreview.attr("src", utils.getUrlForDownload("api/notes/" + note.noteId + "/open")); | ||||||
|  |  | ||||||
|             $rendered.append($pdfPreview); |             $rendered.append($pdfPreview); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         $rendered |         $rendered.append( | ||||||
|  |             $("<div>") | ||||||
|                 .append($downloadButton) |                 .append($downloadButton) | ||||||
|                 .append('   ') |                 .append('   ') | ||||||
|             .append($openButton); |                 .append($openButton) | ||||||
|  |         ); | ||||||
|     } |     } | ||||||
|     else if (type === 'render') { |     else if (type === 'render') { | ||||||
|         $rendered = $('<div>'); |         $rendered = $('<div>'); | ||||||
| @@ -90,6 +92,10 @@ async function getRenderedContent(note) { | |||||||
| function getRenderingType(note) { | function getRenderingType(note) { | ||||||
|     let type = note.type; |     let type = note.type; | ||||||
|  |  | ||||||
|  |     if (type === 'file' && note.mime === 'application/pdf' && utils.isElectron()) { | ||||||
|  |         type = 'pdf'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (note.isProtected) { |     if (note.isProtected) { | ||||||
|         if (protectedSessionHolder.isProtectedSessionAvailable()) { |         if (protectedSessionHolder.isProtectedSessionAvailable()) { | ||||||
|             protectedSessionHolder.touchProtectedSession(); |             protectedSessionHolder.touchProtectedSession(); | ||||||
|   | |||||||
| @@ -288,6 +288,13 @@ class TreeCache { | |||||||
|     async getNoteComplement(noteId) { |     async getNoteComplement(noteId) { | ||||||
|         if (!this.noteComplementPromises[noteId]) { |         if (!this.noteComplementPromises[noteId]) { | ||||||
|             this.noteComplementPromises[noteId] = server.get('notes/' + noteId).then(row => new NoteComplement(row)); |             this.noteComplementPromises[noteId] = server.get('notes/' + noteId).then(row => new NoteComplement(row)); | ||||||
|  |  | ||||||
|  |             // we don't want to keep large payloads forever in memory so we clean that up quite quickly | ||||||
|  |             // this cache is more meant to share the data between different components within one business transaction (e.g. loading of the note into the tab context and all the components) | ||||||
|  |             // this is also a work around for missing invalidation after change | ||||||
|  |             this.noteComplementPromises[noteId].then( | ||||||
|  |                 () => setTimeout(() => this.noteComplementPromises[noteId] = null, 1000) | ||||||
|  |             ); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return await this.noteComplementPromises[noteId]; |         return await this.noteComplementPromises[noteId]; | ||||||
|   | |||||||
| @@ -329,4 +329,9 @@ export default class NoteDetailWidget extends TabAwareWidget { | |||||||
|             saveSelection: true |             saveSelection: true | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // used by cutToNote in CKEditor build | ||||||
|  |     async saveNoteDetailNowCommand() { | ||||||
|  |         await this.spacedUpdate.updateNowIfNecessary(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -305,6 +305,10 @@ export default class NoteTreeWidget extends TabAwareWidget { | |||||||
|             keyboard: false, // we takover keyboard handling in the hotkeys plugin |             keyboard: false, // we takover keyboard handling in the hotkeys plugin | ||||||
|             extensions: utils.isMobile() ? ["dnd5", "clones"] : ["hotkeys", "dnd5", "clones"], |             extensions: utils.isMobile() ? ["dnd5", "clones"] : ["hotkeys", "dnd5", "clones"], | ||||||
|             source: treeData, |             source: treeData, | ||||||
|  |             scrollOfs: { | ||||||
|  |                 top: 200, | ||||||
|  |                 bottom: 200 | ||||||
|  |             }, | ||||||
|             scrollParent: this.$tree, |             scrollParent: this.$tree, | ||||||
|             minExpandLevel: 2, // root can't be collapsed |             minExpandLevel: 2, // root can't be collapsed | ||||||
|             click: (event, data) => { |             click: (event, data) => { | ||||||
|   | |||||||
| @@ -36,10 +36,10 @@ export default class AbstractTextTypeWidget extends TypeWidget { | |||||||
|                     .append($link) |                     .append($link) | ||||||
|             ); |             ); | ||||||
|  |  | ||||||
|             const {renderedContent} = await noteContentRenderer.getRenderedContent(note); |             const {renderedContent, type} = await noteContentRenderer.getRenderedContent(note); | ||||||
|  |  | ||||||
|             $el.append( |             $el.append( | ||||||
|                 $('<div class="include-note-content">') |                 $(`<div class="include-note-content type-${type}">`) | ||||||
|                     .append(renderedContent) |                     .append(renderedContent) | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -135,7 +135,7 @@ export default class FileTypeWidget extends TypeWidget { | |||||||
|         this.$pdfPreview.attr('src', '').empty().hide(); |         this.$pdfPreview.attr('src', '').empty().hide(); | ||||||
|  |  | ||||||
|         if (noteComplement.content) { |         if (noteComplement.content) { | ||||||
|             this.$previewContent.show(); |             this.$previewContent.show().scrollTop(0); | ||||||
|             this.$previewContent.text(noteComplement.content); |             this.$previewContent.text(noteComplement.content); | ||||||
|         } |         } | ||||||
|         else if (note.mime === 'application/pdf' && utils.isElectron()) { |         else if (note.mime === 'application/pdf' && utils.isElectron()) { | ||||||
|   | |||||||
| @@ -687,11 +687,23 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href | |||||||
|     overflow: auto; |     overflow: auto; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .include-note.box-size-small .include-note-content.type-pdf { | ||||||
|  |     height: 10em; /* PDF is rendered in iframe and must be sized absolutely */ | ||||||
|  | } | ||||||
|  |  | ||||||
| .include-note.box-size-medium .include-note-content { | .include-note.box-size-medium .include-note-content { | ||||||
|     max-height: 20em; |     max-height: 20em; | ||||||
|     overflow: auto; |     overflow: auto; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .include-note.box-size-medium .include-note-content.type-pdf { | ||||||
|  |     height: 20em; /* PDF is rendered in iframe and must be sized absolutely */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .include-note.box-size-full .include-note-content.type-pdf { | ||||||
|  |     height: 50em; /* PDF is rendered in iframe and it's not possible to put full height so at least a large height */ | ||||||
|  | } | ||||||
|  |  | ||||||
| .alert-warning { | .alert-warning { | ||||||
|     color: var(--main-text-color) !important; |     color: var(--main-text-color) !important; | ||||||
|     background-color: var(--accented-background-color) !important; |     background-color: var(--accented-background-color) !important; | ||||||
|   | |||||||
| @@ -17,8 +17,9 @@ function getNote(req) { | |||||||
|     if (note.isStringNote()) { |     if (note.isStringNote()) { | ||||||
|         note.content = note.getContent(); |         note.content = note.getContent(); | ||||||
|  |  | ||||||
|         if (note.type === 'file') { |         if (note.type === 'file' && note.content.length > 10000) { | ||||||
|             note.content = note.content.substr(0, 10000); |             note.content = note.content.substr(0, 10000) | ||||||
|  |                 + `\r\n\r\n... and ${note.content.length - 10000} more characters.`; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -279,18 +279,15 @@ const downloadImagePromises = {}; | |||||||
| function replaceUrl(content, url, imageNote) { | function replaceUrl(content, url, imageNote) { | ||||||
|     const quotedUrl = utils.quoteRegex(url); |     const quotedUrl = utils.quoteRegex(url); | ||||||
|  |  | ||||||
|     return content.replace(new RegExp(`\\s+src=[\"']${quotedUrl}[\"']`, "g"), ` src="api/images/${imageNote.noteId}/${imageNote.title}"`); |     return content.replace(new RegExp(`\\s+src=[\"']${quotedUrl}[\"']`, "ig"), ` src="api/images/${imageNote.noteId}/${imageNote.title}"`); | ||||||
| } | } | ||||||
|  |  | ||||||
| function downloadImages(noteId, content) { | function downloadImages(noteId, content) { | ||||||
|     const re = /<img[^>]*?\ssrc=['"]([^'">]+)['"]/ig; |     const imageRe = /<img[^>]*?\ssrc=['"]([^'">]+)['"]/ig; | ||||||
|     let match; |     let imageMatch; | ||||||
|  |  | ||||||
|     const origContent = content; |  | ||||||
|  |  | ||||||
|     while (match = re.exec(origContent)) { |  | ||||||
|         const url = match[1]; |  | ||||||
|  |  | ||||||
|  |     while (imageMatch = imageRe.exec(content)) { | ||||||
|  |         const url = imageMatch[1]; | ||||||
|         const inlineImageMatch = /^data:image\/[a-z]+;base64,/.exec(url); |         const inlineImageMatch = /^data:image\/[a-z]+;base64,/.exec(url); | ||||||
|  |  | ||||||
|         if (inlineImageMatch) { |         if (inlineImageMatch) { | ||||||
| @@ -300,9 +297,9 @@ function downloadImages(noteId, content) { | |||||||
|             const imageService = require('../services/image'); |             const imageService = require('../services/image'); | ||||||
|             const {note} = imageService.saveImage(noteId, imageBuffer, "inline image", true); |             const {note} = imageService.saveImage(noteId, imageBuffer, "inline image", true); | ||||||
|  |  | ||||||
|             content = content.substr(0, match.index) |             content = content.substr(0, imageMatch.index) | ||||||
|                 + `<img src="api/images/${note.noteId}/${note.title}"` |                 + `<img src="api/images/${note.noteId}/${note.title}"` | ||||||
|                 + content.substr(match.index + match[0].length); |                 + content.substr(imageMatch.index + imageMatch[0].length); | ||||||
|         } |         } | ||||||
|         else if (!url.includes('api/images/') |         else if (!url.includes('api/images/') | ||||||
|             // this is an exception for the web clipper's "imageId" |             // this is an exception for the web clipper's "imageId" | ||||||
| @@ -316,7 +313,6 @@ function downloadImages(noteId, content) { | |||||||
|                 } |                 } | ||||||
|                 else { |                 else { | ||||||
|                     content = replaceUrl(content, url, imageNote); |                     content = replaceUrl(content, url, imageNote); | ||||||
|  |  | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -328,7 +324,6 @@ function downloadImages(noteId, content) { | |||||||
|                 imageUrlToNoteIdMapping[url] = existingImage.noteId; |                 imageUrlToNoteIdMapping[url] = existingImage.noteId; | ||||||
|  |  | ||||||
|                 content = replaceUrl(content, url, existingImage); |                 content = replaceUrl(content, url, existingImage); | ||||||
|  |  | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -84,10 +84,11 @@ function exec(opts) { | |||||||
| } | } | ||||||
|  |  | ||||||
| function getImage(imageUrl) { | function getImage(imageUrl) { | ||||||
|  |     const proxyConf = syncOptions.getSyncProxy(); | ||||||
|     const opts = { |     const opts = { | ||||||
|         method: 'GET', |         method: 'GET', | ||||||
|         url: imageUrl, |         url: imageUrl, | ||||||
|         proxy: syncOptions.getSyncProxy() |         proxy: proxyConf !== "noproxy" ? proxyConf : null | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     const client = getClient(opts); |     const client = getClient(opts); | ||||||
|   | |||||||
| @@ -155,7 +155,11 @@ function getContentDisposition(filename) { | |||||||
|     return `file; filename="${sanitizedFilename}"; filename*=UTF-8''${sanitizedFilename}`; |     return `file; filename="${sanitizedFilename}"; filename*=UTF-8''${sanitizedFilename}`; | ||||||
| } | } | ||||||
|  |  | ||||||
| const STRING_MIME_TYPES = ["application/x-javascript", "image/svg+xml"]; | const STRING_MIME_TYPES = [ | ||||||
|  |     "application/javascript", | ||||||
|  |     "application/x-javascript", | ||||||
|  |     "image/svg+xml" | ||||||
|  | ]; | ||||||
|  |  | ||||||
| function isStringNote(type, mime) { | function isStringNote(type, mime) { | ||||||
|     // render and book are string note in the sense that they are expected to contain empty string |     // render and book are string note in the sense that they are expected to contain empty string | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user