42 lines
2 KiB
JavaScript
42 lines
2 KiB
JavaScript
import { union, mapValues } from 'lodash';
|
|
import renderAttributeDefinition from './renderers/render_attribute_definition';
|
|
import renderFontAwesomeHtmlInline from './renderers/render_font_awesome_html_inline';
|
|
import renderHeading from './renderers/render_heading';
|
|
import renderBlockHtml from './renderers/render_html_block';
|
|
import renderIdentifierInstanceText from './renderers/render_identifier_instance_text';
|
|
import renderIdentifierParagraph from './renderers/render_identifier_paragraph';
|
|
import renderListItem from './renderers/render_list_item';
|
|
import renderSoftbreak from './renderers/render_softbreak';
|
|
|
|
const htmlInlineRenderers = [renderFontAwesomeHtmlInline];
|
|
const htmlBlockRenderers = [renderBlockHtml];
|
|
const headingRenderers = [renderHeading];
|
|
const paragraphRenderers = [renderIdentifierParagraph, renderBlockHtml];
|
|
const textRenderers = [renderIdentifierInstanceText, renderAttributeDefinition];
|
|
const listItemRenderers = [renderListItem];
|
|
const softbreakRenderers = [renderSoftbreak];
|
|
|
|
const executeRenderer = (renderers, node, context) => {
|
|
const availableRenderer = renderers.find((renderer) => renderer.canRender(node, context));
|
|
|
|
return availableRenderer ? availableRenderer.render(node, context) : context.origin();
|
|
};
|
|
|
|
const buildCustomHTMLRenderer = (customRenderers) => {
|
|
const renderersByType = {
|
|
...customRenderers,
|
|
htmlBlock: union(htmlBlockRenderers, customRenderers?.htmlBlock),
|
|
htmlInline: union(htmlInlineRenderers, customRenderers?.htmlInline),
|
|
heading: union(headingRenderers, customRenderers?.heading),
|
|
item: union(listItemRenderers, customRenderers?.listItem),
|
|
paragraph: union(paragraphRenderers, customRenderers?.paragraph),
|
|
text: union(textRenderers, customRenderers?.text),
|
|
softbreak: union(softbreakRenderers, customRenderers?.softbreak),
|
|
};
|
|
|
|
return mapValues(renderersByType, (renderers) => {
|
|
return (node, context) => executeRenderer(renderers, node, context);
|
|
});
|
|
};
|
|
|
|
export default buildCustomHTMLRenderer;
|