• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

NaturalIntelligence / fast-xml-parser / 4274003586

pending completion
4274003586

push

github

amit kumar gupta
update package

705 of 760 branches covered (92.76%)

1 of 1 new or added line in 1 file covered. (100.0%)

2396 of 2441 relevant lines covered (98.16%)

194385.18 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.82
/src/xmlparser/DocTypeReader.js
1
//TODO: handle comments
2
function readDocType(xmlData, i){
3
    
4
    const entities = {};
11✔
5
    if( xmlData[i + 3] === 'O' &&
11!
6
         xmlData[i + 4] === 'C' &&
7
         xmlData[i + 5] === 'T' &&
8
         xmlData[i + 6] === 'Y' &&
9
         xmlData[i + 7] === 'P' &&
10
         xmlData[i + 8] === 'E')
11
    {    
12
        i = i+9;
11✔
13
        let angleBracketsCount = 1;
11✔
14
        let hasBody = false, comment = false;
11✔
15
        let exp = "";
11✔
16
        for(;i<xmlData.length;i++){
11✔
17
            if (xmlData[i] === '<' && !comment) { //Determine the tag type
779✔
18
                if( hasBody && isEntity(xmlData, i)){
20✔
19
                    i += 7; 
10✔
20
                    [entityName, val,i] = readEntityExp(xmlData,i+1);
10✔
21
                    if(val.indexOf("&") === -1) //Parameter entities are not supported
10✔
22
                        entities[ entityName ] = {
9✔
23
                            regx : RegExp( `&${entityName};`,"g"),
24
                            val: val
25
                        };
26
                }
27
                else if( hasBody && isElement(xmlData, i))  i += 8;//Not supported
10✔
28
                else if( hasBody && isAttlist(xmlData, i))  i += 8;//Not supported
7✔
29
                else if( hasBody && isNotation(xmlData, i)) i += 9;//Not supported
6✔
30
                else if( isComment)                         comment = true;
5!
31
                else                                        throw new Error("Invalid DOCTYPE");
×
32

33
                angleBracketsCount++;
20✔
34
                exp = "";
20✔
35
            } else if (xmlData[i] === '>') { //Read tag content
759✔
36
                if(comment){
31✔
37
                    if( xmlData[i - 1] === "-" && xmlData[i - 2] === "-"){
6✔
38
                        comment = false;
5✔
39
                        angleBracketsCount--;
5✔
40
                    }
41
                }else{
42
                    angleBracketsCount--;
25✔
43
                }
44
                if (angleBracketsCount === 0) {
31✔
45
                  break;
10✔
46
                }
47
            }else if( xmlData[i] === '['){
728✔
48
                hasBody = true;
8✔
49
            }else{
50
                exp += xmlData[i];
720✔
51
            }
52
        }
53
        if(angleBracketsCount !== 0){
11✔
54
            throw new Error(`Unclosed DOCTYPE`);
1✔
55
        }
56
    }else{
57
        throw new Error(`Invalid Tag instead of DOCTYPE`);
×
58
    }
59
    return {entities, i};
10✔
60
}
61

62
function readEntityExp(xmlData,i){
63
    //External entities are not supported
64
    //    <!ENTITY ext SYSTEM "http://normal-website.com" >
65

66
    //Parameter entities are not supported
67
    //    <!ENTITY entityname "&anotherElement;">
68

69
    //Internal entities are supported
70
    //    <!ENTITY entityname "replacement text">
71
    
72
    //read EntityName
73
    let entityName = "";
10✔
74
    for (; i < xmlData.length && (xmlData[i] !== "'" && xmlData[i] !== '"' ); i++) {
10✔
75
        // if(xmlData[i] === " ") continue;
76
        // else 
77
        entityName += xmlData[i];
82✔
78
    }
79
    entityName = entityName.trim();
10✔
80
    if(entityName.indexOf(" ") !== -1) throw new Error("External entites are not supported");
10!
81

82
    //read Entity Value
83
    const startChar = xmlData[i++];
10✔
84
    let val = ""
10✔
85
    for (; i < xmlData.length && xmlData[i] !== startChar ; i++) {
10✔
86
        val += xmlData[i];
478✔
87
    }
88
    return [entityName, val, i];
10✔
89
}
90

91
function isComment(xmlData, i){
92
    if(xmlData[i+1] === '!' &&
×
93
    xmlData[i+2] === '-' &&
94
    xmlData[i+3] === '-') return true
×
95
    return false
×
96
}
97
function isEntity(xmlData, i){
98
    if(xmlData[i+1] === '!' &&
20✔
99
    xmlData[i+2] === 'E' &&
100
    xmlData[i+3] === 'N' &&
101
    xmlData[i+4] === 'T' &&
102
    xmlData[i+5] === 'I' &&
103
    xmlData[i+6] === 'T' &&
104
    xmlData[i+7] === 'Y') return true
10✔
105
    return false
10✔
106
}
107
function isElement(xmlData, i){
108
    if(xmlData[i+1] === '!' &&
10✔
109
    xmlData[i+2] === 'E' &&
110
    xmlData[i+3] === 'L' &&
111
    xmlData[i+4] === 'E' &&
112
    xmlData[i+5] === 'M' &&
113
    xmlData[i+6] === 'E' &&
114
    xmlData[i+7] === 'N' &&
115
    xmlData[i+8] === 'T') return true
3✔
116
    return false
7✔
117
}
118

119
function isAttlist(xmlData, i){
120
    if(xmlData[i+1] === '!' &&
7✔
121
    xmlData[i+2] === 'A' &&
122
    xmlData[i+3] === 'T' &&
123
    xmlData[i+4] === 'T' &&
124
    xmlData[i+5] === 'L' &&
125
    xmlData[i+6] === 'I' &&
126
    xmlData[i+7] === 'S' &&
127
    xmlData[i+8] === 'T') return true
1✔
128
    return false
6✔
129
}
130
function isNotation(xmlData, i){
131
    if(xmlData[i+1] === '!' &&
6✔
132
    xmlData[i+2] === 'N' &&
133
    xmlData[i+3] === 'O' &&
134
    xmlData[i+4] === 'T' &&
135
    xmlData[i+5] === 'A' &&
136
    xmlData[i+6] === 'T' &&
137
    xmlData[i+7] === 'I' &&
138
    xmlData[i+8] === 'O' &&
139
    xmlData[i+9] === 'N') return true
1✔
140
    return false
5✔
141
}
142

143
module.exports = readDocType;
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc