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