   # Matches strings, including multi-line strings. Ensures that quotation marks
   # are balanced within the string's contents, and within nested interpolations.
   stringToken: ->
-    return false unless starts(@chunk, '"') or starts(@chunk, "'")
+    return false unless @chunk.charAt(0) in ["'", '"']
     return false unless string =
       @balancedToken(['"', '"'], ['#{', '}']) or
       @balancedToken ["'", "'"]
     @interpolateString string.replace MULTILINER, '\\\n'
-    @line += count string, "\n"
+    @line += count string, '\n'
     @i += string.length
     true
 

  # token stream.
  interpolateString: (str, options) ->
    options or= {}
    if str.length < 3 or not starts str, '"'
      @token 'STRING', str
    else
      lexer   = new Lexer
      tokens  = []
      quote   = str.substring 0, 1
      [i, pi] = [1, 1]
      while i < str.length - 1
        if starts str, '\\', i
          i += 1
        else if expr = @balancedString(str.substring(i), [['#{', '}']])
          tokens.push ['STRING', quote + str.substring(pi, i) + quote] if pi < i
          inner = expr.substring(2, expr.length - 1)
          if inner.length
            inner = inner.replace new RegExp('\\\\' + quote, 'g'), quote if options.heredoc
            nested = lexer.tokenize "(#{inner})", line: @line

        if tag is 'TOKENS'
          @tokens = @tokens.concat value
        else if tag is 'STRING' and options.escapeQuotes
          escaped = value.slice(1, -1).replace(/"/g, '\\"')
          @token tag, "\"#{escaped}\""
        else
          @token tag, value
