UNPKG

kentico-cloud-delivery

Version:

Official Kentico Cloud Delivery SDK

188 lines 9.74 kB
import { parseFragment, serialize, } from 'parse5'; import { RichTextItemDataType } from '../../models'; import { parserConfiguration } from '../parser-configuration'; import { parse5Utils } from './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 = parseFragment(html); // get all linked items var result = this.processRichTextElement(resolverContext, contentItemCodename, elementName, this.getChildNodes(documentFragment), replacement, config, { links: [], linkedItems: [], images: [] }); var resolvedHtml = 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 !== parserConfiguration.imageElementData.nodeName) { // node is not an image return; } // get image id attribute var dataImageIdAttribute = attributes.find(function (m) { return m.name === 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 === parserConfiguration.imageElementData.srcAttribute; }); if (srcAttribute) { srcAttribute.value = linkResult.url; } }; Parse5RichTextParser.prototype.processLink = function (element, replacement, config, result) { var attributes = element.attrs; if (element.nodeName !== 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 === 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 = parseFragment(parse5Utils.createTextNode(''), linkHtml); 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 === 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 = RichTextItemDataType.Item; // get codename of the modular content var dataCodenameAttribute = attributes.find(function (m) { return m.name === parserConfiguration.modularContentElementData.dataCodename; }); if (dataCodenameAttribute == null) { throw Error("The '" + 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 === parserConfiguration.modularContentElementData.relAttribute; }); if (relAttribute && relAttribute.value === 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 = 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; }()); export { Parse5RichTextParser }; //# sourceMappingURL=parse5-rich-text.parser.js.map