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}