diff --git a/README.md b/README.md index 317c3ac..a105915 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,12 @@ acorn.Parser.extend(jsx({ allowNamespaces: false })) Note that by default `allowNamespaces` is enabled for spec compliancy. +By default, HTML entities are parsed and transformed within strings. To disable this functionality (and treat HTML entities as plain text), you can provide `transformEntities: false` as an option: + +```javascript +acorn.Parser.extend(jsx({ transformEntities: false })) +``` + ## License This plugin is issued under the [MIT license](./LICENSE). diff --git a/index.js b/index.js index 004e080..cc33ff6 100644 --- a/index.js +++ b/index.js @@ -75,7 +75,8 @@ module.exports = function(options) { return function(Parser) { return plugin({ allowNamespaces: options.allowNamespaces !== false, - allowNamespacedObjects: !!options.allowNamespacedObjects + allowNamespacedObjects: !!options.allowNamespacedObjects, + transformEntities: options.transformEntities !== false }, Parser); }; }; @@ -130,12 +131,6 @@ function plugin(options, Parser) { out += this.input.slice(chunkStart, this.pos); return this.finishToken(tok.jsxText, out); - case 38: // '&' - out += this.input.slice(chunkStart, this.pos); - out += this.jsx_readEntity(); - chunkStart = this.pos; - break; - case 62: // '>' case 125: // '}' this.raise( @@ -144,6 +139,15 @@ function plugin(options, Parser) { (ch === 62 ? ">" : "}") + "` or " + "`{\"" + this.input[this.pos] + "\"}" + "`?" ); + case 38: // '&' (NOTE: must come directly BEFORE default case) + if (options.transformEntities) { + out += this.input.slice(chunkStart, this.pos); + out += this.jsx_readEntity(); + chunkStart = this.pos; + break; + } + /* intentional fallthrough */ + default: if (isNewLine(ch)) { out += this.input.slice(chunkStart, this.pos); diff --git a/test/tests-jsx.js b/test/tests-jsx.js index b53549d..59d07fa 100644 --- a/test/tests-jsx.js +++ b/test/tests-jsx.js @@ -4634,6 +4634,59 @@ test('foo>', { } ] }); +test('foo>', { + "type": "Program", + "start": 0, + "end": 14, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 14, + "expression": { + "type": "JSXElement", + "start": 0, + "end": 14, + "openingElement": { + "type": "JSXOpeningElement", + "start": 0, + "end": 3, + "attributes": [], + "name": { + "type": "JSXIdentifier", + "start": 1, + "end": 2, + "name": "A" + }, + "selfClosing": false + }, + "closingElement": { + "type": "JSXClosingElement", + "start": 10, + "end": 14, + "name": { + "type": "JSXIdentifier", + "start": 12, + "end": 13, + "name": "A" + } + }, + "children": [ + { + "type": "JSXText", + "start": 3, + "end": 10, + "value": "foo>", + "raw": "foo>" + } + ] + } + } + ] +}, { +}, { + transformEntities: false +}); test('function*it(){yield }', { "type": "Program", "start": 0,