UNPKG

1.43 kBJavaScriptView Raw
1/* eslint-disable no-use-before-define,import/prefer-default-export */
2import core from '@bbob/core';
3import * as html from '@bbob/html';
4
5import { isStringNode, isTagNode } from '@bbob/plugin-helper';
6
7const toAST = (source, plugins = [], options = {}) => core(plugins)
8 .process(source, {
9 ...options,
10 render: (input) => html.render(input, { stripTags: true }),
11 }).tree;
12
13const isContentEmpty = (content) => (!content || content.length === 0);
14
15function tagToVueNode(createElement, node, index) {
16 const { class: className, style, ...domProps } = node.attrs || {};
17
18 return createElement(
19 node.tag,
20 {
21 key: index,
22 class: className,
23 style,
24 domProps,
25 },
26 isContentEmpty(node.content) ? null : renderToVueNodes(createElement, node.content),
27 );
28}
29
30function renderToVueNodes(createElement, nodes) {
31 return [].concat(nodes).reduce((arr, node, index) => {
32 if (isTagNode(node)) {
33 arr.push(tagToVueNode(createElement, node, index));
34 } else if (isStringNode(node)) {
35 arr.push(node);
36 }
37
38 return arr;
39 }, []);
40}
41
42/**
43 * Converts string to Vue 2 VNodes
44 * @param createElement {CreateElement}
45 * @param source {String}
46 * @param plugins {Array<Function>}
47 * @param options {Object}
48 * @returns {Array<VNode>}
49 */
50export function render(createElement, source, plugins, options) {
51 return renderToVueNodes(createElement, toAST(source, plugins, options));
52}