snippets
snippets copied to clipboard
Atom snippets fail to treat an octal in multiline strings as expected
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
- Open
$HOME/.atom/snippets.cson
- Save the CSON snippet definition described in Actual behavior below
- 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:
- https://github.com/atom/season
- https://github.com/atom/snippets
- https://github.com/atom/atom
- https://en.wikipedia.org/wiki/ECMAScript
Moved from https://github.com/atom/atom/issues/16184
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))"
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.
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!