diff --git a/.eslintignore b/.eslintignore index a73773da94..a1e0a20179 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1351,6 +1351,9 @@ packages/lib/uuid.js.map packages/lib/versionInfo.d.ts packages/lib/versionInfo.js packages/lib/versionInfo.js.map +packages/renderer/HtmlToHtml.d.ts +packages/renderer/HtmlToHtml.js +packages/renderer/HtmlToHtml.js.map packages/renderer/InMemoryCache.d.ts packages/renderer/InMemoryCache.js packages/renderer/InMemoryCache.js.map @@ -1360,6 +1363,12 @@ packages/renderer/MarkupToHtml.js.map packages/renderer/MdToHtml.d.ts packages/renderer/MdToHtml.js packages/renderer/MdToHtml.js.map +packages/renderer/MdToHtml/linkReplacement.d.ts +packages/renderer/MdToHtml/linkReplacement.js +packages/renderer/MdToHtml/linkReplacement.js.map +packages/renderer/MdToHtml/linkReplacement.test.d.ts +packages/renderer/MdToHtml/linkReplacement.test.js +packages/renderer/MdToHtml/linkReplacement.test.js.map packages/renderer/MdToHtml/rules/checkbox.d.ts packages/renderer/MdToHtml/rules/checkbox.js packages/renderer/MdToHtml/rules/checkbox.js.map @@ -1393,6 +1402,9 @@ packages/renderer/MdToHtml/rules/mermaid.js.map packages/renderer/MdToHtml/rules/sanitize_html.d.ts packages/renderer/MdToHtml/rules/sanitize_html.js packages/renderer/MdToHtml/rules/sanitize_html.js.map +packages/renderer/htmlUtils.d.ts +packages/renderer/htmlUtils.js +packages/renderer/htmlUtils.js.map packages/renderer/index.d.ts packages/renderer/index.js packages/renderer/index.js.map @@ -1402,4 +1414,7 @@ packages/renderer/noteStyle.js.map packages/renderer/pathUtils.d.ts packages/renderer/pathUtils.js packages/renderer/pathUtils.js.map +packages/renderer/utils.d.ts +packages/renderer/utils.js +packages/renderer/utils.js.map # AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD diff --git a/.gitignore b/.gitignore index 7ca8695d2e..b35899c532 100644 --- a/.gitignore +++ b/.gitignore @@ -1343,6 +1343,9 @@ packages/lib/uuid.js.map packages/lib/versionInfo.d.ts packages/lib/versionInfo.js packages/lib/versionInfo.js.map +packages/renderer/HtmlToHtml.d.ts +packages/renderer/HtmlToHtml.js +packages/renderer/HtmlToHtml.js.map packages/renderer/InMemoryCache.d.ts packages/renderer/InMemoryCache.js packages/renderer/InMemoryCache.js.map @@ -1352,6 +1355,12 @@ packages/renderer/MarkupToHtml.js.map packages/renderer/MdToHtml.d.ts packages/renderer/MdToHtml.js packages/renderer/MdToHtml.js.map +packages/renderer/MdToHtml/linkReplacement.d.ts +packages/renderer/MdToHtml/linkReplacement.js +packages/renderer/MdToHtml/linkReplacement.js.map +packages/renderer/MdToHtml/linkReplacement.test.d.ts +packages/renderer/MdToHtml/linkReplacement.test.js +packages/renderer/MdToHtml/linkReplacement.test.js.map packages/renderer/MdToHtml/rules/checkbox.d.ts packages/renderer/MdToHtml/rules/checkbox.js packages/renderer/MdToHtml/rules/checkbox.js.map @@ -1385,6 +1394,9 @@ packages/renderer/MdToHtml/rules/mermaid.js.map packages/renderer/MdToHtml/rules/sanitize_html.d.ts packages/renderer/MdToHtml/rules/sanitize_html.js packages/renderer/MdToHtml/rules/sanitize_html.js.map +packages/renderer/htmlUtils.d.ts +packages/renderer/htmlUtils.js +packages/renderer/htmlUtils.js.map packages/renderer/index.d.ts packages/renderer/index.js packages/renderer/index.js.map @@ -1394,4 +1406,7 @@ packages/renderer/noteStyle.js.map packages/renderer/pathUtils.d.ts packages/renderer/pathUtils.js packages/renderer/pathUtils.js.map +packages/renderer/utils.d.ts +packages/renderer/utils.js +packages/renderer/utils.js.map # AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD \ No newline at end of file diff --git a/packages/app-cli/tests/HtmlToHtml.js b/packages/app-cli/tests/HtmlToHtml.js index 385723778a..edce7703f1 100644 --- a/packages/app-cli/tests/HtmlToHtml.js +++ b/packages/app-cli/tests/HtmlToHtml.js @@ -9,7 +9,7 @@ const Folder = require('@joplin/lib/models/Folder.js'); const Note = require('@joplin/lib/models/Note.js'); const BaseModel = require('@joplin/lib/BaseModel').default; const shim = require('@joplin/lib/shim').default; -const HtmlToHtml = require('@joplin/renderer/HtmlToHtml'); +const HtmlToHtml = require('@joplin/renderer/HtmlToHtml').default; const { enexXmlToMd } = require('@joplin/lib/import-enex-md-gen.js'); process.on('unhandledRejection', (reason, p) => { diff --git a/packages/app-desktop/gui/NoteEditor/utils/useFormNote.ts b/packages/app-desktop/gui/NoteEditor/utils/useFormNote.ts index 97c6fbab7b..5db9d1e9b3 100644 --- a/packages/app-desktop/gui/NoteEditor/utils/useFormNote.ts +++ b/packages/app-desktop/gui/NoteEditor/utils/useFormNote.ts @@ -3,15 +3,16 @@ import { FormNote, defaultFormNote, ResourceInfos } from './types'; import { clearResourceCache, attachedResources } from './resourceHandling'; import AsyncActionQueue from '@joplin/lib/AsyncActionQueue'; import { handleResourceDownloadMode } from './resourceHandling'; +import HtmlToHtml from '@joplin/renderer/HtmlToHtml'; +import Setting from '@joplin/lib/models/Setting'; +import usePrevious from '../../hooks/usePrevious'; +import ResourceEditWatcher from '@joplin/lib/services/ResourceEditWatcher/index'; + const { MarkupToHtml } = require('@joplin/renderer'); -const HtmlToHtml = require('@joplin/renderer/HtmlToHtml'); -const usePrevious = require('../../hooks/usePrevious').default; const Note = require('@joplin/lib/models/Note'); -const Setting = require('@joplin/lib/models/Setting').default; const { reg } = require('@joplin/lib/registry.js'); const ResourceFetcher = require('@joplin/lib/services/ResourceFetcher.js'); const DecryptionWorker = require('@joplin/lib/services/DecryptionWorker.js'); -const ResourceEditWatcher = require('@joplin/lib/services/ResourceEditWatcher/index').default; export interface OnLoadEvent { formNote: FormNote; diff --git a/packages/app-desktop/package.json b/packages/app-desktop/package.json index 2bc44d3660..1748715d58 100644 --- a/packages/app-desktop/package.json +++ b/packages/app-desktop/package.json @@ -11,7 +11,8 @@ "tsc": "node node_modules/typescript/bin/tsc --project tsconfig.json", "watch": "node node_modules/typescript/bin/tsc --watch --project tsconfig.json", "start": "gulp build && electron . --env dev --log-level debug --no-welcome --open-dev-tools", - "test": "jest" + "test": "jest", + "test-ci": "test" }, "repository": { "type": "git", diff --git a/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts b/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts index 0933c3656e..a44c42909f 100644 --- a/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts +++ b/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts @@ -87,7 +87,6 @@ export default function useSource(noteBody: string, noteMarkupLanguage: number, codeTheme: theme.codeThemeCss, postMessageSyntax: 'window.joplinPostMessage_', enableLongPress: shim.mobilePlatform() === 'android', // On iOS, there's already a built-on open/share menu - longPressDelay: 500, // TODO use system value }; // Whenever a resource state changes, for example when it goes from "not downloaded" to "downloaded", the "noteResources" diff --git a/packages/renderer/HtmlToHtml.js b/packages/renderer/HtmlToHtml.ts similarity index 65% rename from packages/renderer/HtmlToHtml.js rename to packages/renderer/HtmlToHtml.ts index e2c7a38067..ef8c0ee166 100644 --- a/packages/renderer/HtmlToHtml.js +++ b/packages/renderer/HtmlToHtml.ts @@ -1,6 +1,6 @@ -const htmlUtils = require('./htmlUtils'); -const utils = require('./utils'); -// const noteStyle = require('./noteStyle').default; +import htmlUtils from './htmlUtils'; +import linkReplacement from './MdToHtml/linkReplacement'; +import utils from './utils'; // TODO: fix // const Setting = require('@joplin/lib/models/Setting').default; @@ -13,9 +13,45 @@ const md5 = require('md5'); // relatively small. const inMemoryCache = new InMemoryCache(10); -class HtmlToHtml { - constructor(options) { - if (!options) options = {}; +interface FsDriver { + writeFile: Function; + exists: Function; + cacheCssToFile: Function; +} + +interface Options { + ResourceModel: any; + resourceBaseUrl?: string; + fsDriver?: FsDriver; +} + +interface RenderOptions { + splitted: boolean; + bodyOnly: boolean; + externalAssetsOnly: boolean; + resources: any; + postMessageSyntax: string; + enableLongPress: boolean; +} + +interface RenderResult { + html: string; + pluginAssets: any[]; +} + +export default class HtmlToHtml { + + private resourceBaseUrl_; + private ResourceModel_; + private cache_; + private fsDriver_: any; + + constructor(options: Options = null) { + options = { + ResourceModel: null, + ...options, + }; + this.resourceBaseUrl_ = 'resourceBaseUrl' in options ? options.resourceBaseUrl : null; this.ResourceModel_ = options.ResourceModel; this.cache_ = inMemoryCache; @@ -36,7 +72,7 @@ class HtmlToHtml { return this.fsDriver_; } - splitHtml(html) { + splitHtml(html: string) { const trimmedHtml = html.trimStart(); if (trimmedHtml.indexOf('