• 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    convertToJSObject(strXml : string, options ?: Object) : ReceiveObject;
25}
26interface ConvertXML {
27    ConvertXml : NativeConvertXml;
28}
29declare function requireInternal(s : string) : ConvertXML;
30const convertXml = requireInternal('ConvertXML');
31
32const TypeErrorCode = 401;
33class BusinessError extends Error {
34    code:number;
35    constructor(msg:string) {
36        super(msg)
37        this.name = 'BusinessError'
38        this.code = TypeErrorCode;
39    }
40}
41
42class ConvertXML {
43    convertxmlclass : NativeConvertXml;
44    constructor() {
45        this.convertxmlclass = new convertXml.ConvertXml();
46    }
47    convert(strXml : string, options ?: Object) {
48        strXml = DealXml(strXml);
49        let converted = this.convertxmlclass.convert(strXml, options);
50        let strEnd : string = '';
51        if (converted.hasOwnProperty('spaces')) {
52            let space : string | number | undefined = converted.spaces;
53            delete converted.spaces;
54        }
55        return converted;
56    }
57
58    convertToJSObject(strXml : string, options ?: Object) {
59        if (typeof strXml !== 'string') {
60            let error = new BusinessError(`Parameter error.The type of ${strXml} must be string`);
61            throw error;
62        }
63        if (options && typeof options !== 'object') {
64            let error = new BusinessError(`Parameter error.The type of ${options} must be object`);
65            throw error;
66        }
67        strXml = DealXml(strXml);
68        let converted = this.convertxmlclass.convert(strXml, options);
69        let strEnd : string = '';
70        if (converted.hasOwnProperty('spaces')) {
71            let space : string | number | undefined = converted.spaces;
72            delete converted.spaces;
73        }
74        return converted;
75    }
76}
77
78function DealXml(strXml : string) {
79    let idx : number = 0;
80    let idxSec : number = 0;
81    let idxThir : number = 0;
82    let idxCData : number = 0;
83    let idxCDataSec : number = 0;
84    while ((idx = strXml.indexOf(']]><![CDATA')) !== -1) {
85        strXml = strXml.substring(0, idx + 3) + ' ' + strXml.substring(idx + 3);
86    }
87    while ((idx = strXml.indexOf('>', idxSec)) !== -1) {
88        idxThir = strXml.indexOf('<', idx);
89        strXml = DealPriorReplace(strXml, idx, idxThir);
90        idxSec = strXml.indexOf('<', idx);
91        if (idxSec !== -1) {
92            idxCData = strXml.indexOf('<![CDATA', idxCDataSec);
93            if (idxSec === idxCData) {
94                idxSec = strXml.indexOf(']]>', idxCData);
95                strXml = DealLaterReplace(strXml, idx, idxThir);
96                idxCDataSec = idxSec;
97            }
98        } else {
99            break;
100        }
101    }
102    return strXml;
103}
104
105function DealPriorReplace(strXml : string, idx : number, idxThir : number) {
106    let i : number = idx + 1;
107    for (; i < idxThir ; i++) {
108        let cXml : string = strXml.charAt(i);
109        if (cXml !== '\n' && cXml !== '\v' && cXml !== '\t' && cXml !== ' ')
110        {
111            break;
112        }
113    }
114    let j : number = idx + 1;
115    if (i == idxThir) {
116        strXml = strXml.substring(0, j) + strXml.substring(idxThir);
117    } else {
118        for (; j < strXml.indexOf('<', idx) ; j++) {
119            let cXml : string = strXml.charAt(j);
120            switch (cXml) {
121                case '\n':
122                    strXml = strXml.substring(0, j) + '\\n' + strXml.substring(j + 1);
123                    break;
124                case '\v':
125                    strXml = strXml.substring(0, j) + '\\v' + strXml.substring(j + 1);
126                    break;
127                case '\t':
128                    strXml = strXml.substring(0, j) + '\\t' + strXml.substring(j + 1);
129                    break;
130                default:
131                    break;
132            }
133        }
134    }
135    return strXml;
136}
137
138function DealLaterReplace(strXml : string, idx : number, idxThir : number) {
139    let i : number = idx + 1;
140    for (; i < idxThir ; i++) {
141        let cXml : string = strXml.charAt(i)
142        switch (cXml) {
143            case '\n':
144                strXml = strXml.substring(0, i) + '\\n' + strXml.substring(i + 1);
145                break;
146            case '\v':
147                strXml = strXml.substring(0, i) + '\\v' + strXml.substring(i + 1);
148                break;
149            case '\t':
150                strXml = strXml.substring(0, i) + '\\t' + strXml.substring(i + 1);
151                break;
152            default:
153                break;
154        }
155    }
156    return strXml;
157}
158
159export default {
160    ConvertXML : ConvertXML
161}
162