Welcome to mirror list, hosted at ThFree Co, Russian Federation.

build_custom_renderer.js « services « rich_content_editor « components « vue_shared « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 108c60c3edb3e87260b5f3a0a9f724b7786b3338 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { union, mapValues } from 'lodash';
import renderBlockHtml from './renderers/render_html_block';
import renderHeading from './renderers/render_heading';
import renderIdentifierInstanceText from './renderers/render_identifier_instance_text';
import renderIdentifierParagraph from './renderers/render_identifier_paragraph';
import renderFontAwesomeHtmlInline from './renderers/render_font_awesome_html_inline';
import renderSoftbreak from './renderers/render_softbreak';
import renderAttributeDefinition from './renderers/render_attribute_definition';
import renderListItem from './renderers/render_list_item';

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;