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

NaturalIntelligence / fast-xml-parser / 13532857399

25 Feb 2025 11:15PM UTC coverage: 98.946% (+0.7%) from 98.217%
13532857399

push

github

web-flow
Update node.js.yml

1087 of 1120 branches covered (97.05%)

8639 of 8731 relevant lines covered (98.95%)

408524.79 hits per line

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

94.04
/src/xmlparser/DocTypeReader.js
1
import {isName} from '../util.js';
4✔
2

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

88✔
36
                angleBracketsCount++;
88✔
37
                exp = "";
88✔
38
            } else if (xmlData[i] === '>') { //Read tag content
3,344✔
39
                if(comment){
136✔
40
                    if( xmlData[i - 1] === "-" && xmlData[i - 2] === "-"){
24✔
41
                        comment = false;
20✔
42
                        angleBracketsCount--;
20✔
43
                    }
20✔
44
                }else{
136✔
45
                    angleBracketsCount--;
112✔
46
                }
112✔
47
                if (angleBracketsCount === 0) {
136✔
48
                  break;
44✔
49
                }
44✔
50
            }else if( xmlData[i] === '['){
3,252✔
51
                hasBody = true;
40✔
52
            }else{
3,116✔
53
                exp += xmlData[i];
3,076✔
54
            }
3,076✔
55
        }
3,344✔
56
        if(angleBracketsCount !== 0){
52✔
57
            throw new Error(`Unclosed DOCTYPE`);
4✔
58
        }
4✔
59
    }else{
52!
60
        throw new Error(`Invalid Tag instead of DOCTYPE`);
×
61
    }
×
62
    return {entities, i};
44✔
63
}
52✔
64

4✔
65
function readEntityExp(xmlData,i){
52✔
66
    //External entities are not supported
52✔
67
    //    <!ENTITY ext SYSTEM "http://normal-website.com" >
52✔
68

52✔
69
    //Parameter entities are not supported
52✔
70
    //    <!ENTITY entityname "&anotherElement;">
52✔
71

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

52✔
85
    //read Entity Value
52✔
86
    const startChar = xmlData[i++];
52✔
87
    let val = ""
52✔
88
    for (; i < xmlData.length && xmlData[i] !== startChar ; i++) {
52✔
89
        val += xmlData[i];
2,064✔
90
    }
2,064✔
91
    return [entityName, val, i];
52✔
92
}
52✔
93

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

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

4✔
146
function validateEntityName(name){
48✔
147
    if (isName(name))
48✔
148
        return name;
48✔
149
    else
4✔
150
        throw new Error(`Invalid entity name ${name}`);
4✔
151
}
48✔
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