From 467bc7c455e9ccf62ec7f73e9a38e55537f3443b Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 17 Aug 2021 06:57:00 +0100 Subject: [PATCH 1/4] Desktop, Cli: Fixes #5325: Fixed file paths when exporting as HTML --- packages/lib/path-utils.ts | 3 ++- packages/lib/pathUtils.test.js | 1 + .../InteropService_Exporter_Html.test.ts | 26 ++++++++++++++++++- .../interop/InteropService_Exporter_Html.ts | 7 +++-- .../InteropService_Exporter_Md.test.js | 2 +- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/packages/lib/path-utils.ts b/packages/lib/path-utils.ts index f0af7b4d20..49f8774512 100644 --- a/packages/lib/path-utils.ts +++ b/packages/lib/path-utils.ts @@ -75,7 +75,8 @@ export function friendlySafeFilename(e: string, maxLength: number = null, preser let fileExt = ''; if (preserveExtension) { - fileExt = `.${safeFileExtension(fileExtension(e))}`; + const baseExt = fileExtension(e); + fileExt = baseExt ? `.${safeFileExtension(baseExt)}` : ''; e = filename(e); } diff --git a/packages/lib/pathUtils.test.js b/packages/lib/pathUtils.test.js index 9f0eb80d08..a5ff91824b 100644 --- a/packages/lib/pathUtils.test.js +++ b/packages/lib/pathUtils.test.js @@ -28,6 +28,7 @@ describe('pathUtils', function() { expect(!!friendlySafeFilename('...')).toBe(true); // Check that it optionally handles filenames with extension + expect(friendlySafeFilename('file', null, true)).toBe('file'); expect(friendlySafeFilename(' testing.md', null, true)).toBe('testing.md'); expect(friendlySafeFilename('testing.safe??ext##', null, true)).toBe('testing.safeext'); expect(friendlySafeFilename('thatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylong.md', null, true)).toBe('thatsreallylongthatsreallylongthatsreallylongthats.md'); diff --git a/packages/lib/services/interop/InteropService_Exporter_Html.test.ts b/packages/lib/services/interop/InteropService_Exporter_Html.test.ts index a6654caa20..5d8b921101 100644 --- a/packages/lib/services/interop/InteropService_Exporter_Html.test.ts +++ b/packages/lib/services/interop/InteropService_Exporter_Html.test.ts @@ -6,6 +6,7 @@ import Note from '../../models/Note'; import * as fs from 'fs-extra'; import { tempFilePath } from '../../testing/test-utils'; import { ContentScriptType } from '../../services/plugins/api/types'; +import { FileSystemItem } from './types'; async function recreateExportDir() { const dir = exportDir(); @@ -13,7 +14,7 @@ async function recreateExportDir() { await fs.mkdirp(dir); } -describe('services_InteropService_Exporter_Html', function() { +describe('interop/InteropService_Exporter_Html', function() { beforeEach(async (done) => { await setupDatabaseAndSynchronizer(1); @@ -37,6 +38,29 @@ describe('services_InteropService_Exporter_Html', function() { expect(content).toContain('ma note'); })); + test('should export HTML directory', (async () => { + const service = InteropService.instance(); + const folder1 = await Folder.save({ title: 'folder1' }); + await Folder.save({ title: 'folder2' }); + await Note.save({ title: 'note1', parent_id: folder1.id }); + await Note.save({ title: 'note2', parent_id: folder1.id }); + + const dir = exportDir(); + await service.export({ + path: dir, + format: 'html', + target: FileSystemItem.Directory, + }); + + const rootDirs = await fs.readdir(dir); + rootDirs.sort(); + expect(rootDirs).toEqual(['folder1', 'folder2']); + + const files = await fs.readdir(`${dir}/${rootDirs[0]}`); + expect(files).toContain('note1.html'); + expect(files).toContain('note2.html'); + })); + test('should export plugin assets', (async () => { const service = InteropService.instance(); const folder1 = await Folder.save({ title: 'folder1' }); diff --git a/packages/lib/services/interop/InteropService_Exporter_Html.ts b/packages/lib/services/interop/InteropService_Exporter_Html.ts index 62a011725a..e4d65838d9 100644 --- a/packages/lib/services/interop/InteropService_Exporter_Html.ts +++ b/packages/lib/services/interop/InteropService_Exporter_Html.ts @@ -8,9 +8,8 @@ import Setting from '../../models/Setting'; import { MarkupToHtml } from '@joplin/renderer'; import { ResourceEntity } from '../database/types'; import { contentScriptsToRendererRules } from '../plugins/utils/loadContentScripts'; -const { basename, friendlySafeFilename, rtrimSlashes } = require('../../path-utils'); +import { basename, friendlySafeFilename, rtrimSlashes, dirname } from '../../path-utils'; const { themeStyle } = require('../../theme'); -const { dirname } = require('../../path-utils'); const { escapeHtml } = require('../../string-utils.js'); const { assetsToHeaders } = require('@joplin/renderer'); @@ -53,7 +52,7 @@ export default class InteropService_Exporter_Html extends InteropService_Exporte if (pathPart) { output = `${pathPart}/${output}`; } else { - output = `${friendlySafeFilename(item.title, null, true)}/${output}`; + output = `${friendlySafeFilename(item.title)}/${output}`; output = await shim.fsDriver().findUniqueFilename(output); } } @@ -98,7 +97,7 @@ export default class InteropService_Exporter_Html extends InteropService_Exporte if (this.filePath_) { noteFilePath = this.filePath_; } else { - noteFilePath = `${dirPath}/${friendlySafeFilename(item.title, null, true)}.html`; + noteFilePath = `${dirPath}/${friendlySafeFilename(item.title)}.html`; noteFilePath = await shim.fsDriver().findUniqueFilename(noteFilePath); } diff --git a/packages/lib/services/interop/InteropService_Exporter_Md.test.js b/packages/lib/services/interop/InteropService_Exporter_Md.test.js index 41a5de82f9..c98b0216c3 100644 --- a/packages/lib/services/interop/InteropService_Exporter_Md.test.js +++ b/packages/lib/services/interop/InteropService_Exporter_Md.test.js @@ -10,7 +10,7 @@ const Resource = require('../../models/Resource').default; const Note = require('../../models/Note').default; const shim = require('../../shim').default; -describe('services_InteropService_Exporter_Md', function() { +describe('interop/InteropService_Exporter_Md', function() { beforeEach(async (done) => { await setupDatabaseAndSynchronizer(1); From 4df434e63ea65f2c37dc606b76c60f618541cda0 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 17 Aug 2021 07:06:05 +0100 Subject: [PATCH 2/4] Desktop release v2.3.4 --- packages/app-desktop/package-lock.json | 4 ++-- packages/app-desktop/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app-desktop/package-lock.json b/packages/app-desktop/package-lock.json index f8d0dc70d9..c7dcaad80f 100644 --- a/packages/app-desktop/package-lock.json +++ b/packages/app-desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "@joplin/app-desktop", - "version": "2.3.3", + "version": "2.3.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@joplin/app-desktop", - "version": "2.3.3", + "version": "2.3.4", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-free": "^5.13.0", diff --git a/packages/app-desktop/package.json b/packages/app-desktop/package.json index 2bc95dd855..20a0f95777 100644 --- a/packages/app-desktop/package.json +++ b/packages/app-desktop/package.json @@ -1,6 +1,6 @@ { "name": "@joplin/app-desktop", - "version": "2.3.3", + "version": "2.3.4", "description": "Joplin for Desktop", "main": "main.js", "private": true, From e51fe8bd80b5cc952618ccbeb33ed0a9ade73038 Mon Sep 17 00:00:00 2001 From: Caleb John Date: Mon, 16 Aug 2021 23:13:52 -0700 Subject: [PATCH 3/4] Desktop: Place code-block background in the back in Markdown editor (#5322) --- .../gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx | 2 +- .../NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx b/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx index 96d0cbd9a3..4d4106aec7 100644 --- a/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx +++ b/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx @@ -483,7 +483,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) { border-radius: .25em; } - div.CodeMirror pre.cm-jn-code-block { + div.CodeMirror div.cm-jn-code-block { background-color: ${theme.codeBackgroundColor}; padding-right: .2em; padding-left: .2em; diff --git a/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.ts b/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.ts index 029f4ee46d..e1a7b81be2 100644 --- a/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.ts +++ b/packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.ts @@ -128,11 +128,11 @@ export default function useJoplinMode(CodeMirror: any) { } else if (state.outer.thisLine && state.outer.thisLine.fencedCodeEnd) { state.inCodeBlock = false; isMonospace = true; - token = `${token} line-cm-jn-code-block`; + token = `${token} line-background-cm-jn-code-block`; } else if (state.outer.code === -1 || state.inCodeBlock) { state.inCodeBlock = true; isMonospace = true; - token = `${token} line-cm-jn-code-block`; + token = `${token} line-background-cm-jn-code-block`; } else if (stream.pos > 0 && stream.string[stream.pos - 1] === '`' && !!token && token.includes('comment')) { // This grabs the closing backtick for inline Code @@ -184,7 +184,7 @@ export default function useJoplinMode(CodeMirror: any) { state.inTable = false; - if (state.inCodeBlock) return 'line-cm-jn-code-block'; + if (state.inCodeBlock) return 'line-background-cm-jn-code-block'; return null; }, From 819af3c6d8e584e37a9dd563b2e1a358a28339a0 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 17 Aug 2021 07:14:59 +0100 Subject: [PATCH 4/4] Desktop release v2.3.5 --- packages/app-desktop/package-lock.json | 4 ++-- packages/app-desktop/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app-desktop/package-lock.json b/packages/app-desktop/package-lock.json index c7dcaad80f..edbe41991f 100644 --- a/packages/app-desktop/package-lock.json +++ b/packages/app-desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "@joplin/app-desktop", - "version": "2.3.4", + "version": "2.3.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@joplin/app-desktop", - "version": "2.3.4", + "version": "2.3.5", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-free": "^5.13.0", diff --git a/packages/app-desktop/package.json b/packages/app-desktop/package.json index 20a0f95777..5d62b9e553 100644 --- a/packages/app-desktop/package.json +++ b/packages/app-desktop/package.json @@ -1,6 +1,6 @@ { "name": "@joplin/app-desktop", - "version": "2.3.4", + "version": "2.3.5", "description": "Joplin for Desktop", "main": "main.js", "private": true,