75 lines
2.8 KiB
CoffeeScript
75 lines
2.8 KiB
CoffeeScript
$(document).ready ->
|
|
# Mobile navigation
|
|
toggleSidebar = ->
|
|
$('.menu-button, .row-offcanvas').toggleClass 'active'
|
|
|
|
$('[data-toggle="offcanvas"]').click toggleSidebar
|
|
|
|
$('[data-action="sidebar-nav"]').click (event) ->
|
|
if $('.menu-button').is(':visible')
|
|
event.preventDefault()
|
|
toggleSidebar()
|
|
setTimeout ->
|
|
window.location = event.target.href
|
|
, 260 # Wait for the sidebar to slide away before navigating
|
|
|
|
|
|
# Initialize Scrollspy for sidebar navigation; http://v4-alpha.getbootstrap.com/components/scrollspy/
|
|
# See also http://www.codingeverything.com/2014/02/BootstrapDocsSideBar.html and http://jsfiddle.net/KyleMit/v6zhz/
|
|
$('body').scrollspy
|
|
target: '#contents'
|
|
offset: Math.round $('main').css('padding-top').replace('px', '')
|
|
|
|
if window.location.hash?
|
|
$(".nav-link.active[href!='#{window.location.hash}']").removeClass 'active'
|
|
|
|
$(window).on 'activate.bs.scrollspy', (event, target) -> # Why `window`? https://github.com/twbs/bootstrap/issues/20086
|
|
# We only want one active link in the nav
|
|
$(".nav-link.active[href!='#{target.relatedTarget}']").removeClass 'active'
|
|
$target = $(".nav-link[href='#{target.relatedTarget}']")
|
|
# Update the browser address bar on scroll or navigation
|
|
window.history.pushState {}, $target.text(), $target.prop('href')
|
|
|
|
|
|
# Initialize CodeMirror for code examples; https://codemirror.net/doc/manual.html
|
|
editors = []
|
|
lastCompilationElapsedTime = 200
|
|
$('textarea').each (index) ->
|
|
$(@).data 'index', index
|
|
mode = if $(@).hasClass('javascript-output') then 'javascript' else 'coffeescript'
|
|
|
|
editors[index] = editor = CodeMirror.fromTextArea @,
|
|
mode: mode
|
|
theme: 'twilight'
|
|
indentUnit: 2
|
|
tabSize: 2
|
|
lineWrapping: on
|
|
lineNumbers: off
|
|
inputStyle: 'contenteditable'
|
|
readOnly: if mode is 'coffeescript' then no else 'nocursor'
|
|
viewportMargin: Infinity
|
|
|
|
# Whenever the user edits the CoffeeScript side of a code example, update the JavaScript output
|
|
if mode is 'coffeescript'
|
|
pending = null
|
|
editor.on 'change', (instance, change) ->
|
|
clearTimeout pending
|
|
pending = setTimeout ->
|
|
lastCompilationStartTime = Date.now()
|
|
try
|
|
output = CoffeeScript.compile editor.getValue(), bare: yes
|
|
lastCompilationElapsedTime = Math.max(200, Date.now() - lastCompilationStartTime)
|
|
catch exception
|
|
output = "#{exception}"
|
|
editors[index + 1].setValue output
|
|
, lastCompilationElapsedTime
|
|
|
|
|
|
# Handle the code example buttons
|
|
$('[data-action="run-code-example"]').click ->
|
|
run = $(@).data 'run'
|
|
index = $("##{$(@).data('example')}-js").data 'index'
|
|
js = editors[index].getValue()
|
|
js = "#{js}\nalert(#{unescape run});" unless run is yes
|
|
eval js
|