adif-parser-ts 0.6.39 → 0.7.0

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.
@@ -71,7 +71,7 @@ var AdifParser = /** @class */ (function () {
71
71
  return parsed;
72
72
  }
73
73
  // Header
74
- if (this.adi[0] !== '<') {
74
+ if (this.hasHeader()) {
75
75
  var header = {};
76
76
  header['text'] = this.parseHeaderText();
77
77
  while (this.cursor < this.adi.length) {
@@ -95,6 +95,18 @@ var AdifParser = /** @class */ (function () {
95
95
  }
96
96
  return parsed;
97
97
  };
98
+ AdifParser.prototype.hasHeader = function () {
99
+ if (this.adi[0] !== '<') {
100
+ return true;
101
+ }
102
+ var lowercaseAdi = this.adi.toLowerCase();
103
+ var endOfHeaderIndex = lowercaseAdi.indexOf('<eoh>');
104
+ if (endOfHeaderIndex === -1) {
105
+ return false;
106
+ }
107
+ var endOfRecordIndex = lowercaseAdi.indexOf('<eor>');
108
+ return endOfRecordIndex === -1 || endOfHeaderIndex < endOfRecordIndex;
109
+ };
98
110
  AdifParser.prototype.parseHeaderText = function () {
99
111
  var startTag = this.adi.indexOf('<', this.cursor);
100
112
  this.cursor = startTag;
@@ -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',\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
+ {"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.hasHeader()) {\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 hasHeader(): boolean {\n if (this.adi[0] !== '<') {\n return true;\n }\n\n const lowercaseAdi = this.adi.toLowerCase();\n const endOfHeaderIndex = lowercaseAdi.indexOf('<eoh>');\n if (endOfHeaderIndex === -1) {\n return false;\n }\n\n const endOfRecordIndex = lowercaseAdi.indexOf('<eor>');\n return endOfRecordIndex === -1 || endOfHeaderIndex < endOfRecordIndex;\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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"}
@@ -77,7 +77,7 @@
77
77
  return parsed;
78
78
  }
79
79
  // Header
80
- if (this.adi[0] !== '<') {
80
+ if (this.hasHeader()) {
81
81
  var header = {};
82
82
  header['text'] = this.parseHeaderText();
83
83
  while (this.cursor < this.adi.length) {
@@ -101,6 +101,18 @@
101
101
  }
102
102
  return parsed;
103
103
  };
104
+ AdifParser.prototype.hasHeader = function () {
105
+ if (this.adi[0] !== '<') {
106
+ return true;
107
+ }
108
+ var lowercaseAdi = this.adi.toLowerCase();
109
+ var endOfHeaderIndex = lowercaseAdi.indexOf('<eoh>');
110
+ if (endOfHeaderIndex === -1) {
111
+ return false;
112
+ }
113
+ var endOfRecordIndex = lowercaseAdi.indexOf('<eor>');
114
+ return endOfRecordIndex === -1 || endOfHeaderIndex < endOfRecordIndex;
115
+ };
104
116
  AdifParser.prototype.parseHeaderText = function () {
105
117
  var startTag = this.adi.indexOf('<', this.cursor);
106
118
  this.cursor = startTag;
@@ -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',\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
+ {"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.hasHeader()) {\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 hasHeader(): boolean {\n if (this.adi[0] !== '<') {\n return true;\n }\n\n const lowercaseAdi = this.adi.toLowerCase();\n const endOfHeaderIndex = lowercaseAdi.indexOf('<eoh>');\n if (endOfHeaderIndex === -1) {\n return false;\n }\n\n const endOfRecordIndex = lowercaseAdi.indexOf('<eor>');\n return endOfRecordIndex === -1 || endOfHeaderIndex < endOfRecordIndex;\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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"}
@@ -21,7 +21,7 @@ var AdifParser = /** @class */ (function () {
21
21
  return parsed;
22
22
  }
23
23
  // Header
24
- if (this.adi[0] !== '<') {
24
+ if (this.hasHeader()) {
25
25
  var header = {};
26
26
  header['text'] = this.parseHeaderText();
27
27
  while (this.cursor < this.adi.length) {
@@ -45,6 +45,18 @@ var AdifParser = /** @class */ (function () {
45
45
  }
46
46
  return parsed;
47
47
  };
48
+ AdifParser.prototype.hasHeader = function () {
49
+ if (this.adi[0] !== '<') {
50
+ return true;
51
+ }
52
+ var lowercaseAdi = this.adi.toLowerCase();
53
+ var endOfHeaderIndex = lowercaseAdi.indexOf('<eoh>');
54
+ if (endOfHeaderIndex === -1) {
55
+ return false;
56
+ }
57
+ var endOfRecordIndex = lowercaseAdi.indexOf('<eor>');
58
+ return endOfRecordIndex === -1 || endOfHeaderIndex < endOfRecordIndex;
59
+ };
48
60
  AdifParser.prototype.parseHeaderText = function () {
49
61
  var startTag = this.adi.indexOf('<', this.cursor);
50
62
  this.cursor = startTag;
@@ -1 +1 @@
1
- {"version":3,"file":"adif-parser.js","sourceRoot":"","sources":["../../src/adif-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adif-parser.js","sourceRoot":"","sources":["../../src/adif-parser.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH;IAUE,oBAAqC,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;QAFxC,WAAM,GAAG,CAAC,CAAC;IAEgC,CAAC;IATpD;;OAEG;IACI,mBAAQ,GAAf,UAAgB,GAAW;QACzB,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IAC7C,CAAC;IAMO,kCAAa,GAArB;QACE,IAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,SAAS;QACT,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,IAAM,MAAM,GAAgC,EAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBACrC,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;QAED,cAAc;QACd,IAAM,OAAO,GAAG,IAAI,KAAK,EAA+B,CAAC;QACzD,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACrC,IAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,8BAAS,GAAjB;QACE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,gBAAgB,KAAK,CAAC,CAAC,IAAI,gBAAgB,GAAG,gBAAgB,CAAC;IACxE,CAAC;IAEO,oCAAe,GAAvB;QACE,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAEO,gCAAW,GAAnB;QACE,IAAM,MAAM,GAAgC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACrC,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kCAAa,GAArB,UAAsB,MAA+B;QACnD,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrE,IACE,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YACnC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,EACnC,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,cAAc,EAAE,CAAC;gBAChE,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,KAAK,CACb,uDAAuD;gBACrD,QAAQ;gBACR,IAAI;gBACJ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,EAAE,CAAC;gBAC/C,IAAI,CACP,CAAC;QACJ,CAAC;QACD,IAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACH,iBAAC;AAAD,CAAC,AA/GD,IA+GC;AA/GY,gCAAU;AAkHvB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA"}
@@ -11,6 +11,7 @@ export declare class AdifParser {
11
11
  private cursor;
12
12
  private constructor();
13
13
  private parseTopLevel;
14
+ private hasHeader;
14
15
  private parseHeaderText;
15
16
  private parseRecord;
16
17
  private parseTagValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adif-parser-ts",
3
- "version": "0.6.39",
3
+ "version": "0.7.0",
4
4
  "description": "An amateur radio log data ADIF parser in Typescript and Javascript",
5
5
  "keywords": [
6
6
  "amateur radio",