• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16interface ReceiveObject{
17    obj : Object;
18    spaces ?: string | number;
19}
20
21interface NativeConvertXml {
22    new() : NativeConvertXml;
23    convert(strXml : string, options ?: Object) : ReceiveObject;
24}
25interface ConvertXML {
26    ConvertXml : NativeConvertXml;
27}
28declare function requireInternal(s : string) : ConvertXML;
29const convertXml = requireInternal('ConvertXML');
30
31class ConvertXML {
32    convertxmlclass : NativeConvertXml;
33    constructor() {
34        this.convertxmlclass = new convertXml.ConvertXml();
35    }
36    convert(strXml : string, options ?: Object) {
37        strXml = DealXml(strXml);
38        let converted = this.convertxmlclass.convert(strXml, options);
39        let strEnd : string = '';
40        if (converted.hasOwnProperty('spaces')) {
41            let space : string | number | undefined = converted.spaces;
42            delete converted.spaces;
43        }
44        return converted;
45    }
46}
47
48function DealXml(strXml : string)
49{
50    let idx : number = 0;
51    let idxSec : number = 0;
52    let idxThir : number = 0;
53    let idxCData : number = 0;
54    let idxCDataSec : number = 0;
55    while ((idx = strXml.indexOf(']]><![CDATA')) !== -1) {
56        strXml = strXml.substring(0, idx + 3) + ' ' + strXml.substring(idx + 3);
57    }
58    while ((idx = strXml.indexOf('>', idxSec)) !== -1) {
59        idxThir = strXml.indexOf('<', idx);
60        strXml = DealPriorReplace(strXml, idx, idxThir);
61        if (strXml.indexOf('<', idx) !== -1) {
62            idxCData = strXml.indexOf('<![CDATA', idxCDataSec);
63            idxSec = strXml.indexOf('<', idx);
64            if (idxSec === idxCData) {
65                idxSec = strXml.indexOf(']]>', idxCData);
66                strXml = DealLaterReplace(strXml, idx, idxThir);
67                idxCDataSec = idxSec;
68            }
69        }
70        else {
71            break;
72        }
73    }
74    return strXml;
75}
76
77function DealPriorReplace(strXml : string, idx : number, idxThir : number)
78{
79    let i : number = idx + 1;
80    for (; i < idxThir ; i++) {
81        let cXml : string = strXml.charAt(i);
82        if (cXml !== '\n' && cXml !== '\v' && cXml !== '\t' && cXml !== ' ')
83        {
84            break;
85        }
86    }
87    let j : number = idx + 1;
88    for (; j < strXml.indexOf('<', idx) ; j++) {
89        let cXml : string = strXml.charAt(j);
90        if (i !== idxThir) {
91            switch (cXml) {
92                case '\n':
93                    strXml = strXml.substring(0, j) + '\\n' + strXml.substring(j + 1);
94                    break;
95                case '\v':
96                    strXml = strXml.substring(0, j) + '\\v' + strXml.substring(j + 1);
97                    break;
98                case '\t':
99                    strXml = strXml.substring(0, j) + '\\t' + strXml.substring(j + 1);
100                    break;
101                default:
102                    break;
103            }
104        } else {
105            strXml = strXml.substring(0, j) + strXml.substring(j + 1);
106            --j;
107        }
108    }
109    return strXml;
110}
111
112function DealLaterReplace(strXml : string, idx : number, idxThir : number)
113{
114    let i : number = idx + 1;
115    for (; i < idxThir ; i++) {
116        let cXml : string = strXml.charAt(i)
117        switch (cXml) {
118            case '\n':
119                strXml = strXml.substring(0, i) + '\\n' + strXml.substring(i + 1);
120                break;
121            case '\v':
122                strXml = strXml.substring(0, i) + '\\v' + strXml.substring(i + 1);
123                break;
124            case '\t':
125                strXml = strXml.substring(0, i) + '\\t' + strXml.substring(i + 1);
126                break;
127            default:
128                break;
129        }
130    }
131    return strXml;
132}
133
134export default {
135    ConvertXML : ConvertXML
136}