@@ -73,6 +73,23 @@ function findPre(start) {
73
73
}
74
74
}
75
75
76
+ function findSelector ( start , selector ) {
77
+ while ( start ) {
78
+ if ( matches . call ( start , selector ) ) {
79
+ return start ;
80
+ }
81
+ if ( start . querySelector ) {
82
+ var pre = start . querySelector ( selector ) ;
83
+ if ( pre ) {
84
+ return pre ;
85
+ }
86
+ }
87
+
88
+ // needs to be previousSibling for zombie
89
+ start = start . previousSibling ;
90
+ }
91
+ }
92
+
76
93
function findDemoWrapper ( el ) {
77
94
while ( el && el . parentNode ) {
78
95
if ( matches . call ( el . parentNode , '.demo_wrapper' ) ) {
@@ -96,58 +113,65 @@ module.exports = function() {
96
113
var codepens = document . querySelectorAll ( ".codepen" ) ;
97
114
//remove the old codepen links
98
115
codepens . forEach ( function ( codepen , i ) {
116
+ var wrapper = findSelector ( codepen , "pre, .demo_wrapper" ) ;
117
+ wrapper . setAttribute ( "data-has-run" , true ) ;
99
118
codepen . parentNode . removeChild ( codepen ) ;
100
119
} ) ;
101
120
102
121
//Register PrismJS "Run" custom button
103
122
Prism . plugins . toolbar . registerButton ( "run-code" , function ( env ) {
104
- var btn = document . createElement ( "button" ) ;
105
- btn . innerHTML = "Run" ;
106
- btn . addEventListener ( 'click' , function ( ) {
107
- var demoWrapper = findDemoWrapper ( env . element ) ;
108
-
109
- if ( ! demoWrapper && matches . call ( env . element . parentNode , 'pre' ) ) {
110
- var language = env . language ;
111
- var text = env . code ;
112
- var data = types [ language ] ( text ) ;
113
- if ( data . js ) {
114
- data . js = data . js . trim ( ) ;
115
- }
116
- if ( data . html ) {
117
- data . html = data . html . trim ( ) ;
123
+ var demoWrapper = findDemoWrapper ( env . element ) ;
124
+ var pre = env . element . parentElement ;
125
+ var hasRunBtn = demoWrapper ? demoWrapper . getAttribute ( "data-has-run" ) : pre . getAttribute ( "data-has-run" ) ;
126
+ //prevent other demos without codepen link to register Run button
127
+ if ( hasRunBtn ) {
128
+ var btn = document . createElement ( "button" ) ;
129
+ btn . innerHTML = "Run" ;
130
+ btn . addEventListener ( 'click' , function ( ) {
131
+
132
+ if ( ! demoWrapper && matches . call ( env . element . parentNode , 'pre' ) ) {
133
+ var language = env . language ;
134
+ var text = env . code ;
135
+ var data = types [ language ] ( text ) ;
136
+ if ( data . js ) {
137
+ data . js = data . js . trim ( ) ;
138
+ }
139
+ if ( data . html ) {
140
+ data . html = data . html . trim ( ) ;
141
+ }
142
+ if ( data ) {
143
+ cleanCodePenData ( data ) ;
144
+ if ( window . CREATE_CODE_PEN ) {
145
+ CREATE_CODE_PEN ( data ) ;
146
+ } else {
147
+ createCodePen ( data ) ;
148
+ }
149
+ } else {
150
+ console . warn ( 'Unable to create a codepen for this demo' ) ;
151
+ }
118
152
}
119
- if ( data ) {
120
- cleanCodePenData ( data ) ;
153
+ if ( demoWrapper && matches . call ( demoWrapper , '.demo_wrapper' ) ) {
154
+ var htmlCode = demoWrapper . querySelector ( '[data-for=html] code' ) ;
155
+ var htmlText = htmlCode ? htmlCode . textContent . trim ( ) : '' ;
156
+ var jsCode = demoWrapper . querySelector ( '[data-for=js] code' ) ;
157
+ var jsText = jsCode ? jsCode . textContent . trim ( ) : '' ;
158
+ var cssText = getStylesFromIframe ( demoWrapper . querySelector ( 'iframe' ) ) ;
159
+ var codePen = {
160
+ html : htmlText ,
161
+ js : jsText ,
162
+ js_module : true ,
163
+ editors : '1011' ,
164
+ css : cssText . trim ( )
165
+ } ;
166
+ cleanCodePenData ( codePen ) ;
121
167
if ( window . CREATE_CODE_PEN ) {
122
- CREATE_CODE_PEN ( data ) ;
168
+ CREATE_CODE_PEN ( codePen ) ;
123
169
} else {
124
- createCodePen ( data ) ;
170
+ createCodePen ( codePen ) ;
125
171
}
126
- } else {
127
- console . warn ( 'Unable to create a codepen for this demo' ) ;
128
- }
129
- }
130
- if ( demoWrapper && matches . call ( demoWrapper , '.demo_wrapper' ) ) {
131
- var htmlCode = demoWrapper . querySelector ( '[data-for=html] code' ) ;
132
- var htmlText = htmlCode ? htmlCode . textContent . trim ( ) : '' ;
133
- var jsCode = demoWrapper . querySelector ( '[data-for=js] code' ) ;
134
- var jsText = jsCode ? jsCode . textContent . trim ( ) : '' ;
135
- var cssText = getStylesFromIframe ( demoWrapper . querySelector ( 'iframe' ) ) ;
136
- var codePen = {
137
- html : htmlText ,
138
- js : jsText ,
139
- js_module : true ,
140
- editors : '1011' ,
141
- css : cssText . trim ( )
142
- } ;
143
- cleanCodePenData ( codePen ) ;
144
- if ( window . CREATE_CODE_PEN ) {
145
- CREATE_CODE_PEN ( codePen ) ;
146
- } else {
147
- createCodePen ( codePen ) ;
148
172
}
149
- }
150
- } ) ;
151
- return btn ;
173
+ } ) ;
174
+ return btn ;
175
+ }
152
176
} ) ;
153
177
} ;
0 commit comments