UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

81 lines (78 loc) 3.48 kB
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); };