@@ -75,13 +75,15 @@ export class EvernoteConverter implements Converter {
75
75
. filter ( Boolean ) as EvernoteResource [ ]
76
76
77
77
const contentNode = xmlNote . getElementsByTagName ( 'content' ) [ 0 ]
78
- const contentXmlString = this . getXmlStringFromContentElement ( contentNode )
78
+ let contentXmlString = this . getXmlStringFromContentElement ( contentNode )
79
79
if ( ! contentXmlString ) {
80
80
continue
81
81
}
82
- const contentXml = this . loadXMLString ( contentXmlString , 'html' )
82
+ // Convert any en-media self-closing tags to normal closing tags
83
+ contentXmlString = contentXmlString . replace ( / < ( ( e n - m e d i a ) [ ^ < > ] + ) \/ > / g, '<$1></$2>' )
84
+ const content = this . loadXMLString ( contentXmlString , 'html' )
83
85
84
- const noteElement = contentXml . getElementsByTagName ( 'en-note' ) [ 0 ] as HTMLElement
86
+ const noteElement = content . getElementsByTagName ( 'en-note' ) [ 0 ] as HTMLElement
85
87
86
88
const unorderedLists = Array . from ( noteElement . getElementsByTagName ( 'ul' ) )
87
89
@@ -92,16 +94,7 @@ export class EvernoteConverter implements Converter {
92
94
}
93
95
94
96
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 )
105
98
106
99
// Some notes have <font> tags that contain separate <span> tags with text
107
100
// which causes broken paragraphs in the note.
@@ -113,13 +106,26 @@ export class EvernoteConverter implements Converter {
113
106
fontElement . innerText = fontElement . textContent || ''
114
107
}
115
108
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
+
116
118
let contentHTML = noteElement . innerHTML
117
119
if ( ! canUseSuper ) {
118
120
contentHTML = contentHTML . replace ( / < \/ d i v > / g, '</div>\n' )
119
121
contentHTML = contentHTML . replace ( / < l i [ ^ > ] * > / g, '\n' )
120
122
contentHTML = contentHTML . trim ( )
121
123
}
122
- const text = ! canUseSuper ? this . stripHTML ( contentHTML ) : convertHTMLToSuper ( contentHTML )
124
+ const text = ! canUseSuper
125
+ ? this . stripHTML ( contentHTML )
126
+ : convertHTMLToSuper ( contentHTML , {
127
+ addLineBreaks : false ,
128
+ } )
123
129
124
130
const createdAtDate = created ? dayjs . utc ( created , dateFormat ) . toDate ( ) : new Date ( )
125
131
const updatedAtDate = updated ? dayjs . utc ( updated , dateFormat ) . toDate ( ) : createdAtDate
@@ -285,11 +291,13 @@ export class EvernoteConverter implements Converter {
285
291
} )
286
292
}
287
293
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 ) => {
290
296
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 ] )
293
301
}
294
302
} )
295
303
}
0 commit comments