Я делаю свои презентации в Shower — их удобно писать в редакторе, легко выкладывать, и они нормально смотрятся.
Так как большая часть моих презентаций связана с JavaScript и включает примеры кода, я подумал, что было бы хорошо иметь рядом с каждым таким примером кнопку «Запустить», которая бы, кхм, запускала этот код.
Код в Шовере помечается тегом pre, и каждая линия завёрнута в code, примерно так:
<section class="slide">
<h2>Some code</h2>
<pre>
<code>function log() {</code>
<code> console.log('HELLO WORLD')</code>
<code>}</code>
</pre>
</section>
Поэтому я набросал следующий сниппет. Его достаточно бросить в конце презентации (тогда он подхватит все теги pre). Конечно, это требует, чтобы все pre содержали только JS, но если это не так, то достаточно только поменять первую строчку.
var pre = [].slice.call(document.querySelectorAll('pre'))
pre.forEach(p => {
var txt = p.innerText
var btn = document.createElement('button')
btn.className = 'run-button'
btn.innerText = 'Run'
p.parentNode.insertBefore(btn, p)
btn.onclick = () => {
console.log('Running\n---\n' + txt + '\n---\nResult:')
eval(txt)
}
})
Отдельно нужно эту кнопку стилизовать, для этого к ней добавляется класс run-button.
eval принято ругать и не использовать, но это один из тех редких моментов, где он уместен.