-
-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathwithCodeSamples.js
More file actions
67 lines (61 loc) · 2.12 KB
/
Copy pathwithCodeSamples.js
File metadata and controls
67 lines (61 loc) · 2.12 KB
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
const visit = require('unist-util-visit')
const redent = require('redent')
const { addImport, highlightCode } = require('./utils')
module.exports = () => {
return (tree) => {
let component
let resizableComponent
visit(tree, 'code', (node) => {
if (node.lang !== 'html') return
let hasPreview = false
let previewClassName
let previewCode
let previewSrc
let snippet = node.value
.replace(
/<template\s+(?:class="([^"]*)"\s+)?preview(?:\s+class="([^"]*)")?>(.*?)<\/template>/is,
(m, class1, class2, content) => {
hasPreview = true
previewClassName = class1 || class2
previewCode = content
return ''
}
)
.trim()
if (!hasPreview) {
snippet = node.value
.replace(
/<iframe\s+(?:src="([^"]*)"\s+)?preview(?:\s+src="([^"]*)")?>\s*<\/iframe>/is,
(m, src1, src2) => {
hasPreview = true
previewSrc = src1 || src2
return ''
}
)
.trim()
}
if (!hasPreview) return
if (!snippet) snippet = previewCode
snippet = highlightCode(redent(snippet).trim(), 'html')
const meta = node.meta ? node.meta.trim().split(/\s+/) : []
const resizable = meta.find((x) => /^resizable(:|$)/.test(x))
const color = meta.find((x) => !/^resizable(:|$)/.test(x))
if (resizable && !resizableComponent) {
resizableComponent = addImport(tree, '@/components/CodeSample', 'ResizableCodeSample')
} else if (!resizable && !component) {
component = addImport(tree, '@/components/CodeSample', 'CodeSample')
}
node.type = 'jsx'
node.value = `
<${resizable ? resizableComponent : component}
preview={${JSON.stringify(previewCode)}}
src={${JSON.stringify(previewSrc)}}
snippet={${JSON.stringify(snippet)}}
previewClassName={${JSON.stringify(previewClassName)}}
color={${JSON.stringify(color)}}
min={${JSON.stringify(resizable === 'resizable:min')}}
/>
`.trim()
})
}
}