kentico-cloud-delivery
Version:
Official Kentico Cloud Delivery SDK
159 lines • 9.76 kB
JavaScript
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