Skip to content

Commit 8dced43

Browse files
committed
Correctly remove CRLF line breaks
1 parent bde65f8 commit 8dced43

File tree

4 files changed

+64
-46
lines changed

4 files changed

+64
-46
lines changed

bin/validator.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var util = require("./util");
33

44
var tagsPattern = new RegExp("<\\/?([\\w:\\-_\.]+)\\s*\/?>","g");
55
exports.validate = function(xmlData){
6-
xmlData = xmlData.replace(/\n/g,"");//make it single line
6+
xmlData = xmlData.replace(/(\r\n|\n|\r)/gm,"");//make it single line
77
xmlData = xmlData.replace(/(^\s*<\?xml.*?\?>)/g,"");//Remove XML starting tag
88
xmlData = xmlData.replace(/(<!DOCTYPE[\s\w\"\.\/\-\:]+(\[.*\])*\s*>)/g,"");//Remove DOCTYPE
99

@@ -12,9 +12,9 @@ exports.validate = function(xmlData){
1212

1313
if(xmlData[i] === "<"){//starting of tag
1414
//read until you reach to '>' avoiding any '>' in attribute value
15-
15+
1616
i++;
17-
17+
1818
if(xmlData[i] === "!"){
1919
i = readCommentAndCDATA(xmlData,i);
2020
continue;
@@ -26,23 +26,23 @@ exports.validate = function(xmlData){
2626
}
2727
//read tagname
2828
var tagName = "";
29-
for(;i < xmlData.length
30-
&& xmlData[i] !== ">"
29+
for(;i < xmlData.length
30+
&& xmlData[i] !== ">"
3131
&& xmlData[i] !== " "
3232
&& xmlData[i] !== "\t" ; i++) {
3333

3434
tagName +=xmlData[i];
3535
}
3636
tagName = tagName.trim();
3737
//console.log(tagName);
38-
38+
3939
if(tagName[tagName.length-1] === "/"){//self closing tag without attributes
4040
tagName = tagName.substring(0,tagName.length-2);
4141
return validateTagName(tagName);
4242
}
4343
if(!validateTagName(tagName)) return false;
4444

45-
45+
4646
var attrStr = "";
4747
var startChar = "";
4848
for(;i < xmlData.length ;i++){
@@ -62,22 +62,22 @@ exports.validate = function(xmlData){
6262
if(startChar !== "") return false;//Unclosed quote
6363
attrStr = attrStr.trim();
6464
//console.log(attrStr, attrStr);
65-
65+
6666
if(attrStr[attrStr.length-1] === "/" ){//self closing tag
6767
attrStr = attrStr.substring(0,attrStr.length-2);
68-
68+
6969
if(!validateAttributeString(attrStr)){
7070
return false;
7171
}else{
72-
72+
7373
continue;
7474
}
7575
}else if(closingTag){
7676
if(attrStr.length > 0){
7777
return false;
7878
//throw new Error("XML validation error: closing tag should not have any attribute");
7979
}else{
80-
var otg = tags.pop();
80+
var otg = tags.pop();
8181
if(tagName !== otg){
8282
return false;
8383
//throw new Error("XML validation error: no mathicng closing tag");
@@ -106,18 +106,18 @@ exports.validate = function(xmlData){
106106
if(xmlData[i] === "<") i--;
107107
}
108108
}else{
109-
109+
110110
if(xmlData[i] === " " || xmlData[i] === "\t") continue;
111111
return false;
112112
}
113113
}
114114

115-
115+
116116
if(tags.length > 0){
117117
return false;
118118
//throw new Error("XML validation error");
119119
}
120-
120+
121121
return true;
122122
}
123123

@@ -129,8 +129,8 @@ function readCommentAndCDATA(xmlData,i){
129129
break;
130130
}
131131
}
132-
}else if( xmlData.length > i+9
133-
&& xmlData[i+1] === "["
132+
}else if( xmlData.length > i+9
133+
&& xmlData[i+1] === "["
134134
&& xmlData[i+2] === "C"
135135
&& xmlData[i+3] === "D"
136136
&& xmlData[i+4] === "A"
@@ -148,7 +148,7 @@ function readCommentAndCDATA(xmlData,i){
148148

149149
return i;
150150
}
151-
//attr, ="sd", a="amit's", a="sd"b="saf",
151+
//attr, ="sd", a="amit's", a="sd"b="saf",
152152
function validateAttributeString(attrStr){
153153
var attrNames = [];
154154
for(var i=0; i< attrStr.length; i++){
@@ -161,8 +161,8 @@ function validateAttributeString(attrStr){
161161
//validate attrName
162162
attrName = attrName.trim();
163163

164-
165-
164+
165+
166166
if(!attrNames.hasOwnProperty(attrName)){
167167
attrNames[attrName]=1;
168168
}else{
@@ -172,20 +172,20 @@ function validateAttributeString(attrStr){
172172
return false;
173173
}
174174
i++;
175-
175+
176176
//skip whitespaces
177-
for(;i < attrStr.length
177+
for(;i < attrStr.length
178178
&& (attrStr[i] === " "
179179
|| attrStr[i] === "\t") ; i++);
180180

181181
//read attribute value
182182
startChar = attrStr[i++];
183-
183+
184184
var attrVal = "";
185185
for(;i < attrStr.length && attrStr[i] !== startChar; i++) {
186186
attrVal +=attrStr[i];
187187
}
188-
188+
189189
//validate attrVal
190190

191191
if(startChar !== ""){

lib/parser.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ var util = require("./util");
243243

244244
var tagsPattern = new RegExp("<\\/?([\\w:\\-_\.]+)\\s*\/?>","g");
245245
exports.validate = function(xmlData){
246-
xmlData = xmlData.replace(/\n/g,"");//make it single line
246+
xmlData = xmlData.replace(/(\r\n|\n|\r)/gm,"");//make it single line
247247
xmlData = xmlData.replace(/(^\s*<\?xml.*?\?>)/g,"");//Remove XML starting tag
248248
xmlData = xmlData.replace(/(<!DOCTYPE[\s\w\"\.\/\-\:]+(\[.*\])*\s*>)/g,"");//Remove DOCTYPE
249249

@@ -252,9 +252,9 @@ exports.validate = function(xmlData){
252252

253253
if(xmlData[i] === "<"){//starting of tag
254254
//read until you reach to '>' avoiding any '>' in attribute value
255-
255+
256256
i++;
257-
257+
258258
if(xmlData[i] === "!"){
259259
i = readCommentAndCDATA(xmlData,i);
260260
continue;
@@ -266,23 +266,23 @@ exports.validate = function(xmlData){
266266
}
267267
//read tagname
268268
var tagName = "";
269-
for(;i < xmlData.length
270-
&& xmlData[i] !== ">"
269+
for(;i < xmlData.length
270+
&& xmlData[i] !== ">"
271271
&& xmlData[i] !== " "
272272
&& xmlData[i] !== "\t" ; i++) {
273273

274274
tagName +=xmlData[i];
275275
}
276276
tagName = tagName.trim();
277277
//console.log(tagName);
278-
278+
279279
if(tagName[tagName.length-1] === "/"){//self closing tag without attributes
280280
tagName = tagName.substring(0,tagName.length-2);
281281
return validateTagName(tagName);
282282
}
283283
if(!validateTagName(tagName)) return false;
284284

285-
285+
286286
var attrStr = "";
287287
var startChar = "";
288288
for(;i < xmlData.length ;i++){
@@ -302,22 +302,22 @@ exports.validate = function(xmlData){
302302
if(startChar !== "") return false;//Unclosed quote
303303
attrStr = attrStr.trim();
304304
//console.log(attrStr, attrStr);
305-
305+
306306
if(attrStr[attrStr.length-1] === "/" ){//self closing tag
307307
attrStr = attrStr.substring(0,attrStr.length-2);
308-
308+
309309
if(!validateAttributeString(attrStr)){
310310
return false;
311311
}else{
312-
312+
313313
continue;
314314
}
315315
}else if(closingTag){
316316
if(attrStr.length > 0){
317317
return false;
318318
//throw new Error("XML validation error: closing tag should not have any attribute");
319319
}else{
320-
var otg = tags.pop();
320+
var otg = tags.pop();
321321
if(tagName !== otg){
322322
return false;
323323
//throw new Error("XML validation error: no mathicng closing tag");
@@ -346,18 +346,18 @@ exports.validate = function(xmlData){
346346
if(xmlData[i] === "<") i--;
347347
}
348348
}else{
349-
349+
350350
if(xmlData[i] === " " || xmlData[i] === "\t") continue;
351351
return false;
352352
}
353353
}
354354

355-
355+
356356
if(tags.length > 0){
357357
return false;
358358
//throw new Error("XML validation error");
359359
}
360-
360+
361361
return true;
362362
}
363363

@@ -369,8 +369,8 @@ function readCommentAndCDATA(xmlData,i){
369369
break;
370370
}
371371
}
372-
}else if( xmlData.length > i+9
373-
&& xmlData[i+1] === "["
372+
}else if( xmlData.length > i+9
373+
&& xmlData[i+1] === "["
374374
&& xmlData[i+2] === "C"
375375
&& xmlData[i+3] === "D"
376376
&& xmlData[i+4] === "A"
@@ -388,7 +388,7 @@ function readCommentAndCDATA(xmlData,i){
388388

389389
return i;
390390
}
391-
//attr, ="sd", a="amit's", a="sd"b="saf",
391+
//attr, ="sd", a="amit's", a="sd"b="saf",
392392
function validateAttributeString(attrStr){
393393
var attrNames = [];
394394
for(var i=0; i< attrStr.length; i++){
@@ -401,8 +401,8 @@ function validateAttributeString(attrStr){
401401
//validate attrName
402402
attrName = attrName.trim();
403403

404-
405-
404+
405+
406406
if(!attrNames.hasOwnProperty(attrName)){
407407
attrNames[attrName]=1;
408408
}else{
@@ -412,20 +412,20 @@ function validateAttributeString(attrStr){
412412
return false;
413413
}
414414
i++;
415-
415+
416416
//skip whitespaces
417-
for(;i < attrStr.length
417+
for(;i < attrStr.length
418418
&& (attrStr[i] === " "
419419
|| attrStr[i] === "\t") ; i++);
420420

421421
//read attribute value
422422
startChar = attrStr[i++];
423-
423+
424424
var attrVal = "";
425425
for(;i < attrStr.length && attrStr[i] !== startChar; i++) {
426426
attrVal +=attrStr[i];
427427
}
428-
428+
429429
//validate attrVal
430430

431431
if(startChar !== ""){

spec/assets/crlf.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!DOCTYPE daily_western_horo_fr>
3+
<daily_western_horo_fr>
4+
<date valeur="2017-09-25"><signe valeur="balance">
5+
<nombre_chance>25
6+
</nombre_chance>
7+
</signe></date>
8+
</daily_western_horo_fr>

spec/validator_spec.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,16 @@ describe("XMLParser", function () {
229229
expect(result).toBe(true);
230230
});
231231

232+
it("should validate xml data with CRLF", function () {
233+
var fs = require("fs");
234+
var path = require("path");
235+
var fileNamePath = path.join(__dirname, "assets/crlf.xml");
236+
var xmlData = fs.readFileSync(fileNamePath).toString();
237+
238+
var result = validator.validate(xmlData);
239+
expect(result).toBe(true);
240+
});
241+
232242
it("should return false for invalid xml", function () {
233243
var fs = require("fs");
234244
var path = require("path");

0 commit comments

Comments
 (0)