diff --git a/packages/parser/lib/lexer.js b/packages/parser/lib/lexer.js
index e7e0686e..d6c18170 100644
--- a/packages/parser/lib/lexer.js
+++ b/packages/parser/lib/lexer.js
@@ -75,7 +75,7 @@ const EntityRef = createToken({
const CharRef = createToken({
name: "CharRef",
- pattern: /\d+;|[a-fA-F0-9]/,
+ pattern: /\d+;|[a-fA-F0-9]+;/,
});
const SEA_WS = createToken({
diff --git a/packages/parser/package.json b/packages/parser/package.json
index 9a27b583..c8f2a81e 100644
--- a/packages/parser/package.json
+++ b/packages/parser/package.json
@@ -25,7 +25,7 @@
"scripts": {
"ci": "npm-run-all clean type-check coverage:*",
"clean": "rimraf ./coverage ./nyc_output",
- "test": "mocha \"./test/**/*spec.js\"",
+ "test": "mocha -reporter-option maxDiffSize=65536 \"./test/**/*spec.js\"",
"coverage:run": "nyc mocha \"./test/**/*spec.js\"",
"coverage:check": "nyc check-coverage --lines 100 --branches 100 --statements 100 --functions 100",
"snapshots:update": "node ./scripts/update-snapshots.js",
diff --git a/packages/parser/test/snapshots/invalid/entity-char-ref/input.xml b/packages/parser/test/snapshots/invalid/entity-char-ref/input.xml
new file mode 100644
index 00000000..47306477
--- /dev/null
+++ b/packages/parser/test/snapshots/invalid/entity-char-ref/input.xml
@@ -0,0 +1,12 @@
+
+ &foo
+ &foo ;
+
+ Ӓ
+ Ӓ ;
+ Y3;
+
+
+ ;
+ ģYBC;
+
diff --git a/packages/parser/test/snapshots/invalid/entity-char-ref/output.js b/packages/parser/test/snapshots/invalid/entity-char-ref/output.js
new file mode 100644
index 00000000..36343b61
--- /dev/null
+++ b/packages/parser/test/snapshots/invalid/entity-char-ref/output.js
@@ -0,0 +1,206 @@
+module.exports = {
+ cst: {
+ name: "document",
+ children: {
+ element: [
+ {
+ name: "element",
+ children: {
+ OPEN: [
+ { image: "<", startOffset: 0, endOffset: 0, tokenType: "OPEN" },
+ ],
+ Name: [
+ {
+ image: "note",
+ startOffset: 1,
+ endOffset: 4,
+ tokenType: "Name",
+ },
+ ],
+ START_CLOSE: [
+ { image: ">", startOffset: 5, endOffset: 5, tokenType: "CLOSE" },
+ ],
+ content: [
+ {
+ name: "content",
+ children: {
+ chardata: [
+ {
+ name: "chardata",
+ children: {
+ SEA_WS: [
+ {
+ image: "\n ",
+ startOffset: 6,
+ endOffset: 8,
+ tokenType: "SEA_WS",
+ },
+ ],
+ },
+ location: { startOffset: 6, endOffset: 8 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "foo\n ",
+ startOffset: 10,
+ endOffset: 15,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 10, endOffset: 15 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "foo ;\n\n ",
+ startOffset: 17,
+ endOffset: 25,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 17, endOffset: 25 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "#1234\n ",
+ startOffset: 27,
+ endOffset: 34,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 27, endOffset: 34 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "#1234 ;\n ",
+ startOffset: 36,
+ endOffset: 45,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 36, endOffset: 45 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "#12Y3;\n\n ",
+ startOffset: 47,
+ endOffset: 56,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 47, endOffset: 56 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "#x123ABC\n ",
+ startOffset: 58,
+ endOffset: 68,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 58, endOffset: 68 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "#x123ABC ;\n ",
+ startOffset: 70,
+ endOffset: 82,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 70, endOffset: 82 },
+ },
+ {
+ name: "chardata",
+ children: {
+ TEXT: [
+ {
+ image: "#x123YBC;\n",
+ startOffset: 84,
+ endOffset: 93,
+ tokenType: "TEXT",
+ },
+ ],
+ },
+ location: { startOffset: 84, endOffset: 93 },
+ },
+ ],
+ },
+ location: { startOffset: 6, endOffset: 93 },
+ },
+ ],
+ SLASH_OPEN: [
+ {
+ image: "",
+ startOffset: 94,
+ endOffset: 95,
+ tokenType: "SLASH_OPEN",
+ },
+ ],
+ END_NAME: [
+ {
+ image: "note",
+ startOffset: 96,
+ endOffset: 99,
+ tokenType: "Name",
+ },
+ ],
+ END: [
+ {
+ image: ">",
+ startOffset: 100,
+ endOffset: 100,
+ tokenType: "CLOSE",
+ },
+ ],
+ },
+ location: { startOffset: 0, endOffset: 100 },
+ },
+ ],
+ misc: [
+ {
+ name: "misc",
+ children: {
+ SEA_WS: [
+ {
+ image: "\n",
+ startOffset: 101,
+ endOffset: 101,
+ tokenType: "SEA_WS",
+ },
+ ],
+ },
+ location: { startOffset: 101, endOffset: 101 },
+ },
+ ],
+ },
+ location: { startOffset: 0, endOffset: 101 },
+ },
+};
diff --git a/packages/parser/test/snapshots/invalid/entity-char-ref/sample.spec.js b/packages/parser/test/snapshots/invalid/entity-char-ref/sample.spec.js
new file mode 100644
index 00000000..7e6e9a0b
--- /dev/null
+++ b/packages/parser/test/snapshots/invalid/entity-char-ref/sample.spec.js
@@ -0,0 +1,7 @@
+const {
+ executeInValidSampleTest,
+ testNameFromDir,
+} = require("../../../sample-test");
+describe(`${testNameFromDir(__dirname)}`, () => {
+ executeInValidSampleTest(__dirname);
+});
diff --git a/packages/parser/test/snapshots/valid/entity-char-ref/input.xml b/packages/parser/test/snapshots/valid/entity-char-ref/input.xml
index 816e0202..c2666418 100644
--- a/packages/parser/test/snapshots/valid/entity-char-ref/input.xml
+++ b/packages/parser/test/snapshots/valid/entity-char-ref/input.xml
@@ -1,5 +1,6 @@
&to;
Ӓ
+
Tim
diff --git a/packages/parser/test/snapshots/valid/entity-char-ref/output.js b/packages/parser/test/snapshots/valid/entity-char-ref/output.js
index de9ebca3..615f2c72 100644
--- a/packages/parser/test/snapshots/valid/entity-char-ref/output.js
+++ b/packages/parser/test/snapshots/valid/entity-char-ref/output.js
@@ -67,19 +67,33 @@ module.exports = {
},
location: { startOffset: 27, endOffset: 31 },
},
+ {
+ name: "chardata",
+ children: {
+ SEA_WS: [
+ {
+ image: "\n ",
+ startOffset: 42,
+ endOffset: 46,
+ tokenType: "SEA_WS",
+ },
+ ],
+ },
+ location: { startOffset: 42, endOffset: 46 },
+ },
{
name: "chardata",
children: {
SEA_WS: [
{
image: "\n",
- startOffset: 48,
- endOffset: 48,
+ startOffset: 63,
+ endOffset: 63,
tokenType: "SEA_WS",
},
],
},
- location: { startOffset: 48, endOffset: 48 },
+ location: { startOffset: 63, endOffset: 63 },
},
],
reference: [
@@ -111,6 +125,20 @@ module.exports = {
},
location: { startOffset: 20, endOffset: 26 },
},
+ {
+ name: "reference",
+ children: {
+ CharRef: [
+ {
+ image: "",
+ startOffset: 32,
+ endOffset: 41,
+ tokenType: "CharRef",
+ },
+ ],
+ },
+ location: { startOffset: 32, endOffset: 41 },
+ },
],
element: [
{
@@ -119,24 +147,24 @@ module.exports = {
OPEN: [
{
image: "<",
- startOffset: 32,
- endOffset: 32,
+ startOffset: 47,
+ endOffset: 47,
tokenType: "OPEN",
},
],
Name: [
{
image: "from",
- startOffset: 33,
- endOffset: 36,
+ startOffset: 48,
+ endOffset: 51,
tokenType: "Name",
},
],
START_CLOSE: [
{
image: ">",
- startOffset: 37,
- endOffset: 37,
+ startOffset: 52,
+ endOffset: 52,
tokenType: "CLOSE",
},
],
@@ -151,77 +179,77 @@ module.exports = {
TEXT: [
{
image: "Tim",
- startOffset: 38,
- endOffset: 40,
+ startOffset: 53,
+ endOffset: 55,
tokenType: "TEXT",
},
],
},
- location: { startOffset: 38, endOffset: 40 },
+ location: { startOffset: 53, endOffset: 55 },
},
],
},
- location: { startOffset: 38, endOffset: 40 },
+ location: { startOffset: 53, endOffset: 55 },
},
],
SLASH_OPEN: [
{
image: "",
- startOffset: 41,
- endOffset: 42,
+ startOffset: 56,
+ endOffset: 57,
tokenType: "SLASH_OPEN",
},
],
END_NAME: [
{
image: "from",
- startOffset: 43,
- endOffset: 46,
+ startOffset: 58,
+ endOffset: 61,
tokenType: "Name",
},
],
END: [
{
image: ">",
- startOffset: 47,
- endOffset: 47,
+ startOffset: 62,
+ endOffset: 62,
tokenType: "CLOSE",
},
],
},
- location: { startOffset: 32, endOffset: 47 },
+ location: { startOffset: 47, endOffset: 62 },
},
],
},
- location: { startOffset: 6, endOffset: 48 },
+ location: { startOffset: 6, endOffset: 63 },
},
],
SLASH_OPEN: [
{
image: "",
- startOffset: 49,
- endOffset: 50,
+ startOffset: 64,
+ endOffset: 65,
tokenType: "SLASH_OPEN",
},
],
END_NAME: [
{
image: "note",
- startOffset: 51,
- endOffset: 54,
+ startOffset: 66,
+ endOffset: 69,
tokenType: "Name",
},
],
END: [
{
image: ">",
- startOffset: 55,
- endOffset: 55,
+ startOffset: 70,
+ endOffset: 70,
tokenType: "CLOSE",
},
],
},
- location: { startOffset: 0, endOffset: 55 },
+ location: { startOffset: 0, endOffset: 70 },
},
],
misc: [
@@ -231,16 +259,16 @@ module.exports = {
SEA_WS: [
{
image: "\n",
- startOffset: 56,
- endOffset: 56,
+ startOffset: 71,
+ endOffset: 71,
tokenType: "SEA_WS",
},
],
},
- location: { startOffset: 56, endOffset: 56 },
+ location: { startOffset: 71, endOffset: 71 },
},
],
},
- location: { startOffset: 0, endOffset: 56 },
+ location: { startOffset: 0, endOffset: 71 },
},
};