UNPKG

1.68 kBJavaScriptView Raw
1'use strict';
2
3const JsonML = require('jsonml.js');
4
5module.exports = function transformer(node) {
6 if (node == null) return;
7
8 if (Array.isArray(node)) {
9 return node.map(transformer);
10 }
11
12 const transformedChildren = transformer(node.children);
13
14 switch (node.type) {
15 case 'root':
16 return ['article'].concat(transformedChildren);
17 case 'heading':
18 return [`h${node.depth}`].concat(transformedChildren);
19 case 'text':
20 return node.value;
21 case 'list':
22 return [node.ordered ? 'ol' : 'ul'].concat(transformedChildren);
23 case 'listItem':
24 return ['li'].concat(transformedChildren);
25 case 'paragraph':
26 return ['p'].concat(transformedChildren);
27 case 'link':
28 return ['a', {
29 title: node.title,
30 href: node.url,
31 }].concat(transformedChildren);
32 case 'image':
33 return ['img', {
34 title: node.title,
35 src: node.url,
36 alt: node.alt,
37 }];
38 case 'table':
39 return ['table', ['tbody'].concat(transformedChildren)];
40 case 'tableRow':
41 return ['tr'].concat(transformedChildren);
42 case 'tableCell':
43 return ['td'].concat(transformedChildren);
44 case 'emphasis':
45 return ['em'].concat(transformedChildren);
46 case 'strong':
47 return ['strong'].concat(transformedChildren);
48 case 'inlineCode':
49 return ['code', node.value];
50 case 'code':
51 return ['pre', { lang: node.lang }, ['code', node.value]];
52 case 'blockquote':
53 return ['blockquote'].concat(transformedChildren);
54 case 'thematicBreak':
55 return ['hr'];
56 case 'html':
57 return JsonML.fromHTMLText(node.value);
58 default:
59 return node;
60 }
61};