adif-parser-ts 0.4.78 → 0.4.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adif-parser.es5.js","sources":["../src/adif-formatter.ts","../src/adif-parser.ts"],"sourcesContent":["import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for formatting objects into ADIF.\n */\nexport class AdifFormatter {\n /**\n * Format the given object into an ADIF string.\n */\n static formatAdi(obj: SimpleAdif): string {\n return new AdifFormatter(obj).format();\n }\n\n private constructor(private readonly obj: SimpleAdif) {}\n\n private format(): string {\n // From just a moment of research, string concatenation should have OK\n // performance. Maybe do testing and reconsider.\n let buffer = '';\n if (this.obj.header !== undefined) {\n buffer += this.obj.header.text + '\\n';\n const restOfHeader = this.obj.header;\n delete restOfHeader.text;\n buffer += AdifFormatter.formatTags(restOfHeader);\n buffer += '<eoh>\\n\\n';\n }\n\n if (!this.obj.records) {\n return AdifFormatter.prepReturn(buffer);\n }\n for (const rec of this.obj.records) {\n buffer += AdifFormatter.formatTags(rec);\n buffer += '<eor>\\n\\n';\n }\n\n return AdifFormatter.prepReturn(buffer);\n }\n\n private static formatTags(obj: object): string {\n let buffer = '';\n for (const [key, value] of Object.entries(obj)) {\n const width = new TextEncoder().encode(value).byteLength;\n buffer += `<${key}:${width}>${value}\\n`;\n }\n return buffer;\n }\n\n private static prepReturn(buffer: string) {\n buffer = buffer.trim();\n if (buffer.length === 0) {\n return buffer;\n }\n return buffer + '\\n';\n }\n}\n","import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for parsing ADIF data into usable data structures.\n */\nexport class AdifParser {\n /**\n * Parse the given ADIF data string into an object.\n */\n static parseAdi(adi: string): SimpleAdif {\n return new AdifParser(adi).parseTopLevel();\n }\n\n private cursor = 0;\n\n private constructor(private readonly adi: string) {}\n\n private parseTopLevel(): SimpleAdif {\n const parsed: SimpleAdif = {};\n if (this.adi.length === 0) {\n return parsed;\n }\n\n // Header\n if (this.adi[0] !== '<') {\n const header: { [field: string]: string } = {};\n header['text'] = this.parseHeaderText();\n while (this.cursor < this.adi.length) {\n const endOfHeader = this.parseTagValue(header);\n if (endOfHeader) {\n break;\n }\n }\n parsed.header = header;\n }\n\n // QSO Records\n const records = new Array<{ [field: string]: string }>();\n while (this.cursor < this.adi.length) {\n const record = this.parseRecord();\n if (Object.keys(record).length > 0) {\n records.push(record);\n }\n }\n if (records.length > 0) {\n parsed.records = records;\n }\n return parsed;\n }\n\n private parseHeaderText(): string {\n const startTag = this.adi.indexOf('<', this.cursor);\n this.cursor = startTag;\n return this.adi.substring(0, startTag).trim();\n }\n\n private parseRecord(): { [field: string]: string } {\n const record: { [field: string]: string } = {};\n while (this.cursor < this.adi.length) {\n const endOfRecord = this.parseTagValue(record);\n if (endOfRecord) {\n break;\n }\n }\n return record;\n }\n\n private parseTagValue(record: { [p: string]: string }): boolean {\n const startTag = this.adi.indexOf('<', this.cursor);\n if (startTag === -1) {\n this.cursor = this.adi.length;\n return true;\n }\n const endTag = this.adi.indexOf('>', startTag);\n const tagParts = this.adi.substring(startTag + 1, endTag).split(':');\n if (\n tagParts[0].toLowerCase() === 'eor' ||\n tagParts[0].toLowerCase() === 'eoh'\n ) {\n this.cursor = endTag + 1;\n return true;\n } else if (tagParts.length < 2) {\n if (this.adi.substring(startTag + 1, endTag) === 'APP_LoTW_EOF') {\n this.cursor = endTag + 1;\n return true;\n }\n\n throw new Error(\n 'Encountered field tag without enough parts near char ' +\n startTag +\n ': ' +\n this.adi.substring(startTag + 1, startTag + 80) +\n '\\n'
|
|
1
|
+
{"version":3,"file":"adif-parser.es5.js","sources":["../src/adif-formatter.ts","../src/adif-parser.ts"],"sourcesContent":["import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for formatting objects into ADIF.\n */\nexport class AdifFormatter {\n /**\n * Format the given object into an ADIF string.\n */\n static formatAdi(obj: SimpleAdif): string {\n return new AdifFormatter(obj).format();\n }\n\n private constructor(private readonly obj: SimpleAdif) {}\n\n private format(): string {\n // From just a moment of research, string concatenation should have OK\n // performance. Maybe do testing and reconsider.\n let buffer = '';\n if (this.obj.header !== undefined) {\n buffer += this.obj.header.text + '\\n';\n const restOfHeader = this.obj.header;\n delete restOfHeader.text;\n buffer += AdifFormatter.formatTags(restOfHeader);\n buffer += '<eoh>\\n\\n';\n }\n\n if (!this.obj.records) {\n return AdifFormatter.prepReturn(buffer);\n }\n for (const rec of this.obj.records) {\n buffer += AdifFormatter.formatTags(rec);\n buffer += '<eor>\\n\\n';\n }\n\n return AdifFormatter.prepReturn(buffer);\n }\n\n private static formatTags(obj: object): string {\n let buffer = '';\n for (const [key, value] of Object.entries(obj)) {\n const width = new TextEncoder().encode(value).byteLength;\n buffer += `<${key}:${width}>${value}\\n`;\n }\n return buffer;\n }\n\n private static prepReturn(buffer: string) {\n buffer = buffer.trim();\n if (buffer.length === 0) {\n return buffer;\n }\n return buffer + '\\n';\n }\n}\n","import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for parsing ADIF data into usable data structures.\n */\nexport class AdifParser {\n /**\n * Parse the given ADIF data string into an object.\n */\n static parseAdi(adi: string): SimpleAdif {\n return new AdifParser(adi).parseTopLevel();\n }\n\n private cursor = 0;\n\n private constructor(private readonly adi: string) {}\n\n private parseTopLevel(): SimpleAdif {\n const parsed: SimpleAdif = {};\n if (this.adi.length === 0) {\n return parsed;\n }\n\n // Header\n if (this.adi[0] !== '<') {\n const header: { [field: string]: string } = {};\n header['text'] = this.parseHeaderText();\n while (this.cursor < this.adi.length) {\n const endOfHeader = this.parseTagValue(header);\n if (endOfHeader) {\n break;\n }\n }\n parsed.header = header;\n }\n\n // QSO Records\n const records = new Array<{ [field: string]: string }>();\n while (this.cursor < this.adi.length) {\n const record = this.parseRecord();\n if (Object.keys(record).length > 0) {\n records.push(record);\n }\n }\n if (records.length > 0) {\n parsed.records = records;\n }\n return parsed;\n }\n\n private parseHeaderText(): string {\n const startTag = this.adi.indexOf('<', this.cursor);\n this.cursor = startTag;\n return this.adi.substring(0, startTag).trim();\n }\n\n private parseRecord(): { [field: string]: string } {\n const record: { [field: string]: string } = {};\n while (this.cursor < this.adi.length) {\n const endOfRecord = this.parseTagValue(record);\n if (endOfRecord) {\n break;\n }\n }\n return record;\n }\n\n private parseTagValue(record: { [p: string]: string }): boolean {\n const startTag = this.adi.indexOf('<', this.cursor);\n if (startTag === -1) {\n this.cursor = this.adi.length;\n return true;\n }\n const endTag = this.adi.indexOf('>', startTag);\n const tagParts = this.adi.substring(startTag + 1, endTag).split(':');\n if (\n tagParts[0].toLowerCase() === 'eor' ||\n tagParts[0].toLowerCase() === 'eoh'\n ) {\n this.cursor = endTag + 1;\n return true;\n } else if (tagParts.length < 2) {\n if (this.adi.substring(startTag + 1, endTag) === 'APP_LoTW_EOF') {\n this.cursor = endTag + 1;\n return true;\n }\n\n throw new Error(\n 'Encountered field tag without enough parts near char ' +\n startTag +\n ': ' +\n this.adi.substring(startTag + 1, startTag + 80) +\n '\\n',\n );\n }\n const fieldName = tagParts[0].toLowerCase();\n const width = +tagParts[1];\n record[fieldName] = this.adi.substr(endTag + 1, width);\n this.cursor = endTag + 1 + width;\n return false;\n }\n}\n\nexport { SimpleAdif } from './simple-adif';\nexport { AdifFormatter } from './adif-formatter';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adif-parser.umd.js","sources":["../src/adif-formatter.ts","../src/adif-parser.ts"],"sourcesContent":["import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for formatting objects into ADIF.\n */\nexport class AdifFormatter {\n /**\n * Format the given object into an ADIF string.\n */\n static formatAdi(obj: SimpleAdif): string {\n return new AdifFormatter(obj).format();\n }\n\n private constructor(private readonly obj: SimpleAdif) {}\n\n private format(): string {\n // From just a moment of research, string concatenation should have OK\n // performance. Maybe do testing and reconsider.\n let buffer = '';\n if (this.obj.header !== undefined) {\n buffer += this.obj.header.text + '\\n';\n const restOfHeader = this.obj.header;\n delete restOfHeader.text;\n buffer += AdifFormatter.formatTags(restOfHeader);\n buffer += '<eoh>\\n\\n';\n }\n\n if (!this.obj.records) {\n return AdifFormatter.prepReturn(buffer);\n }\n for (const rec of this.obj.records) {\n buffer += AdifFormatter.formatTags(rec);\n buffer += '<eor>\\n\\n';\n }\n\n return AdifFormatter.prepReturn(buffer);\n }\n\n private static formatTags(obj: object): string {\n let buffer = '';\n for (const [key, value] of Object.entries(obj)) {\n const width = new TextEncoder().encode(value).byteLength;\n buffer += `<${key}:${width}>${value}\\n`;\n }\n return buffer;\n }\n\n private static prepReturn(buffer: string) {\n buffer = buffer.trim();\n if (buffer.length === 0) {\n return buffer;\n }\n return buffer + '\\n';\n }\n}\n","import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for parsing ADIF data into usable data structures.\n */\nexport class AdifParser {\n /**\n * Parse the given ADIF data string into an object.\n */\n static parseAdi(adi: string): SimpleAdif {\n return new AdifParser(adi).parseTopLevel();\n }\n\n private cursor = 0;\n\n private constructor(private readonly adi: string) {}\n\n private parseTopLevel(): SimpleAdif {\n const parsed: SimpleAdif = {};\n if (this.adi.length === 0) {\n return parsed;\n }\n\n // Header\n if (this.adi[0] !== '<') {\n const header: { [field: string]: string } = {};\n header['text'] = this.parseHeaderText();\n while (this.cursor < this.adi.length) {\n const endOfHeader = this.parseTagValue(header);\n if (endOfHeader) {\n break;\n }\n }\n parsed.header = header;\n }\n\n // QSO Records\n const records = new Array<{ [field: string]: string }>();\n while (this.cursor < this.adi.length) {\n const record = this.parseRecord();\n if (Object.keys(record).length > 0) {\n records.push(record);\n }\n }\n if (records.length > 0) {\n parsed.records = records;\n }\n return parsed;\n }\n\n private parseHeaderText(): string {\n const startTag = this.adi.indexOf('<', this.cursor);\n this.cursor = startTag;\n return this.adi.substring(0, startTag).trim();\n }\n\n private parseRecord(): { [field: string]: string } {\n const record: { [field: string]: string } = {};\n while (this.cursor < this.adi.length) {\n const endOfRecord = this.parseTagValue(record);\n if (endOfRecord) {\n break;\n }\n }\n return record;\n }\n\n private parseTagValue(record: { [p: string]: string }): boolean {\n const startTag = this.adi.indexOf('<', this.cursor);\n if (startTag === -1) {\n this.cursor = this.adi.length;\n return true;\n }\n const endTag = this.adi.indexOf('>', startTag);\n const tagParts = this.adi.substring(startTag + 1, endTag).split(':');\n if (\n tagParts[0].toLowerCase() === 'eor' ||\n tagParts[0].toLowerCase() === 'eoh'\n ) {\n this.cursor = endTag + 1;\n return true;\n } else if (tagParts.length < 2) {\n if (this.adi.substring(startTag + 1, endTag) === 'APP_LoTW_EOF') {\n this.cursor = endTag + 1;\n return true;\n }\n\n throw new Error(\n 'Encountered field tag without enough parts near char ' +\n startTag +\n ': ' +\n this.adi.substring(startTag + 1, startTag + 80) +\n '\\n'
|
|
1
|
+
{"version":3,"file":"adif-parser.umd.js","sources":["../src/adif-formatter.ts","../src/adif-parser.ts"],"sourcesContent":["import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for formatting objects into ADIF.\n */\nexport class AdifFormatter {\n /**\n * Format the given object into an ADIF string.\n */\n static formatAdi(obj: SimpleAdif): string {\n return new AdifFormatter(obj).format();\n }\n\n private constructor(private readonly obj: SimpleAdif) {}\n\n private format(): string {\n // From just a moment of research, string concatenation should have OK\n // performance. Maybe do testing and reconsider.\n let buffer = '';\n if (this.obj.header !== undefined) {\n buffer += this.obj.header.text + '\\n';\n const restOfHeader = this.obj.header;\n delete restOfHeader.text;\n buffer += AdifFormatter.formatTags(restOfHeader);\n buffer += '<eoh>\\n\\n';\n }\n\n if (!this.obj.records) {\n return AdifFormatter.prepReturn(buffer);\n }\n for (const rec of this.obj.records) {\n buffer += AdifFormatter.formatTags(rec);\n buffer += '<eor>\\n\\n';\n }\n\n return AdifFormatter.prepReturn(buffer);\n }\n\n private static formatTags(obj: object): string {\n let buffer = '';\n for (const [key, value] of Object.entries(obj)) {\n const width = new TextEncoder().encode(value).byteLength;\n buffer += `<${key}:${width}>${value}\\n`;\n }\n return buffer;\n }\n\n private static prepReturn(buffer: string) {\n buffer = buffer.trim();\n if (buffer.length === 0) {\n return buffer;\n }\n return buffer + '\\n';\n }\n}\n","import { SimpleAdif } from './simple-adif';\n\n/**\n * A class for parsing ADIF data into usable data structures.\n */\nexport class AdifParser {\n /**\n * Parse the given ADIF data string into an object.\n */\n static parseAdi(adi: string): SimpleAdif {\n return new AdifParser(adi).parseTopLevel();\n }\n\n private cursor = 0;\n\n private constructor(private readonly adi: string) {}\n\n private parseTopLevel(): SimpleAdif {\n const parsed: SimpleAdif = {};\n if (this.adi.length === 0) {\n return parsed;\n }\n\n // Header\n if (this.adi[0] !== '<') {\n const header: { [field: string]: string } = {};\n header['text'] = this.parseHeaderText();\n while (this.cursor < this.adi.length) {\n const endOfHeader = this.parseTagValue(header);\n if (endOfHeader) {\n break;\n }\n }\n parsed.header = header;\n }\n\n // QSO Records\n const records = new Array<{ [field: string]: string }>();\n while (this.cursor < this.adi.length) {\n const record = this.parseRecord();\n if (Object.keys(record).length > 0) {\n records.push(record);\n }\n }\n if (records.length > 0) {\n parsed.records = records;\n }\n return parsed;\n }\n\n private parseHeaderText(): string {\n const startTag = this.adi.indexOf('<', this.cursor);\n this.cursor = startTag;\n return this.adi.substring(0, startTag).trim();\n }\n\n private parseRecord(): { [field: string]: string } {\n const record: { [field: string]: string } = {};\n while (this.cursor < this.adi.length) {\n const endOfRecord = this.parseTagValue(record);\n if (endOfRecord) {\n break;\n }\n }\n return record;\n }\n\n private parseTagValue(record: { [p: string]: string }): boolean {\n const startTag = this.adi.indexOf('<', this.cursor);\n if (startTag === -1) {\n this.cursor = this.adi.length;\n return true;\n }\n const endTag = this.adi.indexOf('>', startTag);\n const tagParts = this.adi.substring(startTag + 1, endTag).split(':');\n if (\n tagParts[0].toLowerCase() === 'eor' ||\n tagParts[0].toLowerCase() === 'eoh'\n ) {\n this.cursor = endTag + 1;\n return true;\n } else if (tagParts.length < 2) {\n if (this.adi.substring(startTag + 1, endTag) === 'APP_LoTW_EOF') {\n this.cursor = endTag + 1;\n return true;\n }\n\n throw new Error(\n 'Encountered field tag without enough parts near char ' +\n startTag +\n ': ' +\n this.adi.substring(startTag + 1, startTag + 80) +\n '\\n',\n );\n }\n const fieldName = tagParts[0].toLowerCase();\n const width = +tagParts[1];\n record[fieldName] = this.adi.substr(endTag + 1, width);\n this.cursor = endTag + 1 + width;\n return false;\n }\n}\n\nexport { SimpleAdif } from './simple-adif';\nexport { AdifFormatter } from './adif-formatter';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adif-parser-ts",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.80",
|
|
4
4
|
"description": "An amateur radio log data ADIF parser in Typescript and Javascript",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"amateur radio",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"npm": ">7.0.0"
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
29
|
-
"
|
|
29
|
+
"postinstall": "husky install",
|
|
30
30
|
"lint": "tslint --project tsconfig.json -t codeFrame 'src/**/*.ts' 'test/**/*.ts'",
|
|
31
31
|
"build": "tsc --module commonjs && rollup -c rollup.config.ts && typedoc --entryPointStrategy expand --out docs src",
|
|
32
32
|
"test": "jest --coverage",
|
|
@@ -67,29 +67,29 @@
|
|
|
67
67
|
"singleQuote": true
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@types/jest": "29.5.
|
|
71
|
-
"@types/node": "
|
|
70
|
+
"@types/jest": "29.5.3",
|
|
71
|
+
"@types/node": "20.5.0",
|
|
72
72
|
"coveralls": "3.1.1",
|
|
73
73
|
"cross-env": "7.0.3",
|
|
74
74
|
"husky": "8.0.3",
|
|
75
|
-
"jest": "29.
|
|
76
|
-
"jest-config": "29.
|
|
77
|
-
"lint-staged": "13.2.
|
|
75
|
+
"jest": "29.6.2",
|
|
76
|
+
"jest-config": "29.6.2",
|
|
77
|
+
"lint-staged": "13.2.3",
|
|
78
78
|
"lodash.camelcase": "4.3.0",
|
|
79
79
|
"pinst": "3.0.0",
|
|
80
|
-
"prettier": "
|
|
80
|
+
"prettier": "3.0.1",
|
|
81
81
|
"rollup": "2.79.1",
|
|
82
82
|
"rollup-plugin-commonjs": "10.1.0",
|
|
83
83
|
"rollup-plugin-json": "4.0.0",
|
|
84
84
|
"rollup-plugin-node-resolve": "5.2.0",
|
|
85
85
|
"rollup-plugin-sourcemaps": "0.6.3",
|
|
86
|
-
"rollup-plugin-typescript2": "0.
|
|
87
|
-
"ts-jest": "29.1.
|
|
86
|
+
"rollup-plugin-typescript2": "0.35.0",
|
|
87
|
+
"ts-jest": "29.1.1",
|
|
88
88
|
"ts-node": "10.9.1",
|
|
89
89
|
"tslint": "6.1.3",
|
|
90
90
|
"tslint-config-prettier": "1.18.0",
|
|
91
91
|
"tslint-config-standard": "9.0.0",
|
|
92
92
|
"typedoc": "0.24.8",
|
|
93
|
-
"typescript": "5.
|
|
93
|
+
"typescript": "5.1.6"
|
|
94
94
|
}
|
|
95
95
|
}
|