1 |
|
2 | import core from '@bbob/core';
|
3 | import * as html from '@bbob/html';
|
4 |
|
5 | import { isStringNode, isTagNode } from '@bbob/plugin-helper';
|
6 |
|
7 | const toAST = (source, plugins = [], options = {}) => core(plugins)
|
8 | .process(source, {
|
9 | ...options,
|
10 | render: (input) => html.render(input, { stripTags: true }),
|
11 | }).tree;
|
12 |
|
13 | const isContentEmpty = (content) => (!content || content.length === 0);
|
14 |
|
15 | function 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 |
|
30 | function 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 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | export function render(createElement, source, plugins, options) {
|
51 | return renderToVueNodes(createElement, toAST(source, plugins, options));
|
52 | }
|