Skip to content

Commit 2bc7d57

Browse files
committed
fix: Fixed issue with some Evernote imports getting cut-off
1 parent 6e282c1 commit 2bc7d57

File tree

4 files changed

+38
-25
lines changed

4 files changed

+38
-25
lines changed

packages/files/src/Domain/Service/SuperConverterServiceInterface.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { FileItem, PrefKey, PrefValue } from '@standardnotes/models'
22

3+
export type SuperConverterHTMLOptions = {
4+
addLineBreaks?: boolean
5+
}
6+
37
export interface SuperConverterServiceInterface {
48
isValidSuperString(superString: string): boolean
59
convertSuperStringToOtherFormat: (
@@ -18,9 +22,7 @@ export interface SuperConverterServiceInterface {
1822
otherFormatString: string,
1923
fromFormat: 'txt' | 'md' | 'html' | 'json',
2024
options?: {
21-
html?: {
22-
addLineBreaks?: boolean
23-
}
25+
html?: SuperConverterHTMLOptions
2426
},
2527
) => string
2628
getEmbeddedFileIDsFromSuperString(superString: string): string[]

packages/ui-services/src/Import/Converter.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NoteType } from '@standardnotes/features'
22
import { DecryptedItemInterface, FileItem, ItemContent, NoteContent, SNNote, SNTag } from '@standardnotes/models'
33
import { ConversionResult } from './ConversionResult'
4+
import { SuperConverterHTMLOptions } from '@standardnotes/snjs'
45

56
export interface Converter {
67
getImportType(): string
@@ -18,7 +19,7 @@ export interface Converter {
1819
canUploadFiles: boolean
1920
uploadFile: UploadFileFn
2021
canUseSuper: boolean
21-
convertHTMLToSuper: (html: string) => string
22+
convertHTMLToSuper: (html: string, options?: SuperConverterHTMLOptions) => string
2223
convertMarkdownToSuper: (markdown: string) => string
2324
readFileAsText: (file: File) => Promise<string>
2425
linkItems(

packages/ui-services/src/Import/EvernoteConverter/EvernoteConverter.ts

+26-18
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,15 @@ export class EvernoteConverter implements Converter {
7575
.filter(Boolean) as EvernoteResource[]
7676

7777
const contentNode = xmlNote.getElementsByTagName('content')[0]
78-
const contentXmlString = this.getXmlStringFromContentElement(contentNode)
78+
let contentXmlString = this.getXmlStringFromContentElement(contentNode)
7979
if (!contentXmlString) {
8080
continue
8181
}
82-
const contentXml = this.loadXMLString(contentXmlString, 'html')
82+
// Convert any en-media self-closing tags to normal closing tags
83+
contentXmlString = contentXmlString.replace(/<((en-media)[^<>]+)\/>/g, '<$1></$2>')
84+
const content = this.loadXMLString(contentXmlString, 'html')
8385

84-
const noteElement = contentXml.getElementsByTagName('en-note')[0] as HTMLElement
86+
const noteElement = content.getElementsByTagName('en-note')[0] as HTMLElement
8587

8688
const unorderedLists = Array.from(noteElement.getElementsByTagName('ul'))
8789

@@ -92,16 +94,7 @@ export class EvernoteConverter implements Converter {
9294
}
9395

9496
this.removeEmptyAndOrphanListElements(noteElement)
95-
this.removeUnnecessaryTopLevelBreaks(noteElement)
96-
97-
const mediaElements = Array.from(noteElement.getElementsByTagName('en-media'))
98-
const { uploadedFiles } = await this.replaceMediaElementsWithResources(
99-
mediaElements,
100-
resources,
101-
canUploadFiles,
102-
uploadFile,
103-
)
104-
filesToPotentiallyCleanup.push(...uploadedFiles)
97+
this.unwrapTopLevelBreaks(noteElement)
10598

10699
// Some notes have <font> tags that contain separate <span> tags with text
107100
// which causes broken paragraphs in the note.
@@ -113,13 +106,26 @@ export class EvernoteConverter implements Converter {
113106
fontElement.innerText = fontElement.textContent || ''
114107
}
115108

109+
const mediaElements = Array.from(noteElement.getElementsByTagName('en-media'))
110+
const { uploadedFiles } = await this.replaceMediaElementsWithResources(
111+
mediaElements,
112+
resources,
113+
canUploadFiles,
114+
uploadFile,
115+
)
116+
filesToPotentiallyCleanup.push(...uploadedFiles)
117+
116118
let contentHTML = noteElement.innerHTML
117119
if (!canUseSuper) {
118120
contentHTML = contentHTML.replace(/<\/div>/g, '</div>\n')
119121
contentHTML = contentHTML.replace(/<li[^>]*>/g, '\n')
120122
contentHTML = contentHTML.trim()
121123
}
122-
const text = !canUseSuper ? this.stripHTML(contentHTML) : convertHTMLToSuper(contentHTML)
124+
const text = !canUseSuper
125+
? this.stripHTML(contentHTML)
126+
: convertHTMLToSuper(contentHTML, {
127+
addLineBreaks: false,
128+
})
123129

124130
const createdAtDate = created ? dayjs.utc(created, dateFormat).toDate() : new Date()
125131
const updatedAtDate = updated ? dayjs.utc(updated, dateFormat).toDate() : createdAtDate
@@ -285,11 +291,13 @@ export class EvernoteConverter implements Converter {
285291
})
286292
}
287293

288-
removeUnnecessaryTopLevelBreaks(noteElement: HTMLElement) {
289-
Array.from(noteElement.querySelectorAll('* > p > br')).forEach((br) => {
294+
unwrapTopLevelBreaks(noteElement: HTMLElement) {
295+
Array.from(noteElement.querySelectorAll('* > p > br, * > div > br')).forEach((br) => {
290296
const parent = br.parentElement!
291-
if (parent.children.length === 1) {
292-
parent.remove()
297+
const children = Array.from(parent.children)
298+
const isEveryChildBR = children.every((child) => child.tagName === 'BR')
299+
if (isEveryChildBR) {
300+
parent.replaceWith(children[0])
293301
}
294302
})
295303
}

packages/ui-services/src/Import/Importer.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { HTMLConverter } from './HTMLConverter/HTMLConverter'
2727
import { SuperConverter } from './SuperConverter/SuperConverter'
2828
import { CleanupItemsFn, Converter, InsertNoteFn, InsertTagFn, LinkItemsFn, UploadFileFn } from './Converter'
2929
import { ConversionResult } from './ConversionResult'
30-
import { FilesClientInterface, SuperConverterServiceInterface } from '@standardnotes/files'
30+
import { FilesClientInterface, SuperConverterHTMLOptions, SuperConverterServiceInterface } from '@standardnotes/files'
3131
import { ContentType } from '@standardnotes/domain-core'
3232

3333
const BytesInOneMegabyte = 1_000_000
@@ -207,12 +207,14 @@ export class Importer {
207207
)
208208
}
209209

210-
convertHTMLToSuper = (html: string): string => {
210+
convertHTMLToSuper = (html: string, options?: SuperConverterHTMLOptions): string => {
211211
if (!this.canUseSuper()) {
212212
return html
213213
}
214214

215-
return this.superConverterService.convertOtherFormatToSuperString(html, 'html')
215+
return this.superConverterService.convertOtherFormatToSuperString(html, 'html', {
216+
html: options,
217+
})
216218
}
217219

218220
convertMarkdownToSuper = (markdown: string): string => {

0 commit comments

Comments
 (0)