atom / snippets

Atom snippets package
MIT License
204 stars 102 forks source link

Atom snippets fail to treat an octal in multiline strings as expected #256

Open philoserf opened 7 years ago

philoserf commented 7 years ago

Description

Atom snippets fail to treat an octal in multiline strings as expected. While the specification at https://github.com/bevry/cson proclaims "Multi-line Strings! Without Quote Escaping!" and gives no warning about octal Atom editor gives an error message while saving a snippet definition containing an octal.

Escaping a closing brace in a multi-line string is in the README for the snippets package: https://github.com/atom/snippets/blob/edf7db4e5f3d9bb0354745433cf09e14c933d75a/README.md#multi-line-snippet-body

Using the same technique to escape the opening backslash of the octal delivers the same error message as with no escaping.

Steps to Reproduce

  1. Open $HOME/.atom/snippets.cson
  2. Save the CSON snippet definition described in Actual behavior below
  3. Save the file

Expected behavior:

Unlike a closing brace, other values do not require escaping in snippets.cson using CSON multi-line strings.

OR, a means of escaping the octal exists for snippets as that require them.

OR, the README is updated to reflect this limitation in addition to the closing brace limit.

Actual behavior:

While running Atom like this, atom --safe

Add this code fragment snippet definition to $HOME/.atom/snippets.cson:

'.source.makefile':
  'makefile':
    prefix: 'start.make'
    description: 'Makefile help'
    body: '''
      .DEFAULT_GOAL := help
      .PHONY: help
      help:
        @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
      '''

Upon saving the file, get this error:

Failed to load snippets from '/.../.atom/snippets.cson'

/.../.atom/snippets.cson: ocatal esccape sequences are not allowed \03

Using the debugger arrive at this error message:

fs.js line 122
Error reading snippets file '/Users/mark/.atom/snippets.cson': [stdin]:147:99: error: octal escape sequences are not allowed \03
        @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

Which comes from this line/function:

function nullCheck(path, callback) {
  if (('' + path).indexOf('\u0000') !== -1) {
    var er = new Error('Path must be a string without null bytes');
    er.code = 'ENOENT';
    if (typeof callback !== 'function')
      throw er;
    process.nextTick(callback, er); // <-- line 122
    return false;
  }
  return true;
}

Reproduces how often: Always

Versions

> atom --version
Atom    : 1.22.0
Electron: 1.6.15
Chrome  : 56.0.2924.87
Node    : 7.4.0

> apm --version
apm  1.18.8
npm  3.10.10
node 6.9.5 x64
python 2.7.10
git 2.15.0

> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.1
BuildVersion:   17B48

Additional Information

Not certain to which of these this issue belongs:

philoserf commented 7 years ago

Moved from https://github.com/atom/atom/issues/16184

ericbiewener commented 6 years ago

Doesn't appear to be confined to multiline strings. I'm getting the same error with this cson:

'.source.python':
  'print color':
    'prefix': 'pp'
    'body': "print('\033[94m{}\033[0m'.format($1))"
philoserf commented 6 years ago

https://github.com/atom/snippets/blob/master/lib/snippet-body.pegjs

This is the body parser that is fed to pegjs. I need to build skill in a language I do not use to contribute. Still, I am taking a look as time and attention allow.

savetheclocktower commented 6 years ago

I can try to take a stab at this one. @philoserf, a PR that did nothing but add failing unit tests for this case would be incredibly helpful and wouldn't require you to learn pegjs. Thanks for reporting this!