@@ -93,13 +93,25 @@ function findSelector(start, selector) {
93
93
function findDemoWrapper ( el ) {
94
94
while ( el && el . parentNode ) {
95
95
if ( matches . call ( el . parentNode , '.demo_wrapper' ) ) {
96
- var demoWrapper = el . parentNode ;
97
- return demoWrapper ;
96
+ return el . parentNode ;
98
97
}
99
98
el = el . parentNode ;
100
99
}
101
100
}
102
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
+
103
115
function getStylesFromIframe ( iframe ) {
104
116
var styles = iframe . contentDocument . documentElement . querySelectorAll ( "style" ) ;
105
117
var cssText = "" ;
@@ -130,53 +142,60 @@ module.exports = function() {
130
142
if ( hasRunBtn ) {
131
143
var btn = document . createElement ( "button" ) ;
132
144
btn . innerHTML = "Run" ;
133
- document . body . addEventListener ( 'click' , function ( ev ) {
134
- ev . stopPropagation ( ) ;
135
- if ( ev . target === btn ) {
136
- if ( ! demoWrapper && matches . call ( env . element . parentNode , 'pre' ) ) {
137
- var language = env . language ;
138
- var text = env . code ;
139
- var data = types [ language ] ( text ) ;
140
- if ( data . js ) {
141
- data . js = data . js . trim ( ) ;
142
- }
143
- if ( data . html ) {
144
- data . html = data . html . trim ( ) ;
145
- }
146
- if ( data ) {
147
- cleanCodePenData ( data ) ;
148
- if ( window . CREATE_CODE_PEN ) {
149
- CREATE_CODE_PEN ( data ) ;
150
- } else {
151
- createCodePen ( data ) ;
152
- }
153
- } else {
154
- console . warn ( 'Unable to create a codepen for this demo' ) ;
155
- }
156
- }
157
- if ( demoWrapper && matches . call ( demoWrapper , '.demo_wrapper' ) ) {
158
- var htmlCode = demoWrapper . querySelector ( '[data-for=html] code' ) ;
159
- var htmlText = htmlCode ? htmlCode . textContent . trim ( ) : '' ;
160
- var jsCode = demoWrapper . querySelector ( '[data-for=js] code' ) ;
161
- var jsText = jsCode ? jsCode . textContent . trim ( ) : '' ;
162
- var cssText = getStylesFromIframe ( demoWrapper . querySelector ( 'iframe' ) ) ;
163
- var codePen = {
164
- html : htmlText ,
165
- js : jsText ,
166
- js_module : true ,
167
- editors : '1011' ,
168
- css : cssText . trim ( )
169
- } ;
170
- cleanCodePenData ( codePen ) ;
171
- if ( window . CREATE_CODE_PEN ) {
172
- CREATE_CODE_PEN ( codePen ) ;
173
- } else {
174
- createCodePen ( codePen ) ;
175
- }
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 ) ;
155
+ var codeElement = preElement . querySelector ( "code" ) ;
156
+ var language = codeElement . className . match ( languageHTML ) [ 1 ] ;
157
+ var text = codeElement . textContent ;
158
+
159
+ var data = types [ language ] ( text ) ;
160
+
161
+ if ( data . js ) {
162
+ data . js = data . js . trim ( ) ;
163
+ }
164
+ if ( data . html ) {
165
+ data . html = data . html . trim ( ) ;
166
+ }
167
+ if ( data ) {
168
+ cleanCodePenData ( data ) ;
169
+ if ( window . CREATE_CODE_PEN ) {
170
+ CREATE_CODE_PEN ( data ) ;
171
+ } else {
172
+ createCodePen ( data ) ;
176
173
}
174
+
175
+ } else {
176
+ console . warn ( "Unable to create a codepen for this demo" ) ;
177
177
}
178
- } ) ;
179
- return btn ;
178
+ }
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' ) ) ;
185
+ var codePen = {
186
+ html : htmlText ,
187
+ js : jsText ,
188
+ js_module : true ,
189
+ editors : '1011' ,
190
+ css : cssText . trim ( )
191
+ } ;
192
+ cleanCodePenData ( codePen ) ;
193
+ if ( window . CREATE_CODE_PEN ) {
194
+ CREATE_CODE_PEN ( codePen ) ;
195
+ } else {
196
+ createCodePen ( codePen ) ;
197
+ }
198
+ }
180
199
}
181
200
} ) ;
182
201
} ;
0 commit comments