fix: Fixed issues with lists and indents when importing from Evernote

This commit is contained in:
Aman Harwara
2023-12-06 16:49:55 +05:30
parent 09c95b782d
commit d16ca3305d

View File

@@ -67,29 +67,18 @@ export class EvernoteConverter implements Converter {
}
const contentXml = this.loadXMLString(contentXmlString, 'html')
const noteElement = contentXml.getElementsByTagName('en-note')[0]
const noteElement = contentXml.getElementsByTagName('en-note')[0] as HTMLElement
const unorderedLists = Array.from(noteElement.getElementsByTagName('ul'))
if (canUseSuper) {
this.convertTopLevelDivsToParagraphs(noteElement)
this.convertListsToSuperFormatIfApplicable(unorderedLists)
this.convertLeftPaddingToSuperIndent(noteElement)
}
// Remove empty lists and orphan list items
Array.from(noteElement.getElementsByTagName('ul')).forEach((ul) => {
if (ul.children.length === 0) {
ul.remove()
}
})
Array.from(noteElement.getElementsByTagName('ol')).forEach((ol) => {
if (ol.children.length === 0) {
ol.remove()
}
})
Array.from(noteElement.getElementsByTagName('li')).forEach((li) => {
if (li.children.length === 0 || li.closest('ul, ol') === null) {
li.remove()
}
})
this.removeEmptyAndOrphanListElements(noteElement)
this.removeUnnecessaryTopLevelBreaks(noteElement)
const mediaElements = Array.from(noteElement.getElementsByTagName('en-media'))
this.replaceMediaElementsWithResources(mediaElements, resources)
@@ -212,6 +201,14 @@ export class EvernoteConverter implements Converter {
} as EvernoteResource
}
convertTopLevelDivsToParagraphs(noteElement: HTMLElement) {
noteElement.querySelectorAll('div').forEach((div) => {
if (div.parentElement === noteElement) {
changeElementTag(div, 'p')
}
})
}
convertListsToSuperFormatIfApplicable(unorderedLists: HTMLUListElement[]) {
for (const unorderedList of unorderedLists) {
if (unorderedList.style.getPropertyValue('--en-todo') !== 'true') {
@@ -227,6 +224,42 @@ export class EvernoteConverter implements Converter {
}
}
convertLeftPaddingToSuperIndent(noteElement: HTMLElement) {
noteElement.querySelectorAll('p').forEach((element) => {
const paddingLeft = element.style.paddingLeft
if (paddingLeft) {
// Lexical uses multiples of 20px for indent while Evernote uses multiples of 40px
const indent = parseInt(paddingLeft) / 2
element.style.textIndent = `${indent}px`
element.style.paddingLeft = ''
}
})
}
removeEmptyAndOrphanListElements(noteElement: HTMLElement) {
Array.from(noteElement.getElementsByTagName('ul, ol')).forEach((list) => {
if (list.children.length === 0) {
list.remove()
}
})
Array.from(noteElement.getElementsByTagName('li')).forEach((li) => {
const isEmpty = li.textContent === null || li.textContent.trim() === ''
const isOrphan = !li.closest('ul, ol')
if (isEmpty || isOrphan) {
li.remove()
}
})
}
removeUnnecessaryTopLevelBreaks(noteElement: HTMLElement) {
Array.from(noteElement.querySelectorAll('* > p > br')).forEach((br) => {
const parent = br.parentElement!
if (parent.children.length === 1) {
parent.remove()
}
})
}
replaceMediaElementsWithResources(mediaElements: Element[], resources: EvernoteResource[]): number {
let replacedElements = 0
for (const mediaElement of mediaElements) {
@@ -279,3 +312,10 @@ export class EvernoteConverter implements Converter {
return tmp.textContent || tmp.innerText || ''
}
}
function changeElementTag(element: HTMLElement, newTag: string) {
const attributes = Array.prototype.slice.call(element.attributes)
element.outerHTML = `<${newTag} ${attributes.map((attr) => attr.name + '="' + attr.value + '"').join(' ')}>${
element.innerHTML
}</${newTag}>`
}