@@ -90,6 +90,28 @@ function findSelector(start, selector) {
9090 }
9191}
9292
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+
93115function getStylesFromIframe ( iframe ) {
94116 var styles = iframe . contentDocument . documentElement . querySelectorAll ( "style" ) ;
95117 var cssText = "" ;
@@ -100,13 +122,36 @@ function getStylesFromIframe(iframe) {
100122}
101123
102124module . 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+ } ) ;
103135
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 ) ;
110155 var codeElement = preElement . querySelector ( "code" ) ;
111156 var language = codeElement . className . match ( languageHTML ) [ 1 ] ;
112157 var text = codeElement . textContent ;
@@ -131,31 +176,26 @@ module.exports = function() {
131176 console . warn ( "Unable to create a codepen for this demo" ) ;
132177 }
133178 }
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' ) ) ;
143185 var codePen = {
144186 html : htmlText ,
145187 js : jsText ,
146188 js_module : true ,
147- editors : " 1011" ,
189+ editors : ' 1011' ,
148190 css : cssText . trim ( )
149191 } ;
150192 cleanCodePenData ( codePen ) ;
151- if ( window . CREATE_CODE_PEN ) {
193+ if ( window . CREATE_CODE_PEN ) {
152194 CREATE_CODE_PEN ( codePen ) ;
153195 } else {
154196 createCodePen ( codePen ) ;
155197 }
156-
157198 }
158-
159199 }
160200 } ) ;
161201} ;
0 commit comments