@@ -93,13 +93,25 @@ function findSelector(start, selector) {
9393function findDemoWrapper ( el ) {
9494 while ( el && el . parentNode ) {
9595 if ( matches . call ( el . parentNode , '.demo_wrapper' ) ) {
96- var demoWrapper = el . parentNode ;
97- return demoWrapper ;
96+ return el . parentNode ;
9897 }
9998 el = el . parentNode ;
10099 }
101100}
102101
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+
103115function getStylesFromIframe ( iframe ) {
104116 var styles = iframe . contentDocument . documentElement . querySelectorAll ( "style" ) ;
105117 var cssText = "" ;
@@ -130,53 +142,60 @@ module.exports = function() {
130142 if ( hasRunBtn ) {
131143 var btn = document . createElement ( "button" ) ;
132144 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 ) ;
176173 }
174+
175+ } else {
176+ console . warn ( "Unable to create a codepen for this demo" ) ;
177177 }
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+ }
180199 }
181200 } ) ;
182201} ;
0 commit comments