mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-05-03 03:00:14 -04:00
* Don’t confuse the syntax highlighter
* Comment Assign::compilePatternMatch a bit
* Assignment expressions in conditionals are a bad practice
* Rename `wrapInBraces` to `wrapInParentheses`, to set the stage for future `wrapInBraces` that uses `{` and `wrapInBrackets` that uses `[`
* Correct comment
* object destructuring
* Allow custom position of the rest element.
* Output simple array destructuring assignments to ES2015
* Output simple object destructured assignments to ES2015
* Compile shorthand object properties to ES2015 shorthand properties
This dramatically improves the appearance of destructured imports.
* Don’t confuse the syntax highlighter
* Comment Assign::compilePatternMatch a bit
* Assignment expressions in conditionals are a bad practice
* Rename `wrapInBraces` to `wrapInParentheses`, to set the stage for future `wrapInBraces` that uses `{` and `wrapInBrackets` that uses `[`
* object destructuring
* Allow custom position of the rest element.
* rest element in object destructuring
* rest element in object destructuring
* fix string interpolation
* merging
* fixing splats in object literal
* Rest element in parameter destructuring
* merging with CS2
* merged with CS2
* Add support for the object spread initializer. https://github.com/tc39/proposal-object-rest-spread/blob/master/Spread.md
* Fix misspellings, trailing whitespace, other minor details
* merging with beta2
* refactor object spread properties
* small fix
* - Fixed object spread function parameters.
- Clean up "Assign" and moved all logic for object rest properties in single method (compileObjectDestruct).
- Add helper function "objectWithoutKeys" to the "UTILITIES" for use with object rest properties,
e.g. {a, b, r...} = obj => {a, b} = obj, r = objectWithoutKeys(...)
- Clean up "Obj" and moved all logic for object spread properties in single method (compileSpread).
- Clean up "Code".
- Add method "hasSplat" to "Obj" and "Value" for checking if Obj contains the splat.
- Enable placing spread syntax triple dots on either right or left, per #85 (https://github.com/coffeescript6/discuss/issues/85)
* Fixed typos
* Remove unused code
* Removed dots (e.g. splat) on the left side from the grammar
* Initial release for deep spread properties, e.g. obj2 = {obj.b..., a: 1} or {obj[b][c]..., d: 7}
Tests need to be prepared!
* 1. Object literal spread properties
Object literals:
- obj = { {b:{c:{d:1}}}..., a:1 }
Parenthetical:
- obj = { ( body ), a:1 }
- obj = { ( body )..., a:1 }
Invocation:
- obj = { ( (args) -> ... )(params), a:1 }
- obj = { ( (args) -> ... )(params)..., a:1 }
- obj = { foo(), a:1 }
- obj = { foo()..., a:1 }
2. Refactor, cleanup & other optimizations.
* Merged with 2.0
* Cleanup
* Some more cleanup.
* Fixed error with freeVariable and object destructuring.
* Fixed errors with object spread properties.
* Improvements, fixed errors.
* Minor improvement.
* Minor improvements.
* Typo.
* Remove unnecessary whitespace.
* Remove unnecessary whitespace.
* Changed few "assertErrorFormat" tests since parentheses are now allowed in the Obj.
* Whitespace cleanup
* Comments cleanup
* fix destructured obj param declarations
* refine fix; add test
* Refactor function args ({a, b...})
* Additional tests for object destructuring in function argument.
* Minor improvement for object destructuring variable declaration.
* refactor function args ({a, b...}) and ({a, b...} = {}); Obj And Param cleanup
* fix comment
* Fix object destructuring variable declaration.
* more tests with default values
* fix typo
* Fixed default values in object destructuring.
* small fix
* Babel’s tests for object rest spread
* Style: spaces after colons in object declarations
* Cleanup comments
* Simplify Babel tests
* Fix comments
* Fix destructuring with splats in multiple objects
* Add test for default values in detsructuring assignment with splats
* Handle default values when assigning to object splats
* Rewrite traverseRest to fix handling of dynamic keys
* Fix double parens around destructuring with splats
* Update compileObjectDestruct comments
* Improve formatting of top-level destructures with splats and tidy parens
* Added a bigger destructuring-with-defaults test and fixed a bug
* Refactor destructuring grammar to allow additional forms
* Add a missing case to ObjSpreadExpr
* These tests shouldn’t run in the browser
* Fix test.html
* Fix docs scroll position getting screwed up by CodeMirror initialization
* Breaking change documentation about => (fixes #4593)
* Spread/rest syntax documentation
* Documentation about bound class methods
* 2.0.0-beta3 changelog
* Add note about ‘lib’
* Fix accidentally converting this to tabs
* Bump version to 2.0.0-beta3
* Update annotated source and test.html
129 lines
5.0 KiB
CoffeeScript
129 lines
5.0 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', '')
|
||
|
||
initializeScrollspyFromHash = (hash) ->
|
||
$(".nav-link.active[href!='#{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: mode isnt 'coffeescript' # Can’t use 'nocursor' if we want the JavaScript to be copyable
|
||
viewportMargin: Infinity
|
||
|
||
# Whenever the user edits the CoffeeScript side of a code example, update the JavaScript output
|
||
# If the editor is Try CoffeeScript, also update the hash and save this code in localStorage
|
||
if mode is 'coffeescript'
|
||
pending = null
|
||
editor.on 'change', (instance, change) ->
|
||
clearTimeout pending
|
||
pending = setTimeout ->
|
||
lastCompilationStartTime = Date.now()
|
||
try
|
||
coffee = editor.getValue()
|
||
if index is 0 and $('#try').hasClass('active') # If this is the editor in Try CoffeeScript and it’s still visible
|
||
# Update the hash with the current code
|
||
link = "try:#{encodeURIComponent coffee}"
|
||
window.history.pushState {}, 'CoffeeScript', "#{location.href.split('#')[0]}##{link}"
|
||
# Save this to the user’s localStorage
|
||
try
|
||
if window.localStorage?
|
||
window.localStorage.setItem 'tryCoffeeScriptCode', coffee
|
||
catch exception
|
||
output = CoffeeScript.compile coffee, bare: yes
|
||
lastCompilationElapsedTime = Math.max(200, Date.now() - lastCompilationStartTime)
|
||
catch exception
|
||
output = "#{exception}"
|
||
editors[index + 1].setValue output
|
||
, lastCompilationElapsedTime
|
||
|
||
# Fix the code editors’ handling of tab-indented code
|
||
editor.addKeyMap
|
||
'Tab': (cm) ->
|
||
if cm.somethingSelected()
|
||
cm.indentSelection 'add'
|
||
else if /^\t/m.test cm.getValue()
|
||
# If any lines start with a tab, treat this as tab-indented code
|
||
cm.execCommand 'insertTab'
|
||
else
|
||
cm.execCommand 'insertSoftTab'
|
||
'Shift-Tab': (cm) ->
|
||
cm.indentSelection 'subtract'
|
||
'Enter': (cm) ->
|
||
cm.options.indentWithTabs = /^\t/m.test cm.getValue()
|
||
cm.execCommand 'newlineAndIndent'
|
||
|
||
# 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
|
||
|
||
|
||
# Try CoffeeScript
|
||
toggleTry = (checkLocalStorage = no) ->
|
||
if checkLocalStorage and window.localStorage?
|
||
try
|
||
coffee = window.localStorage.getItem 'tryCoffeeScriptCode'
|
||
if coffee?
|
||
editors[0].setValue coffee
|
||
catch exception
|
||
$('#try, #try-link').toggleClass 'active'
|
||
closeTry = ->
|
||
$('#try, #try-link').removeClass 'active'
|
||
|
||
$('[data-toggle="try"]').click toggleTry
|
||
$('[data-close="try"]').click closeTry
|
||
|
||
|
||
# Configure the initial state
|
||
if window.location.hash?
|
||
if window.location.hash is '#try'
|
||
toggleTry yes
|
||
else if window.location.hash.indexOf('#try') is 0
|
||
editors[0].setValue decodeURIComponent window.location.hash[5..]
|
||
toggleTry()
|
||
else
|
||
initializeScrollspyFromHash window.location.hash
|
||
# Initializing the code editors might’ve thrown off our vertical scroll position
|
||
document.getElementById(window.location.hash.slice(1)).scrollIntoView()
|