fix: automatically convert Super notes to Markdown for the Plaintext Backups feature

This commit is contained in:
Mo
2023-05-02 15:37:23 -05:00
parent 2eddc3a1c6
commit 75ecf4c393
11 changed files with 88 additions and 48 deletions

View File

@@ -6,7 +6,7 @@ import Icon from '../Icon/Icon'
import Modal, { ModalAction } from '../Modal/Modal'
import { EditorMenuItem } from '../NotesOptions/EditorMenuItem'
import { NoteViewController } from '../NoteView/Controller/NoteViewController'
import { exportSuperNote } from './SuperNoteExporter'
import { InvisibleSuperConverter } from './Tools/InvisibleMarkdownConverter'
const SuperNoteConverter = ({
note,
@@ -47,7 +47,7 @@ const SuperNoteConverter = ({
return note.text
}
return exportSuperNote(note, format)
return new InvisibleSuperConverter().convertString(note.text, format)
}, [format, note])
const componentViewer = useMemo(() => {

View File

@@ -1,43 +0,0 @@
import { createHeadlessEditor } from '@lexical/headless'
import { $convertToMarkdownString } from '@lexical/markdown'
import { MarkdownTransformers } from './MarkdownTransformers'
import { $generateHtmlFromNodes } from '@lexical/html'
import { BlockEditorNodes } from './Lexical/Nodes/AllNodes'
import BlocksEditorTheme from './Lexical/Theme/Theme'
import { SNNote } from '@standardnotes/models'
export const exportSuperNote = (note: SNNote, format: 'txt' | 'md' | 'html' | 'json') => {
const headlessEditor = createHeadlessEditor({
namespace: 'BlocksEditor',
theme: BlocksEditorTheme,
editable: false,
onError: (error: Error) => console.error(error),
nodes: [...BlockEditorNodes],
})
headlessEditor.setEditorState(headlessEditor.parseEditorState(note.text))
let content: string | undefined
headlessEditor.update(() => {
switch (format) {
case 'txt':
case 'md':
content = $convertToMarkdownString(MarkdownTransformers)
break
case 'html':
content = $generateHtmlFromNodes(headlessEditor)
break
case 'json':
default:
content = note.text
break
}
})
if (!content) {
throw new Error('Could not export note')
}
return content
}

View File

@@ -0,0 +1,57 @@
import { createHeadlessEditor } from '@lexical/headless'
import { $convertToMarkdownString } from '@lexical/markdown'
import { SuperConverterServiceInterface } from '@standardnotes/snjs'
import { LexicalEditor } from 'lexical'
import BlocksEditorTheme from '../Lexical/Theme/Theme'
import { BlockEditorNodes } from '../Lexical/Nodes/AllNodes'
import { MarkdownTransformers } from '../MarkdownTransformers'
import { $generateHtmlFromNodes } from '@lexical/html'
export class InvisibleSuperConverter implements SuperConverterServiceInterface {
private editor: LexicalEditor
constructor() {
this.editor = createHeadlessEditor({
namespace: 'BlocksEditor',
theme: BlocksEditorTheme,
editable: false,
onError: (error: Error) => console.error(error),
nodes: [...BlockEditorNodes],
})
}
convertString(superString: string, format: 'txt' | 'md' | 'html' | 'json'): string {
if (superString.length === 0) {
return superString
}
this.editor.setEditorState(this.editor.parseEditorState(superString))
let content: string | undefined
this.editor.update(
() => {
switch (format) {
case 'txt':
case 'md':
content = $convertToMarkdownString(MarkdownTransformers)
break
case 'html':
content = $generateHtmlFromNodes(this.editor)
break
case 'json':
default:
content = superString
break
}
},
{ discrete: true },
)
if (!content) {
throw new Error('Could not export note')
}
return content
}
}