@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
81 lines (78 loc) • 3.48 kB
JavaScript
import { isNestedTableExtension } from '@atlaskit/adf-utils/transforms';
import { reduce } from '@atlaskit/adf-utils/traverse';
/**
* Traverses a JSON document and counts the number of unique elements, text formatting and macros.
*
**/
export var getPageElementCounts = function getPageElementCounts(doc) {
var pageElementCounts = {
elements: {},
textFormats: {},
macros: {},
unexpectedElements: {}
};
reduce(doc, function (acc, node) {
if (node.type === 'text') {
var _acc$elements$node$ty;
if (node.marks) {
node.marks.forEach(function (mark) {
var _acc$textFormats$mark;
var markType = mark.type;
acc.textFormats[markType] = ((_acc$textFormats$mark = acc.textFormats[markType]) !== null && _acc$textFormats$mark !== void 0 ? _acc$textFormats$mark : 0) + 1;
});
}
acc.elements[node.type] = ((_acc$elements$node$ty = acc.elements[node.type]) !== null && _acc$elements$node$ty !== void 0 ? _acc$elements$node$ty : 0) + 1;
}
// If the node is a 'macro'or extension
else if (node.type === 'extension' || node.type === 'inlineExtension' || node.type === 'bodiedExtension' || node.type === 'multiBodiedExtension' || node.type === 'extensionFrame') {
if ('attrs' in node && node.attrs && 'extensionKey' in node.attrs && node.attrs.extensionKey) {
var _acc$macros$extension;
var extensionKey = node.attrs.extensionKey;
// If there is a nested table extension
if (isNestedTableExtension(node)) {
if ('parameters' in node.attrs && node.attrs.parameters && 'adf' in node.attrs.parameters) {
// Check to see if the ADF contains a nested table
var adfString = node.attrs.parameters.adf;
var adf = JSON.parse(adfString);
if (adfString.includes('{"type":"table"')) {
if (getHasNestedTable(adf)) {
var _acc$unexpectedElemen;
acc.unexpectedElements['tablesNestedMoreThanOnce'] = ((_acc$unexpectedElemen = acc.unexpectedElements['tablesNestedMoreThanOnce']) !== null && _acc$unexpectedElemen !== void 0 ? _acc$unexpectedElemen : 0) + 1;
}
}
}
}
// If macros extensionKey has <UUID>/<UUID>/static/ prepended to it, remove the prefix
if (extensionKey.includes('/static/')) {
var extensionKeyParts = extensionKey.split('/');
extensionKey = extensionKeyParts[extensionKeyParts.length - 1];
}
acc.macros[extensionKey] = ((_acc$macros$extension = acc.macros[extensionKey]) !== null && _acc$macros$extension !== void 0 ? _acc$macros$extension : 0) + 1;
}
} else {
var _acc$elements$node$ty2;
acc.elements[node.type] = ((_acc$elements$node$ty2 = acc.elements[node.type]) !== null && _acc$elements$node$ty2 !== void 0 ? _acc$elements$node$ty2 : 0) + 1;
}
return acc;
}, pageElementCounts);
return pageElementCounts;
};
/**
* Return true is the JSON document contains a table nested within a table
*/
var getHasNestedTable = function getHasNestedTable(node) {
return reduce(node, function (hasNestedTable, node) {
if (hasNestedTable) {
return hasNestedTable;
}
if (node.type === 'table') {
return reduce(node, function (acc, node) {
if (node.type === 'table') {
return true;
}
return acc;
}, false);
}
return hasNestedTable;
}, false);
};