UNPKG

kentico-cloud-delivery

Version:

Official Kentico Cloud Delivery SDK

159 lines 9.76 kB
import { RichTextItemDataType } from '../../models'; import { parserConfiguration } from '../parser-configuration'; var BrowserRichTextParser = /** @class */ (function () { function BrowserRichTextParser() { } BrowserRichTextParser.prototype.resolveRichTextElement = function (resolverContext, contentItemCodename, html, elementName, replacement, config) { var doc = this.createWrapperElement(html); // get all linked items var result = this.processRichTextElement(resolverContext, contentItemCodename, elementName, doc.children, replacement, config, { links: [], linkedItems: [], images: [] }); return { links: result.links, linkedItems: result.linkedItems, images: result.images, resolvedHtml: doc.innerHTML }; }; BrowserRichTextParser.prototype.createWrapperElement = function (html) { var element = document.createElement(parserConfiguration.linkedItemWrapperElem); element.innerHTML = html; return element; }; BrowserRichTextParser.prototype.processRichTextElement = function (resolverContext, contentItemCodename, elementName, htmlCollection, replacement, config, result) { if (!htmlCollection || htmlCollection.length === 0) { // there are no more nodes } else { // extract objects for (var i = 0; i < htmlCollection.length; i++) { var element = htmlCollection[i]; var typeAttribute = element.attributes ? element.attributes.getNamedItem('type') : undefined; // process linked items (modular items) if (element.attributes && typeAttribute && typeAttribute.value && typeAttribute.value.toLowerCase() === parserConfiguration.modularContentElementData.type.toLowerCase()) { var dataCodenameAttribute = element.attributes.getNamedItem(parserConfiguration.modularContentElementData.dataCodename); var dataTypeAttribute = element.attributes.getNamedItem(parserConfiguration.modularContentElementData.dataType); if (!dataTypeAttribute) { throw Error('Missing data type attribute. This is likely an error caused by invalid response.'); } var relAttribute = element.attributes.getNamedItem(parserConfiguration.modularContentElementData.relAttribute); var itemType = 'linkedItem'; if (relAttribute && relAttribute.value === parserConfiguration.modularContentElementData.componentRel) { itemType = 'component'; } // prepare link item object var linkItemContentObject = { dataCodename: dataCodenameAttribute ? dataCodenameAttribute.value : '', dataType: dataTypeAttribute ? dataTypeAttribute.value : '', itemType: itemType }; // replace html var parentElement = element.parentElement; if (!parentElement) { console.warn("Could not replace linked item '" + linkItemContentObject.dataCodename + "' of '" + linkItemContentObject.dataType + "' because parent node is undefined. Please report this error if you are seeing this."); } else { if (dataTypeAttribute.value === 'item') { // add to result result.linkedItems.push(linkItemContentObject); // create new element var newElem = document.createElement(config.linkedItemWrapperTag); // get type of resolving item var type = void 0; type = RichTextItemDataType.Item; var linkedItemHtml = replacement.getLinkedItemHtml(linkItemContentObject.dataCodename, type); // recursively run resolver on the HTML obtained by resolver newElem.innerHTML = this.resolveRichTextElement('nested', linkItemContentObject.dataCodename, linkedItemHtml, elementName, replacement, config).resolvedHtml; // add classes newElem.className = config.linkedItemWrapperClasses.map(function (m) { return m; }).join(' '); // replace original node with new one parentElement.replaceChild(newElem, element); } else { if (config.enableAdvancedLogging) { console.warn("Rich text element contains object with unsupported data type '" + dataTypeAttribute.value + "'"); } } } } // process links if (element.nodeName.toLowerCase() === parserConfiguration.linkElementData.nodeName.toLowerCase()) { var dataItemIdAttribute = element.attributes.getNamedItem(parserConfiguration.linkElementData.dataItemId); if (dataItemIdAttribute) { var link = { dataItemId: dataItemIdAttribute ? dataItemIdAttribute.value : '' }; // add to result result.links.push(link); // get original link text (the one inside <a> tag) var linkText = element.innerHTML; var urlSlugResult = replacement.getUrlSlugResult(link.dataItemId, linkText); // html has priority over url resolver if (urlSlugResult.html) { // replace link html var linkHtml = urlSlugResult.html; element.outerHTML = linkHtml ? linkHtml : ''; var parent_1 = element.parentNode; if (parent_1) { parent_1.replaceChild(element, element); } } else if (urlSlugResult.url) { // set link url only var hrefAttribute = element.attributes.getNamedItem('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.\n Please report this issue if you are seeing this.\n 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 : ''; } } } } // process images if (element.nodeName.toLowerCase() === parserConfiguration.imageElementData.nodeName.toLowerCase()) { var dataImageIdAttribute = element.attributes.getNamedItem(parserConfiguration.imageElementData.dataImageId); // continue only if data image id is present. There could be regular img tags included if (dataImageIdAttribute) { var imageObj = { imageId: dataImageIdAttribute.value }; result.images.push(imageObj); // get image result var imageResult = replacement.getImageResult(resolverContext, contentItemCodename, imageObj.imageId, elementName); // get src attribute of img tag var srcAttribute = element.attributes.getNamedItem(parserConfiguration.imageElementData.srcAttribute); if (!srcAttribute) { throw Error("Attribute '" + parserConfiguration.imageElementData.srcAttribute + "' is missing. Source element: " + elementName); } // set new image url srcAttribute.value = imageResult.url; } } // recursively process child nodes if (element.children && element.children.length > 0) { this.processRichTextElement(resolverContext, contentItemCodename, elementName, element.children, replacement, config, result); } } } return result; }; return BrowserRichTextParser; }()); export { BrowserRichTextParser }; //# sourceMappingURL=browser-rich-text.parser.js.map