You've already forked joplin
							
							
				mirror of
				https://github.com/laurent22/joplin.git
				synced 2025-10-31 00:07:48 +02:00 
			
		
		
		
	Plugins: Added a renderMarkup command to render MD or HTML markup to HTML
This commit is contained in:
		| @@ -155,6 +155,7 @@ packages/app-desktop/commands/exportNotes.js | ||||
| packages/app-desktop/commands/focusElement.js | ||||
| packages/app-desktop/commands/index.js | ||||
| packages/app-desktop/commands/openProfileDirectory.js | ||||
| packages/app-desktop/commands/renderMarkup.js | ||||
| packages/app-desktop/commands/replaceMisspelling.js | ||||
| packages/app-desktop/commands/restoreNoteRevision.js | ||||
| packages/app-desktop/commands/startExternalEditing.js | ||||
| @@ -538,7 +539,6 @@ packages/app-desktop/utils/customProtocols/handleCustomProtocols.js | ||||
| packages/app-desktop/utils/customProtocols/registerCustomProtocols.js | ||||
| packages/app-desktop/utils/isSafeToOpen.test.js | ||||
| packages/app-desktop/utils/isSafeToOpen.js | ||||
| packages/app-desktop/utils/markupLanguageUtils.js | ||||
| packages/app-desktop/utils/restartInSafeModeFromMain.test.js | ||||
| packages/app-desktop/utils/restartInSafeModeFromMain.js | ||||
| packages/app-mobile/PluginAssetsLoader.js | ||||
| @@ -1349,6 +1349,7 @@ packages/lib/types.js | ||||
| packages/lib/urlUtils.js | ||||
| packages/lib/utils/ActionLogger.test.js | ||||
| packages/lib/utils/ActionLogger.js | ||||
| packages/lib/utils/attachedResources.js | ||||
| packages/lib/utils/credentialFiles.js | ||||
| packages/lib/utils/dom/makeSandboxedIframe.js | ||||
| packages/lib/utils/focusHandler.js | ||||
| @@ -1368,6 +1369,7 @@ packages/lib/utils/ipc/utils/separateCallbacksFromSerializable.js | ||||
| packages/lib/utils/ipc/utils/separateCallbacksFromSerializableArray.js | ||||
| packages/lib/utils/joplinCloud/index.js | ||||
| packages/lib/utils/joplinCloud/types.js | ||||
| packages/lib/utils/markupLanguageUtils.js | ||||
| packages/lib/utils/processStartFlags.js | ||||
| packages/lib/utils/replaceUnsupportedCharacters.test.js | ||||
| packages/lib/utils/replaceUnsupportedCharacters.js | ||||
|   | ||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -132,6 +132,7 @@ packages/app-desktop/commands/exportNotes.js | ||||
| packages/app-desktop/commands/focusElement.js | ||||
| packages/app-desktop/commands/index.js | ||||
| packages/app-desktop/commands/openProfileDirectory.js | ||||
| packages/app-desktop/commands/renderMarkup.js | ||||
| packages/app-desktop/commands/replaceMisspelling.js | ||||
| packages/app-desktop/commands/restoreNoteRevision.js | ||||
| packages/app-desktop/commands/startExternalEditing.js | ||||
| @@ -515,7 +516,6 @@ packages/app-desktop/utils/customProtocols/handleCustomProtocols.js | ||||
| packages/app-desktop/utils/customProtocols/registerCustomProtocols.js | ||||
| packages/app-desktop/utils/isSafeToOpen.test.js | ||||
| packages/app-desktop/utils/isSafeToOpen.js | ||||
| packages/app-desktop/utils/markupLanguageUtils.js | ||||
| packages/app-desktop/utils/restartInSafeModeFromMain.test.js | ||||
| packages/app-desktop/utils/restartInSafeModeFromMain.js | ||||
| packages/app-mobile/PluginAssetsLoader.js | ||||
| @@ -1326,6 +1326,7 @@ packages/lib/types.js | ||||
| packages/lib/urlUtils.js | ||||
| packages/lib/utils/ActionLogger.test.js | ||||
| packages/lib/utils/ActionLogger.js | ||||
| packages/lib/utils/attachedResources.js | ||||
| packages/lib/utils/credentialFiles.js | ||||
| packages/lib/utils/dom/makeSandboxedIframe.js | ||||
| packages/lib/utils/focusHandler.js | ||||
| @@ -1345,6 +1346,7 @@ packages/lib/utils/ipc/utils/separateCallbacksFromSerializable.js | ||||
| packages/lib/utils/ipc/utils/separateCallbacksFromSerializableArray.js | ||||
| packages/lib/utils/joplinCloud/index.js | ||||
| packages/lib/utils/joplinCloud/types.js | ||||
| packages/lib/utils/markupLanguageUtils.js | ||||
| packages/lib/utils/processStartFlags.js | ||||
| packages/lib/utils/replaceUnsupportedCharacters.test.js | ||||
| packages/lib/utils/replaceUnsupportedCharacters.js | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import * as exportFolders from './exportFolders'; | ||||
| import * as exportNotes from './exportNotes'; | ||||
| import * as focusElement from './focusElement'; | ||||
| import * as openProfileDirectory from './openProfileDirectory'; | ||||
| import * as renderMarkup from './renderMarkup'; | ||||
| import * as replaceMisspelling from './replaceMisspelling'; | ||||
| import * as restoreNoteRevision from './restoreNoteRevision'; | ||||
| import * as startExternalEditing from './startExternalEditing'; | ||||
| @@ -25,6 +26,7 @@ const index: any[] = [ | ||||
| 	exportNotes, | ||||
| 	focusElement, | ||||
| 	openProfileDirectory, | ||||
| 	renderMarkup, | ||||
| 	replaceMisspelling, | ||||
| 	restoreNoteRevision, | ||||
| 	startExternalEditing, | ||||
|   | ||||
							
								
								
									
										32
									
								
								packages/app-desktop/commands/renderMarkup.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								packages/app-desktop/commands/renderMarkup.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| import markupLanguageUtils from '@joplin/lib/markupLanguageUtils'; | ||||
| import Setting from '@joplin/lib/models/Setting'; | ||||
| import { CommandRuntime, CommandDeclaration, CommandContext } from '@joplin/lib/services/CommandService'; | ||||
| import { themeStyle } from '@joplin/lib/theme'; | ||||
| import attachedResources from '@joplin/lib/utils/attachedResources'; | ||||
| import { MarkupLanguage } from '@joplin/renderer'; | ||||
|  | ||||
| export const declaration: CommandDeclaration = { | ||||
| 	name: 'renderMarkup', | ||||
| }; | ||||
|  | ||||
| const getMarkupToHtml = () => { | ||||
| 	const resourceBaseUrl = `joplin-content://note-viewer/${Setting.value('resourceDir')}/`; | ||||
|  | ||||
| 	return markupLanguageUtils.newMarkupToHtml({}, { | ||||
| 		resourceBaseUrl, | ||||
| 		customCss: '', | ||||
| 	}); | ||||
| }; | ||||
|  | ||||
| export const runtime = (): CommandRuntime => { | ||||
| 	return { | ||||
| 		execute: async (_context: CommandContext, markupLanguage: MarkupLanguage, markup: string) => { | ||||
| 			const markupToHtml = getMarkupToHtml(); | ||||
| 			const html = await markupToHtml.render(markupLanguage, markup, themeStyle(Setting.value('theme')), { | ||||
| 				resources: await attachedResources(markup), | ||||
| 				splitted: true, | ||||
| 			}); | ||||
| 			return html; | ||||
| 		}, | ||||
| 	}; | ||||
| }; | ||||
| @@ -4,7 +4,7 @@ import { _ } from '@joplin/lib/locale'; | ||||
| import DialogButtonRow from './DialogButtonRow'; | ||||
| const { themeStyle } = require('@joplin/lib/theme'); | ||||
| const Countable = require('@joplin/lib/countable/Countable'); | ||||
| import markupLanguageUtils from '../utils/markupLanguageUtils'; | ||||
| import markupLanguageUtils from '@joplin/lib/utils/markupLanguageUtils'; | ||||
| import Dialog from './Dialog'; | ||||
|  | ||||
| interface NoteContentPropertiesDialogProps { | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| import * as React from 'react'; | ||||
| import { useState, useEffect, useCallback, useRef, forwardRef, useImperativeHandle } from 'react'; | ||||
| import { ScrollOptions, ScrollOptionTypes, EditorCommand, NoteBodyEditorProps, ResourceInfos, HtmlToMarkdownHandler } from '../../utils/types'; | ||||
| import { resourcesStatus, commandAttachFileToBody, getResourcesFromPasteEvent, processPastedHtml, attachedResources } from '../../utils/resourceHandling'; | ||||
| import { resourcesStatus, commandAttachFileToBody, getResourcesFromPasteEvent, processPastedHtml } from '../../utils/resourceHandling'; | ||||
| import attachedResources from '@joplin/lib/utils/attachedResources'; | ||||
| import useScroll from './utils/useScroll'; | ||||
| import styles_ from './styles'; | ||||
| import CommandService from '@joplin/lib/services/CommandService'; | ||||
|   | ||||
| @@ -24,7 +24,7 @@ import ToolbarButtonUtils from '@joplin/lib/services/commands/ToolbarButtonUtils | ||||
| import { _, _n } from '@joplin/lib/locale'; | ||||
| import TagList from '../TagList'; | ||||
| import NoteTitleBar from './NoteTitle/NoteTitleBar'; | ||||
| import markupLanguageUtils from '../../utils/markupLanguageUtils'; | ||||
| import markupLanguageUtils from '@joplin/lib/utils/markupLanguageUtils'; | ||||
| import Setting from '@joplin/lib/models/Setting'; | ||||
| import stateToWhenClauseContext from '../../services/commands/stateToWhenClauseContext'; | ||||
| import ExternalEditWatcher from '@joplin/lib/services/ExternalEditWatcher'; | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import shim from '@joplin/lib/shim'; | ||||
| import Setting from '@joplin/lib/models/Setting'; | ||||
| import Note from '@joplin/lib/models/Note'; | ||||
| import BaseModel from '@joplin/lib/BaseModel'; | ||||
| import Resource from '@joplin/lib/models/Resource'; | ||||
| const bridge = require('@electron/remote').require('./bridge').default; | ||||
| import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; | ||||
| @@ -28,43 +27,6 @@ export async function handleResourceDownloadMode(noteBody: string) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| let resourceCache_: any = {}; | ||||
|  | ||||
| export function clearResourceCache() { | ||||
| 	resourceCache_ = {}; | ||||
| } | ||||
|  | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| export async function attachedResources(noteBody: string): Promise<any> { | ||||
| 	if (!noteBody) return {}; | ||||
| 	const resourceIds = await Note.linkedItemIdsByType(BaseModel.TYPE_RESOURCE, noteBody); | ||||
|  | ||||
| 	// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| 	const output: any = {}; | ||||
| 	for (let i = 0; i < resourceIds.length; i++) { | ||||
| 		const id = resourceIds[i]; | ||||
|  | ||||
| 		if (resourceCache_[id]) { | ||||
| 			output[id] = resourceCache_[id]; | ||||
| 		} else { | ||||
| 			const resource = await Resource.load(id); | ||||
| 			const localState = await Resource.localState(resource); | ||||
|  | ||||
| 			const o = { | ||||
| 				item: resource, | ||||
| 				localState: localState, | ||||
| 			}; | ||||
|  | ||||
| 			// eslint-disable-next-line require-atomic-updates | ||||
| 			resourceCache_[id] = o; | ||||
| 			output[id] = o; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| export async function commandAttachFileToBody(body: string, filePaths: string[] = null, options: any = null) { | ||||
| 	options = { | ||||
|   | ||||
| @@ -1,12 +1,11 @@ | ||||
| import { useState, useEffect, useCallback, RefObject, useRef } from 'react'; | ||||
| import { FormNote, defaultFormNote, ResourceInfos } from './types'; | ||||
| import { clearResourceCache, attachedResources } from './resourceHandling'; | ||||
| import AsyncActionQueue from '@joplin/lib/AsyncActionQueue'; | ||||
| import { handleResourceDownloadMode } from './resourceHandling'; | ||||
| import { splitHtml } from '@joplin/renderer/HtmlToHtml'; | ||||
| import Setting from '@joplin/lib/models/Setting'; | ||||
| import usePrevious from '../../hooks/usePrevious'; | ||||
|  | ||||
| import attachedResources, { clearResourceCache } from '@joplin/lib/utils/attachedResources'; | ||||
| import { MarkupToHtml } from '@joplin/renderer'; | ||||
| import Note from '@joplin/lib/models/Note'; | ||||
| import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| import { PluginStates } from '@joplin/lib/services/plugins/reducer'; | ||||
| import { useCallback, useMemo } from 'react'; | ||||
| import markupLanguageUtils from '../../../utils/markupLanguageUtils'; | ||||
| import markupLanguageUtils from '@joplin/lib/utils/markupLanguageUtils'; | ||||
| import Setting from '@joplin/lib/models/Setting'; | ||||
| import shim from '@joplin/lib/shim'; | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ import RevisionService from '@joplin/lib/services/RevisionService'; | ||||
| import { MarkupToHtml } from '@joplin/renderer'; | ||||
| import time from '@joplin/lib/time'; | ||||
| import bridge from '../services/bridge'; | ||||
| import markupLanguageUtils from '../utils/markupLanguageUtils'; | ||||
| import markupLanguageUtils from '@joplin/lib/utils/markupLanguageUtils'; | ||||
| import { NoteEntity, RevisionEntity } from '@joplin/lib/services/database/types'; | ||||
| import { AppState } from '../app.reducer'; | ||||
| const urlUtils = require('@joplin/lib/urlUtils'); | ||||
|   | ||||
| @@ -15,7 +15,7 @@ import ItemList from '../gui/ItemList'; | ||||
| import HelpButton from '../gui/HelpButton'; | ||||
| import { surroundKeywords, nextWhitespaceIndex, removeDiacritics } from '@joplin/lib/string-utils'; | ||||
| import { mergeOverlappingIntervals } from '@joplin/lib/ArrayUtils'; | ||||
| import markupLanguageUtils from '../utils/markupLanguageUtils'; | ||||
| import markupLanguageUtils from '@joplin/lib/utils/markupLanguageUtils'; | ||||
| import focusEditorIfEditorCommand from '@joplin/lib/services/commands/focusEditorIfEditorCommand'; | ||||
| import Logger from '@joplin/utils/Logger'; | ||||
| import { MarkupLanguage, MarkupToHtml } from '@joplin/renderer'; | ||||
|   | ||||
							
								
								
									
										40
									
								
								packages/lib/utils/attachedResources.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								packages/lib/utils/attachedResources.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| import BaseModel from '../BaseModel'; | ||||
| import Note from '../models/Note'; | ||||
| import Resource from '../models/Resource'; | ||||
|  | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| let resourceCache_: any = {}; | ||||
|  | ||||
| export function clearResourceCache() { | ||||
| 	resourceCache_ = {}; | ||||
| } | ||||
|  | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| export default async function attachedResources(noteBody: string): Promise<any> { | ||||
| 	if (!noteBody) return {}; | ||||
| 	const resourceIds = await Note.linkedItemIdsByType(BaseModel.TYPE_RESOURCE, noteBody); | ||||
|  | ||||
| 	// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied | ||||
| 	const output: any = {}; | ||||
| 	for (let i = 0; i < resourceIds.length; i++) { | ||||
| 		const id = resourceIds[i]; | ||||
|  | ||||
| 		if (resourceCache_[id]) { | ||||
| 			output[id] = resourceCache_[id]; | ||||
| 		} else { | ||||
| 			const resource = await Resource.load(id); | ||||
| 			const localState = await Resource.localState(resource); | ||||
|  | ||||
| 			const o = { | ||||
| 				item: resource, | ||||
| 				localState: localState, | ||||
| 			}; | ||||
|  | ||||
| 			// eslint-disable-next-line require-atomic-updates | ||||
| 			resourceCache_[id] = o; | ||||
| 			output[id] = o; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
| @@ -1,6 +1,6 @@ | ||||
| import { MarkupLanguageUtils as BaseMarkupLanguageUtils } from '@joplin/lib/markupLanguageUtils'; | ||||
| import { PluginStates } from '@joplin/lib/services/plugins/reducer'; | ||||
| import { contentScriptsToRendererRules } from '@joplin/lib/services/plugins/utils/loadContentScripts'; | ||||
| import { MarkupLanguageUtils as BaseMarkupLanguageUtils } from '../markupLanguageUtils'; | ||||
| import { PluginStates } from '../services/plugins/reducer'; | ||||
| import { contentScriptsToRendererRules } from '../services/plugins/utils/loadContentScripts'; | ||||
| import { Options } from '@joplin/renderer/MarkupToHtml'; | ||||
| 
 | ||||
| class MarkupLanguageUtils extends BaseMarkupLanguageUtils { | ||||
		Reference in New Issue
	
	Block a user