mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
adding heredocs, with tests
This commit is contained in:
parent
c3029faca7
commit
477c510345
3 changed files with 68 additions and 4 deletions
|
@ -93,6 +93,30 @@
|
|||
<key>name</key>
|
||||
<string>constant.numeric.coffee</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>string.quoted.heredoc.coffee</string>
|
||||
<key>begin</key>
|
||||
<string>("""|''')</string>
|
||||
<key>end</key>
|
||||
<string>("""|''')</string>
|
||||
<key>beginCaptures</key>
|
||||
<dict>
|
||||
<key>0</key>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>punctuation.definition.string.begin.coffee</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>endCaptures</key>
|
||||
<dict>
|
||||
<key>0</key>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>punctuation.definition.string.end.coffee</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>begin</key>
|
||||
<string>'</string>
|
||||
|
|
|
@ -22,6 +22,7 @@ module CoffeeScript
|
|||
IDENTIFIER = /\A([a-zA-Z$_](\w|\$)*)/
|
||||
NUMBER = /\A(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i
|
||||
STRING = /\A(""|''|"(.*?)([^\\]|\\\\)"|'(.*?)([^\\]|\\\\)')/m
|
||||
HEREDOC = /\A("{6}|'{6}|"{3}\n?(\s*)(.*?)\n?(\s*)"{3}|'{3}\n?(\s*)(.*?)\n?(\s*)'{3})/m
|
||||
JS = /\A(``|`(.*?)([^\\]|\\\\)`)/m
|
||||
OPERATOR = /\A([+\*&|\/\-%=<>:!]+)/
|
||||
WHITESPACE = /\A([ \t]+)/
|
||||
|
@ -69,6 +70,7 @@ module CoffeeScript
|
|||
def extract_next_token
|
||||
return if identifier_token
|
||||
return if number_token
|
||||
return if heredoc_token
|
||||
return if string_token
|
||||
return if js_token
|
||||
return if regex_token
|
||||
|
@ -103,14 +105,24 @@ module CoffeeScript
|
|||
# Matches strings, including multi-line strings.
|
||||
def string_token
|
||||
return false unless string = @chunk[STRING, 1]
|
||||
escaped = string.gsub(MULTILINER) do |match|
|
||||
@line += 1
|
||||
" \\\n"
|
||||
end
|
||||
escaped = string.gsub(MULTILINER, " \\\n")
|
||||
token(:STRING, escaped)
|
||||
@line += string.count("\n")
|
||||
@i += string.length
|
||||
end
|
||||
|
||||
# Matches heredocs, adjusting indentation to the correct level.
|
||||
def heredoc_token
|
||||
return false unless match = @chunk.match(HEREDOC)
|
||||
indent = match[2] || match[5]
|
||||
doc = match[3] || match[6]
|
||||
doc.gsub!(/\n#{indent}/, "\\n")
|
||||
doc.gsub!('"', '\\"')
|
||||
token(:STRING, "\"#{doc}\"")
|
||||
@line += match[1].count("\n")
|
||||
@i += match[1].length
|
||||
end
|
||||
|
||||
# Matches interpolated JavaScript.
|
||||
def js_token
|
||||
return false unless script = @chunk[JS, 1]
|
||||
|
|
28
test/fixtures/execution/test_heredocs.coffee
vendored
Normal file
28
test/fixtures/execution/test_heredocs.coffee
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
a: """
|
||||
basic heredoc
|
||||
on two lines
|
||||
"""
|
||||
|
||||
print(a is "basic heredoc\non two lines")
|
||||
|
||||
|
||||
a: '''
|
||||
a
|
||||
b
|
||||
c
|
||||
'''
|
||||
|
||||
print(a is "a\n b\nc")
|
||||
|
||||
|
||||
a: '''one-liner'''
|
||||
|
||||
print(a is 'one-liner')
|
||||
|
||||
|
||||
a: """
|
||||
out
|
||||
here
|
||||
"""
|
||||
|
||||
print(a is "out\nhere")
|
Loading…
Reference in a new issue