import { IResolvedRichTextHtmlResult, IRichTextHtmlResolverInput } from '../rich-text-resolver.models';
import { browserParser, IParser, parserConfiguration, parserHelper } from '../../../parser';
import { BaseRichTextResolver } from '../base/base-rich-text-resolver';
export class RichTextHtmlResolver extends BaseRichTextResolver<
IRichTextHtmlResolverInput,
IResolvedRichTextHtmlResult
> {
constructor(parser?: IParser) {
super(browserParser, parser);
}
resolveRichText(input: IRichTextHtmlResolverInput): IResolvedRichTextHtmlResult {
return this.resolveRichTextInternal(input.element.value, input);
}
private resolveRichTextInternal(html: string, input: IRichTextHtmlResolverInput): IResolvedRichTextHtmlResult {
const parsedResult = super.getParser().parse(
html,
input.element,
{
elementResolver: (element) => {},
contentItemResolver: (element, itemCodename, linkedItemIndex, linkedItem) => {
const parentElement = element.parentElement;
if (parentElement) {
const resolvedItemHtml = input.contentItemResolver
? input.contentItemResolver(itemCodename, linkedItem).contentItemHtml ?? ''
: '';
// resursively resolve HTML
const innerHtml = this.resolveRichTextInternal(resolvedItemHtml, input).html;
// set resolved html
if (input.preserveResolvedObjectTags === true) {
element.setInnerHtml(innerHtml);
} else {
element.setOuterHtml(innerHtml);
}
// set resolved attribute
element.setAttribute(parserHelper.sdkResolvedAttributeName, '1');
}
},
genericElementResolver: (element) => {
// do nothing to generic elements
},
imageResolver: (element, imageId, image) => {
// get image result
const imageResult = input.imageResolver ? input.imageResolver(imageId, image) : undefined;
// html has priority over url resolver
if (imageResult?.imageHtml) {
// replace link html
element.setOuterHtml(imageResult.imageHtml);
} else if (imageResult?.imageUrl) {
// set link url only
element.setAttribute(parserConfiguration.imageElementData.srcAttribute, imageResult.imageUrl);
}
},
urlResolver: (element, linkId, linkText, link) => {
if (input.urlResolver) {
const urlResult = input.urlResolver(linkId, linkText, link);
// html has priority over url resolver
if (urlResult?.linkHtml) {
// replace link html
element.setOuterHtml(urlResult.linkHtml);
} else if (urlResult?.linkUrl) {
// set link url only
element.setAttribute('href', urlResult.linkUrl);
}
}
}
},
input.linkedItems ?? []
);
return {
componentCodenames: parsedResult.componentCodenames,
linkedItemCodenames: parsedResult.linkedItemCodenames,
html: parsedResult.result
};
}
}
export const createRichTextHtmlResolver = (parser?: IParser) => new RichTextHtmlResolver(parser);