-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
79 lines (66 loc) · 2.13 KB
/
index.js
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
'use strict'
/**
* @see https://github.com/syntax-tree/mdast Markdown Abstract Syntax Tree format
* @param {object} options
* @param {object} options.type
* @param {object} options.depth
* @param {object} options.value
* @param {string|object} replaceMarkdown
*/
function replace(options, replaceMarkdown) {
const {
type,
depth,
value
} = options || {};
if (!replaceMarkdown) {
throw new Error('Missing required argument `replaceMarkdown`')
}
if (!type) {
throw new Error('Missing `type` in options')
}
if (!value) {
throw new Error('Missing `value` in options')
}
if (type === 'heading' && !depth) {
throw new Error('Missing `depth` in options')
}
if(typeof replaceMarkdown === 'string'){
replaceMarkdown = this.parse(replaceMarkdown)
}
return transformer;
function transformer(sourceTree) {
const nodeIndex = sourceTree.children.findIndex(
child =>
child.type === type &&
child.depth === depth &&
child.children &&
child.children[0] &&
child.children[0].value === value
);
if (nodeIndex > -1) {
const toNextHeading =
sourceTree.children
.slice(nodeIndex + 1)
.findIndex(
child => child.type === type && child.depth === depth
) + 1;
if (toNextHeading === 0) {
sourceTree.children = sourceTree.children
.slice(0, nodeIndex)
.concat(replaceMarkdown.children);
} else {
sourceTree.children = sourceTree.children
.slice(0, nodeIndex)
.concat(
replaceMarkdown.children,
sourceTree.children.slice(nodeIndex + toNextHeading)
);
}
} else {
sourceTree.children = sourceTree.children.concat(replaceMarkdown.children);
}
return sourceTree;
}
}
module.exports = replace;