kentico-cloud-delivery
Version:
Official Kentico Cloud Delivery SDK
106 lines • 5.42 kB
JavaScript
exports.__esModule = true;
var BrowserRichTextParser = /** @class */ (function () {
function BrowserRichTextParser() {
this.modularContentWrapperElem = 'div';
this.modularContent = {
type: 'application/kenticocloud',
dataType: 'data-type',
dataCodename: 'data-codename'
};
this.link = {
nodeName: 'a',
dataItemId: 'data-item-id'
};
}
BrowserRichTextParser.prototype.resolveRichTextField = function (html, replacement, config) {
try {
var doc = this.createWrapperElement(html);
// get all modular content items
var result = this.processRichTextField(doc.children, replacement, config, {
links: [],
modularContentItems: []
});
return {
links: result.links,
modularContentItems: result.modularContentItems,
resolvedHtml: doc.innerHTML
};
}
catch (error) {
throw Error('Parsing HTML failed:' + error);
}
};
BrowserRichTextParser.prototype.createWrapperElement = function (html) {
var element = document.createElement(this.modularContentWrapperElem);
element.innerHTML = html;
return element;
};
BrowserRichTextParser.prototype.processRichTextField = function (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;
if (element.attributes && typeAttribute && typeAttribute.value && typeAttribute.value.toLowerCase() === this.modularContent.type.toLowerCase()) {
// node is modular content object
var dataCodenameAttribute = element.attributes.getNamedItem(this.modularContent.dataCodename);
var dataTypeAttribute = element.attributes.getNamedItem(this.modularContent.dataType);
var modularItem = {
dataCodename: dataCodenameAttribute ? dataCodenameAttribute.value : '',
dataType: dataTypeAttribute ? dataTypeAttribute.value : ''
};
// add to result
result.modularContentItems.push(modularItem);
// replace html
var parentElement = element.parentElement;
if (!parentElement) {
console.warn("Could not replace modular content '" + modularItem.dataCodename + "' of '" + modularItem.dataType + "' because parent node is null. Please report this error if you are seeing this.");
}
else {
// create new element
var newElem = document.createElement(config.modularContentWrapperTag);
newElem.innerHTML = replacement.getModularContentHtml(modularItem.dataCodename);
// add classes
newElem.className = config.modularContentWrapperClasses.map(function (m) { return m; }).join(' ');
// remove original object element
parentElement.replaceChild(newElem, element);
}
}
if (element.nodeName.toLowerCase() === this.link.nodeName.toLowerCase()) {
var dataItemIdAttribute = element.attributes.getNamedItem(this.link.dataItemId);
if (dataItemIdAttribute) {
var link = {
dataItemId: dataItemIdAttribute ? dataItemIdAttribute.value : ''
};
// add to result
result.links.push(link);
var resolvedUrl = replacement.getLinkUrl(link.dataItemId);
// add url to link
var hrefAttribute = element.attributes.getNamedItem('href');
if (!hrefAttribute) {
// href attribute is missing
if (config.enableAdvancedLogging) {
console.warn("Cannot set url '" + resolvedUrl + "' because 'href' attribute is not present in the <a> tag. Please report this issue if you are seeing this.");
}
}
else {
hrefAttribute.value = resolvedUrl;
}
}
}
// recursively process child nodes
if (element.children && element.children.length > 0) {
this.processRichTextField(element.children, replacement, config, result);
}
}
}
return result;
};
return BrowserRichTextParser;
}());
exports.BrowserRichTextParser = BrowserRichTextParser;
//# sourceMappingURL=browser-rich-text.parser.js.map
;