Skip to content

Commit 536289a

Browse files
committed
Prevent run button to be registred for every demo
1 parent d579268 commit 536289a

File tree

1 file changed

+67
-43
lines changed

1 file changed

+67
-43
lines changed

index.js

Lines changed: 67 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,23 @@ function findPre(start) {
7373
}
7474
}
7575

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+
7693
function findDemoWrapper(el) {
7794
while(el && el.parentNode) {
7895
if(matches.call(el.parentNode, '.demo_wrapper')) {
@@ -96,58 +113,65 @@ module.exports = function() {
96113
var codepens = document.querySelectorAll(".codepen");
97114
//remove the old codepen links
98115
codepens.forEach(function(codepen, i){
116+
var wrapper = findSelector(codepen, "pre, .demo_wrapper");
117+
wrapper.setAttribute("data-has-run", true);
99118
codepen.parentNode.removeChild(codepen);
100119
});
101120

102121
//Register PrismJS "Run" custom button
103122
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+
}
118152
}
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);
121167
if (window.CREATE_CODE_PEN) {
122-
CREATE_CODE_PEN(data);
168+
CREATE_CODE_PEN(codePen);
123169
} else {
124-
createCodePen(data);
170+
createCodePen(codePen);
125171
}
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);
148172
}
149-
}
150-
});
151-
return btn;
173+
});
174+
return btn;
175+
}
152176
});
153177
};

0 commit comments

Comments
 (0)