diff --git a/.eslintignore b/.eslintignore index 277e1f46a3..e1a62ea017 100644 --- a/.eslintignore +++ b/.eslintignore @@ -873,7 +873,8 @@ packages/app-mobile/contentScripts/rendererBundle/useWebViewSetup.js packages/app-mobile/contentScripts/rendererBundle/utils/useContentScripts.js packages/app-mobile/contentScripts/rendererBundle/utils/useEditPopup.test.js packages/app-mobile/contentScripts/rendererBundle/utils/useEditPopup.js -packages/app-mobile/contentScripts/richTextEditorBundle/contentScript.js +packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/convertHtmlToMarkdown.js +packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/index.js packages/app-mobile/contentScripts/richTextEditorBundle/types.js packages/app-mobile/contentScripts/richTextEditorBundle/useWebViewSetup.js packages/app-mobile/contentScripts/types.js diff --git a/.gitignore b/.gitignore index 2fdad3445b..1a9ec7e911 100644 --- a/.gitignore +++ b/.gitignore @@ -846,7 +846,8 @@ packages/app-mobile/contentScripts/rendererBundle/useWebViewSetup.js packages/app-mobile/contentScripts/rendererBundle/utils/useContentScripts.js packages/app-mobile/contentScripts/rendererBundle/utils/useEditPopup.test.js packages/app-mobile/contentScripts/rendererBundle/utils/useEditPopup.js -packages/app-mobile/contentScripts/richTextEditorBundle/contentScript.js +packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/convertHtmlToMarkdown.js +packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/index.js packages/app-mobile/contentScripts/richTextEditorBundle/types.js packages/app-mobile/contentScripts/richTextEditorBundle/useWebViewSetup.js packages/app-mobile/contentScripts/types.js diff --git a/packages/app-cli/tests/MarkupToHtml.ts b/packages/app-cli/tests/MarkupToHtml.ts index 36ad5f582e..13ad243864 100644 --- a/packages/app-cli/tests/MarkupToHtml.ts +++ b/packages/app-cli/tests/MarkupToHtml.ts @@ -1,6 +1,6 @@ -import MarkupToHtml, { MarkupLanguage } from '@joplin/renderer/MarkupToHtml'; -import { RenderResult } from '@joplin/renderer/types'; +import MarkupToHtml from '@joplin/renderer/MarkupToHtml'; +import { RenderResult, MarkupLanguage } from '@joplin/renderer/types'; describe('MarkupToHtml', () => { diff --git a/packages/app-mobile/contentScripts/rendererBundle/types.ts b/packages/app-mobile/contentScripts/rendererBundle/types.ts index ebaa2bb854..b950034f40 100644 --- a/packages/app-mobile/contentScripts/rendererBundle/types.ts +++ b/packages/app-mobile/contentScripts/rendererBundle/types.ts @@ -1,6 +1,6 @@ -import type { FsDriver as RendererFsDriver, RenderResult, ResourceInfos } from '@joplin/renderer/types'; +import type { MarkupLanguage, FsDriver as RendererFsDriver, RenderResult, ResourceInfos } from '@joplin/renderer/types'; import type Renderer from './contentScript/Renderer'; -import { MarkupLanguage, PluginOptions } from '@joplin/renderer/MarkupToHtml'; +import { PluginOptions } from '@joplin/renderer/MarkupToHtml'; // Joplin settings (as from Setting.value(...)) that should // remain constant during editing. diff --git a/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/convertHtmlToMarkdown.ts b/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/convertHtmlToMarkdown.ts new file mode 100644 index 0000000000..275bf9167e --- /dev/null +++ b/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/convertHtmlToMarkdown.ts @@ -0,0 +1,32 @@ +const TurndownService = require('@joplin/turndown'); +const turndownPluginGfm = require('@joplin/turndown-plugin-gfm').gfm; + +// Avoid using @joplin/lib/HtmlToMd here. HtmlToMd may cause several megabytes +// of additional JavaScript and supporting data to be included. + +const convertHtmlToMarkdown = (html: string|HTMLElement) => { + const turndownOpts = { + headingStyle: 'atx', + codeBlockStyle: 'fenced', + preserveImageTagsWithSize: true, + preserveNestedTables: true, + preserveColorStyles: true, + bulletListMarker: '-', + emDelimiter: '*', + strongDelimiter: '**', + allowResourcePlaceholders: true, + + // If soft-breaks are enabled, lines need to end with two or more spaces for + // trailing
s to render. See + // https://github.com/laurent22/joplin/issues/8430 + br: ' ', + }; + const turndown = new TurndownService(turndownOpts); + turndown.use(turndownPluginGfm); + turndown.remove('script'); + turndown.remove('style'); + const md = turndown.turndown(html); + return md; +}; + +export default convertHtmlToMarkdown; diff --git a/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript.ts b/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/index.ts similarity index 90% rename from packages/app-mobile/contentScripts/richTextEditorBundle/contentScript.ts rename to packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/index.ts index ac5dd9d829..ec183a4ec3 100644 --- a/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript.ts +++ b/packages/app-mobile/contentScripts/richTextEditorBundle/contentScript/index.ts @@ -1,12 +1,12 @@ -import '../utils/polyfills'; +import '../../utils/polyfills'; import { createEditor } from '@joplin/editor/ProseMirror'; -import { EditorProcessApi, EditorProps, MainProcessApi } from './types'; -import WebViewToRNMessenger from '../../utils/ipc/WebViewToRNMessenger'; -import { MarkupLanguage } from '@joplin/renderer'; +import { EditorProcessApi, EditorProps, MainProcessApi } from '../types'; +import WebViewToRNMessenger from '../../../utils/ipc/WebViewToRNMessenger'; +import { MarkupLanguage } from '@joplin/renderer/types'; import '@joplin/editor/ProseMirror/styles'; -import HtmlToMd from '@joplin/lib/HtmlToMd'; -import readFileToBase64 from '../utils/readFileToBase64'; +import readFileToBase64 from '../../utils/readFileToBase64'; import { EditorLanguageType } from '@joplin/editor/types'; +import convertHtmlToMarkdown from './convertHtmlToMarkdown'; const postprocessHtml = (html: HTMLElement) => { // Fix resource URLs @@ -45,11 +45,10 @@ const wrapHtmlForMarkdownConversion = (html: HTMLElement) => { }; -const htmlToMd = new HtmlToMd(); const htmlToMarkdown = (html: HTMLElement): string => { html = postprocessHtml(html); - return htmlToMd.parse(html, { preserveColorStyles: true }); + return convertHtmlToMarkdown(html); }; export const initialize = async ({ @@ -127,5 +126,5 @@ export const initialize = async ({ return editor; }; -export { default as setUpLogger } from '../utils/setUpLogger'; +export { default as setUpLogger } from '../../utils/setUpLogger'; diff --git a/packages/lib/markupLanguageUtils.ts b/packages/lib/markupLanguageUtils.ts index 33f6f5aa82..c64a456cfd 100644 --- a/packages/lib/markupLanguageUtils.ts +++ b/packages/lib/markupLanguageUtils.ts @@ -1,11 +1,12 @@ import markdownUtils from './markdownUtils'; import Setting from './models/Setting'; import shim from './shim'; -import MarkupToHtml, { MarkupLanguage, Options } from '@joplin/renderer/MarkupToHtml'; +import MarkupToHtml, { Options } from '@joplin/renderer/MarkupToHtml'; import htmlUtils from './htmlUtils'; import Resource from './models/Resource'; import { PluginStates } from './services/plugins/reducer'; +import { MarkupLanguage } from '@joplin/renderer'; export class MarkupLanguageUtils { diff --git a/packages/renderer/MarkupToHtml.ts b/packages/renderer/MarkupToHtml.ts index 8996ddddc1..df05e3693e 100644 --- a/packages/renderer/MarkupToHtml.ts +++ b/packages/renderer/MarkupToHtml.ts @@ -3,16 +3,10 @@ import HtmlToHtml from './HtmlToHtml'; import htmlUtils from './htmlUtils'; import { Options as NoteStyleOptions } from './noteStyle'; import { AllHtmlEntities } from 'html-entities'; -import { FsDriver, MarkupRenderer, MarkupToHtmlConverter, OptionsResourceModel, RenderOptions, RenderResult } from './types'; +import { FsDriver, MarkupLanguage, MarkupRenderer, MarkupToHtmlConverter, OptionsResourceModel, RenderOptions, RenderResult } from './types'; import defaultResourceModel from './defaultResourceModel'; const MarkdownIt = require('markdown-it'); -export enum MarkupLanguage { - Markdown = 1, - Html = 2, - Any = 3, -} - export interface PluginOptions { [id: string]: { enabled: boolean }; } diff --git a/packages/renderer/index.ts b/packages/renderer/index.ts index 966266ac4d..d1bf014c4e 100644 --- a/packages/renderer/index.ts +++ b/packages/renderer/index.ts @@ -1,4 +1,4 @@ -import MarkupToHtml, { MarkupLanguage } from './MarkupToHtml'; +import MarkupToHtml from './MarkupToHtml'; import MdToHtml from './MdToHtml'; import HtmlToHtml from './HtmlToHtml'; import * as utils from './utils'; @@ -6,6 +6,7 @@ import setupLinkify from './MdToHtml/setupLinkify'; import validateLinks from './MdToHtml/validateLinks'; import headerAnchor from './headerAnchor'; import assetsToHeaders from './assetsToHeaders'; +import { MarkupLanguage } from './types'; export { MarkupToHtml, diff --git a/packages/renderer/types.ts b/packages/renderer/types.ts index 0990ff856c..2edc299c7f 100644 --- a/packages/renderer/types.ts +++ b/packages/renderer/types.ts @@ -1,6 +1,11 @@ -import { MarkupLanguage } from './MarkupToHtml'; import { Options as NoteStyleOptions } from './noteStyle'; +export enum MarkupLanguage { + Markdown = 1, + Html = 2, + Any = 3, +} + export type ItemIdToUrlHandler = (resourceId: string, urlParameters?: string)=> string; interface ResourceEntity {