kentico-cloud-delivery
Version:
Official Kentico Cloud Delivery SDK
190 lines • 10.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var parse5_1 = require("parse5");
var models_1 = require("../../models");
var parser_configuration_1 = require("../parser-configuration");
var parse5utils_1 = require("./parse5utils");
var Parse5RichTextParser = /** @class */ (function () {
function Parse5RichTextParser() {
this.resolvedLinkedItemAttribute = 'data-sdk-resolved';
}
Parse5RichTextParser.prototype.resolveRichTextElement = function (resolverContext, contentItemCodename, html, elementName, replacement, config) {
// create document
var documentFragment = parse5_1.parseFragment(html);
// get all linked items
var result = this.processRichTextElement(resolverContext, contentItemCodename, elementName, this.getChildNodes(documentFragment), replacement, config, {
links: [],
linkedItems: [],
images: []
});
var resolvedHtml = parse5_1.serialize(documentFragment);
return {
links: result.links,
linkedItems: result.linkedItems,
images: result.images,
resolvedHtml: resolvedHtml
};
};
Parse5RichTextParser.prototype.processRichTextElement = function (resolverContext, contentItemCodename, elementName, elements, replacement, config, result) {
var _this = this;
if (!elements || elements.length === 0) {
// there are no more elements
}
else {
elements.forEach(function (element) {
if (element.attrs) {
_this.processModularContentItem(resolverContext, elementName, element, replacement, config, result);
_this.processImage(resolverContext, contentItemCodename, elementName, element, replacement, config, result);
_this.processLink(element, replacement, config, result);
}
if (element.childNodes) {
// recursively process all childs
_this.processRichTextElement(resolverContext, contentItemCodename, elementName, _this.getChildNodes(element), replacement, config, result);
}
});
}
return result;
};
Parse5RichTextParser.prototype.processImage = function (resolverContext, contentItemCodename, elementName, element, replacement, config, result) {
var attributes = element.attrs;
if (element.nodeName !== parser_configuration_1.parserConfiguration.imageElementData.nodeName) {
// node is not an image
return;
}
// get image id attribute
var dataImageIdAttribute = attributes.find(function (m) { return m.name === parser_configuration_1.parserConfiguration.imageElementData.dataImageId; });
if (!dataImageIdAttribute) {
// image tag does not have image id attribute
return;
}
// prepare link object
var image = {
imageId: dataImageIdAttribute.value
};
// add link to result
result.images.push(image);
var linkResult = replacement.getImageResult(resolverContext, contentItemCodename, image.imageId, elementName);
// set url of image
var srcAttribute = attributes.find(function (m) { return m.name === parser_configuration_1.parserConfiguration.imageElementData.srcAttribute; });
if (srcAttribute) {
srcAttribute.value = linkResult.url;
}
};
Parse5RichTextParser.prototype.processLink = function (element, replacement, config, result) {
var attributes = element.attrs;
if (element.nodeName !== parser_configuration_1.parserConfiguration.linkElementData.nodeName) {
// node is not a link
return;
}
// get all links which have item it attribute, ignore all other links (they can be regular links in rich text)
var dataItemIdAttribute = attributes.find(function (m) { return m.name === parser_configuration_1.parserConfiguration.linkElementData.dataItemId; });
if (!dataItemIdAttribute) {
// its either a regular link or the attribute is not defined
return;
}
// prepare link object
var link = {
dataItemId: dataItemIdAttribute ? dataItemIdAttribute.value : ''
};
// add link to result
result.links.push(link);
// get original link text (the one inside <a> tag from response)
var originalLinkText = undefined;
var linkTextNode = element.childNodes[0];
if (linkTextNode) {
originalLinkText = linkTextNode.value;
}
var urlSlugResult = replacement.getUrlSlugResult(link.dataItemId, originalLinkText || '');
// html has priority over url
if (urlSlugResult.html) {
// replace entire link html
var linkHtml = urlSlugResult.html
? urlSlugResult.html
: '';
if (linkHtml) {
var newNode = parse5_1.parseFragment(parse5utils_1.parse5Utils.createTextNode(''), linkHtml);
parse5utils_1.parse5Utils.replaceNode(element, newNode.childNodes[0]);
}
}
else if (urlSlugResult.url) {
// replace just link href
var hrefAttribute = attributes.find(function (m) { return m.name === 'href'; });
if (!hrefAttribute) {
// href attribute is missing
if (config.enableAdvancedLogging) {
console.warn("Cannot set url '" + urlSlugResult + "' because 'href' attribute is not present in the <a> tag. Please report this issue if you are seeing this. This warning can be turned off by disabling 'enableAdvancedLogging' option.");
}
}
else {
// get link url
var linkUrlResult = typeof urlSlugResult === 'string'
? urlSlugResult
: urlSlugResult.url;
hrefAttribute.value = linkUrlResult ? linkUrlResult : '';
}
}
};
Parse5RichTextParser.prototype.processModularContentItem = function (resolverContext, elementName, element, replacement, config, result) {
var _this = this;
var attributes = element.attrs;
var dataTypeAttribute = attributes.find(function (m) { return m.name === parser_configuration_1.parserConfiguration.modularContentElementData.dataType; });
var resolvedDataAttribute = attributes.find(function (m) { return m.name === _this.resolvedLinkedItemAttribute; });
// process linked itmes
if (dataTypeAttribute && !resolvedDataAttribute) {
// get type of resolving item
var type = void 0;
if (dataTypeAttribute.value === 'item') {
type = models_1.RichTextItemDataType.Item;
// get codename of the modular content
var dataCodenameAttribute = attributes.find(function (m) { return m.name === parser_configuration_1.parserConfiguration.modularContentElementData.dataCodename; });
if (dataCodenameAttribute == null) {
throw Error("The '" + parser_configuration_1.parserConfiguration.modularContentElementData.dataCodename + "' attribute is missing and therefore linked item cannot be retrieved");
}
var itemCodename = dataCodenameAttribute.value;
var itemType = 'linkedItem';
// get rel attribute for components
var relAttribute = attributes.find(function (m) { return m.name === parser_configuration_1.parserConfiguration.modularContentElementData.relAttribute; });
if (relAttribute && relAttribute.value === parser_configuration_1.parserConfiguration.modularContentElementData.componentRel) {
itemType = 'component';
}
var linkedItem = {
dataCodename: dataCodenameAttribute ? dataCodenameAttribute.value : '',
dataType: dataTypeAttribute ? dataTypeAttribute.value : '',
itemType: itemType
};
// add to result
result.linkedItems.push(linkedItem);
var linkedItemHtml = replacement.getLinkedItemHtml(itemCodename, type);
// flag element as resolved to avoid duplicate resolving
element.attrs.push({
name: this.resolvedLinkedItemAttribute,
value: '1'
});
// get html
var resultHtml = this.resolveRichTextElement('nested', itemCodename, linkedItemHtml, elementName, replacement, config).resolvedHtml;
// replace 'object' tag name
element.tagName = config.linkedItemWrapperTag;
// add classes
element.attrs.push({
name: 'class',
value: config.linkedItemWrapperClasses.map(function (m) { return m; }).join(' ')
});
// get serialized set of nodes from HTML
var serializedChildNodes = parse5_1.parseFragment(resultHtml);
// add child nodes
element.childNodes = serializedChildNodes.childNodes;
}
else {
if (config.enableAdvancedLogging) {
console.warn("Rich text element contains object with unsupported data type '" + dataTypeAttribute.value + "'");
}
}
}
};
Parse5RichTextParser.prototype.getChildNodes = function (documentFragment) {
return documentFragment.childNodes;
};
return Parse5RichTextParser;
}());
exports.Parse5RichTextParser = Parse5RichTextParser;
//# sourceMappingURL=parse5-rich-text.parser.js.map
;