1
1
const visit = require ( "unist-util-visit" ) ;
2
2
const { parseComponent } = require ( "vue-template-compiler" ) ;
3
3
const { isCodeVueSfc } = require ( "vue-inbrowser-compiler-utils" ) ;
4
+ const getImports = require ( "./getImports" ) ;
4
5
5
- export default function attacher ( { liveFilter } = { } ) {
6
- return ( ast ) => visit ( ast , "code" , visitor ) ;
7
-
6
+ function getAttacher ( { liveFilter } = { } ) {
8
7
function visitor ( node ) {
9
- let { lang } = node ;
8
+ let { lang, meta } = node ;
10
9
11
10
if (
12
11
liveFilter
13
- ? ! liveFilter ( lang )
14
- : ! / l i v e $ / . test ( lang ) && ! / l i v e / . test ( lang )
12
+ ? ! liveFilter ( lang , meta )
13
+ : ! / l i v e $ / . test ( meta ) && ! / l i v e / . test ( meta )
15
14
) {
16
15
return ;
17
16
}
@@ -35,17 +34,40 @@ export default function attacher({ liveFilter } = {}) {
35
34
// add this as a prop
36
35
const scr = getScript ( code ) ;
37
36
38
- const langArray = lang . split ( " " ) ;
39
- const langClean = langArray [ 0 ] ;
37
+ const requires = getImports ( scr ) . map (
38
+ ( mod ) => `'${ mod } ': require('${ mod } ')`
39
+ ) ;
40
+
40
41
const codeClean = code . replace ( / \` / g, "\\`" ) . replace ( / \$ / g, "\\$" ) ;
41
- const editorProps = langArray . find ( ( l ) => / ^ \{ .+ \} $ / . test ( l ) ) ;
42
- const jsx = langArray . length > 2 && langArray [ 1 ] === "jsx" ? "jsx " : "" ; // to enable jsx, we want ```vue jsx live or ```jsx jsx live
42
+
43
+ const editorPropsArray = / \{ .+ \} / . exec ( meta ) ;
44
+ const editorProps = editorPropsArray ? editorPropsArray [ 0 ] : undefined ;
45
+ const metaArray = meta ? meta . replace ( editorProps , "" ) . split ( " " ) : [ ] ;
46
+ const jsx = metaArray . length > 2 && metaArray [ 1 ] === "jsx" ? "jsx " : "" ; // to enable jsx, we want ```vue jsx live or ```jsx jsx live
43
47
const markdownGenerated = `<vue-live ${ jsx }
44
- :layoutProps="{lang:'${ langClean } '}"
45
- :code="\`${ codeClean } \`"
46
- ${ editorProps ? ` :editorProps="${ editorProps } "` : "" }
47
- />` ;
48
+ :layoutProps="{lang:'${ lang } '}"${
49
+ requires . length
50
+ ? `
51
+ :requires="{${ requires . join ( "," ) } }"`
52
+ : ""
53
+ }
54
+ :code="\`${ codeClean } \`" ${
55
+ editorProps
56
+ ? `
57
+ :editorProps="${ editorProps
58
+ . replace ( / " / g, """ )
59
+ . replace ( / < / g, "<" )
60
+ . replace ( / > / g, ">" ) } "`
61
+ : ""
62
+ } />`;
48
63
64
+ node . type = "html" ;
49
65
node . value = markdownGenerated ;
50
66
}
67
+
68
+ return function attacher ( ) {
69
+ return ( ast ) => visit ( ast , "code" , visitor ) ;
70
+ } ;
51
71
}
72
+
73
+ module . exports = getAttacher ;
0 commit comments