@atlaskit/editor-jira-transformer
Version:
Editor JIRA transformer's
96 lines (95 loc) • 2.65 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) {
var paragraphs = [];
var buffer = [];
var mediaGroupFound = false;
var skipBuffer = false;
var processMedia = function processMedia() {
if (buffer.length) {
var head = buffer[0];
if (getNodeName(head) === 'BR') {
buffer.shift();
}
paragraphs.push(buffer);
buffer = [];
}
};
for (var i = 0, length = p.childNodes.length; i < length; i++) {
var 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) {
var fragment = document.createDocumentFragment();
paragraphs.forEach(function (childP) {
var innerP = document.createElement('p');
childP.forEach(function (child) {
return innerP.appendChild(child);
});
fragment.appendChild(innerP);
});
// Replace old P
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
var parent = p.parentNode;
parent.insertBefore(fragment, p.nextSibling);
// IE11 doesn't support remove
parent.removeChild(p);
}
}
export default function (doc) {
var paragraphs = doc.querySelectorAll('p');
for (var i = 0, length = paragraphs.length; i < length; i++) {
repairParagraph(paragraphs[i]);
}
return doc;
}