diff --git a/package-lock.json b/package-lock.json index e17b6a2..dc2cb5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pf2open", - "version": "0.1.9", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pf2open", - "version": "0.1.9", + "version": "0.2.0", "dependencies": { "@angular/animations": "^16.2.0", "@angular/cdk": "^16.2.10", diff --git a/package.json b/package.json index cdfb8b4..a96a563 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pf2open", - "version": "0.1.9", + "version": "0.2.0", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/src/app/services/converter.service.ts b/src/app/services/converter.service.ts index 43e2109..a9ddc17 100644 --- a/src/app/services/converter.service.ts +++ b/src/app/services/converter.service.ts @@ -32,7 +32,7 @@ export class ConverterService { this.displayConversionCard$.next(false); } - async convert(file: File) { + async convert(file: File, pretty?: boolean) { this.displayConversionCard$.next(false); this.displayConversionCard$.next(true); @@ -49,8 +49,7 @@ export class ConverterService { // Correctly handle CDATA tags const parserOoptions = { - cdataPropName: "CDATA", - leadingZeros: true, + numberParseOptions: {hex: false, leadingZeros: true} } const parser = new XMLParser(parserOoptions); @@ -63,7 +62,7 @@ export class ConverterService { subscriber.error(opnJson); // bubble error message up to the calling method } - const opnXml = that.jsonToXML(opnJson as opnRoot); + const opnXml = that.jsonToXML(opnJson as opnRoot, pretty); that.conversionAvailable$.next(true); subscriber.next(opnXml); // opnXml object will be returned to the calling method @@ -139,11 +138,14 @@ export class ConverterService { let mappedAlias = Array(); for (const [key, value] of Object.entries(pfAliases)) { - if (key === 'alias') { + if (key === 'alias' && value instanceof Array) { value.forEach((alias: pfAlias) => { mappedAlias.push(this.mapAliasEntity(alias)); }); } + if (key === 'alias' && !(value instanceof Array)) { + mappedAlias.push(this.mapAliasEntity(value)); + } }; aliases = mappedAlias @@ -198,10 +200,14 @@ export class ConverterService { return arrayBuilder.build(array); } - jsonToXML(opnJson: opnRoot) { + jsonToXML(opnJson: opnRoot, pretty?: boolean) { + + const shouldPretty = + pretty != undefined ? + pretty : true; const builder = new XMLBuilder({ - format: true, + format: shouldPretty, // Correctly encode handled CDATA tags cdataPropName: 'CDATA', }); @@ -215,10 +221,13 @@ export class ConverterService { const result = builder.build(opnJson); const split = result.toString().split(""); - const splitWithAliases = [split[0], `${additionalArrays}`, split[1]]; + const splitWithAliases = [split[0]+'', `${additionalArrays}`, split[1]]; const concatenatedResult = splitWithAliases.join(''); - return xmlFormat(concatenatedResult); + if (shouldPretty) { + return xmlFormat(concatenatedResult, {}); + } + return concatenatedResult.replaceAll('\n', ''); } const result = builder.build(opnJson); diff --git a/src/app/upload/upload.component.html b/src/app/upload/upload.component.html index 9d8dd02..bb2ece7 100644 --- a/src/app/upload/upload.component.html +++ b/src/app/upload/upload.component.html @@ -78,9 +78,20 @@
- +
+
+ +
+ +
+

Having trouble with whitespace during import?

+
+
+
diff --git a/src/app/upload/upload.component.ts b/src/app/upload/upload.component.ts index dd26bd7..4e94739 100644 --- a/src/app/upload/upload.component.ts +++ b/src/app/upload/upload.component.ts @@ -18,6 +18,7 @@ export class UploadComponent implements OnInit, OnDestroy { fileName = ''; unsupportedFile = false; renderedXML: any = null; + renderedNotPrettyXML: any = null; conversionError = false; constructor(private converterService: ConverterService) { @@ -58,6 +59,19 @@ export class UploadComponent implements OnInit, OnDestroy { document.body.removeChild(element); } + downloadNoPretty() { + var element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(this.renderedNotPrettyXML)); + element.setAttribute('download', 'unformatted-pf2opn-generated-opnsense-config.xml'); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); + } + async onFileSelected(event: any) { const file: File = event.target.files[0]; this.fileName = file.name; @@ -80,6 +94,20 @@ export class UploadComponent implements OnInit, OnDestroy { this.progressColor = 'warn'; }, ); + (await this.converterService.convert(file, false)).subscribe( + res => { + this.progressMode = 'determinate'; + this.incrementProgress(); + this.renderedNotPrettyXML = res; + this.conversionError = false + }, + err => { + this.renderedNotPrettyXML = err; + console.error('something went boom: ' + err); + this.conversionError = true + this.progressColor = 'warn'; + }, + ); } else { this.unsupportedFile = true; this.converterService.cancel();