datocms-contentful-to-structured-text
Version:
Convert Contentful Rich Text to a valid DatoCMS Structured Text `dast` document
77 lines • 3.32 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.liftAssets = void 0;
var rich_text_types_1 = require("@contentful/rich-text-types");
var liftAssets = function (richText) {
var visit = function (node, cb, index, parents) {
if (index === void 0) { index = 0; }
if (parents === void 0) { parents = []; }
if (node.nodeType !== 'text' && node.content && node.content.length > 0) {
node.content.forEach(function (child, index) {
visit(child, cb, index, __spreadArrays(parents, [node]));
});
}
cb(node, index, parents);
};
var liftedImages = new WeakSet();
visit(richText, function (node, index, parents) {
if (!node ||
node.nodeType !== rich_text_types_1.BLOCKS.EMBEDDED_ASSET ||
liftedImages.has(node) ||
parents.length === 1 // is a top level asset
) {
return;
}
var assetParent = parents[parents.length - 1];
assetParent.content.splice(index, 1);
var currentParentIndex = parents.length;
var splitChildrenIndex = index;
var contentAfterSplitPoint = [];
while (--currentParentIndex > 0) {
var parent_1 = parents[currentParentIndex];
var parentsParent = parents[currentParentIndex - 1];
// to do: check if this is ok
var parentsParentContentWithType = parentsParent.content;
contentAfterSplitPoint = parent_1.content.splice(splitChildrenIndex);
splitChildrenIndex = parentsParentContentWithType.indexOf(parent_1);
var nodeInserted = false;
if (currentParentIndex === 1) {
splitChildrenIndex += 1;
parentsParent.content.splice(splitChildrenIndex, 0, node);
liftedImages.add(node);
nodeInserted = true;
}
splitChildrenIndex += 1;
if (contentAfterSplitPoint.length > 0) {
var nodeToinsert = __assign(__assign({}, parent_1), { content: contentAfterSplitPoint });
// to do: check if this is ok
parentsParent.content.splice(splitChildrenIndex, 0, nodeToinsert);
}
// Remove the parent if empty
if (parent_1.content.length === 0) {
splitChildrenIndex -= 1;
parentsParent.content.splice(nodeInserted ? splitChildrenIndex - 1 : splitChildrenIndex, 1);
}
}
});
};
exports.liftAssets = liftAssets;
//# sourceMappingURL=lift-assets.js.map