@atlaskit/editor-jira-transformer
Version:
Editor JIRA transformer's
94 lines (93 loc) • 2.61 kB
JavaScript
function getNodeName(node) {
return node && node.nodeName.toUpperCase();
}
function isMedia(node) {
if (!node) {
return false;
}
if (getNodeName(node) === 'SPAN' && node instanceof HTMLElement) {
return !!node.querySelector('a > jira-attachment-thumbnail > img[data-attachment-type="thumbnail"], ' + 'a[data-attachment-type="file"]');
}
return false;
}
function repairParagraph(p) {
const paragraphs = [];
let buffer = [];
let mediaGroupFound = false;
let skipBuffer = false;
const processMedia = () => {
if (buffer.length) {
const head = buffer[0];
if (getNodeName(head) === 'BR') {
buffer.shift();
}
paragraphs.push(buffer);
buffer = [];
}
};
for (let i = 0, length = p.childNodes.length; i < length; i++) {
const node = p.childNodes[i];
skipBuffer = false;
// [..., M, BR, ...]
if (getNodeName(node) === 'BR') {
// [mmm, M, BR, ...]
if (mediaGroupFound) {
processMedia();
mediaGroupFound = false;
skipBuffer = true;
}
// [..., BR, M, ...]
if (isMedia(node.nextSibling)) {
mediaGroupFound = true;
if (buffer.length) {
paragraphs.push(buffer);
buffer = [];
}
}
} else if (isMedia(node)) {
// [M, ...]
if (node.previousSibling === null) {
mediaGroupFound = true;
}
} else {
if (mediaGroupFound) {
// Skip white space characters inside media
if (getNodeName(node) === '#TEXT' && (node.textContent || '').trim() === '') {
continue;
}
buffer = (paragraphs.pop() || []).concat(buffer);
mediaGroupFound = false;
}
}
if (!skipBuffer) {
buffer.push(node);
}
}
if (mediaGroupFound) {
processMedia();
} else {
paragraphs.push(buffer);
}
if (paragraphs.length > 1) {
const fragment = document.createDocumentFragment();
paragraphs.forEach(childP => {
const innerP = document.createElement('p');
childP.forEach(child => innerP.appendChild(child));
fragment.appendChild(innerP);
});
// Replace old P
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const parent = p.parentNode;
parent.insertBefore(fragment, p.nextSibling);
// IE11 doesn't support remove
parent.removeChild(p);
}
}
export default function (doc) {
const paragraphs = doc.querySelectorAll('p');
for (let i = 0, length = paragraphs.length; i < length; i++) {
repairParagraph(paragraphs[i]);
}
return doc;
}