@@ -90,6 +90,28 @@ function findSelector(start, selector) {
90
90
}
91
91
}
92
92
93
+ function findDemoWrapper ( el ) {
94
+ while ( el && el . parentNode ) {
95
+ if ( matches . call ( el . parentNode , '.demo_wrapper' ) ) {
96
+ return el . parentNode ;
97
+ }
98
+ el = el . parentNode ;
99
+ }
100
+ }
101
+
102
+ function findPreForToolbarBtn ( el ) {
103
+ while ( el ) {
104
+ if ( el . nodeName === "PRE" ) {
105
+ return el ;
106
+ }
107
+ if ( matches . call ( el , '.toolbar' ) ) {
108
+ el = findSelector ( el , 'pre' ) ;
109
+ } else {
110
+ el = el . parentNode ;
111
+ }
112
+ }
113
+ }
114
+
93
115
function getStylesFromIframe ( iframe ) {
94
116
var styles = iframe . contentDocument . documentElement . querySelectorAll ( "style" ) ;
95
117
var cssText = "" ;
@@ -100,13 +122,36 @@ function getStylesFromIframe(iframe) {
100
122
}
101
123
102
124
module . exports = function ( ) {
125
+ var codepens = document . querySelectorAll ( 'div.codepen' ) ;
126
+ //remove the old codepen links
127
+ codepens . forEach ( function ( codepen , i ) {
128
+ var wrapper = findSelector ( codepen , "pre, .demo_wrapper" ) ;
129
+ //the CodePen iframe wrapper has ".codepen" class too
130
+ if ( wrapper ) {
131
+ wrapper . setAttribute ( 'data-has-run' , true ) ;
132
+ codepen . parentNode . removeChild ( codepen ) ;
133
+ }
134
+ } ) ;
103
135
104
- document . body . addEventListener ( "click" , function ( ev ) {
105
- if ( matches . call ( ev . target , ".codepen" ) ) {
106
-
107
- var el = findSelector ( ev . target , "pre, .demo_wrapper" ) ;
108
- if ( el && matches . call ( el , "pre" ) ) {
109
- var preElement = el ;
136
+ //Register PrismJS "Run" custom button
137
+ Prism . plugins . toolbar . registerButton ( "run-code" , function ( env ) {
138
+ var demoWrapper = findDemoWrapper ( env . element ) ;
139
+ var pre = env . element . parentElement ;
140
+ var hasRunBtn = demoWrapper ? demoWrapper . getAttribute ( "data-has-run" ) : pre . getAttribute ( "data-has-run" ) ;
141
+ //prevent other demos without codepen link to register Run button
142
+ if ( hasRunBtn ) {
143
+ var btn = document . createElement ( "button" ) ;
144
+ btn . innerHTML = "Run" ;
145
+ btn . setAttribute ( "data-run" , "" ) ;
146
+ return btn ;
147
+ }
148
+ } ) ;
149
+ document . body . addEventListener ( 'click' , function ( ev ) {
150
+ if ( ev . target . getAttribute ( 'data-run' ) != null ) {
151
+ var btn = ev . target ;
152
+ var demoWrapper = findDemoWrapper ( btn ) ;
153
+ if ( ! demoWrapper ) {
154
+ var preElement = findPreForToolbarBtn ( btn ) ;
110
155
var codeElement = preElement . querySelector ( "code" ) ;
111
156
var language = codeElement . className . match ( languageHTML ) [ 1 ] ;
112
157
var text = codeElement . textContent ;
@@ -131,31 +176,26 @@ module.exports = function() {
131
176
console . warn ( "Unable to create a codepen for this demo" ) ;
132
177
}
133
178
}
134
- if ( el && matches . call ( el , ".demo_wrapper" ) ) {
135
- var htmlCode = el . querySelector ( "[data-for=html] code" ) ;
136
- var htmlText = htmlCode ? htmlCode . textContent . trim ( ) : "" ;
137
-
138
- var jsCode = el . querySelector ( "[data-for=js] code" ) ;
139
- var jsText = jsCode ? jsCode . textContent . trim ( ) : "" ;
140
-
141
- var cssText = getStylesFromIframe ( el . querySelector ( "iframe" ) ) ;
142
-
179
+ if ( demoWrapper && matches . call ( demoWrapper , '.demo_wrapper' ) ) {
180
+ var htmlCode = demoWrapper . querySelector ( '[data-for=html] code' ) ;
181
+ var htmlText = htmlCode ? htmlCode . textContent . trim ( ) : '' ;
182
+ var jsCode = demoWrapper . querySelector ( '[data-for=js] code' ) ;
183
+ var jsText = jsCode ? jsCode . textContent . trim ( ) : '' ;
184
+ var cssText = getStylesFromIframe ( demoWrapper . querySelector ( 'iframe' ) ) ;
143
185
var codePen = {
144
186
html : htmlText ,
145
187
js : jsText ,
146
188
js_module : true ,
147
- editors : " 1011" ,
189
+ editors : ' 1011' ,
148
190
css : cssText . trim ( )
149
191
} ;
150
192
cleanCodePenData ( codePen ) ;
151
- if ( window . CREATE_CODE_PEN ) {
193
+ if ( window . CREATE_CODE_PEN ) {
152
194
CREATE_CODE_PEN ( codePen ) ;
153
195
} else {
154
196
createCodePen ( codePen ) ;
155
197
}
156
-
157
198
}
158
-
159
199
}
160
200
} ) ;
161
201
} ;
0 commit comments