-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Triple backticks to allow creation of JavaScript blocks #4357
Changes from all commits
27e8a62
107d8af
edd36b5
b9dd310
3200259
0d5449f
7689620
9945e68
621d9d5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,70 @@ | ||
# Javascript Literals | ||
# JavaScript Literals | ||
# ------------------- | ||
|
||
# TODO: refactor javascript literal tests | ||
# TODO: add indexing and method invocation tests: `[1]`[0] is 1, `function(){}`.call() | ||
test "inline JavaScript is evaluated", -> | ||
eq '\\`', ` | ||
// Inline JS | ||
"\\\\\`" | ||
` | ||
|
||
eq '\\`', ` | ||
// Inline JS | ||
"\\\`" | ||
` | ||
test "escaped backticks are output correctly", -> | ||
`var a = \`2 + 2 = ${4}\`` | ||
eq a, '2 + 2 = 4' | ||
|
||
test "backslashes before a newline don’t break JavaScript blocks", -> | ||
`var a = \`To be, or not\\ | ||
to be.\`` | ||
eq a, ''' | ||
To be, or not\\ | ||
to be.''' | ||
|
||
test "block inline JavaScript is evaluated", -> | ||
``` | ||
var a = 1; | ||
var b = 2; | ||
``` | ||
c = 3 | ||
```var d = 4;``` | ||
eq a + b + c + d, 10 | ||
|
||
test "block inline JavaScript containing backticks", -> | ||
``` | ||
// This is a comment with `backticks` | ||
var a = 42; | ||
var b = `foo ${'bar'}`; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's no 'eq' for variable b in the ""block inline JavaScript containing backticks" test. Is this correct? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, as I didn't want to rely on ES2015 in the 1.x branch. Though I guess I am already for it to parse the |
||
var c = 3; | ||
var d = 'foo`bar`'; | ||
``` | ||
eq a + c, 45 | ||
eq b, 'foo bar' | ||
eq d, 'foo`bar`' | ||
|
||
test "block JavaScript can end with an escaped backtick character", -> | ||
```var a = \`hello\```` | ||
``` | ||
var b = \`world${'!'}\```` | ||
eq a, 'hello' | ||
eq b, 'world!' | ||
|
||
test "JavaScript block only escapes backslashes followed by backticks", -> | ||
eq `'\\\n'`, '\\\n' | ||
|
||
test "escaped JavaScript blocks speed round", -> | ||
# The following has escaped backslashes because they’re required in strings, but the intent is this: | ||
# `hello` → hello; | ||
# `\`hello\`` → `hello`; | ||
# `\`Escaping backticks in JS: \\\`hello\\\`\`` → `Escaping backticks in JS: \`hello\``; | ||
# `Single backslash: \ ` → Single backslash: \ ; | ||
# `Double backslash: \\ ` → Double backslash: \\ ; | ||
# `Single backslash at EOS: \\` → Single backslash at EOS: \; | ||
# `Double backslash at EOS: \\\\` → Double backslash at EOS: \\; | ||
for [input, output] in [ | ||
['`hello`', 'hello;'] | ||
['`\\`hello\\``', '`hello`;'] | ||
['`\\`Escaping backticks in JS: \\\\\\`hello\\\\\\`\\``', '`Escaping backticks in JS: \\`hello\\``;'] | ||
['`Single backslash: \\ `', 'Single backslash: \\ ;'] | ||
['`Double backslash: \\\\ `', 'Double backslash: \\\\ ;'] | ||
['`Single backslash at EOS: \\\\`', 'Single backslash at EOS: \\;'] | ||
['`Double backslash at EOS: \\\\\\\\`', 'Double backslash at EOS: \\\\;'] | ||
] | ||
eq CoffeeScript.compile(input, bare: yes), "#{output}\n\n" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With my proposed escaping rules, this test needs to be written like this:
or like this: