Skip to content

Commit 4a4742f

Browse files
Fix character validation function
1 parent f3d8ca4 commit 4a4742f

File tree

4 files changed

+81
-49
lines changed

4 files changed

+81
-49
lines changed

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.0.2 ##
2+
3+
* Bug fixes
4+
15
## 1.0.1 ##
26

37
* Documentation fixes

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "xmlcreate",
3-
"version": "1.0.1",
3+
"version": "1.0.2",
44
"description": "Simple XML builder for Node.js",
55
"keywords": [
66
"build",

src/validate.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
* @private
2727
*/
2828
export function validateChar(str: string): boolean {
29-
const charRegex = "\\u0009|\\u000A|\\u000D|[\\u0020-\\uD7FF]";
29+
const charRegex = "\\u0009|\\u000A|\\u000D|[\\u0020-\\uD7FF]|"
30+
+ "[\\uE000-\\uFFFD]";
3031
const surrogateCharRegex = "[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]";
3132

3233
return new RegExp("^((" + charRegex + ")|(" + surrogateCharRegex + "))*$")
@@ -46,8 +47,8 @@ export function validateChar(str: string): boolean {
4647
*/
4748
export function validateSingleChar(str: string): boolean {
4849
if (str.length === 1) {
49-
return new RegExp("^\\u0009|\\u000A|\\u000D|[\\u0020-\\uD7FF]$")
50-
.test(str);
50+
return new RegExp("^\\u0009|\\u000A|\\u000D|[\\u0020-\\uD7FF]|"
51+
+ "[\\uE000-\\uFFFD]$").test(str);
5152
} else if (str.length === 2) {
5253
return new RegExp("^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$").test(str);
5354
} else {

test/src/validate.ts

Lines changed: 72 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,64 +24,91 @@ describe("validate", () => {
2424
describe("#validateChar", () => {
2525
it("should return false if the specified string contains" +
2626
" characters not allowed in XML", () => {
27-
assert.isFalse(validateChar(String.fromCharCode(0x0001)));
27+
assert.isFalse(validateChar(String.fromCharCode(0x0000)));
28+
assert.isFalse(validateChar(String.fromCharCode(0x0008)));
29+
assert.isFalse(validateChar(String.fromCharCode(0x000B)));
30+
assert.isFalse(validateChar(String.fromCharCode(0x000C)));
31+
assert.isFalse(validateChar(String.fromCharCode(0x000E)));
32+
assert.isFalse(validateChar(String.fromCharCode(0x001F)));
2833
assert.isFalse(validateChar(String.fromCharCode(0xd800)));
29-
assert.isFalse(validateChar(String.fromCharCode(0xdb80)));
34+
assert.isFalse(validateChar(String.fromCharCode(0xdbff)));
3035
assert.isFalse(validateChar(String.fromCharCode(0xdc00)));
31-
assert.isFalse(validateChar(String.fromCharCode(0xe000)));
36+
assert.isFalse(validateChar(String.fromCharCode(0xdfff)));
37+
38+
assert.isFalse(validateChar(String.fromCharCode(0x0001)));
39+
assert.isFalse(validateChar(String.fromCharCode(0xdb80)));
40+
assert.isFalse(validateChar(String.fromCharCode(0xdc80)));
3241
assert.isFalse(validateChar("abc" + String.fromCharCode(0x0001)));
33-
assert.isFalse(
34-
validateChar("a" + String.fromCharCode(0x0001) + "bc"));
35-
assert.isFalse(
36-
validateChar("a" + String.fromCharCode(0xd800) + "bc"));
37-
assert.isFalse(
38-
validateChar("a" + String.fromCharCode(0xdb80) + "bc"));
39-
assert.isFalse(
40-
validateChar("a" + String.fromCharCode(0xdc00) + "bc"));
41-
assert.isFalse(
42-
validateChar("a" + String.fromCharCode(0xe000) + "bc"));
43-
assert.isFalse(validateChar(
44-
"a" + String.fromCharCode(0xdb80) + String.fromCharCode(0xe000)
45-
+ "bc"));
46-
assert.isFalse(validateChar(String.fromCharCode(0xd800) + "a"));
47-
assert.isFalse(validateChar(String.fromCharCode(0xe000) +
48-
String.fromCharCode(0xdfff)));
49-
assert.isFalse(validateChar("ab" + String.fromCharCode(0xd800)));
50-
assert.isFalse(validateChar(
51-
"ab" + String.fromCharCode(0xe000) + String.fromCharCode(
52-
0xdfff)));
53-
assert.isFalse(validateChar(
54-
String.fromCharCode(0xd800) + String.fromCharCode(0xdc00)
55-
+ String.fromCharCode(0xd800)));
56-
assert.isFalse(validateChar(
57-
String.fromCharCode(0xd800) + String.fromCharCode(0xdc00)
58-
+ String.fromCharCode(0xe000) + String.fromCharCode(0xdfff)));
42+
assert.isFalse(validateChar("a" + String.fromCharCode(0x0001)
43+
+ "bc"));
44+
assert.isFalse(validateChar("abc" + String.fromCharCode(0xdb80)));
45+
assert.isFalse(validateChar("a" + String.fromCharCode(0xdb80)
46+
+ "bc"));
47+
assert.isFalse(validateChar("abc" + String.fromCharCode(0xdc80)));
48+
assert.isFalse(validateChar("a" + String.fromCharCode(0xdc80)
49+
+ "bc"));
50+
51+
assert.isFalse(validateChar(String.fromCharCode(0xdb80)
52+
+ String.fromCharCode(0xdb40)));
53+
assert.isFalse(validateChar(String.fromCharCode(0xdc80)
54+
+ String.fromCharCode(0xdc40)));
55+
assert.isFalse(validateChar(String.fromCharCode(0xdc80)
56+
+ String.fromCharCode(0xdb80)));
57+
assert.isFalse(validateChar("abc" + String.fromCharCode(0xdb80)
58+
+ String.fromCharCode(0xdb40)));
59+
assert.isFalse(validateChar("abc" + String.fromCharCode(0xdc80)
60+
+ String.fromCharCode(0xdc40)));
61+
assert.isFalse(validateChar("abc" + String.fromCharCode(0xdc80)
62+
+ String.fromCharCode(0xdb80)));
63+
assert.isFalse(validateChar("a" + String.fromCharCode(0xdb80)
64+
+ String.fromCharCode(0xdb40) + "bc"));
65+
assert.isFalse(validateChar("a" + String.fromCharCode(0xdc80)
66+
+ String.fromCharCode(0xdc40) + "bc"));
67+
assert.isFalse(validateChar("a" + String.fromCharCode(0xdc80)
68+
+ String.fromCharCode(0xdb80) + "bc"));
69+
70+
assert.isFalse(validateChar(String.fromCharCode(0xdb80)
71+
+ String.fromCharCode(0xdc80)
72+
+ String.fromCharCode(0xdb80)));
73+
assert.isFalse(validateChar(String.fromCharCode(0xdb80)
74+
+ String.fromCharCode(0xdc80)
75+
+ String.fromCharCode(0xdc80)));
5976
});
6077

6178
it("should return true if the specified string contains no" +
6279
" characters or only contains characters allowed in XML", () => {
63-
assert.isTrue(validateChar("a"));
64-
assert.isTrue(validateChar("&"));
65-
assert.isTrue(validateChar("<"));
80+
assert.isTrue(validateChar(String.fromCharCode(0x9)));
81+
assert.isTrue(validateChar(String.fromCharCode(0xa)));
82+
assert.isTrue(validateChar(String.fromCharCode(0xd)));
83+
assert.isTrue(validateChar(String.fromCharCode(0x20)));
84+
assert.isTrue(validateChar(String.fromCharCode(0xd7ff)));
85+
assert.isTrue(validateChar(String.fromCharCode(0xe000)));
86+
assert.isTrue(validateChar(String.fromCharCode(0xfffd)));
6687
assert.isTrue(validateChar(String.fromCharCode(0xd800) +
6788
String.fromCharCode(0xdc00)));
6889
assert.isTrue(validateChar(String.fromCharCode(0xdbff) +
69-
String.fromCharCode(0xdc00)));
90+
String.fromCharCode(0xdfff)));
91+
92+
assert.isTrue(validateChar("a"));
93+
assert.isTrue(validateChar("&"));
94+
assert.isTrue(validateChar("<"));
95+
assert.isTrue(validateChar(String.fromCharCode(0xdb80) +
96+
String.fromCharCode(0xdc80)));
7097
assert.isTrue(validateChar("&abc"));
7198
assert.isTrue(validateChar("abc<"));
7299
assert.isTrue(validateChar("a&<bc"));
73-
assert.isTrue(validateChar("abc" + String.fromCharCode(0xdbff) +
74-
String.fromCharCode(0xdc00)));
75-
assert.isTrue(validateChar("a" + String.fromCharCode(0xdbff) +
76-
String.fromCharCode(0xdc00) + "bc"));
77-
assert.isTrue(validateChar(String.fromCharCode(0xdbff) +
78-
String.fromCharCode(0xdc00)));
79-
assert.isTrue(validateChar(String.fromCharCode(0xdbff) +
80-
String.fromCharCode(0xdc00) + "abc"));
81-
assert.isTrue(validateChar(String.fromCharCode(0xdbff) +
82-
String.fromCharCode(0xdc00) + "abc" +
83-
String.fromCharCode(0xdbff)
84-
+ String.fromCharCode(0xdc00)));
100+
assert.isTrue(validateChar("abc" + String.fromCharCode(0xdb80) +
101+
String.fromCharCode(0xdc80)));
102+
assert.isTrue(validateChar("a" + String.fromCharCode(0xdb80) +
103+
String.fromCharCode(0xdc80) + "bc"));
104+
assert.isTrue(validateChar(String.fromCharCode(0xdb80) +
105+
String.fromCharCode(0xdc80)));
106+
assert.isTrue(validateChar(String.fromCharCode(0xdb80) +
107+
String.fromCharCode(0xdc80) + "abc"));
108+
assert.isTrue(validateChar(String.fromCharCode(0xdb80) +
109+
String.fromCharCode(0xdc80) + "abc" +
110+
String.fromCharCode(0xdb80)
111+
+ String.fromCharCode(0xdc80)));
85112
});
86113
});
87114

0 commit comments

Comments
 (0)