@speleotica/frcsdata 5.1.0 → 5.1.2
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.
- package/chunksToLines.d.ts +7 -2
- package/chunksToLines.d.ts.map +1 -1
- package/chunksToLines.js +5 -5
- package/chunksToLines.js.map +1 -1
- package/cli/encodeWindows1252.d.ts +2 -0
- package/cli/encodeWindows1252.d.ts.map +1 -0
- package/cli/encodeWindows1252.js +11 -0
- package/cli/encodeWindows1252.js.map +1 -0
- package/cli/list-names.d.ts.map +1 -1
- package/cli/list-names.js +6 -1
- package/cli/list-names.js.map +1 -1
- package/cli/merge-names-files.d.ts.map +1 -1
- package/cli/merge-names-files.js +2 -1
- package/cli/merge-names-files.js.map +1 -1
- package/cli/readFile.d.ts.map +1 -1
- package/cli/readFile.js +1 -1
- package/cli/readFile.js.map +1 -1
- package/cli/replace-names.d.ts.map +1 -1
- package/cli/replace-names.js +3 -2
- package/cli/replace-names.js.map +1 -1
- package/cli/summarize.d.ts.map +1 -1
- package/cli/summarize.js +2 -1
- package/cli/summarize.js.map +1 -1
- package/node/index.d.ts.map +1 -1
- package/node/index.js +5 -3
- package/node/index.js.map +1 -1
- package/package.json +2 -1
- package/src/chunksToLines.ts +18 -4
- package/src/cli/encodeWindows1252.ts +5 -0
- package/src/cli/list-names.ts +13 -6
- package/src/cli/merge-names-files.ts +2 -1
- package/src/cli/readFile.ts +3 -1
- package/src/cli/replace-names.ts +3 -2
- package/src/cli/summarize.ts +2 -1
- package/src/node/index.ts +19 -3
- package/src/survey/parseFrcsSurveyFile.ts +23 -4
- package/src/web/index.ts +1 -1
- package/survey/parseFrcsSurveyFile.d.ts.map +1 -1
- package/survey/parseFrcsSurveyFile.js +18 -4
- package/survey/parseFrcsSurveyFile.js.map +1 -1
- package/web/index.js +1 -1
- package/web/index.js.map +1 -1
package/chunksToLines.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
export declare function chunksToLines(chunks: Iterable<string> | AsyncIterable<string
|
|
1
|
+
export declare function chunksToLines(chunks: Iterable<string> | AsyncIterable<string>, options: {
|
|
2
|
+
includeStartIndex: true;
|
|
3
|
+
}): AsyncIterable<{
|
|
2
4
|
line: string;
|
|
3
5
|
startIndex: number;
|
|
4
|
-
}
|
|
6
|
+
}>;
|
|
7
|
+
export declare function chunksToLines(chunks: Iterable<string> | AsyncIterable<string>, options?: {
|
|
8
|
+
includeStartIndex?: false;
|
|
9
|
+
}): AsyncIterable<string>;
|
|
5
10
|
//# sourceMappingURL=chunksToLines.d.ts.map
|
package/chunksToLines.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunksToLines.d.ts","sourceRoot":"","sources":["src/chunksToLines.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"chunksToLines.d.ts","sourceRoot":"","sources":["src/chunksToLines.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,OAAO,EAAE;IAAE,iBAAiB,EAAE,IAAI,CAAA;CAAE,GACnC,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AACtD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,KAAK,CAAA;CAAE,GACtC,aAAa,CAAC,MAAM,CAAC,CAAA"}
|
package/chunksToLines.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.chunksToLines = chunksToLines;
|
|
7
|
-
async function* chunksToLines(chunks) {
|
|
7
|
+
async function* chunksToLines(chunks, options) {
|
|
8
8
|
let chunkStartIndex = 0;
|
|
9
9
|
let remainder = '';
|
|
10
10
|
let prevChunkEndedWithCarriageReturn = false;
|
|
@@ -19,19 +19,19 @@ async function* chunksToLines(chunks) {
|
|
|
19
19
|
rx.lastIndex = end;
|
|
20
20
|
for (const match of chunk.matchAll(rx)) {
|
|
21
21
|
const line = chunk.substring(end, match.index);
|
|
22
|
-
yield {
|
|
22
|
+
yield options?.includeStartIndex ? {
|
|
23
23
|
line,
|
|
24
24
|
startIndex: chunkStartIndex + end
|
|
25
|
-
};
|
|
25
|
+
} : line;
|
|
26
26
|
end = match.index + match[0].length;
|
|
27
27
|
}
|
|
28
28
|
if (end < chunk.length) remainder = chunk.substring(end);
|
|
29
29
|
chunkStartIndex += end;
|
|
30
30
|
prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\r';
|
|
31
31
|
}
|
|
32
|
-
if (remainder) yield {
|
|
32
|
+
if (remainder) yield options?.includeStartIndex ? {
|
|
33
33
|
line: remainder,
|
|
34
34
|
startIndex: chunkStartIndex
|
|
35
|
-
};
|
|
35
|
+
} : remainder;
|
|
36
36
|
}
|
|
37
37
|
//# sourceMappingURL=chunksToLines.js.map
|
package/chunksToLines.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunksToLines.js","names":["chunksToLines","chunks","chunkStartIndex","remainder","prevChunkEndedWithCarriageReturn","chunk","length","end","rx","lastIndex","match","matchAll","line","substring","index","startIndex"],"sources":["src/chunksToLines.ts"],"sourcesContent":["export async function* chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string
|
|
1
|
+
{"version":3,"file":"chunksToLines.js","names":["chunksToLines","chunks","options","chunkStartIndex","remainder","prevChunkEndedWithCarriageReturn","chunk","length","end","rx","lastIndex","match","matchAll","line","substring","index","includeStartIndex","startIndex"],"sources":["src/chunksToLines.ts"],"sourcesContent":["export function chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>,\n options: { includeStartIndex: true }\n): AsyncIterable<{ line: string; startIndex: number }>\nexport function chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>,\n options?: { includeStartIndex?: false }\n): AsyncIterable<string>\nexport async function* chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>,\n options?: { includeStartIndex?: boolean }\n): AsyncIterable<string | { line: string; startIndex: number }> {\n let chunkStartIndex = 0\n let remainder = ''\n let prevChunkEndedWithCarriageReturn = false\n for await (let chunk of chunks) {\n if (!chunk.length) continue\n if (remainder) {\n chunk = remainder + chunk\n remainder = ''\n }\n let end = prevChunkEndedWithCarriageReturn && chunk[0] === '\\n' ? 1 : 0\n const rx = /\\r\\n?|\\n/gm\n rx.lastIndex = end\n for (const match of chunk.matchAll(rx)) {\n const line = chunk.substring(end, match.index)\n yield options?.includeStartIndex\n ? { line, startIndex: chunkStartIndex + end }\n : line\n end = match.index + match[0].length\n }\n if (end < chunk.length) remainder = chunk.substring(end)\n chunkStartIndex += end\n prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\\r'\n }\n if (remainder)\n yield options?.includeStartIndex\n ? { line: remainder, startIndex: chunkStartIndex }\n : remainder\n}\n"],"mappings":";;;;;;AAQO,gBAAgBA,aAAaA,CAClCC,MAAgD,EAChDC,OAAyC,EACqB;EAC9D,IAAIC,eAAe,GAAG,CAAC;EACvB,IAAIC,SAAS,GAAG,EAAE;EAClB,IAAIC,gCAAgC,GAAG,KAAK;EAC5C,WAAW,IAAIC,KAAK,IAAIL,MAAM,EAAE;IAC9B,IAAI,CAACK,KAAK,CAACC,MAAM,EAAE;IACnB,IAAIH,SAAS,EAAE;MACbE,KAAK,GAAGF,SAAS,GAAGE,KAAK;MACzBF,SAAS,GAAG,EAAE;IAChB;IACA,IAAII,GAAG,GAAGH,gCAAgC,IAAIC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;IACvE,MAAMG,EAAE,GAAG,YAAY;IACvBA,EAAE,CAACC,SAAS,GAAGF,GAAG;IAClB,KAAK,MAAMG,KAAK,IAAIL,KAAK,CAACM,QAAQ,CAACH,EAAE,CAAC,EAAE;MACtC,MAAMI,IAAI,GAAGP,KAAK,CAACQ,SAAS,CAACN,GAAG,EAAEG,KAAK,CAACI,KAAK,CAAC;MAC9C,MAAMb,OAAO,EAAEc,iBAAiB,GAC5B;QAAEH,IAAI;QAAEI,UAAU,EAAEd,eAAe,GAAGK;MAAI,CAAC,GAC3CK,IAAI;MACRL,GAAG,GAAGG,KAAK,CAACI,KAAK,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAACJ,MAAM;IACrC;IACA,IAAIC,GAAG,GAAGF,KAAK,CAACC,MAAM,EAAEH,SAAS,GAAGE,KAAK,CAACQ,SAAS,CAACN,GAAG,CAAC;IACxDL,eAAe,IAAIK,GAAG;IACtBH,gCAAgC,GAAGC,KAAK,CAACA,KAAK,CAACC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;EACrE;EACA,IAAIH,SAAS,EACX,MAAMF,OAAO,EAAEc,iBAAiB,GAC5B;IAAEH,IAAI,EAAET,SAAS;IAAEa,UAAU,EAAEd;EAAgB,CAAC,GAChDC,SAAS;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encodeWindows1252.d.ts","sourceRoot":"","sources":["../../src/cli/encodeWindows1252.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,2BAE7C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.encodeWindows1252 = encodeWindows1252;
|
|
7
|
+
var _windows = require("windows-1252");
|
|
8
|
+
function encodeWindows1252(text) {
|
|
9
|
+
return new Uint8Array((0, _windows.encode)(text));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=encodeWindows1252.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encodeWindows1252.js","names":["_windows","require","encodeWindows1252","text","Uint8Array","encode"],"sources":["../../src/cli/encodeWindows1252.ts"],"sourcesContent":["import { encode } from 'windows-1252'\n\nexport function encodeWindows1252(text: string) {\n return new Uint8Array(encode(text))\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEO,SAASC,iBAAiBA,CAACC,IAAY,EAAE;EAC9C,OAAO,IAAIC,UAAU,CAAC,IAAAC,eAAM,EAACF,IAAI,CAAC,CAAC;AACrC","ignoreList":[]}
|
package/cli/list-names.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-names.d.ts","sourceRoot":"","sources":["../../src/cli/list-names.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-names.d.ts","sourceRoot":"","sources":["../../src/cli/list-names.ts"],"names":[],"mappings":"AAUA,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,iBA+ErE"}
|
package/cli/list-names.js
CHANGED
|
@@ -11,6 +11,7 @@ var _unwrapInvalid = require("../unwrapInvalid.js");
|
|
|
11
11
|
var _groupBy = require("@jcoreio/utils/groupBy");
|
|
12
12
|
var _compareNames = require("./compareNames.js");
|
|
13
13
|
var _readFile = require("./readFile.js");
|
|
14
|
+
var _encodeWindows = require("./encodeWindows1252.js");
|
|
14
15
|
/* eslint-disable no-console */
|
|
15
16
|
|
|
16
17
|
async function listSurveyNames(file, options) {
|
|
@@ -60,7 +61,11 @@ async function listSurveyNames(file, options) {
|
|
|
60
61
|
}
|
|
61
62
|
for (const [name, count] of table) {
|
|
62
63
|
const replacement = replacements.get(name);
|
|
63
|
-
if (includeCounts)
|
|
64
|
+
if (includeCounts) {
|
|
65
|
+
process.stdout.write((0, _encodeWindows.encodeWindows1252)(`${count.toFixed().padStart(countLength)} ${name}${replacement ? ` => ${replacement}` : ''}\n`));
|
|
66
|
+
} else {
|
|
67
|
+
process.stdout.write((0, _encodeWindows.encodeWindows1252)(`${name}${replacement ? ` => ${replacement}` : ''}\n`));
|
|
68
|
+
}
|
|
64
69
|
}
|
|
65
70
|
}
|
|
66
71
|
const countCaps = name => {
|
package/cli/list-names.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-names.js","names":["_index","require","_normalizeTeamMemberName","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_groupBy","_compareNames","_readFile","listSurveyNames","file","options","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","readFile","normalizeNames","nameCounts","Map","trip","unwrapInvalid","trips","team","header","name","set","get","table","entries","sort","a","b","compareNames","maxNameCount","reduce","max","count","Math","countLength","toFixed","length","includeCounts","names","keys","replacements","suggestReplacements","group","groupBy","toLowerCase","values","normalized","normalizeNameCapitalization","best","map","countCaps","firstInitials","filter","test","replace","firstInitial","m","substring","matches","match","replacement","
|
|
1
|
+
{"version":3,"file":"list-names.js","names":["_index","require","_normalizeTeamMemberName","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_groupBy","_compareNames","_readFile","_encodeWindows","listSurveyNames","file","options","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","readFile","normalizeNames","nameCounts","Map","trip","unwrapInvalid","trips","team","header","name","set","get","table","entries","sort","a","b","compareNames","maxNameCount","reduce","max","count","Math","countLength","toFixed","length","includeCounts","names","keys","replacements","suggestReplacements","group","groupBy","toLowerCase","values","normalized","normalizeNameCapitalization","best","map","countCaps","firstInitials","filter","test","replace","firstInitial","m","substring","matches","match","replacement","process","stdout","write","encodeWindows1252","padStart","lower","i"],"sources":["../../src/cli/list-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { normalizeNameCapitalization } from '../survey/normalizeTeamMemberName'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { groupBy } from '@jcoreio/utils/groupBy'\nimport { compareNames } from './compareNames'\nimport { readFile } from './readFile'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function listSurveyNames(\n file: string,\n options?: { includeCounts?: boolean; suggestReplacements?: boolean }\n) {\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(file, await readFile(file), {\n normalizeNames: false,\n })\n )\n const nameCounts = new Map<string, number>()\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team } = unwrapInvalid(unwrapInvalid(trip).header)\n if (!team) continue\n for (const name of team) {\n nameCounts.set(name, (nameCounts.get(name) ?? 0) + 1)\n }\n }\n\n const table = [...nameCounts.entries()].sort((a, b) =>\n compareNames(a[0], b[0])\n )\n const maxNameCount = table.reduce((max, [, count]) => Math.max(max, count), 0)\n const countLength = maxNameCount.toFixed().length\n\n const includeCounts = options?.includeCounts ?? false\n\n const names = [...nameCounts.keys()]\n\n const replacements = new Map<string, string>()\n if (options?.suggestReplacements) {\n for (const group of groupBy(names, (name) => name.toLowerCase()).values()) {\n if (group.length === 1) {\n const [name] = group\n const normalized = normalizeNameCapitalization(name)\n if (normalized !== name) replacements.set(name, normalized)\n continue\n }\n const best = group\n .map((name) => normalizeNameCapitalization(name))\n .reduce((a, b) => (countCaps(a) > countCaps(b) ? a : b))\n for (const name of group) {\n if (name !== best) replacements.set(name, best)\n }\n }\n\n const firstInitials = groupBy(\n names.filter((name) => /^\\S[. ]/.test(name)),\n (name) => name.toLowerCase().replace(/\\.\\s*/g, ' ')\n )\n\n for (const name of names) {\n if (/^\\S[. ]/.test(name)) continue\n const firstInitial = name\n .toLowerCase()\n .replace(/^\\S+/, (m) => m.substring(0, 1))\n .replace(/\\.\\s*/g, ' ')\n const matches = firstInitials.get(firstInitial)\n if (matches) {\n for (const match of matches) {\n replacements.set(match, replacements.get(name) ?? name)\n }\n }\n }\n }\n\n for (const [name, count] of table) {\n const replacement = replacements.get(name)\n if (includeCounts) {\n process.stdout.write(\n encodeWindows1252(\n `${count.toFixed().padStart(countLength)} ${name}${\n replacement ? ` => ${replacement}` : ''\n }\\n`\n )\n )\n } else {\n process.stdout.write(\n encodeWindows1252(`${name}${replacement ? ` => ${replacement}` : ''}\\n`)\n )\n }\n }\n}\n\nconst countCaps = (name: string) => {\n const lower = name.toLowerCase()\n let count = 0\n for (let i = 0; i < name.length; i++) {\n if (name[i] !== lower[i]) count++\n }\n return count\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-names-files.d.ts","sourceRoot":"","sources":["../../src/cli/merge-names-files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge-names-files.d.ts","sourceRoot":"","sources":["../../src/cli/merge-names-files.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,iBAavD"}
|
package/cli/merge-names-files.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.mergeNamesFiles = mergeNamesFiles;
|
|
|
7
7
|
var _parseNamesFile = require("./parseNamesFile.js");
|
|
8
8
|
var _formatNamesFile = require("./formatNamesFile.js");
|
|
9
9
|
var _readFile = require("./readFile.js");
|
|
10
|
+
var _encodeWindows = require("./encodeWindows1252.js");
|
|
10
11
|
async function mergeNamesFiles(...files) {
|
|
11
12
|
const names = new Map();
|
|
12
13
|
for (const file of files) {
|
|
@@ -20,6 +21,6 @@ async function mergeNamesFiles(...files) {
|
|
|
20
21
|
});else if (!existing.replacement) existing.replacement = replacement;
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
process.stdout.write((0, _formatNamesFile.formatNamesFile)(names));
|
|
24
|
+
process.stdout.write((0, _encodeWindows.encodeWindows1252)((0, _formatNamesFile.formatNamesFile)(names)));
|
|
24
25
|
}
|
|
25
26
|
//# sourceMappingURL=merge-names-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-names-files.js","names":["_parseNamesFile","require","_formatNamesFile","_readFile","mergeNamesFiles","files","names","Map","file","parsed","parseNamesFile","readFile","name","replacement","existing","get","set","process","stdout","write","formatNamesFile"],"sources":["../../src/cli/merge-names-files.ts"],"sourcesContent":["import { parseNamesFile } from './parseNamesFile'\nimport { formatNamesFile } from './formatNamesFile'\nimport { readFile } from './readFile'\n\nexport async function mergeNamesFiles(...files: string[]) {\n const names = new Map<string, { replacement?: string }>()\n\n for (const file of files) {\n const parsed = parseNamesFile(await readFile(file))\n for (const [name, { replacement }] of parsed) {\n const existing = names.get(name)\n if (!existing) names.set(name, { replacement })\n else if (!existing.replacement) existing.replacement = replacement\n }\n }\n\n process.stdout.write(formatNamesFile(names))\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAEO,
|
|
1
|
+
{"version":3,"file":"merge-names-files.js","names":["_parseNamesFile","require","_formatNamesFile","_readFile","_encodeWindows","mergeNamesFiles","files","names","Map","file","parsed","parseNamesFile","readFile","name","replacement","existing","get","set","process","stdout","write","encodeWindows1252","formatNamesFile"],"sources":["../../src/cli/merge-names-files.ts"],"sourcesContent":["import { parseNamesFile } from './parseNamesFile'\nimport { formatNamesFile } from './formatNamesFile'\nimport { readFile } from './readFile'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function mergeNamesFiles(...files: string[]) {\n const names = new Map<string, { replacement?: string }>()\n\n for (const file of files) {\n const parsed = parseNamesFile(await readFile(file))\n for (const [name, { replacement }] of parsed) {\n const existing = names.get(name)\n if (!existing) names.set(name, { replacement })\n else if (!existing.replacement) existing.replacement = replacement\n }\n }\n\n process.stdout.write(encodeWindows1252(formatNamesFile(names)))\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AAEO,eAAeI,eAAeA,CAAC,GAAGC,KAAe,EAAE;EACxD,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAmC,CAAC;EAEzD,KAAK,MAAMC,IAAI,IAAIH,KAAK,EAAE;IACxB,MAAMI,MAAM,GAAG,IAAAC,8BAAc,EAAC,MAAM,IAAAC,kBAAQ,EAACH,IAAI,CAAC,CAAC;IACnD,KAAK,MAAM,CAACI,IAAI,EAAE;MAAEC;IAAY,CAAC,CAAC,IAAIJ,MAAM,EAAE;MAC5C,MAAMK,QAAQ,GAAGR,KAAK,CAACS,GAAG,CAACH,IAAI,CAAC;MAChC,IAAI,CAACE,QAAQ,EAAER,KAAK,CAACU,GAAG,CAACJ,IAAI,EAAE;QAAEC;MAAY,CAAC,CAAC,MAC1C,IAAI,CAACC,QAAQ,CAACD,WAAW,EAAEC,QAAQ,CAACD,WAAW,GAAGA,WAAW;IACpE;EACF;EAEAI,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAAC,gCAAiB,EAAC,IAAAC,gCAAe,EAACf,KAAK,CAAC,CAAC,CAAC;AACjE","ignoreList":[]}
|
package/cli/readFile.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readFile.d.ts","sourceRoot":"","sources":["../../src/cli/readFile.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"readFile.d.ts","sourceRoot":"","sources":["../../src/cli/readFile.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,mBAI1C"}
|
package/cli/readFile.js
CHANGED
|
@@ -8,6 +8,6 @@ exports.readFile = readFile;
|
|
|
8
8
|
var _fs = _interopRequireDefault(require("fs"));
|
|
9
9
|
var _util = require("util");
|
|
10
10
|
async function readFile(file) {
|
|
11
|
-
return await (0, _util.promisify)(cb => _fs.default.readFile(file || 0,
|
|
11
|
+
return new TextDecoder('windows-1252').decode(await (0, _util.promisify)(cb => _fs.default.readFile(file || 0, cb))());
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=readFile.js.map
|
package/cli/readFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readFile.js","names":["_fs","_interopRequireDefault","require","_util","readFile","file","promisify","cb","fs"],"sources":["../../src/cli/readFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { promisify } from 'util'\n\nexport async function readFile(file: string) {\n return await promisify<
|
|
1
|
+
{"version":3,"file":"readFile.js","names":["_fs","_interopRequireDefault","require","_util","readFile","file","TextDecoder","decode","promisify","cb","fs"],"sources":["../../src/cli/readFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { promisify } from 'util'\n\nexport async function readFile(file: string) {\n return new TextDecoder('windows-1252').decode(\n await promisify<Buffer>((cb) => fs.readFile(file || 0, cb))()\n )\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAEO,eAAeE,QAAQA,CAACC,IAAY,EAAE;EAC3C,OAAO,IAAIC,WAAW,CAAC,cAAc,CAAC,CAACC,MAAM,CAC3C,MAAM,IAAAC,eAAS,EAAUC,EAAE,IAAKC,WAAE,CAACN,QAAQ,CAACC,IAAI,IAAI,CAAC,EAAEI,EAAE,CAAC,CAAC,CAAC,CAC9D,CAAC;AACH","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-names.d.ts","sourceRoot":"","sources":["../../src/cli/replace-names.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replace-names.d.ts","sourceRoot":"","sources":["../../src/cli/replace-names.ts"],"names":[],"mappings":"AAYA,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,iBAuEF"}
|
package/cli/replace-names.js
CHANGED
|
@@ -14,6 +14,7 @@ var _readFile = require("./readFile.js");
|
|
|
14
14
|
var _promises = require("fs/promises");
|
|
15
15
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
16
16
|
var _compareNames = require("./compareNames.js");
|
|
17
|
+
var _encodeWindows = require("./encodeWindows1252.js");
|
|
17
18
|
/* eslint-disable no-console */
|
|
18
19
|
|
|
19
20
|
async function replaceSurveyNames(surveyFile, replacementsFile, options) {
|
|
@@ -53,9 +54,9 @@ async function replaceSurveyNames(surveyFile, replacementsFile, options) {
|
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
|
-
const replaced = (0, _replaceRanges.replaceRanges)(source, replacements);
|
|
57
|
+
const replaced = (0, _encodeWindows.encodeWindows1252)((0, _replaceRanges.replaceRanges)(source, replacements));
|
|
57
58
|
if (options?.write) {
|
|
58
|
-
await (0, _promises.writeFile)(surveyFile, replaced
|
|
59
|
+
await (0, _promises.writeFile)(surveyFile, replaced);
|
|
59
60
|
} else {
|
|
60
61
|
process.stdout.write(replaced);
|
|
61
62
|
}
|
package/cli/replace-names.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-names.js","names":["_parseFrcsSurveyFile","_interopRequireDefault","require","_replaceRanges","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_parseNamesFile","_readFile","_promises","_chalk","_compareNames","replaceSurveyNames","surveyFile","replacementsFile","options","source","readFile","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","normalizeNames","includeLocs","names","parseNamesFile","unreplacedNames","Set","entries","flatMap","name","replacement","replacedNames","replacementCount","replacements","trip","unwrapInvalid","trips","team","locs","teamLocs","header","i","length","loc","get","delete","add","push","start","index","end","value","replaced","replaceRanges","write","writeFile","process","stdout","console","error","chalk","yellow","size","verbose","green","sort","compareNames"],"sources":["../../src/cli/replace-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { replaceRanges } from '../replaceRanges'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { parseNamesFile } from './parseNamesFile'\nimport { readFile } from './readFile'\nimport { writeFile } from 'fs/promises'\nimport chalk from 'chalk'\nimport { compareNames } from './compareNames'\n\nexport async function replaceSurveyNames(\n surveyFile: string,\n replacementsFile: string,\n options?: {\n verbose?: boolean\n write?: boolean\n }\n) {\n const source = await readFile(surveyFile)\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(surveyFile, [source], {\n normalizeNames: false,\n includeLocs: true,\n })\n )\n const names = await parseNamesFile(await readFile(replacementsFile))\n\n const unreplacedNames = new Set<string>(\n [...names.entries()].flatMap(([name, { replacement }]) =>\n replacement ? name : []\n )\n )\n const replacedNames = new Set<string>()\n let replacementCount = 0\n\n const replacements: { start: number; end: number; value: string }[] = []\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team, locs: { team: teamLocs } = {} } = unwrapInvalid(\n unwrapInvalid(trip).header\n )\n if (!team || !teamLocs) continue\n for (let i = 0; i < team.length; i++) {\n const name = team[i]\n const loc = teamLocs[i]\n const replacement = names.get(name)?.replacement\n if (replacement && loc) {\n unreplacedNames.delete(name)\n replacedNames.add(name)\n replacementCount++\n replacements.push({\n start: loc.start.index,\n end: loc.end.index,\n value: replacement,\n })\n }\n }\n }\n\n const replaced = replaceRanges(source, replacements)\n if (options?.write) {\n await writeFile(surveyFile, replaced
|
|
1
|
+
{"version":3,"file":"replace-names.js","names":["_parseFrcsSurveyFile","_interopRequireDefault","require","_replaceRanges","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_parseNamesFile","_readFile","_promises","_chalk","_compareNames","_encodeWindows","replaceSurveyNames","surveyFile","replacementsFile","options","source","readFile","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","normalizeNames","includeLocs","names","parseNamesFile","unreplacedNames","Set","entries","flatMap","name","replacement","replacedNames","replacementCount","replacements","trip","unwrapInvalid","trips","team","locs","teamLocs","header","i","length","loc","get","delete","add","push","start","index","end","value","replaced","encodeWindows1252","replaceRanges","write","writeFile","process","stdout","console","error","chalk","yellow","size","verbose","green","sort","compareNames"],"sources":["../../src/cli/replace-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { replaceRanges } from '../replaceRanges'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { parseNamesFile } from './parseNamesFile'\nimport { readFile } from './readFile'\nimport { writeFile } from 'fs/promises'\nimport chalk from 'chalk'\nimport { compareNames } from './compareNames'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function replaceSurveyNames(\n surveyFile: string,\n replacementsFile: string,\n options?: {\n verbose?: boolean\n write?: boolean\n }\n) {\n const source = await readFile(surveyFile)\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(surveyFile, [source], {\n normalizeNames: false,\n includeLocs: true,\n })\n )\n const names = await parseNamesFile(await readFile(replacementsFile))\n\n const unreplacedNames = new Set<string>(\n [...names.entries()].flatMap(([name, { replacement }]) =>\n replacement ? name : []\n )\n )\n const replacedNames = new Set<string>()\n let replacementCount = 0\n\n const replacements: { start: number; end: number; value: string }[] = []\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team, locs: { team: teamLocs } = {} } = unwrapInvalid(\n unwrapInvalid(trip).header\n )\n if (!team || !teamLocs) continue\n for (let i = 0; i < team.length; i++) {\n const name = team[i]\n const loc = teamLocs[i]\n const replacement = names.get(name)?.replacement\n if (replacement && loc) {\n unreplacedNames.delete(name)\n replacedNames.add(name)\n replacementCount++\n replacements.push({\n start: loc.start.index,\n end: loc.end.index,\n value: replacement,\n })\n }\n }\n }\n\n const replaced = encodeWindows1252(replaceRanges(source, replacements))\n if (options?.write) {\n await writeFile(surveyFile, replaced)\n } else {\n process.stdout.write(replaced)\n }\n console.error(\n chalk.yellow(\n `replaced ${replacedNames.size} name${\n replacedNames.size === 1 ? '' : 's'\n } in ${replacementCount} location${replacementCount === 1 ? '' : 's'}`\n )\n )\n console.error(\n unreplacedNames.size\n ? chalk.yellow(\n `${unreplacedNames.size} name replacement${\n unreplacedNames.size === 1 ? ' was' : 's were'\n } unused${options?.verbose ? ':' : ''}`\n )\n : chalk.green('all name replacements were used')\n )\n if (options?.verbose) {\n for (const name of [...unreplacedNames].sort(compareNames)) {\n console.error(\n chalk.yellow(` ${name} => ${names.get(name)?.replacement}`)\n )\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/cli/summarize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/cli/summarize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/cli/summarize.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,iBAmBjD"}
|
package/cli/summarize.js
CHANGED
|
@@ -11,6 +11,7 @@ var _index = require("../string/index.js");
|
|
|
11
11
|
var _formatFrcsTripSummaryFile = require("../formatFrcsTripSummaryFile.js");
|
|
12
12
|
var _summarizeSurvey = require("../survey/summarizeSurvey.js");
|
|
13
13
|
var _readFile = require("./readFile.js");
|
|
14
|
+
var _encodeWindows = require("./encodeWindows1252.js");
|
|
14
15
|
/* eslint-disable no-console */
|
|
15
16
|
|
|
16
17
|
async function summarizeSurvey(file) {
|
|
@@ -27,7 +28,7 @@ async function summarizeSurvey(file) {
|
|
|
27
28
|
process.exit(1);
|
|
28
29
|
}
|
|
29
30
|
for (const line of (0, _formatFrcsTripSummaryFile.formatFrcsTripSummaryFile)((0, _summarizeSurvey.summarizeSurvey)(parsed))) {
|
|
30
|
-
|
|
31
|
+
process.stdout.write((0, _encodeWindows.encodeWindows1252)(line + '\n'));
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=summarize.js.map
|
package/cli/summarize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.js","names":["_chalk","_interopRequireDefault","require","_formatIssues","_index","_formatFrcsTripSummaryFile","_summarizeSurvey","_readFile","summarizeSurvey","file","source","readFile","parsed","parseFrcsSurveyFile","console","log","formatIssues","errorStyle","chalk","red","warningStyle","yellow","process","exit","line","formatFrcsTripSummaryFile","baseSummarizeSurvey"],"sources":["../../src/cli/summarize.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport { formatIssues } from '../formatIssues'\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { formatFrcsTripSummaryFile } from '../formatFrcsTripSummaryFile'\nimport { summarizeSurvey as baseSummarizeSurvey } from '../survey/summarizeSurvey'\nimport { readFile } from './readFile'\n\nexport async function summarizeSurvey(file: string) {\n const source = await readFile(file)\n const parsed = await parseFrcsSurveyFile(file, source)\n if ('INVALID' in parsed) {\n console.log(\n formatIssues({\n file,\n source,\n parsed,\n errorStyle: chalk.red,\n warningStyle: chalk.yellow,\n })\n )\n process.exit(1)\n }\n\n for (const line of formatFrcsTripSummaryFile(baseSummarizeSurvey(parsed))) {\n
|
|
1
|
+
{"version":3,"file":"summarize.js","names":["_chalk","_interopRequireDefault","require","_formatIssues","_index","_formatFrcsTripSummaryFile","_summarizeSurvey","_readFile","_encodeWindows","summarizeSurvey","file","source","readFile","parsed","parseFrcsSurveyFile","console","log","formatIssues","errorStyle","chalk","red","warningStyle","yellow","process","exit","line","formatFrcsTripSummaryFile","baseSummarizeSurvey","stdout","write","encodeWindows1252"],"sources":["../../src/cli/summarize.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport { formatIssues } from '../formatIssues'\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { formatFrcsTripSummaryFile } from '../formatFrcsTripSummaryFile'\nimport { summarizeSurvey as baseSummarizeSurvey } from '../survey/summarizeSurvey'\nimport { readFile } from './readFile'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function summarizeSurvey(file: string) {\n const source = await readFile(file)\n const parsed = await parseFrcsSurveyFile(file, source)\n if ('INVALID' in parsed) {\n console.log(\n formatIssues({\n file,\n source,\n parsed,\n errorStyle: chalk.red,\n warningStyle: chalk.yellow,\n })\n )\n process.exit(1)\n }\n\n for (const line of formatFrcsTripSummaryFile(baseSummarizeSurvey(parsed))) {\n process.stdout.write(encodeWindows1252(line + '\\n'))\n }\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,0BAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AAPA;;AASO,eAAeO,eAAeA,CAACC,IAAY,EAAE;EAClD,MAAMC,MAAM,GAAG,MAAM,IAAAC,kBAAQ,EAACF,IAAI,CAAC;EACnC,MAAMG,MAAM,GAAG,MAAM,IAAAC,0BAAmB,EAACJ,IAAI,EAAEC,MAAM,CAAC;EACtD,IAAI,SAAS,IAAIE,MAAM,EAAE;IACvBE,OAAO,CAACC,GAAG,CACT,IAAAC,0BAAY,EAAC;MACXP,IAAI;MACJC,MAAM;MACNE,MAAM;MACNK,UAAU,EAAEC,cAAK,CAACC,GAAG;MACrBC,YAAY,EAAEF,cAAK,CAACG;IACtB,CAAC,CACH,CAAC;IACDC,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;EACjB;EAEA,KAAK,MAAMC,IAAI,IAAI,IAAAC,oDAAyB,EAAC,IAAAC,gCAAmB,EAACd,MAAM,CAAC,CAAC,EAAE;IACzEU,OAAO,CAACK,MAAM,CAACC,KAAK,CAAC,IAAAC,gCAAiB,EAACL,IAAI,GAAG,IAAI,CAAC,CAAC;EACtD;AACF","ignoreList":[]}
|
package/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,mBAAmB,SATvB,MAAM,kKAS2D,CAAA;AAC1E,eAAO,MAAM,iBAAiB,SA7BrB,MAAM,uCA6BsD,CAAA;AACrE,eAAO,MAAM,wBAAwB,SA9B5B,MAAM;;2DAgCd,CAAA"}
|
package/node/index.js
CHANGED
|
@@ -6,12 +6,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.parseFrcsTripSummaryFile = exports.parseFrcsSurveyFile = exports.parseFrcsPlotFile = void 0;
|
|
8
8
|
var _fs = _interopRequireDefault(require("fs"));
|
|
9
|
-
var _readline = _interopRequireDefault(require("readline"));
|
|
10
9
|
var _parseFrcsSurveyFile2 = _interopRequireDefault(require("../survey/parseFrcsSurveyFile.js"));
|
|
11
10
|
var _parseFrcsPlotFile2 = _interopRequireDefault(require("../parseFrcsPlotFile.js"));
|
|
12
11
|
var _parseFrcsTripSummaryFile2 = _interopRequireDefault(require("../parseFrcsTripSummaryFile.js"));
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
var _stream = require("stream");
|
|
13
|
+
var _web = require("stream/web");
|
|
14
|
+
var _chunksToLines = require("../chunksToLines.js");
|
|
15
|
+
const convertLineBased = fn => (file, ...rest) => fn(file, (0, _chunksToLines.chunksToLines)(_stream.Readable.toWeb(_fs.default.createReadStream(file)).pipeThrough(new _web.TextDecoderStream('windows-1252'))), ...rest);
|
|
16
|
+
const convertChunkBased = fn => (file, ...rest) => fn(file, _stream.Readable.toWeb(_fs.default.createReadStream(file)).pipeThrough(new _web.TextDecoderStream('windows-1252')), ...rest);
|
|
15
17
|
const parseFrcsSurveyFile = exports.parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile2.default);
|
|
16
18
|
const parseFrcsPlotFile = exports.parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile2.default);
|
|
17
19
|
const parseFrcsTripSummaryFile = exports.parseFrcsTripSummaryFile = convertLineBased(_parseFrcsTripSummaryFile2.default);
|
package/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_fs","_interopRequireDefault","require","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_fs","_interopRequireDefault","require","_parseFrcsSurveyFile2","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","_stream","_web","_chunksToLines","convertLineBased","fn","file","rest","chunksToLines","Readable","toWeb","fs","createReadStream","pipeThrough","TextDecoderStream","convertChunkBased","parseFrcsSurveyFile","exports","_parseFrcsSurveyFile","parseFrcsPlotFile","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/node/index.ts"],"sourcesContent":["import fs from 'fs'\nimport _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\nimport { Readable } from 'stream'\nimport { TextDecoderStream } from 'stream/web'\nimport { chunksToLines } from '../chunksToLines'\n\nconst convertLineBased =\n <T, Rest extends any[]>(\n fn: (\n file: string,\n lines: AsyncIterable<string>,\n ...rest: Rest\n ) => Promise<T>\n ) =>\n (file: string, ...rest: Rest): Promise<T> =>\n fn(\n file,\n chunksToLines(\n Readable.toWeb(fs.createReadStream(file)).pipeThrough(\n new TextDecoderStream('windows-1252')\n )\n ),\n ...rest\n )\n\nconst convertChunkBased =\n <T, Rest extends any[]>(\n fn: (\n file: string,\n lines: AsyncIterable<string>,\n ...rest: Rest\n ) => Promise<T>\n ) =>\n (file: string, ...rest: Rest): Promise<T> =>\n fn(\n file,\n Readable.toWeb(fs.createReadStream(file)).pipeThrough(\n new TextDecoderStream('windows-1252')\n ),\n ...rest\n )\n\nexport const parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile)\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,mBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,0BAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,IAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AAEA,MAAMO,gBAAgB,GAElBC,EAIe,IAEjB,CAACC,IAAY,EAAE,GAAGC,IAAU,KAC1BF,EAAE,CACAC,IAAI,EACJ,IAAAE,4BAAa,EACXC,gBAAQ,CAACC,KAAK,CAACC,WAAE,CAACC,gBAAgB,CAACN,IAAI,CAAC,CAAC,CAACO,WAAW,CACnD,IAAIC,sBAAiB,CAAC,cAAc,CACtC,CACF,CAAC,EACD,GAAGP,IACL,CAAC;AAEL,MAAMQ,iBAAiB,GAEnBV,EAIe,IAEjB,CAACC,IAAY,EAAE,GAAGC,IAAU,KAC1BF,EAAE,CACAC,IAAI,EACJG,gBAAQ,CAACC,KAAK,CAACC,WAAE,CAACC,gBAAgB,CAACN,IAAI,CAAC,CAAC,CAACO,WAAW,CACnD,IAAIC,sBAAiB,CAAC,cAAc,CACtC,CAAC,EACD,GAAGP,IACL,CAAC;AAEE,MAAMS,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAGD,iBAAiB,CAACG,6BAAoB,CAAC;AACnE,MAAMC,iBAAiB,GAAAF,OAAA,CAAAE,iBAAA,GAAGf,gBAAgB,CAACgB,2BAAkB,CAAC;AAC9D,MAAMC,wBAAwB,GAAAJ,OAAA,CAAAI,wBAAA,GAAGjB,gBAAgB,CACtDkB,kCACF,CAAC","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@speleotica/frcsdata",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.2",
|
|
4
4
|
"description": "parser for Chip Hopper's survey data format used in Fisher Ridge Cave System",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"bin": {
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"dedent-js": "^1.0.1",
|
|
31
31
|
"glob": "^13.0.6",
|
|
32
32
|
"parse-segment": "^1.5.4",
|
|
33
|
+
"windows-1252": "^3.0.4",
|
|
33
34
|
"yaml": "^2.8.2",
|
|
34
35
|
"yargs": "^17",
|
|
35
36
|
"zod": "^3"
|
package/src/chunksToLines.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
export function chunksToLines(
|
|
2
|
+
chunks: Iterable<string> | AsyncIterable<string>,
|
|
3
|
+
options: { includeStartIndex: true }
|
|
4
|
+
): AsyncIterable<{ line: string; startIndex: number }>
|
|
5
|
+
export function chunksToLines(
|
|
6
|
+
chunks: Iterable<string> | AsyncIterable<string>,
|
|
7
|
+
options?: { includeStartIndex?: false }
|
|
8
|
+
): AsyncIterable<string>
|
|
1
9
|
export async function* chunksToLines(
|
|
2
|
-
chunks: Iterable<string> | AsyncIterable<string
|
|
3
|
-
|
|
10
|
+
chunks: Iterable<string> | AsyncIterable<string>,
|
|
11
|
+
options?: { includeStartIndex?: boolean }
|
|
12
|
+
): AsyncIterable<string | { line: string; startIndex: number }> {
|
|
4
13
|
let chunkStartIndex = 0
|
|
5
14
|
let remainder = ''
|
|
6
15
|
let prevChunkEndedWithCarriageReturn = false
|
|
@@ -15,12 +24,17 @@ export async function* chunksToLines(
|
|
|
15
24
|
rx.lastIndex = end
|
|
16
25
|
for (const match of chunk.matchAll(rx)) {
|
|
17
26
|
const line = chunk.substring(end, match.index)
|
|
18
|
-
yield
|
|
27
|
+
yield options?.includeStartIndex
|
|
28
|
+
? { line, startIndex: chunkStartIndex + end }
|
|
29
|
+
: line
|
|
19
30
|
end = match.index + match[0].length
|
|
20
31
|
}
|
|
21
32
|
if (end < chunk.length) remainder = chunk.substring(end)
|
|
22
33
|
chunkStartIndex += end
|
|
23
34
|
prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\r'
|
|
24
35
|
}
|
|
25
|
-
if (remainder)
|
|
36
|
+
if (remainder)
|
|
37
|
+
yield options?.includeStartIndex
|
|
38
|
+
? { line: remainder, startIndex: chunkStartIndex }
|
|
39
|
+
: remainder
|
|
26
40
|
}
|
package/src/cli/list-names.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { unwrapInvalid } from '../unwrapInvalid'
|
|
|
6
6
|
import { groupBy } from '@jcoreio/utils/groupBy'
|
|
7
7
|
import { compareNames } from './compareNames'
|
|
8
8
|
import { readFile } from './readFile'
|
|
9
|
+
import { encodeWindows1252 } from './encodeWindows1252'
|
|
9
10
|
|
|
10
11
|
export async function listSurveyNames(
|
|
11
12
|
file: string,
|
|
@@ -74,13 +75,19 @@ export async function listSurveyNames(
|
|
|
74
75
|
|
|
75
76
|
for (const [name, count] of table) {
|
|
76
77
|
const replacement = replacements.get(name)
|
|
77
|
-
if (includeCounts)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
if (includeCounts) {
|
|
79
|
+
process.stdout.write(
|
|
80
|
+
encodeWindows1252(
|
|
81
|
+
`${count.toFixed().padStart(countLength)} ${name}${
|
|
82
|
+
replacement ? ` => ${replacement}` : ''
|
|
83
|
+
}\n`
|
|
84
|
+
)
|
|
82
85
|
)
|
|
83
|
-
else
|
|
86
|
+
} else {
|
|
87
|
+
process.stdout.write(
|
|
88
|
+
encodeWindows1252(`${name}${replacement ? ` => ${replacement}` : ''}\n`)
|
|
89
|
+
)
|
|
90
|
+
}
|
|
84
91
|
}
|
|
85
92
|
}
|
|
86
93
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parseNamesFile } from './parseNamesFile'
|
|
2
2
|
import { formatNamesFile } from './formatNamesFile'
|
|
3
3
|
import { readFile } from './readFile'
|
|
4
|
+
import { encodeWindows1252 } from './encodeWindows1252'
|
|
4
5
|
|
|
5
6
|
export async function mergeNamesFiles(...files: string[]) {
|
|
6
7
|
const names = new Map<string, { replacement?: string }>()
|
|
@@ -14,5 +15,5 @@ export async function mergeNamesFiles(...files: string[]) {
|
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
process.stdout.write(formatNamesFile(names))
|
|
18
|
+
process.stdout.write(encodeWindows1252(formatNamesFile(names)))
|
|
18
19
|
}
|
package/src/cli/readFile.ts
CHANGED
|
@@ -2,5 +2,7 @@ import fs from 'fs'
|
|
|
2
2
|
import { promisify } from 'util'
|
|
3
3
|
|
|
4
4
|
export async function readFile(file: string) {
|
|
5
|
-
return
|
|
5
|
+
return new TextDecoder('windows-1252').decode(
|
|
6
|
+
await promisify<Buffer>((cb) => fs.readFile(file || 0, cb))()
|
|
7
|
+
)
|
|
6
8
|
}
|
package/src/cli/replace-names.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { readFile } from './readFile'
|
|
|
8
8
|
import { writeFile } from 'fs/promises'
|
|
9
9
|
import chalk from 'chalk'
|
|
10
10
|
import { compareNames } from './compareNames'
|
|
11
|
+
import { encodeWindows1252 } from './encodeWindows1252'
|
|
11
12
|
|
|
12
13
|
export async function replaceSurveyNames(
|
|
13
14
|
surveyFile: string,
|
|
@@ -57,9 +58,9 @@ export async function replaceSurveyNames(
|
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
|
|
60
|
-
const replaced = replaceRanges(source, replacements)
|
|
61
|
+
const replaced = encodeWindows1252(replaceRanges(source, replacements))
|
|
61
62
|
if (options?.write) {
|
|
62
|
-
await writeFile(surveyFile, replaced
|
|
63
|
+
await writeFile(surveyFile, replaced)
|
|
63
64
|
} else {
|
|
64
65
|
process.stdout.write(replaced)
|
|
65
66
|
}
|
package/src/cli/summarize.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { parseFrcsSurveyFile } from '../string/index'
|
|
|
5
5
|
import { formatFrcsTripSummaryFile } from '../formatFrcsTripSummaryFile'
|
|
6
6
|
import { summarizeSurvey as baseSummarizeSurvey } from '../survey/summarizeSurvey'
|
|
7
7
|
import { readFile } from './readFile'
|
|
8
|
+
import { encodeWindows1252 } from './encodeWindows1252'
|
|
8
9
|
|
|
9
10
|
export async function summarizeSurvey(file: string) {
|
|
10
11
|
const source = await readFile(file)
|
|
@@ -23,6 +24,6 @@ export async function summarizeSurvey(file: string) {
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
for (const line of formatFrcsTripSummaryFile(baseSummarizeSurvey(parsed))) {
|
|
26
|
-
|
|
27
|
+
process.stdout.write(encodeWindows1252(line + '\n'))
|
|
27
28
|
}
|
|
28
29
|
}
|
package/src/node/index.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import fs from 'fs'
|
|
2
|
-
import readline from 'readline'
|
|
3
2
|
import _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'
|
|
4
3
|
import _parseFrcsPlotFile from '../parseFrcsPlotFile'
|
|
5
4
|
import _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'
|
|
5
|
+
import { Readable } from 'stream'
|
|
6
|
+
import { TextDecoderStream } from 'stream/web'
|
|
7
|
+
import { chunksToLines } from '../chunksToLines'
|
|
6
8
|
|
|
7
9
|
const convertLineBased =
|
|
8
10
|
<T, Rest extends any[]>(
|
|
@@ -13,7 +15,15 @@ const convertLineBased =
|
|
|
13
15
|
) => Promise<T>
|
|
14
16
|
) =>
|
|
15
17
|
(file: string, ...rest: Rest): Promise<T> =>
|
|
16
|
-
fn(
|
|
18
|
+
fn(
|
|
19
|
+
file,
|
|
20
|
+
chunksToLines(
|
|
21
|
+
Readable.toWeb(fs.createReadStream(file)).pipeThrough(
|
|
22
|
+
new TextDecoderStream('windows-1252')
|
|
23
|
+
)
|
|
24
|
+
),
|
|
25
|
+
...rest
|
|
26
|
+
)
|
|
17
27
|
|
|
18
28
|
const convertChunkBased =
|
|
19
29
|
<T, Rest extends any[]>(
|
|
@@ -24,7 +34,13 @@ const convertChunkBased =
|
|
|
24
34
|
) => Promise<T>
|
|
25
35
|
) =>
|
|
26
36
|
(file: string, ...rest: Rest): Promise<T> =>
|
|
27
|
-
fn(
|
|
37
|
+
fn(
|
|
38
|
+
file,
|
|
39
|
+
Readable.toWeb(fs.createReadStream(file)).pipeThrough(
|
|
40
|
+
new TextDecoderStream('windows-1252')
|
|
41
|
+
),
|
|
42
|
+
...rest
|
|
43
|
+
)
|
|
28
44
|
|
|
29
45
|
export const parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile)
|
|
30
46
|
export const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)
|
|
@@ -115,7 +115,8 @@ export default async function parseFrcsSurveyFile(
|
|
|
115
115
|
let tripCommentEndLine = -1
|
|
116
116
|
const tripComment: string[] = []
|
|
117
117
|
const commentLines: string[] = []
|
|
118
|
-
let trip: FrcsTrip | InvalidFrcsTrip | undefined
|
|
118
|
+
let trip: FrcsTrip | InvalidFrcsTrip | undefined
|
|
119
|
+
let lastShot: FrcsShot | InvalidFrcsShot | undefined
|
|
119
120
|
let inBlockComment = false
|
|
120
121
|
let section
|
|
121
122
|
let sectionLoc: SourceLoc | undefined
|
|
@@ -137,7 +138,9 @@ export default async function parseFrcsSurveyFile(
|
|
|
137
138
|
|
|
138
139
|
let began = false
|
|
139
140
|
|
|
140
|
-
for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks
|
|
141
|
+
for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks, {
|
|
142
|
+
includeStartIndex: true,
|
|
143
|
+
})) {
|
|
141
144
|
if (lineIssues.length) lineIssues = []
|
|
142
145
|
|
|
143
146
|
lineNumber++
|
|
@@ -179,6 +182,8 @@ export default async function parseFrcsSurveyFile(
|
|
|
179
182
|
alternateUnits = nextShotUnits = undefined
|
|
180
183
|
unitsChanged = false
|
|
181
184
|
if (inTripComment) {
|
|
185
|
+
const trailingComment = getComment()
|
|
186
|
+
if (trailingComment) attachComment(lastShot, trailingComment)
|
|
182
187
|
tripName = undefined
|
|
183
188
|
tripNameLoc = undefined
|
|
184
189
|
section = undefined
|
|
@@ -316,7 +321,10 @@ export default async function parseFrcsSurveyFile(
|
|
|
316
321
|
inBlockComment = false
|
|
317
322
|
} else {
|
|
318
323
|
inBlockComment = !inBlockComment
|
|
319
|
-
if (inBlockComment)
|
|
324
|
+
if (inBlockComment) {
|
|
325
|
+
const trailingComment = getComment()
|
|
326
|
+
if (trailingComment) attachComment(lastShot, trailingComment)
|
|
327
|
+
}
|
|
320
328
|
}
|
|
321
329
|
} else if (inBlockComment) {
|
|
322
330
|
addCommentLine(line)
|
|
@@ -708,12 +716,22 @@ export default async function parseFrcsSurveyFile(
|
|
|
708
716
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
709
717
|
|
|
710
718
|
function getComment(): string | undefined {
|
|
711
|
-
if (!commentLines
|
|
719
|
+
if (!commentLines.length) return undefined
|
|
712
720
|
const comment = commentLines.join('\n').trim()
|
|
713
721
|
commentLines.length = 0
|
|
714
722
|
return comment || undefined
|
|
715
723
|
}
|
|
716
724
|
|
|
725
|
+
function attachComment(
|
|
726
|
+
shot: FrcsShot | InvalidFrcsShot | undefined,
|
|
727
|
+
comment: string
|
|
728
|
+
) {
|
|
729
|
+
const unwrapped = unwrapInvalid(shot)
|
|
730
|
+
if (!unwrapped) return
|
|
731
|
+
if (unwrapped.comment) unwrapped.comment += '\n' + comment
|
|
732
|
+
else unwrapped.comment = comment
|
|
733
|
+
}
|
|
734
|
+
|
|
717
735
|
function addCommentLine(comment: string): void {
|
|
718
736
|
if (trip) {
|
|
719
737
|
const distanceUnit =
|
|
@@ -938,6 +956,7 @@ export default async function parseFrcsSurveyFile(
|
|
|
938
956
|
}
|
|
939
957
|
|
|
940
958
|
function addShot(shot: FrcsShot | InvalidFrcsShot) {
|
|
959
|
+
lastShot = shot
|
|
941
960
|
if (!trip) return
|
|
942
961
|
if (alternateUnits) {
|
|
943
962
|
const recorded:
|
package/src/web/index.ts
CHANGED
|
@@ -92,7 +92,7 @@ const convertLineBased = <T>(
|
|
|
92
92
|
function chunksOf(input: Blob | ReadableStream): AsyncIterable<string> {
|
|
93
93
|
return readableStreamValues(
|
|
94
94
|
(input instanceof ReadableStream ? input : input.stream()).pipeThrough(
|
|
95
|
-
new TextDecoderStream()
|
|
95
|
+
new TextDecoderStream('windows-1252')
|
|
96
96
|
)
|
|
97
97
|
)
|
|
98
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseFrcsSurveyFile.d.ts","sourceRoot":"","sources":["../../src/survey/parseFrcsSurveyFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EAId,qBAAqB,EAKtB,MAAM,kBAAkB,CAAA;AA2BzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CI;AACJ,wBAA8B,mBAAmB,CAC/C,IAAI,EAAE,GAAG,EAAE,yDAAyD;AACpE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,EACE,OAAqC,EACrC,aAAqB,EACrB,cAAqB,EACrB,gBAAgB,EAChB,WAAW,GACZ,GAAE,0BAA+B,GACjC,OAAO,CAAC,cAAc,GAAG,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"parseFrcsSurveyFile.d.ts","sourceRoot":"","sources":["../../src/survey/parseFrcsSurveyFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EAId,qBAAqB,EAKtB,MAAM,kBAAkB,CAAA;AA2BzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CI;AACJ,wBAA8B,mBAAmB,CAC/C,IAAI,EAAE,GAAG,EAAE,yDAAyD;AACpE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,EACE,OAAqC,EACrC,aAAqB,EACrB,cAAqB,EACrB,gBAAgB,EAChB,WAAW,GACZ,GAAE,0BAA+B,GACjC,OAAO,CAAC,cAAc,GAAG,qBAAqB,CAAC,CAu7BjD"}
|
|
@@ -84,7 +84,8 @@ chunks, {
|
|
|
84
84
|
let tripCommentEndLine = -1;
|
|
85
85
|
const tripComment = [];
|
|
86
86
|
const commentLines = [];
|
|
87
|
-
let trip
|
|
87
|
+
let trip;
|
|
88
|
+
let lastShot;
|
|
88
89
|
let inBlockComment = false;
|
|
89
90
|
let section;
|
|
90
91
|
let sectionLoc;
|
|
@@ -101,7 +102,9 @@ chunks, {
|
|
|
101
102
|
for await ({
|
|
102
103
|
line,
|
|
103
104
|
startIndex: lineStartIndex
|
|
104
|
-
} of (0, _chunksToLines.chunksToLines)(chunks
|
|
105
|
+
} of (0, _chunksToLines.chunksToLines)(chunks, {
|
|
106
|
+
includeStartIndex: true
|
|
107
|
+
})) {
|
|
105
108
|
if (lineIssues.length) lineIssues = [];
|
|
106
109
|
lineNumber++;
|
|
107
110
|
if (!began) {
|
|
@@ -132,6 +135,8 @@ chunks, {
|
|
|
132
135
|
alternateUnits = nextShotUnits = undefined;
|
|
133
136
|
unitsChanged = false;
|
|
134
137
|
if (inTripComment) {
|
|
138
|
+
const trailingComment = getComment();
|
|
139
|
+
if (trailingComment) attachComment(lastShot, trailingComment);
|
|
135
140
|
tripName = undefined;
|
|
136
141
|
tripNameLoc = undefined;
|
|
137
142
|
section = undefined;
|
|
@@ -221,7 +226,10 @@ chunks, {
|
|
|
221
226
|
inBlockComment = false;
|
|
222
227
|
} else {
|
|
223
228
|
inBlockComment = !inBlockComment;
|
|
224
|
-
if (inBlockComment)
|
|
229
|
+
if (inBlockComment) {
|
|
230
|
+
const trailingComment = getComment();
|
|
231
|
+
if (trailingComment) attachComment(lastShot, trailingComment);
|
|
232
|
+
}
|
|
225
233
|
}
|
|
226
234
|
} else if (inBlockComment) {
|
|
227
235
|
addCommentLine(line);
|
|
@@ -511,11 +519,16 @@ chunks, {
|
|
|
511
519
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
512
520
|
|
|
513
521
|
function getComment() {
|
|
514
|
-
if (!commentLines
|
|
522
|
+
if (!commentLines.length) return undefined;
|
|
515
523
|
const comment = commentLines.join('\n').trim();
|
|
516
524
|
commentLines.length = 0;
|
|
517
525
|
return comment || undefined;
|
|
518
526
|
}
|
|
527
|
+
function attachComment(shot, comment) {
|
|
528
|
+
const unwrapped = (0, _unwrapInvalid.unwrapInvalid)(shot);
|
|
529
|
+
if (!unwrapped) return;
|
|
530
|
+
if (unwrapped.comment) unwrapped.comment += '\n' + comment;else unwrapped.comment = comment;
|
|
531
|
+
}
|
|
519
532
|
function addCommentLine(comment) {
|
|
520
533
|
if (trip) {
|
|
521
534
|
const distanceUnit = (0, _unwrapInvalid.unwrapInvalid)(alternateUnits)?.distanceUnit || (0, _unwrapInvalid.unwrapInvalid)((0, _unwrapInvalid.unwrapInvalid)(trip).units).distanceUnit || _unitized.Length.feet;
|
|
@@ -655,6 +668,7 @@ chunks, {
|
|
|
655
668
|
}
|
|
656
669
|
}
|
|
657
670
|
function addShot(shot) {
|
|
671
|
+
lastShot = shot;
|
|
658
672
|
if (!trip) return;
|
|
659
673
|
if (alternateUnits) {
|
|
660
674
|
const recorded = shot;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseFrcsSurveyFile.js","names":["_FrcsSurveyFile","require","_unitized","_chunksToLines","_validators","_getColumnRanges","_parsers","_normalizeTeamMemberName","_unwrapInvalid","parseFrcsSurveyFile","file","chunks","columns","defaultFrcsShotColumnConfig","outputColumns","normalizeNames","suppressWarnings","includeLocs","columnRanges","getColumnRanges","maxRange","Math","max","Object","values","decimal","map","r","cave","undefined","location","trips","rootLocs","issues","tripName","tripNameLoc","tripTeam","tripTeamLoc","tripDate","tripDateLoc","inTripComment","tripCommentStartLine","tripCommentEndLine","tripComment","commentLines","trip","inBlockComment","section","sectionLoc","commentFromStationLruds","Map","unitsChanged","alternateUnits","nextShotUnits","lineNumber","line","lineStartIndex","lineIssues","tripIssues","began","startIndex","chunksToLines","length","test","match","exec","trim","indices","makeLineLoc","parseUnits","startColumn","index","endColumn","dateMatch","team","substring","replace","matchAll","includes","name","push","addIssue","normalizeTeamMemberName","month","day","year","parseInt","parseMonth","Date","currentUnits","unwrapInvalid","units","distanceUnit","Length","inches","meters","feet","addCommentLine","comment","join","headerLocs","date","header","locs","some","i","type","INVALID","shots","tripNumber","azimuthUnit","Angle","degrees","inclinationUnit","ranges","feetAndInches","fromStation","fromStr","validate","isValidStation","from","lStr","left","isValidOptFloat","rStr","right","uStr","up","dStr","down","parseLrud","toStr","toStation","shot","to","distance","UnitizedNumber","frontsightAzimuth","backsightAzimuth","frontsightInclination","backsightInclination","fromLruds","getComment","addShot","get","delete","fromLrudMatch","RegExp","split","s","azmFsStr","isValidOptUFloat","azmBsStr","incFsStr","incBsStr","horizontalDistance","verticalDistance","feetStr","distanceFeet","inchesStr","distanceInches","isValidUInt","Unitize","parseFloat","add","distStr","isValidUFloat","distNum","Number","isFinite","specialKindStr","kind","exclude","specialKind","parseSpecialKind","excludeDistance","isSplay","isValidFloat","h","NaN","v","sqrt","atan2","in","d","asin","parseNumber","validateInclinationRange","parseAzimuth","validateAzimuthRange","toLruds","loc","forEach","every","t","parsedFromStationLruds","parseFromStationLruds","set","code","message","indicesArray","start","column","end","parseLengthUnit","slice","parseAngleUnit","backsightAzimuthCorrected","backsightInclinationCorrected","hasBacksightAzimuth","hasBacksightInclination","fieldName","validator","field","toUpperCase","azimuth","rawValue","unit","Infinity","gradians","radians","PI","milsNATO","inclination","recorded","unwrappedAlternateUnits","unwrappedShot","opposite","negate","module","exports","default"],"sources":["../../src/survey/parseFrcsSurveyFile.ts"],"sourcesContent":["import { defaultFrcsShotColumnConfig } from './FrcsSurveyFile'\nimport type {\n ParseFrcsSurveyFileOptions,\n FrcsSurveyFile,\n FrcsTrip,\n FrcsUnits,\n FrcsShot,\n InvalidFrcsSurveyFile,\n InvalidFrcsUnits,\n InvalidFrcsTrip,\n InvalidFrcsShot,\n FrcsTripHeader,\n} from './FrcsSurveyFile'\nimport { Angle, Length, UnitizedNumber, Unitize } from '@speleotica/unitized'\nimport { ParseIssue, ParseIssueSeverity } from '../ParseIssue'\nimport { chunksToLines } from '../chunksToLines'\nimport {\n isValidStation,\n isValidOptFloat,\n isValidOptUFloat,\n isValidUInt,\n isValidUFloat,\n isValidFloat,\n} from './validators'\nimport { getColumnRanges } from './getColumnRanges'\nimport {\n parseFromStationLruds,\n parseLengthUnit,\n parseAngleUnit,\n parseMonth,\n parseLrud,\n parseSpecialKind,\n parseNumber,\n parseAzimuth,\n} from './parsers'\nimport { normalizeTeamMemberName } from './normalizeTeamMemberName'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { SourceLoc } from '../SourceLoc'\n\n/**\n * Parses a raw cdata.fr survey file. These look like so:\n *\n <pre> Fisher Ridge Cave System, Hart Co., KY\n ENTRANCE DROPS, JOE'S \"I LOVE MY WIFE TRAVERSE\", TRICKY TRAVERSE\n PETER QUICK, KEITH ORTIZ - 2-15-81\n This File has Crumps test connected. 11/20/12\n *\n FT C DD A\n AE20 0 1 3 0 2\n * %FS\n * AE20 0 0 0 Bug-can't put before so put after-so can't make 2 fixed 10/28/12\n AE19 AE20 9.3 60.0 60.0-36.0 2 12 0 20\n AE18 AE19 24.5 0.0 0.0-90.0 6 10 25 0\n AE17 AE18 8.0 350.5 350.5 17.0 3 5 0 0\n AE16 AE17 6.7 0.0 0.0-90.0 3 5 6 1\n AE15 AE16 12.6 70.5 71.0-18.0 4 0 2 1\n AE14 AE15 10.0 21.5 20.0 6.0 5 5 0 3\n AE13 AE14 26.8 288.0 286.0-50.0 0 7 20 5\n *\n *SHORT CANYON AT THE BASE OF THE SECOND DROP\n AE12 AE13 20.7 236.0 236.0 34.0 3 5 4 4\n AE11 AE12 12.4 210.0 210.0 35.0 7 4 5 1\n AE10 AE13 25.7 40.0 40.0 -9.0 2 2 3 6\n *\n *AE10 AT JOE'S \" I LOVE MY WIFE TRAVERSE \"\n AE9 AE10 17.8 32.5 31.0 23.0 4 5 20 15\n AE1 AE9 13.7 82.0 82.0-13.0\n A1 AE1 34.3 46.0 48.0-17.5\n *\n *SURVEY TO DOME NEAR THE ENTRANCE DOME (ABOVE THE SECOND DROP)\n AD1 AE15 8.0 200.0 200.0 0.0 3 1 1 1\n AD2 AD1 17.7 161.0 161.0 7.0 1 4 25 1\n AD3 AD2 10.4 180.0 180.0 50.0 4 1 15 5\n *\n TRICKY TRAVERSE AND THEN FIRST SURVEY IN UPPER CROWLWAY\n DAN CROWL, KEITH ORTIZ, CHIP HOPPER, PETER QUICK, LARRY BEAN 14 FEB 1981\n *\n FI B DD\n A2 A1 48 10 292.0 110.0-42.0 5 10 35 5\n A3 A2 12 5 333.5 153.5 35.0 3 1 15 5\n A4 A3 4 2 0.0 0.0 90.0 3 1 10 10\n ...</pre>\n *\n */\nexport default async function parseFrcsSurveyFile(\n file: any, // eslint-disable-line @typescript-eslint/no-explicit-any\n chunks: Iterable<string> | AsyncIterable<string>,\n {\n columns = defaultFrcsShotColumnConfig,\n outputColumns = false,\n normalizeNames = true,\n suppressWarnings,\n includeLocs,\n }: ParseFrcsSurveyFileOptions = {}\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n const columnRanges = getColumnRanges(columns)\n const maxRange = Math.max(\n ...Object.values(columnRanges.decimal).map((r) => r[1])\n )\n\n let cave: string | undefined = undefined\n let location: string | undefined = undefined\n const trips: (FrcsTrip | InvalidFrcsTrip)[] = []\n const rootLocs: FrcsSurveyFile['locs'] = {}\n const issues: ParseIssue[] = []\n\n let tripName: string | undefined\n let tripNameLoc: SourceLoc | undefined\n let tripTeam: string[] | undefined\n let tripTeamLoc: SourceLoc[] | undefined\n let tripDate: Date | undefined\n let tripDateLoc: SourceLoc | undefined\n let inTripComment = true\n let tripCommentStartLine = 1\n let tripCommentEndLine = -1\n const tripComment: string[] = []\n const commentLines: string[] = []\n let trip: FrcsTrip | InvalidFrcsTrip | undefined = undefined\n let inBlockComment = false\n let section\n let sectionLoc: SourceLoc | undefined\n const commentFromStationLruds = new Map<\n string,\n NonNullable<FrcsShot['fromLruds']>\n >()\n\n let unitsChanged = false\n let alternateUnits: FrcsUnits | InvalidFrcsUnits | undefined\n let nextShotUnits: FrcsUnits | InvalidFrcsUnits | undefined\n\n let lineNumber = 0\n let line: string\n let lineStartIndex = 0\n\n let lineIssues: number[] = []\n let tripIssues: number[] = []\n\n let began = false\n\n for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks)) {\n if (lineIssues.length) lineIssues = []\n\n lineNumber++\n\n if (!began) {\n began = true\n if (/^\\s+\\*/.test(line)) {\n continue\n }\n const match = /^\\s*([^,]+)(,(.*))?/d.exec(line)\n if (match) {\n cave = match[1].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[1]\n )\n }\n if (match[3]) {\n location = match[3].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[3]\n )\n }\n }\n }\n }\n\n if (unitsChanged) {\n unitsChanged = false\n alternateUnits = parseUnits()\n nextShotUnits = alternateUnits\n } else if (/^\\s{1,8}\\*(?!\\*)/.test(line)) {\n inTripComment = !inTripComment\n alternateUnits = nextShotUnits = undefined\n unitsChanged = false\n if (inTripComment) {\n tripName = undefined\n tripNameLoc = undefined\n section = undefined\n sectionLoc = undefined\n tripTeam = undefined\n tripTeamLoc = undefined\n tripDate = undefined\n tripDateLoc = undefined\n tripComment.length = 0\n tripCommentStartLine = lineNumber\n } else {\n tripCommentEndLine = lineNumber\n }\n } else if (inTripComment) {\n if (lineNumber === tripCommentStartLine + 1) {\n tripName = line.trim()\n const startColumn = /\\S/.exec(line)?.index ?? 0\n const endColumn = startColumn + tripName.length\n tripNameLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n startColumn,\n endColumn\n )\n } else if (lineNumber === tripCommentStartLine + 2) {\n const dateMatch =\n /(?:[-.]\\s*)?((\\d+)[-/](\\d+)[-/](\\d{2,4})|((\\d+)[-/ ](january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)[-/ ](\\d{2,4}))|((january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)\\s+(\\d+)(?:,\\s*|,?\\s+)(\\d{2,4})))/di.exec(\n line\n )\n if (dateMatch) {\n const team = line.substring(0, dateMatch.index).replace(/\\.?\\s*$/, '')\n tripTeam = []\n tripTeamLoc = []\n for (const match of team.matchAll(\n team.includes(';')\n ? /\\s*([^;]+)\\s*/dg\n : team.includes(',')\n ? /\\s*([^,]+)\\s*/dg\n : team.includes('&')\n ? /\\s*([^&]+)\\s*/dg\n : /\\S {2,}\\S/.test(team)\n ? /(\\S+( \\S+)*)/dg\n : /(\\S+( \\S\\.? )? \\S{2,})/dg\n )) {\n const name = match[1].trim()\n tripTeam.push(name)\n if (includeLocs && match.indices) {\n const index = match.indices[1][0]\n tripTeamLoc.push(\n makeLineLoc(\n lineNumber,\n lineStartIndex,\n index,\n index + name.length\n )\n )\n }\n }\n if (!tripTeam.length) {\n addIssue(\n 'warning',\n 'missingTripTeam',\n 'Missing team',\n 0,\n dateMatch.index,\n tripIssues\n )\n }\n if (normalizeNames) tripTeam = tripTeam.map(normalizeTeamMemberName)\n let month, day, year\n if (dateMatch[2]) {\n month = parseInt(dateMatch[2])\n day = parseInt(dateMatch[3])\n year = parseInt(dateMatch[4])\n } else if (dateMatch[6]) {\n day = parseInt(dateMatch[6])\n month = parseMonth(dateMatch[7])\n year = parseInt(dateMatch[8])\n } else {\n month = parseMonth(dateMatch[10])\n day = parseInt(dateMatch[11])\n year = parseInt(dateMatch[12])\n }\n tripDate = new Date(year < 60 ? year + 2000 : year, month - 1, day)\n if (includeLocs && dateMatch.indices) {\n tripDateLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...dateMatch.indices[1]\n )\n }\n } else {\n addIssue(\n 'warning',\n 'missingTripDate',\n 'Missing date',\n line.length,\n line.length,\n tripIssues\n )\n }\n } else if (lineNumber > 1) {\n tripComment.push(line)\n }\n const match = /^\\*\\*\\*([^*]+)\\*\\*\\*/.exec(line)\n if (match) {\n section = match[1].trim()\n }\n } else if (/^(\\s{9,}|)\\*(?!\\*)/.test(line)) {\n if (/^\\*\\s*%NC(\\b|$)/.test(line)) {\n unitsChanged = true\n }\n let match: RegExpMatchArray | null\n if ((match = /^\\*\\s*%T([ITM])(\\b|$)/.exec(line))) {\n const currentUnits = alternateUnits || unwrapInvalid(trip)?.units\n if (currentUnits && !('INVALID' in currentUnits)) {\n alternateUnits = {\n ...currentUnits,\n distanceUnit:\n match[1] === 'I'\n ? Length.inches\n : match[1] === 'M'\n ? Length.meters\n : Length.feet,\n }\n nextShotUnits = alternateUnits\n }\n }\n if (/^\\*\\s*%/.test(line)) {\n inBlockComment = false\n continue\n }\n if (/[^\\s*]/.test(line)) {\n addCommentLine(line.replace(/^\\s*\\*/, ''))\n inBlockComment = false\n } else {\n inBlockComment = !inBlockComment\n if (inBlockComment) commentLines.length = 0\n }\n } else if (inBlockComment) {\n addCommentLine(line)\n } else if (lineNumber === tripCommentEndLine + 1) {\n if (trip) trips.push(trip)\n const comment = tripComment.join('\\n') || undefined\n const headerLocs: FrcsTripHeader['locs'] =\n includeLocs && tripNameLoc\n ? {\n name: tripNameLoc,\n date: tripDateLoc,\n section: sectionLoc,\n team: tripTeamLoc,\n }\n : undefined\n const header = {\n name: tripName || '',\n comment,\n section,\n date: tripDate,\n team: tripTeam,\n ...(headerLocs && { locs: headerLocs }),\n }\n const units = parseUnits()\n if (\n 'INVALID' in units ||\n tripIssues.some((i) => issues[i]?.type === 'error')\n ) {\n trip = {\n INVALID: {\n header,\n units,\n shots: [],\n },\n ...(tripIssues.length ? { issues: tripIssues } : {}),\n }\n } else {\n trip = {\n tripNumber: 1,\n header,\n units,\n shots: [],\n }\n }\n tripIssues = []\n } else if (trip) {\n let distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const azimuthUnit =\n unwrapInvalid(alternateUnits)?.azimuthUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).azimuthUnit ||\n Angle.degrees\n const inclinationUnit =\n unwrapInvalid(alternateUnits)?.inclinationUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).inclinationUnit ||\n Angle.degrees\n\n const inches = distanceUnit === Length.inches\n if (inches) distanceUnit = Length.feet\n\n const ranges = inches ? columnRanges.feetAndInches : columnRanges.decimal\n\n // from station name\n if (!/\\S/.test(line.substring(...ranges.fromStation))) continue\n const fromStr = validate(\n ...ranges.fromStation,\n 'from station',\n isValidStation\n )\n const from = fromStr.trim()\n\n // Sadly I have found negative LRUD values in Chip's format and apparently\n // his program doesn't fail on them, so I have to accept them here\n // isValidOptFloat instead of isValidOptUFloat\n const lStr = validate(...ranges.left, 'left', isValidOptFloat)\n const rStr = validate(...ranges.right, 'right', isValidOptFloat)\n const uStr = validate(...ranges.up, 'up', isValidOptFloat)\n const dStr = validate(...ranges.down, 'down', isValidOptFloat)\n\n const up = parseLrud(uStr, distanceUnit)\n const down = parseLrud(dStr, distanceUnit)\n const left = parseLrud(lStr, distanceUnit)\n const right = parseLrud(rStr, distanceUnit)\n\n // to station name\n const toStr = line.substring(...ranges.toStation)\n if (!toStr.trim()) {\n const shot: FrcsShot = {\n from,\n to: undefined,\n distance: new UnitizedNumber(0, distanceUnit),\n frontsightAzimuth: undefined,\n backsightAzimuth: undefined,\n frontsightInclination: undefined,\n backsightInclination: undefined,\n fromLruds: {\n left,\n right,\n up,\n down,\n },\n comment: getComment(),\n }\n addShot(\n lineIssues.length ? { INVALID: shot, issues: lineIssues } : shot\n )\n continue\n }\n if (!isValidStation(toStr)) {\n addIssue(\n 'error',\n 'invalidStationName',\n 'Invalid station name',\n ...ranges.toStation\n )\n }\n\n let fromLruds = commentFromStationLruds.get(from)\n if (fromLruds) {\n commentFromStationLruds.delete(from)\n } else {\n const fromLrudMatch = new RegExp(\n `^\\\\s+${fromStr\n .trim()\n .replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}((\\\\s+(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)){4})`\n ).exec(line.substring(maxRange))\n if (fromLrudMatch) {\n const [left, right, up, down] = fromLrudMatch[1]\n .trim()\n .split(/\\s+/g)\n .map((s) => parseLrud(s, distanceUnit))\n fromLruds = { left, right, up, down }\n }\n }\n\n const comment = getComment()\n\n // azimuth and inclination\n const azmFsStr = validate(\n ranges.frontsightAzimuth[0],\n ranges.frontsightAzimuth[1],\n 'azimuth',\n isValidOptUFloat\n )\n const azmBsStr = validate(\n ...ranges.backsightAzimuth,\n 'azimuth',\n isValidOptUFloat\n )\n const incFsStr = line.substring(...ranges.frontsightInclination)\n const incBsStr = line.substring(...ranges.backsightInclination)\n\n let distance: UnitizedNumber<Length> | undefined\n let horizontalDistance: UnitizedNumber<Length> | undefined\n let verticalDistance: UnitizedNumber<Length> | undefined\n let frontsightInclination: UnitizedNumber<Angle> | undefined\n let backsightInclination: UnitizedNumber<Angle> | undefined\n\n // parse distance\n if (inches) {\n const feetStr = validate(\n ...ranges.distanceFeet,\n 'feet',\n isValidOptUFloat\n )\n const inchesStr = validate(\n ...ranges.distanceInches,\n 'inches',\n isValidOptUFloat\n )\n if (!/\\S/.test(feetStr) && !/\\S/.test(inchesStr)) {\n addIssue(\n 'error',\n 'missingDistance',\n 'Missing distance',\n ranges.distanceFeet[0],\n ranges.distanceInches[1]\n )\n }\n // sometimes inches are omitted, hence the || 0...I'm assuming it's possible\n // for feet to be omitted as well\n else if (\n (isValidUInt(feetStr) && isValidOptUFloat(inchesStr)) ||\n (isValidOptUFloat(feetStr) && isValidUInt(inchesStr))\n ) {\n distance = Unitize.inches(parseFloat(inchesStr) || 0).add(\n Unitize.feet(parseFloat(feetStr) || 0)\n )\n }\n // NOTE there are two columns around here that can contain a *.\n // I think they might represent different values, but thisis confused by\n // the fact that for ft/in shots, if there is a D or H flag it occupies the\n // first column that can contain a * for decimal feet shots\n } else {\n const distStr = validate(...ranges.distance, 'distance', isValidUFloat)\n const distNum = parseFloat(distStr)\n distance = Number.isFinite(distNum)\n ? new UnitizedNumber(distNum, distanceUnit)\n : undefined\n }\n const specialKindStr = line.substring(...ranges.kind).trim()\n const exclude = line.substring(...ranges.exclude).trim()\n const specialKind = parseSpecialKind(specialKindStr)\n\n if (specialKindStr && !specialKind) {\n addIssue(\n 'error',\n 'invalidShotType',\n 'Invalid shot type',\n ranges.kind[0],\n ranges.kind[1]\n )\n }\n\n const excludeDistance = exclude === '*' || exclude === 's'\n const isSplay = exclude === 's'\n\n if (exclude && !excludeDistance) {\n addIssue(\n 'error',\n 'invalidShotFlag',\n 'Invalid shot flag',\n ranges.exclude[0],\n ranges.exclude[1]\n )\n }\n\n if (specialKind) {\n validate(\n ...ranges.frontsightInclination,\n 'vertical-distance',\n isValidFloat\n )\n }\n\n // convert horizontal and diagonal shots to standard\n // in this case incFs is the vertical offset between stations\n // fortunately it appears we can always count on incFs being specified\n // and incBs not being specified for these types of shots\n if (specialKind === 'horizontal') {\n // distance is horizontal offset and incFsStr is vertical offset\n horizontalDistance = distance\n const h = horizontalDistance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n distance = new UnitizedNumber(Math.sqrt(h * h + v * v), distanceUnit)\n frontsightInclination =\n verticalDistance && horizontalDistance\n ? Angle.atan2(verticalDistance, horizontalDistance).in(\n inclinationUnit\n )\n : undefined\n backsightInclination = undefined\n } else if (specialKind === 'diagonal') {\n // distance is as usual, but incFsStr is vertical offset\n const d = distance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n frontsightInclination = Angle.asin(v / d).in(inclinationUnit)\n backsightInclination = undefined\n } else {\n // frontsight inclination\n validate(\n ...ranges.frontsightInclination,\n 'inclination',\n isValidOptFloat\n )\n // backsight inclination\n validate(...ranges.backsightInclination, 'inclination', isValidOptFloat)\n frontsightInclination = parseNumber(incFsStr, inclinationUnit)\n backsightInclination = parseNumber(incBsStr, inclinationUnit)\n\n validateInclinationRange(\n frontsightInclination,\n ...ranges.frontsightInclination\n )\n validateInclinationRange(\n backsightInclination,\n ...ranges.backsightInclination\n )\n }\n\n const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit)\n const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit)\n\n validateAzimuthRange(frontsightAzimuth, ...ranges.frontsightAzimuth)\n validateAzimuthRange(backsightAzimuth, ...ranges.backsightAzimuth)\n\n if (!/\\S/.test(incFsStr) && !/\\S/.test(incBsStr)) {\n frontsightInclination = Unitize.degrees(0)\n }\n\n if (from && distance && !lineIssues.length) {\n const shot: FrcsShot = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot(shot)\n } else {\n const shot: InvalidFrcsShot['INVALID'] = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot({ INVALID: shot, issues: lineIssues })\n }\n }\n }\n\n if (trip) trips.push(trip)\n\n trips.forEach((trip, index) => (unwrapInvalid(trip).tripNumber = index + 1))\n\n if (\n !issues.some((i) => i.type === 'error') &&\n trips.every((t): t is FrcsTrip => !('INVALID' in t))\n ) {\n return {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(issues.length ? { issues } : undefined),\n ...(includeLocs && { locs: rootLocs }),\n }\n }\n\n return {\n INVALID: {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(includeLocs && { locs: rootLocs }),\n },\n issues,\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////\n\n function getComment(): string | undefined {\n if (!commentLines?.length) return undefined\n const comment = commentLines.join('\\n').trim()\n commentLines.length = 0\n return comment || undefined\n }\n\n function addCommentLine(comment: string): void {\n if (trip) {\n const distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const parsedFromStationLruds = parseFromStationLruds(\n comment,\n distanceUnit\n )\n if (parsedFromStationLruds) {\n commentFromStationLruds.set(\n parsedFromStationLruds[0],\n parsedFromStationLruds[1]\n )\n return\n }\n }\n if (commentLines) {\n commentLines.push(comment)\n }\n }\n\n function addIssue(\n type: ParseIssueSeverity,\n code: string,\n message: string,\n startColumn: number,\n endColumn: number,\n indicesArray?: number[]\n ) {\n if (\n suppressWarnings &&\n type === 'warning' &&\n (suppressWarnings === true ||\n ('code' in suppressWarnings &&\n suppressWarnings[code as keyof typeof suppressWarnings] === true))\n ) {\n return\n }\n\n issues.push({\n type,\n code,\n message,\n loc: {\n start: {\n line: lineNumber,\n column: startColumn,\n index: lineStartIndex + startColumn,\n },\n end: {\n line: lineNumber,\n column: endColumn,\n index: lineStartIndex + endColumn,\n },\n },\n })\n if (!lineIssues) lineIssues = []\n lineIssues.push(issues.length - 1)\n indicesArray?.push(issues.length - 1)\n }\n\n function parseUnits(): FrcsUnits | InvalidFrcsUnits {\n // FT CC DD\n // 01234567\n const distanceUnit = parseLengthUnit(line.slice(0, 2))\n if (!distanceUnit) {\n addIssue('error', 'invalidDistanceUnit', 'Invalid distance unit', 0, 2)\n }\n const azimuthUnit = parseAngleUnit(line[6])\n if (!azimuthUnit) {\n addIssue('error', 'invalidAzimuthUnit', 'Invalid azimuth unit', 6, 7)\n }\n const inclinationUnit = parseAngleUnit(line[7])\n if (!inclinationUnit) {\n addIssue(\n 'error',\n 'invalidInclinationUnit',\n 'Invalid inclination unit',\n 7,\n 8\n )\n }\n const backsightAzimuthCorrected = line[3] === 'C'\n const backsightInclinationCorrected = line[4] === 'C'\n const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-'\n const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-'\n\n if (!/[-CB ]/.test(line[3])) {\n addIssue(\n 'error',\n 'invalidBacksightAzimuthType',\n 'Invalid backsight azimuth type',\n 3,\n 4\n )\n }\n if (!/[-CB ]/.test(line[4])) {\n addIssue(\n 'error',\n 'invalidBacksightInclinationType',\n 'Invalid backsight inclination type',\n 4,\n 5\n )\n }\n\n if (!distanceUnit || !azimuthUnit || !inclinationUnit) {\n return {\n INVALID: {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n },\n issues: lineIssues,\n }\n }\n\n return {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n }\n }\n\n function validate(\n startColumn: number,\n endColumn: number,\n fieldName: string,\n validator: (value: string) => boolean\n ): string {\n const field = line.substring(startColumn, endColumn)\n if (!validator(field)) {\n addIssue(\n 'error',\n `${\n field.trim() ? 'invalid' : 'missing'\n }${fieldName[0].toUpperCase()}${fieldName.substring(1)}`,\n (field.trim() ? 'Invalid ' : 'Missing ') + fieldName,\n startColumn,\n endColumn\n )\n }\n return field\n }\n\n function validateAzimuthRange(\n azimuth: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!azimuth) return\n const rawValue = azimuth.get(azimuth.unit)\n let max = Infinity\n switch (azimuth.unit) {\n case Angle.degrees:\n max = 360\n break\n case Angle.gradians:\n max = 400\n break\n case Angle.radians:\n max = Math.PI * 2\n break\n case Angle.milsNATO:\n max = 6400\n break\n }\n if (rawValue < 0 || rawValue >= max) {\n addIssue(\n 'error',\n 'azimuthOutOfRange',\n 'Azimuth out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function validateInclinationRange(\n inclination: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!inclination) return\n const rawValue = inclination.get(inclination.unit)\n let max = Infinity\n switch (inclination.unit) {\n case Angle.degrees:\n max = 90\n break\n case Angle.gradians:\n max = 100\n break\n case Angle.radians:\n max = Math.PI / 2\n break\n case Angle.milsNATO:\n max = 1600\n break\n }\n if (rawValue < -max || rawValue > max) {\n addIssue(\n 'error',\n 'inclinationOutOfRange',\n 'Inclination out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function addShot(shot: FrcsShot | InvalidFrcsShot) {\n if (!trip) return\n if (alternateUnits) {\n const recorded:\n | FrcsShot['recorded']\n | InvalidFrcsShot['INVALID']['recorded'] = shot\n if ('INVALID' in shot) {\n shot = {\n INVALID: {\n ...shot.INVALID,\n recorded: shot,\n },\n issues: shot.issues,\n }\n } else {\n shot = { ...shot, recorded: shot }\n }\n if (nextShotUnits) {\n unwrapInvalid(recorded).units = nextShotUnits\n nextShotUnits = undefined\n }\n const {\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n } = unwrapInvalid(unwrapInvalid(trip).units)\n const unwrappedAlternateUnits = unwrapInvalid(alternateUnits)\n const unwrappedShot = unwrapInvalid(shot)\n {\n const alternateUnits = unwrappedAlternateUnits\n const shot = unwrappedShot\n if (\n alternateUnits.backsightAzimuthCorrected !== backsightAzimuthCorrected\n ) {\n shot.backsightAzimuth = shot.backsightAzimuth\n ? Angle.opposite(shot.backsightAzimuth)\n : undefined\n }\n if (\n alternateUnits.backsightInclinationCorrected !==\n backsightInclinationCorrected\n ) {\n shot.backsightInclination = shot.backsightInclination?.negate()\n }\n if (distanceUnit && distanceUnit !== alternateUnits.distanceUnit) {\n shot.distance = shot.distance?.in(distanceUnit)\n if (shot.fromLruds) {\n shot.fromLruds = { ...shot.fromLruds }\n shot.fromLruds.left = shot.fromLruds.left?.in(distanceUnit)\n shot.fromLruds.right = shot.fromLruds.right?.in(distanceUnit)\n shot.fromLruds.up = shot.fromLruds.up?.in(distanceUnit)\n shot.fromLruds.down = shot.fromLruds.down?.in(distanceUnit)\n }\n if (shot.toLruds) {\n shot.toLruds = { ...shot.toLruds }\n shot.toLruds.left = shot.toLruds.left?.in(distanceUnit)\n shot.toLruds.right = shot.toLruds.right?.in(distanceUnit)\n shot.toLruds.up = shot.toLruds.up?.in(distanceUnit)\n shot.toLruds.down = shot.toLruds.down?.in(distanceUnit)\n }\n }\n if (azimuthUnit && azimuthUnit !== alternateUnits.azimuthUnit) {\n shot.frontsightAzimuth = shot.frontsightAzimuth?.in(azimuthUnit)\n shot.backsightAzimuth = shot.backsightAzimuth?.in(azimuthUnit)\n }\n if (\n inclinationUnit &&\n inclinationUnit !== alternateUnits.inclinationUnit\n ) {\n shot.frontsightInclination =\n shot.frontsightInclination?.in(inclinationUnit)\n shot.backsightInclination =\n shot.backsightInclination?.in(inclinationUnit)\n }\n }\n }\n if ('INVALID' in trip) {\n trip.INVALID.shots.push(shot)\n } else if ('INVALID' in shot) {\n trip = { INVALID: trip }\n trip.INVALID.shots.push(shot)\n } else {\n trip.shots.push(shot)\n }\n }\n}\n\nfunction makeLineLoc(\n line: number,\n lineStartIndex: number,\n startColumn: number,\n endColumn: number\n): SourceLoc {\n return {\n start: {\n index: lineStartIndex + startColumn,\n line,\n column: startColumn,\n },\n end: {\n index: lineStartIndex + endColumn,\n line,\n column: endColumn,\n },\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAaA,IAAAC,SAAA,GAAAD,OAAA;AAEA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AAQA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAL,OAAA;AAUA,IAAAM,wBAAA,GAAAN,OAAA;AACA,IAAAO,cAAA,GAAAP,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,eAAeQ,mBAAmBA,CAC/CC,IAAS;AAAE;AACXC,MAAgD,EAChD;EACEC,OAAO,GAAGC,2CAA2B;EACrCC,aAAa,GAAG,KAAK;EACrBC,cAAc,GAAG,IAAI;EACrBC,gBAAgB;EAChBC;AAC0B,CAAC,GAAG,CAAC,CAAC,EACe;EACjD,MAAMC,YAAY,GAAG,IAAAC,gCAAe,EAACP,OAAO,CAAC;EAC7C,MAAMQ,QAAQ,GAAGC,IAAI,CAACC,GAAG,CACvB,GAAGC,MAAM,CAACC,MAAM,CAACN,YAAY,CAACO,OAAO,CAAC,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;EAED,IAAIC,IAAwB,GAAGC,SAAS;EACxC,IAAIC,QAA4B,GAAGD,SAAS;EAC5C,MAAME,KAAqC,GAAG,EAAE;EAChD,MAAMC,QAAgC,GAAG,CAAC,CAAC;EAC3C,MAAMC,MAAoB,GAAG,EAAE;EAE/B,IAAIC,QAA4B;EAChC,IAAIC,WAAkC;EACtC,IAAIC,QAA8B;EAClC,IAAIC,WAAoC;EACxC,IAAIC,QAA0B;EAC9B,IAAIC,WAAkC;EACtC,IAAIC,aAAa,GAAG,IAAI;EACxB,IAAIC,oBAAoB,GAAG,CAAC;EAC5B,IAAIC,kBAAkB,GAAG,CAAC,CAAC;EAC3B,MAAMC,WAAqB,GAAG,EAAE;EAChC,MAAMC,YAAsB,GAAG,EAAE;EACjC,IAAIC,IAA4C,GAAGhB,SAAS;EAC5D,IAAIiB,cAAc,GAAG,KAAK;EAC1B,IAAIC,OAAO;EACX,IAAIC,UAAiC;EACrC,MAAMC,uBAAuB,GAAG,IAAIC,GAAG,CAGrC,CAAC;EAEH,IAAIC,YAAY,GAAG,KAAK;EACxB,IAAIC,cAAwD;EAC5D,IAAIC,aAAuD;EAE3D,IAAIC,UAAU,GAAG,CAAC;EAClB,IAAIC,IAAY;EAChB,IAAIC,cAAc,GAAG,CAAC;EAEtB,IAAIC,UAAoB,GAAG,EAAE;EAC7B,IAAIC,UAAoB,GAAG,EAAE;EAE7B,IAAIC,KAAK,GAAG,KAAK;EAEjB,WAAW;IAAEJ,IAAI;IAAEK,UAAU,EAAEJ;EAAe,CAAC,IAAI,IAAAK,4BAAa,EAAClD,MAAM,CAAC,EAAE;IACxE,IAAI8C,UAAU,CAACK,MAAM,EAAEL,UAAU,GAAG,EAAE;IAEtCH,UAAU,EAAE;IAEZ,IAAI,CAACK,KAAK,EAAE;MACVA,KAAK,GAAG,IAAI;MACZ,IAAI,QAAQ,CAACI,IAAI,CAACR,IAAI,CAAC,EAAE;QACvB;MACF;MACA,MAAMS,KAAK,GAAG,sBAAsB,CAACC,IAAI,CAACV,IAAI,CAAC;MAC/C,IAAIS,KAAK,EAAE;QACTpC,IAAI,GAAGoC,KAAK,CAAC,CAAC,CAAC,CAACE,IAAI,CAAC,CAAC;QACtB,IAAIjD,WAAW,IAAI+C,KAAK,CAACG,OAAO,EAAE;UAChCnC,QAAQ,CAACJ,IAAI,GAAGwC,WAAW,CACzBd,UAAU,EACVE,cAAc,EACd,GAAGQ,KAAK,CAACG,OAAO,CAAC,CAAC,CACpB,CAAC;QACH;QACA,IAAIH,KAAK,CAAC,CAAC,CAAC,EAAE;UACZlC,QAAQ,GAAGkC,KAAK,CAAC,CAAC,CAAC,CAACE,IAAI,CAAC,CAAC;UAC1B,IAAIjD,WAAW,IAAI+C,KAAK,CAACG,OAAO,EAAE;YAChCnC,QAAQ,CAACJ,IAAI,GAAGwC,WAAW,CACzBd,UAAU,EACVE,cAAc,EACd,GAAGQ,KAAK,CAACG,OAAO,CAAC,CAAC,CACpB,CAAC;UACH;QACF;MACF;IACF;IAEA,IAAIhB,YAAY,EAAE;MAChBA,YAAY,GAAG,KAAK;MACpBC,cAAc,GAAGiB,UAAU,CAAC,CAAC;MAC7BhB,aAAa,GAAGD,cAAc;IAChC,CAAC,MAAM,IAAI,kBAAkB,CAACW,IAAI,CAACR,IAAI,CAAC,EAAE;MACxCf,aAAa,GAAG,CAACA,aAAa;MAC9BY,cAAc,GAAGC,aAAa,GAAGxB,SAAS;MAC1CsB,YAAY,GAAG,KAAK;MACpB,IAAIX,aAAa,EAAE;QACjBN,QAAQ,GAAGL,SAAS;QACpBM,WAAW,GAAGN,SAAS;QACvBkB,OAAO,GAAGlB,SAAS;QACnBmB,UAAU,GAAGnB,SAAS;QACtBO,QAAQ,GAAGP,SAAS;QACpBQ,WAAW,GAAGR,SAAS;QACvBS,QAAQ,GAAGT,SAAS;QACpBU,WAAW,GAAGV,SAAS;QACvBc,WAAW,CAACmB,MAAM,GAAG,CAAC;QACtBrB,oBAAoB,GAAGa,UAAU;MACnC,CAAC,MAAM;QACLZ,kBAAkB,GAAGY,UAAU;MACjC;IACF,CAAC,MAAM,IAAId,aAAa,EAAE;MACxB,IAAIc,UAAU,KAAKb,oBAAoB,GAAG,CAAC,EAAE;QAC3CP,QAAQ,GAAGqB,IAAI,CAACW,IAAI,CAAC,CAAC;QACtB,MAAMI,WAAW,GAAG,IAAI,CAACL,IAAI,CAACV,IAAI,CAAC,EAAEgB,KAAK,IAAI,CAAC;QAC/C,MAAMC,SAAS,GAAGF,WAAW,GAAGpC,QAAQ,CAAC4B,MAAM;QAC/C3B,WAAW,GAAGiC,WAAW,CACvBd,UAAU,EACVE,cAAc,EACdc,WAAW,EACXE,SACF,CAAC;MACH,CAAC,MAAM,IAAIlB,UAAU,KAAKb,oBAAoB,GAAG,CAAC,EAAE;QAClD,MAAMgC,SAAS,GACb,kYAAkY,CAACR,IAAI,CACrYV,IACF,CAAC;QACH,IAAIkB,SAAS,EAAE;UACb,MAAMC,IAAI,GAAGnB,IAAI,CAACoB,SAAS,CAAC,CAAC,EAAEF,SAAS,CAACF,KAAK,CAAC,CAACK,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;UACtExC,QAAQ,GAAG,EAAE;UACbC,WAAW,GAAG,EAAE;UAChB,KAAK,MAAM2B,KAAK,IAAIU,IAAI,CAACG,QAAQ,CAC/BH,IAAI,CAACI,QAAQ,CAAC,GAAG,CAAC,GACd,iBAAiB,GACjBJ,IAAI,CAACI,QAAQ,CAAC,GAAG,CAAC,GAClB,iBAAiB,GACjBJ,IAAI,CAACI,QAAQ,CAAC,GAAG,CAAC,GAClB,iBAAiB,GACjB,WAAW,CAACf,IAAI,CAACW,IAAI,CAAC,GACtB,gBAAgB,GAChB,0BACN,CAAC,EAAE;YACD,MAAMK,IAAI,GAAGf,KAAK,CAAC,CAAC,CAAC,CAACE,IAAI,CAAC,CAAC;YAC5B9B,QAAQ,CAAC4C,IAAI,CAACD,IAAI,CAAC;YACnB,IAAI9D,WAAW,IAAI+C,KAAK,CAACG,OAAO,EAAE;cAChC,MAAMI,KAAK,GAAGP,KAAK,CAACG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;cACjC9B,WAAW,CAAC2C,IAAI,CACdZ,WAAW,CACTd,UAAU,EACVE,cAAc,EACde,KAAK,EACLA,KAAK,GAAGQ,IAAI,CAACjB,MACf,CACF,CAAC;YACH;UACF;UACA,IAAI,CAAC1B,QAAQ,CAAC0B,MAAM,EAAE;YACpBmB,QAAQ,CACN,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,CAAC,EACDR,SAAS,CAACF,KAAK,EACfb,UACF,CAAC;UACH;UACA,IAAI3C,cAAc,EAAEqB,QAAQ,GAAGA,QAAQ,CAACV,GAAG,CAACwD,gDAAuB,CAAC;UACpE,IAAIC,KAAK,EAAEC,GAAG,EAAEC,IAAI;UACpB,IAAIZ,SAAS,CAAC,CAAC,CAAC,EAAE;YAChBU,KAAK,GAAGG,QAAQ,CAACb,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9BW,GAAG,GAAGE,QAAQ,CAACb,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5BY,IAAI,GAAGC,QAAQ,CAACb,SAAS,CAAC,CAAC,CAAC,CAAC;UAC/B,CAAC,MAAM,IAAIA,SAAS,CAAC,CAAC,CAAC,EAAE;YACvBW,GAAG,GAAGE,QAAQ,CAACb,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5BU,KAAK,GAAG,IAAAI,mBAAU,EAACd,SAAS,CAAC,CAAC,CAAC,CAAC;YAChCY,IAAI,GAAGC,QAAQ,CAACb,SAAS,CAAC,CAAC,CAAC,CAAC;UAC/B,CAAC,MAAM;YACLU,KAAK,GAAG,IAAAI,mBAAU,EAACd,SAAS,CAAC,EAAE,CAAC,CAAC;YACjCW,GAAG,GAAGE,QAAQ,CAACb,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7BY,IAAI,GAAGC,QAAQ,CAACb,SAAS,CAAC,EAAE,CAAC,CAAC;UAChC;UACAnC,QAAQ,GAAG,IAAIkD,IAAI,CAACH,IAAI,GAAG,EAAE,GAAGA,IAAI,GAAG,IAAI,GAAGA,IAAI,EAAEF,KAAK,GAAG,CAAC,EAAEC,GAAG,CAAC;UACnE,IAAInE,WAAW,IAAIwD,SAAS,CAACN,OAAO,EAAE;YACpC5B,WAAW,GAAG6B,WAAW,CACvBd,UAAU,EACVE,cAAc,EACd,GAAGiB,SAAS,CAACN,OAAO,CAAC,CAAC,CACxB,CAAC;UACH;QACF,CAAC,MAAM;UACLc,QAAQ,CACN,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd1B,IAAI,CAACO,MAAM,EACXP,IAAI,CAACO,MAAM,EACXJ,UACF,CAAC;QACH;MACF,CAAC,MAAM,IAAIJ,UAAU,GAAG,CAAC,EAAE;QACzBX,WAAW,CAACqC,IAAI,CAACzB,IAAI,CAAC;MACxB;MACA,MAAMS,KAAK,GAAG,sBAAsB,CAACC,IAAI,CAACV,IAAI,CAAC;MAC/C,IAAIS,KAAK,EAAE;QACTjB,OAAO,GAAGiB,KAAK,CAAC,CAAC,CAAC,CAACE,IAAI,CAAC,CAAC;MAC3B;IACF,CAAC,MAAM,IAAI,oBAAoB,CAACH,IAAI,CAACR,IAAI,CAAC,EAAE;MAC1C,IAAI,iBAAiB,CAACQ,IAAI,CAACR,IAAI,CAAC,EAAE;QAChCJ,YAAY,GAAG,IAAI;MACrB;MACA,IAAIa,KAA8B;MAClC,IAAKA,KAAK,GAAG,uBAAuB,CAACC,IAAI,CAACV,IAAI,CAAC,EAAG;QAChD,MAAMkC,YAAY,GAAGrC,cAAc,IAAI,IAAAsC,4BAAa,EAAC7C,IAAI,CAAC,EAAE8C,KAAK;QACjE,IAAIF,YAAY,IAAI,EAAE,SAAS,IAAIA,YAAY,CAAC,EAAE;UAChDrC,cAAc,GAAG;YACf,GAAGqC,YAAY;YACfG,YAAY,EACV5B,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GACZ6B,gBAAM,CAACC,MAAM,GACb9B,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAChB6B,gBAAM,CAACE,MAAM,GACbF,gBAAM,CAACG;UACf,CAAC;UACD3C,aAAa,GAAGD,cAAc;QAChC;MACF;MACA,IAAI,SAAS,CAACW,IAAI,CAACR,IAAI,CAAC,EAAE;QACxBT,cAAc,GAAG,KAAK;QACtB;MACF;MACA,IAAI,QAAQ,CAACiB,IAAI,CAACR,IAAI,CAAC,EAAE;QACvB0C,cAAc,CAAC1C,IAAI,CAACqB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1C9B,cAAc,GAAG,KAAK;MACxB,CAAC,MAAM;QACLA,cAAc,GAAG,CAACA,cAAc;QAChC,IAAIA,cAAc,EAAEF,YAAY,CAACkB,MAAM,GAAG,CAAC;MAC7C;IACF,CAAC,MAAM,IAAIhB,cAAc,EAAE;MACzBmD,cAAc,CAAC1C,IAAI,CAAC;IACtB,CAAC,MAAM,IAAID,UAAU,KAAKZ,kBAAkB,GAAG,CAAC,EAAE;MAChD,IAAIG,IAAI,EAAEd,KAAK,CAACiD,IAAI,CAACnC,IAAI,CAAC;MAC1B,MAAMqD,OAAO,GAAGvD,WAAW,CAACwD,IAAI,CAAC,IAAI,CAAC,IAAItE,SAAS;MACnD,MAAMuE,UAAkC,GACtCnF,WAAW,IAAIkB,WAAW,GACtB;QACE4C,IAAI,EAAE5C,WAAW;QACjBkE,IAAI,EAAE9D,WAAW;QACjBQ,OAAO,EAAEC,UAAU;QACnB0B,IAAI,EAAErC;MACR,CAAC,GACDR,SAAS;MACf,MAAMyE,MAAM,GAAG;QACbvB,IAAI,EAAE7C,QAAQ,IAAI,EAAE;QACpBgE,OAAO;QACPnD,OAAO;QACPsD,IAAI,EAAE/D,QAAQ;QACdoC,IAAI,EAAEtC,QAAQ;QACd,IAAIgE,UAAU,IAAI;UAAEG,IAAI,EAAEH;QAAW,CAAC;MACxC,CAAC;MACD,MAAMT,KAAK,GAAGtB,UAAU,CAAC,CAAC;MAC1B,IACE,SAAS,IAAIsB,KAAK,IAClBjC,UAAU,CAAC8C,IAAI,CAAEC,CAAC,IAAKxE,MAAM,CAACwE,CAAC,CAAC,EAAEC,IAAI,KAAK,OAAO,CAAC,EACnD;QACA7D,IAAI,GAAG;UACL8D,OAAO,EAAE;YACPL,MAAM;YACNX,KAAK;YACLiB,KAAK,EAAE;UACT,CAAC;UACD,IAAIlD,UAAU,CAACI,MAAM,GAAG;YAAE7B,MAAM,EAAEyB;UAAW,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;MACH,CAAC,MAAM;QACLb,IAAI,GAAG;UACLgE,UAAU,EAAE,CAAC;UACbP,MAAM;UACNX,KAAK;UACLiB,KAAK,EAAE;QACT,CAAC;MACH;MACAlD,UAAU,GAAG,EAAE;IACjB,CAAC,MAAM,IAAIb,IAAI,EAAE;MACf,IAAI+C,YAAY,GACd,IAAAF,4BAAa,EAACtC,cAAc,CAAC,EAAEwC,YAAY,IAC3C,IAAAF,4BAAa,EAAC,IAAAA,4BAAa,EAAC7C,IAAI,CAAC,CAAC8C,KAAK,CAAC,CAACC,YAAY,IACrDC,gBAAM,CAACG,IAAI;MACb,MAAMc,WAAW,GACf,IAAApB,4BAAa,EAACtC,cAAc,CAAC,EAAE0D,WAAW,IAC1C,IAAApB,4BAAa,EAAC,IAAAA,4BAAa,EAAC7C,IAAI,CAAC,CAAC8C,KAAK,CAAC,CAACmB,WAAW,IACpDC,eAAK,CAACC,OAAO;MACf,MAAMC,eAAe,GACnB,IAAAvB,4BAAa,EAACtC,cAAc,CAAC,EAAE6D,eAAe,IAC9C,IAAAvB,4BAAa,EAAC,IAAAA,4BAAa,EAAC7C,IAAI,CAAC,CAAC8C,KAAK,CAAC,CAACsB,eAAe,IACxDF,eAAK,CAACC,OAAO;MAEf,MAAMlB,MAAM,GAAGF,YAAY,KAAKC,gBAAM,CAACC,MAAM;MAC7C,IAAIA,MAAM,EAAEF,YAAY,GAAGC,gBAAM,CAACG,IAAI;MAEtC,MAAMkB,MAAM,GAAGpB,MAAM,GAAG5E,YAAY,CAACiG,aAAa,GAAGjG,YAAY,CAACO,OAAO;;MAEzE;MACA,IAAI,CAAC,IAAI,CAACsC,IAAI,CAACR,IAAI,CAACoB,SAAS,CAAC,GAAGuC,MAAM,CAACE,WAAW,CAAC,CAAC,EAAE;MACvD,MAAMC,OAAO,GAAGC,QAAQ,CACtB,GAAGJ,MAAM,CAACE,WAAW,EACrB,cAAc,EACdG,0BACF,CAAC;MACD,MAAMC,IAAI,GAAGH,OAAO,CAACnD,IAAI,CAAC,CAAC;;MAE3B;MACA;MACA;MACA,MAAMuD,IAAI,GAAGH,QAAQ,CAAC,GAAGJ,MAAM,CAACQ,IAAI,EAAE,MAAM,EAAEC,2BAAe,CAAC;MAC9D,MAAMC,IAAI,GAAGN,QAAQ,CAAC,GAAGJ,MAAM,CAACW,KAAK,EAAE,OAAO,EAAEF,2BAAe,CAAC;MAChE,MAAMG,IAAI,GAAGR,QAAQ,CAAC,GAAGJ,MAAM,CAACa,EAAE,EAAE,IAAI,EAAEJ,2BAAe,CAAC;MAC1D,MAAMK,IAAI,GAAGV,QAAQ,CAAC,GAAGJ,MAAM,CAACe,IAAI,EAAE,MAAM,EAAEN,2BAAe,CAAC;MAE9D,MAAMI,EAAE,GAAG,IAAAG,kBAAS,EAACJ,IAAI,EAAElC,YAAY,CAAC;MACxC,MAAMqC,IAAI,GAAG,IAAAC,kBAAS,EAACF,IAAI,EAAEpC,YAAY,CAAC;MAC1C,MAAM8B,IAAI,GAAG,IAAAQ,kBAAS,EAACT,IAAI,EAAE7B,YAAY,CAAC;MAC1C,MAAMiC,KAAK,GAAG,IAAAK,kBAAS,EAACN,IAAI,EAAEhC,YAAY,CAAC;;MAE3C;MACA,MAAMuC,KAAK,GAAG5E,IAAI,CAACoB,SAAS,CAAC,GAAGuC,MAAM,CAACkB,SAAS,CAAC;MACjD,IAAI,CAACD,KAAK,CAACjE,IAAI,CAAC,CAAC,EAAE;QACjB,MAAMmE,IAAc,GAAG;UACrBb,IAAI;UACJc,EAAE,EAAEzG,SAAS;UACb0G,QAAQ,EAAE,IAAIC,wBAAc,CAAC,CAAC,EAAE5C,YAAY,CAAC;UAC7C6C,iBAAiB,EAAE5G,SAAS;UAC5B6G,gBAAgB,EAAE7G,SAAS;UAC3B8G,qBAAqB,EAAE9G,SAAS;UAChC+G,oBAAoB,EAAE/G,SAAS;UAC/BgH,SAAS,EAAE;YACTnB,IAAI;YACJG,KAAK;YACLE,EAAE;YACFE;UACF,CAAC;UACD/B,OAAO,EAAE4C,UAAU,CAAC;QACtB,CAAC;QACDC,OAAO,CACLtF,UAAU,CAACK,MAAM,GAAG;UAAE6C,OAAO,EAAE0B,IAAI;UAAEpG,MAAM,EAAEwB;QAAW,CAAC,GAAG4E,IAC9D,CAAC;QACD;MACF;MACA,IAAI,CAAC,IAAAd,0BAAc,EAACY,KAAK,CAAC,EAAE;QAC1BlD,QAAQ,CACN,OAAO,EACP,oBAAoB,EACpB,sBAAsB,EACtB,GAAGiC,MAAM,CAACkB,SACZ,CAAC;MACH;MAEA,IAAIS,SAAS,GAAG5F,uBAAuB,CAAC+F,GAAG,CAACxB,IAAI,CAAC;MACjD,IAAIqB,SAAS,EAAE;QACb5F,uBAAuB,CAACgG,MAAM,CAACzB,IAAI,CAAC;MACtC,CAAC,MAAM;QACL,MAAM0B,aAAa,GAAG,IAAIC,MAAM,CAC9B,QAAQ9B,OAAO,CACZnD,IAAI,CAAC,CAAC,CACNU,OAAO,CACN,qBAAqB,EACrB,MACF,CAAC,qCACL,CAAC,CAACX,IAAI,CAACV,IAAI,CAACoB,SAAS,CAACvD,QAAQ,CAAC,CAAC;QAChC,IAAI8H,aAAa,EAAE;UACjB,MAAM,CAACxB,IAAI,EAAEG,KAAK,EAAEE,EAAE,EAAEE,IAAI,CAAC,GAAGiB,aAAa,CAAC,CAAC,CAAC,CAC7ChF,IAAI,CAAC,CAAC,CACNkF,KAAK,CAAC,MAAM,CAAC,CACb1H,GAAG,CAAE2H,CAAC,IAAK,IAAAnB,kBAAS,EAACmB,CAAC,EAAEzD,YAAY,CAAC,CAAC;UACzCiD,SAAS,GAAG;YAAEnB,IAAI;YAAEG,KAAK;YAAEE,EAAE;YAAEE;UAAK,CAAC;QACvC;MACF;MAEA,MAAM/B,OAAO,GAAG4C,UAAU,CAAC,CAAC;;MAE5B;MACA,MAAMQ,QAAQ,GAAGhC,QAAQ,CACvBJ,MAAM,CAACuB,iBAAiB,CAAC,CAAC,CAAC,EAC3BvB,MAAM,CAACuB,iBAAiB,CAAC,CAAC,CAAC,EAC3B,SAAS,EACTc,4BACF,CAAC;MACD,MAAMC,QAAQ,GAAGlC,QAAQ,CACvB,GAAGJ,MAAM,CAACwB,gBAAgB,EAC1B,SAAS,EACTa,4BACF,CAAC;MACD,MAAME,QAAQ,GAAGlG,IAAI,CAACoB,SAAS,CAAC,GAAGuC,MAAM,CAACyB,qBAAqB,CAAC;MAChE,MAAMe,QAAQ,GAAGnG,IAAI,CAACoB,SAAS,CAAC,GAAGuC,MAAM,CAAC0B,oBAAoB,CAAC;MAE/D,IAAIL,QAA4C;MAChD,IAAIoB,kBAAsD;MAC1D,IAAIC,gBAAoD;MACxD,IAAIjB,qBAAwD;MAC5D,IAAIC,oBAAuD;;MAE3D;MACA,IAAI9C,MAAM,EAAE;QACV,MAAM+D,OAAO,GAAGvC,QAAQ,CACtB,GAAGJ,MAAM,CAAC4C,YAAY,EACtB,MAAM,EACNP,4BACF,CAAC;QACD,MAAMQ,SAAS,GAAGzC,QAAQ,CACxB,GAAGJ,MAAM,CAAC8C,cAAc,EACxB,QAAQ,EACRT,4BACF,CAAC;QACD,IAAI,CAAC,IAAI,CAACxF,IAAI,CAAC8F,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC9F,IAAI,CAACgG,SAAS,CAAC,EAAE;UAChD9E,QAAQ,CACN,OAAO,EACP,iBAAiB,EACjB,kBAAkB,EAClBiC,MAAM,CAAC4C,YAAY,CAAC,CAAC,CAAC,EACtB5C,MAAM,CAAC8C,cAAc,CAAC,CAAC,CACzB,CAAC;QACH;QACA;QACA;QAAA,KACK,IACF,IAAAC,uBAAW,EAACJ,OAAO,CAAC,IAAI,IAAAN,4BAAgB,EAACQ,SAAS,CAAC,IACnD,IAAAR,4BAAgB,EAACM,OAAO,CAAC,IAAI,IAAAI,uBAAW,EAACF,SAAS,CAAE,EACrD;UACAxB,QAAQ,GAAG2B,iBAAO,CAACpE,MAAM,CAACqE,UAAU,CAACJ,SAAS,CAAC,IAAI,CAAC,CAAC,CAACK,GAAG,CACvDF,iBAAO,CAAClE,IAAI,CAACmE,UAAU,CAACN,OAAO,CAAC,IAAI,CAAC,CACvC,CAAC;QACH;QACA;QACA;QACA;QACA;MACF,CAAC,MAAM;QACL,MAAMQ,OAAO,GAAG/C,QAAQ,CAAC,GAAGJ,MAAM,CAACqB,QAAQ,EAAE,UAAU,EAAE+B,yBAAa,CAAC;QACvE,MAAMC,OAAO,GAAGJ,UAAU,CAACE,OAAO,CAAC;QACnC9B,QAAQ,GAAGiC,MAAM,CAACC,QAAQ,CAACF,OAAO,CAAC,GAC/B,IAAI/B,wBAAc,CAAC+B,OAAO,EAAE3E,YAAY,CAAC,GACzC/D,SAAS;MACf;MACA,MAAM6I,cAAc,GAAGnH,IAAI,CAACoB,SAAS,CAAC,GAAGuC,MAAM,CAACyD,IAAI,CAAC,CAACzG,IAAI,CAAC,CAAC;MAC5D,MAAM0G,OAAO,GAAGrH,IAAI,CAACoB,SAAS,CAAC,GAAGuC,MAAM,CAAC0D,OAAO,CAAC,CAAC1G,IAAI,CAAC,CAAC;MACxD,MAAM2G,WAAW,GAAG,IAAAC,yBAAgB,EAACJ,cAAc,CAAC;MAEpD,IAAIA,cAAc,IAAI,CAACG,WAAW,EAAE;QAClC5F,QAAQ,CACN,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACnBiC,MAAM,CAACyD,IAAI,CAAC,CAAC,CAAC,EACdzD,MAAM,CAACyD,IAAI,CAAC,CAAC,CACf,CAAC;MACH;MAEA,MAAMI,eAAe,GAAGH,OAAO,KAAK,GAAG,IAAIA,OAAO,KAAK,GAAG;MAC1D,MAAMI,OAAO,GAAGJ,OAAO,KAAK,GAAG;MAE/B,IAAIA,OAAO,IAAI,CAACG,eAAe,EAAE;QAC/B9F,QAAQ,CACN,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACnBiC,MAAM,CAAC0D,OAAO,CAAC,CAAC,CAAC,EACjB1D,MAAM,CAAC0D,OAAO,CAAC,CAAC,CAClB,CAAC;MACH;MAEA,IAAIC,WAAW,EAAE;QACfvD,QAAQ,CACN,GAAGJ,MAAM,CAACyB,qBAAqB,EAC/B,mBAAmB,EACnBsC,wBACF,CAAC;MACH;;MAEA;MACA;MACA;MACA;MACA,IAAIJ,WAAW,KAAK,YAAY,EAAE;QAChC;QACAlB,kBAAkB,GAAGpB,QAAQ;QAC7B,MAAM2C,CAAC,GAAGvB,kBAAkB,EAAEX,GAAG,CAACpD,YAAY,CAAC,IAAIuF,GAAG;QACtD,MAAMC,CAAC,GAAGjB,UAAU,CAACV,QAAQ,CAAC;QAC9BG,gBAAgB,GAAGY,MAAM,CAACC,QAAQ,CAACW,CAAC,CAAC,GACjC,IAAI5C,wBAAc,CAAC4C,CAAC,EAAExF,YAAY,CAAC,GACnC/D,SAAS;QACb0G,QAAQ,GAAG,IAAIC,wBAAc,CAACnH,IAAI,CAACgK,IAAI,CAACH,CAAC,GAAGA,CAAC,GAAGE,CAAC,GAAGA,CAAC,CAAC,EAAExF,YAAY,CAAC;QACrE+C,qBAAqB,GACnBiB,gBAAgB,IAAID,kBAAkB,GAClC5C,eAAK,CAACuE,KAAK,CAAC1B,gBAAgB,EAAED,kBAAkB,CAAC,CAAC4B,EAAE,CAClDtE,eACF,CAAC,GACDpF,SAAS;QACf+G,oBAAoB,GAAG/G,SAAS;MAClC,CAAC,MAAM,IAAIgJ,WAAW,KAAK,UAAU,EAAE;QACrC;QACA,MAAMW,CAAC,GAAGjD,QAAQ,EAAES,GAAG,CAACpD,YAAY,CAAC,IAAIuF,GAAG;QAC5C,MAAMC,CAAC,GAAGjB,UAAU,CAACV,QAAQ,CAAC;QAC9BG,gBAAgB,GAAGY,MAAM,CAACC,QAAQ,CAACW,CAAC,CAAC,GACjC,IAAI5C,wBAAc,CAAC4C,CAAC,EAAExF,YAAY,CAAC,GACnC/D,SAAS;QACb8G,qBAAqB,GAAG5B,eAAK,CAAC0E,IAAI,CAACL,CAAC,GAAGI,CAAC,CAAC,CAACD,EAAE,CAACtE,eAAe,CAAC;QAC7D2B,oBAAoB,GAAG/G,SAAS;MAClC,CAAC,MAAM;QACL;QACAyF,QAAQ,CACN,GAAGJ,MAAM,CAACyB,qBAAqB,EAC/B,aAAa,EACbhB,2BACF,CAAC;QACD;QACAL,QAAQ,CAAC,GAAGJ,MAAM,CAAC0B,oBAAoB,EAAE,aAAa,EAAEjB,2BAAe,CAAC;QACxEgB,qBAAqB,GAAG,IAAA+C,oBAAW,EAACjC,QAAQ,EAAExC,eAAe,CAAC;QAC9D2B,oBAAoB,GAAG,IAAA8C,oBAAW,EAAChC,QAAQ,EAAEzC,eAAe,CAAC;QAE7D0E,wBAAwB,CACtBhD,qBAAqB,EACrB,GAAGzB,MAAM,CAACyB,qBACZ,CAAC;QACDgD,wBAAwB,CACtB/C,oBAAoB,EACpB,GAAG1B,MAAM,CAAC0B,oBACZ,CAAC;MACH;MAEA,MAAMH,iBAAiB,GAAG,IAAAmD,qBAAY,EAACtC,QAAQ,EAAExC,WAAW,CAAC;MAC7D,MAAM4B,gBAAgB,GAAG,IAAAkD,qBAAY,EAACpC,QAAQ,EAAE1C,WAAW,CAAC;MAE5D+E,oBAAoB,CAACpD,iBAAiB,EAAE,GAAGvB,MAAM,CAACuB,iBAAiB,CAAC;MACpEoD,oBAAoB,CAACnD,gBAAgB,EAAE,GAAGxB,MAAM,CAACwB,gBAAgB,CAAC;MAElE,IAAI,CAAC,IAAI,CAAC3E,IAAI,CAAC0F,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC1F,IAAI,CAAC2F,QAAQ,CAAC,EAAE;QAChDf,qBAAqB,GAAGuB,iBAAO,CAAClD,OAAO,CAAC,CAAC,CAAC;MAC5C;MAEA,IAAIQ,IAAI,IAAIe,QAAQ,IAAI,CAAC9E,UAAU,CAACK,MAAM,EAAE;QAC1C,MAAMuE,IAAc,GAAG;UACrBb,IAAI;UACJc,EAAE,EAAEH,KAAK,CAACjE,IAAI,CAAC,CAAC;UAChB2G,WAAW;UACXtC,QAAQ;UACRE,iBAAiB;UACjBC,gBAAgB;UAChBC,qBAAqB;UACrBC,oBAAoB;UACpBkD,OAAO,EAAE;YACPpE,IAAI;YACJG,KAAK;YACLE,EAAE;YACFE;UACF,CAAC;UACD8C,eAAe;UACf7E,OAAO;UACP,IAAIjF,WAAW,IAAI;YACjB8K,GAAG,EAAE3H,WAAW,CAACd,UAAU,EAAEE,cAAc,EAAE,CAAC,EAAED,IAAI,CAACO,MAAM;UAC7D,CAAC;QACH,CAAC;QACD,IAAIkH,OAAO,EAAE3C,IAAI,CAAC2C,OAAO,GAAG,IAAI;QAChC,IAAInC,SAAS,EAAER,IAAI,CAACQ,SAAS,GAAGA,SAAS;QACzC,IAAIc,kBAAkB,EAAEtB,IAAI,CAACsB,kBAAkB,GAAGA,kBAAkB;QACpE,IAAIC,gBAAgB,EAAEvB,IAAI,CAACuB,gBAAgB,GAAGA,gBAAgB;QAC9Db,OAAO,CAACV,IAAI,CAAC;MACf,CAAC,MAAM;QACL,MAAMA,IAAgC,GAAG;UACvCb,IAAI;UACJc,EAAE,EAAEH,KAAK,CAACjE,IAAI,CAAC,CAAC;UAChB2G,WAAW;UACXtC,QAAQ;UACRE,iBAAiB;UACjBC,gBAAgB;UAChBC,qBAAqB;UACrBC,oBAAoB;UACpBkD,OAAO,EAAE;YACPpE,IAAI;YACJG,KAAK;YACLE,EAAE;YACFE;UACF,CAAC;UACD8C,eAAe;UACf7E,OAAO;UACP,IAAIjF,WAAW,IAAI;YACjB8K,GAAG,EAAE3H,WAAW,CAACd,UAAU,EAAEE,cAAc,EAAE,CAAC,EAAED,IAAI,CAACO,MAAM;UAC7D,CAAC;QACH,CAAC;QACD,IAAIkH,OAAO,EAAE3C,IAAI,CAAC2C,OAAO,GAAG,IAAI;QAChC,IAAInC,SAAS,EAAER,IAAI,CAACQ,SAAS,GAAGA,SAAS;QACzC,IAAIc,kBAAkB,EAAEtB,IAAI,CAACsB,kBAAkB,GAAGA,kBAAkB;QACpE,IAAIC,gBAAgB,EAAEvB,IAAI,CAACuB,gBAAgB,GAAGA,gBAAgB;QAC9Db,OAAO,CAAC;UAAEpC,OAAO,EAAE0B,IAAI;UAAEpG,MAAM,EAAEwB;QAAW,CAAC,CAAC;MAChD;IACF;EACF;EAEA,IAAIZ,IAAI,EAAEd,KAAK,CAACiD,IAAI,CAACnC,IAAI,CAAC;EAE1Bd,KAAK,CAACiK,OAAO,CAAC,CAACnJ,IAAI,EAAE0B,KAAK,KAAM,IAAAmB,4BAAa,EAAC7C,IAAI,CAAC,CAACgE,UAAU,GAAGtC,KAAK,GAAG,CAAE,CAAC;EAE5E,IACE,CAACtC,MAAM,CAACuE,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,KAAK,OAAO,CAAC,IACvC3E,KAAK,CAACkK,KAAK,CAAEC,CAAC,IAAoB,EAAE,SAAS,IAAIA,CAAC,CAAC,CAAC,EACpD;IACA,OAAO;MACLtK,IAAI;MACJhB,OAAO,EAAEE,aAAa,GAAGF,OAAO,GAAGiB,SAAS;MAC5CC,QAAQ;MACRC,KAAK;MACL,IAAIE,MAAM,CAAC6B,MAAM,GAAG;QAAE7B;MAAO,CAAC,GAAGJ,SAAS,CAAC;MAC3C,IAAIZ,WAAW,IAAI;QAAEsF,IAAI,EAAEvE;MAAS,CAAC;IACvC,CAAC;EACH;EAEA,OAAO;IACL2E,OAAO,EAAE;MACP/E,IAAI;MACJhB,OAAO,EAAEE,aAAa,GAAGF,OAAO,GAAGiB,SAAS;MAC5CC,QAAQ;MACRC,KAAK;MACL,IAAId,WAAW,IAAI;QAAEsF,IAAI,EAAEvE;MAAS,CAAC;IACvC,CAAC;IACDC;EACF,CAAC;;EAED;;EAEA,SAAS6G,UAAUA,CAAA,EAAuB;IACxC,IAAI,CAAClG,YAAY,EAAEkB,MAAM,EAAE,OAAOjC,SAAS;IAC3C,MAAMqE,OAAO,GAAGtD,YAAY,CAACuD,IAAI,CAAC,IAAI,CAAC,CAACjC,IAAI,CAAC,CAAC;IAC9CtB,YAAY,CAACkB,MAAM,GAAG,CAAC;IACvB,OAAOoC,OAAO,IAAIrE,SAAS;EAC7B;EAEA,SAASoE,cAAcA,CAACC,OAAe,EAAQ;IAC7C,IAAIrD,IAAI,EAAE;MACR,MAAM+C,YAAY,GAChB,IAAAF,4BAAa,EAACtC,cAAc,CAAC,EAAEwC,YAAY,IAC3C,IAAAF,4BAAa,EAAC,IAAAA,4BAAa,EAAC7C,IAAI,CAAC,CAAC8C,KAAK,CAAC,CAACC,YAAY,IACrDC,gBAAM,CAACG,IAAI;MACb,MAAMmG,sBAAsB,GAAG,IAAAC,8BAAqB,EAClDlG,OAAO,EACPN,YACF,CAAC;MACD,IAAIuG,sBAAsB,EAAE;QAC1BlJ,uBAAuB,CAACoJ,GAAG,CACzBF,sBAAsB,CAAC,CAAC,CAAC,EACzBA,sBAAsB,CAAC,CAAC,CAC1B,CAAC;QACD;MACF;IACF;IACA,IAAIvJ,YAAY,EAAE;MAChBA,YAAY,CAACoC,IAAI,CAACkB,OAAO,CAAC;IAC5B;EACF;EAEA,SAASjB,QAAQA,CACfyB,IAAwB,EACxB4F,IAAY,EACZC,OAAe,EACfjI,WAAmB,EACnBE,SAAiB,EACjBgI,YAAuB,EACvB;IACA,IACExL,gBAAgB,IAChB0F,IAAI,KAAK,SAAS,KACjB1F,gBAAgB,KAAK,IAAI,IACvB,MAAM,IAAIA,gBAAgB,IACzBA,gBAAgB,CAACsL,IAAI,CAAkC,KAAK,IAAK,CAAC,EACtE;MACA;IACF;IAEArK,MAAM,CAAC+C,IAAI,CAAC;MACV0B,IAAI;MACJ4F,IAAI;MACJC,OAAO;MACPR,GAAG,EAAE;QACHU,KAAK,EAAE;UACLlJ,IAAI,EAAED,UAAU;UAChBoJ,MAAM,EAAEpI,WAAW;UACnBC,KAAK,EAAEf,cAAc,GAAGc;QAC1B,CAAC;QACDqI,GAAG,EAAE;UACHpJ,IAAI,EAAED,UAAU;UAChBoJ,MAAM,EAAElI,SAAS;UACjBD,KAAK,EAAEf,cAAc,GAAGgB;QAC1B;MACF;IACF,CAAC,CAAC;IACF,IAAI,CAACf,UAAU,EAAEA,UAAU,GAAG,EAAE;IAChCA,UAAU,CAACuB,IAAI,CAAC/C,MAAM,CAAC6B,MAAM,GAAG,CAAC,CAAC;IAClC0I,YAAY,EAAExH,IAAI,CAAC/C,MAAM,CAAC6B,MAAM,GAAG,CAAC,CAAC;EACvC;EAEA,SAASO,UAAUA,CAAA,EAAiC;IAClD;IACA;IACA,MAAMuB,YAAY,GAAG,IAAAgH,wBAAe,EAACrJ,IAAI,CAACsJ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,IAAI,CAACjH,YAAY,EAAE;MACjBX,QAAQ,CAAC,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE;IACA,MAAM6B,WAAW,GAAG,IAAAgG,uBAAc,EAACvJ,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAACuD,WAAW,EAAE;MAChB7B,QAAQ,CAAC,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE;IACA,MAAMgC,eAAe,GAAG,IAAA6F,uBAAc,EAACvJ,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC0D,eAAe,EAAE;MACpBhC,QAAQ,CACN,OAAO,EACP,wBAAwB,EACxB,0BAA0B,EAC1B,CAAC,EACD,CACF,CAAC;IACH;IACA,MAAM8H,yBAAyB,GAAGxJ,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;IACjD,MAAMyJ,6BAA6B,GAAGzJ,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;IACrD,MAAM0J,mBAAmB,GAAG1J,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;IAC9D,MAAM2J,uBAAuB,GAAG3J,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;IAElE,IAAI,CAAC,QAAQ,CAACQ,IAAI,CAACR,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;MAC3B0B,QAAQ,CACN,OAAO,EACP,6BAA6B,EAC7B,gCAAgC,EAChC,CAAC,EACD,CACF,CAAC;IACH;IACA,IAAI,CAAC,QAAQ,CAAClB,IAAI,CAACR,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;MAC3B0B,QAAQ,CACN,OAAO,EACP,iCAAiC,EACjC,oCAAoC,EACpC,CAAC,EACD,CACF,CAAC;IACH;IAEA,IAAI,CAACW,YAAY,IAAI,CAACkB,WAAW,IAAI,CAACG,eAAe,EAAE;MACrD,OAAO;QACLN,OAAO,EAAE;UACPf,YAAY;UACZkB,WAAW;UACXG,eAAe;UACf8F,yBAAyB;UACzBC,6BAA6B;UAC7BC,mBAAmB;UACnBC;QACF,CAAC;QACDjL,MAAM,EAAEwB;MACV,CAAC;IACH;IAEA,OAAO;MACLmC,YAAY;MACZkB,WAAW;MACXG,eAAe;MACf8F,yBAAyB;MACzBC,6BAA6B;MAC7BC,mBAAmB;MACnBC;IACF,CAAC;EACH;EAEA,SAAS5F,QAAQA,CACfhD,WAAmB,EACnBE,SAAiB,EACjB2I,SAAiB,EACjBC,SAAqC,EAC7B;IACR,MAAMC,KAAK,GAAG9J,IAAI,CAACoB,SAAS,CAACL,WAAW,EAAEE,SAAS,CAAC;IACpD,IAAI,CAAC4I,SAAS,CAACC,KAAK,CAAC,EAAE;MACrBpI,QAAQ,CACN,OAAO,EACP,GACEoI,KAAK,CAACnJ,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,GACnCiJ,SAAS,CAAC,CAAC,CAAC,CAACG,WAAW,CAAC,CAAC,GAAGH,SAAS,CAACxI,SAAS,CAAC,CAAC,CAAC,EAAE,EACxD,CAAC0I,KAAK,CAACnJ,IAAI,CAAC,CAAC,GAAG,UAAU,GAAG,UAAU,IAAIiJ,SAAS,EACpD7I,WAAW,EACXE,SACF,CAAC;IACH;IACA,OAAO6I,KAAK;EACd;EAEA,SAASxB,oBAAoBA,CAC3B0B,OAA0C,EAC1CjJ,WAAmB,EACnBE,SAAiB,EACjB;IACA,IAAI,CAAC+I,OAAO,EAAE;IACd,MAAMC,QAAQ,GAAGD,OAAO,CAACvE,GAAG,CAACuE,OAAO,CAACE,IAAI,CAAC;IAC1C,IAAInM,GAAG,GAAGoM,QAAQ;IAClB,QAAQH,OAAO,CAACE,IAAI;MAClB,KAAK1G,eAAK,CAACC,OAAO;QAChB1F,GAAG,GAAG,GAAG;QACT;MACF,KAAKyF,eAAK,CAAC4G,QAAQ;QACjBrM,GAAG,GAAG,GAAG;QACT;MACF,KAAKyF,eAAK,CAAC6G,OAAO;QAChBtM,GAAG,GAAGD,IAAI,CAACwM,EAAE,GAAG,CAAC;QACjB;MACF,KAAK9G,eAAK,CAAC+G,QAAQ;QACjBxM,GAAG,GAAG,IAAI;QACV;IACJ;IACA,IAAIkM,QAAQ,GAAG,CAAC,IAAIA,QAAQ,IAAIlM,GAAG,EAAE;MACnC2D,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB,sBAAsB,EACtBX,WAAW,EACXE,SAAS,EACTf,UACF,CAAC;IACH;EACF;EAEA,SAASkI,wBAAwBA,CAC/BoC,WAA8C,EAC9CzJ,WAAmB,EACnBE,SAAiB,EACjB;IACA,IAAI,CAACuJ,WAAW,EAAE;IAClB,MAAMP,QAAQ,GAAGO,WAAW,CAAC/E,GAAG,CAAC+E,WAAW,CAACN,IAAI,CAAC;IAClD,IAAInM,GAAG,GAAGoM,QAAQ;IAClB,QAAQK,WAAW,CAACN,IAAI;MACtB,KAAK1G,eAAK,CAACC,OAAO;QAChB1F,GAAG,GAAG,EAAE;QACR;MACF,KAAKyF,eAAK,CAAC4G,QAAQ;QACjBrM,GAAG,GAAG,GAAG;QACT;MACF,KAAKyF,eAAK,CAAC6G,OAAO;QAChBtM,GAAG,GAAGD,IAAI,CAACwM,EAAE,GAAG,CAAC;QACjB;MACF,KAAK9G,eAAK,CAAC+G,QAAQ;QACjBxM,GAAG,GAAG,IAAI;QACV;IACJ;IACA,IAAIkM,QAAQ,GAAG,CAAClM,GAAG,IAAIkM,QAAQ,GAAGlM,GAAG,EAAE;MACrC2D,QAAQ,CACN,OAAO,EACP,uBAAuB,EACvB,0BAA0B,EAC1BX,WAAW,EACXE,SAAS,EACTf,UACF,CAAC;IACH;EACF;EAEA,SAASsF,OAAOA,CAACV,IAAgC,EAAE;IACjD,IAAI,CAACxF,IAAI,EAAE;IACX,IAAIO,cAAc,EAAE;MAClB,MAAM4K,QAEoC,GAAG3F,IAAI;MACjD,IAAI,SAAS,IAAIA,IAAI,EAAE;QACrBA,IAAI,GAAG;UACL1B,OAAO,EAAE;YACP,GAAG0B,IAAI,CAAC1B,OAAO;YACfqH,QAAQ,EAAE3F;UACZ,CAAC;UACDpG,MAAM,EAAEoG,IAAI,CAACpG;QACf,CAAC;MACH,CAAC,MAAM;QACLoG,IAAI,GAAG;UAAE,GAAGA,IAAI;UAAE2F,QAAQ,EAAE3F;QAAK,CAAC;MACpC;MACA,IAAIhF,aAAa,EAAE;QACjB,IAAAqC,4BAAa,EAACsI,QAAQ,CAAC,CAACrI,KAAK,GAAGtC,aAAa;QAC7CA,aAAa,GAAGxB,SAAS;MAC3B;MACA,MAAM;QACJkL,yBAAyB;QACzBC,6BAA6B;QAC7BpH,YAAY;QACZkB,WAAW;QACXG;MACF,CAAC,GAAG,IAAAvB,4BAAa,EAAC,IAAAA,4BAAa,EAAC7C,IAAI,CAAC,CAAC8C,KAAK,CAAC;MAC5C,MAAMsI,uBAAuB,GAAG,IAAAvI,4BAAa,EAACtC,cAAc,CAAC;MAC7D,MAAM8K,aAAa,GAAG,IAAAxI,4BAAa,EAAC2C,IAAI,CAAC;MACzC;QACE,MAAMjF,cAAc,GAAG6K,uBAAuB;QAC9C,MAAM5F,IAAI,GAAG6F,aAAa;QAC1B,IACE9K,cAAc,CAAC2J,yBAAyB,KAAKA,yBAAyB,EACtE;UACA1E,IAAI,CAACK,gBAAgB,GAAGL,IAAI,CAACK,gBAAgB,GACzC3B,eAAK,CAACoH,QAAQ,CAAC9F,IAAI,CAACK,gBAAgB,CAAC,GACrC7G,SAAS;QACf;QACA,IACEuB,cAAc,CAAC4J,6BAA6B,KAC5CA,6BAA6B,EAC7B;UACA3E,IAAI,CAACO,oBAAoB,GAAGP,IAAI,CAACO,oBAAoB,EAAEwF,MAAM,CAAC,CAAC;QACjE;QACA,IAAIxI,YAAY,IAAIA,YAAY,KAAKxC,cAAc,CAACwC,YAAY,EAAE;UAChEyC,IAAI,CAACE,QAAQ,GAAGF,IAAI,CAACE,QAAQ,EAAEgD,EAAE,CAAC3F,YAAY,CAAC;UAC/C,IAAIyC,IAAI,CAACQ,SAAS,EAAE;YAClBR,IAAI,CAACQ,SAAS,GAAG;cAAE,GAAGR,IAAI,CAACQ;YAAU,CAAC;YACtCR,IAAI,CAACQ,SAAS,CAACnB,IAAI,GAAGW,IAAI,CAACQ,SAAS,CAACnB,IAAI,EAAE6D,EAAE,CAAC3F,YAAY,CAAC;YAC3DyC,IAAI,CAACQ,SAAS,CAAChB,KAAK,GAAGQ,IAAI,CAACQ,SAAS,CAAChB,KAAK,EAAE0D,EAAE,CAAC3F,YAAY,CAAC;YAC7DyC,IAAI,CAACQ,SAAS,CAACd,EAAE,GAAGM,IAAI,CAACQ,SAAS,CAACd,EAAE,EAAEwD,EAAE,CAAC3F,YAAY,CAAC;YACvDyC,IAAI,CAACQ,SAAS,CAACZ,IAAI,GAAGI,IAAI,CAACQ,SAAS,CAACZ,IAAI,EAAEsD,EAAE,CAAC3F,YAAY,CAAC;UAC7D;UACA,IAAIyC,IAAI,CAACyD,OAAO,EAAE;YAChBzD,IAAI,CAACyD,OAAO,GAAG;cAAE,GAAGzD,IAAI,CAACyD;YAAQ,CAAC;YAClCzD,IAAI,CAACyD,OAAO,CAACpE,IAAI,GAAGW,IAAI,CAACyD,OAAO,CAACpE,IAAI,EAAE6D,EAAE,CAAC3F,YAAY,CAAC;YACvDyC,IAAI,CAACyD,OAAO,CAACjE,KAAK,GAAGQ,IAAI,CAACyD,OAAO,CAACjE,KAAK,EAAE0D,EAAE,CAAC3F,YAAY,CAAC;YACzDyC,IAAI,CAACyD,OAAO,CAAC/D,EAAE,GAAGM,IAAI,CAACyD,OAAO,CAAC/D,EAAE,EAAEwD,EAAE,CAAC3F,YAAY,CAAC;YACnDyC,IAAI,CAACyD,OAAO,CAAC7D,IAAI,GAAGI,IAAI,CAACyD,OAAO,CAAC7D,IAAI,EAAEsD,EAAE,CAAC3F,YAAY,CAAC;UACzD;QACF;QACA,IAAIkB,WAAW,IAAIA,WAAW,KAAK1D,cAAc,CAAC0D,WAAW,EAAE;UAC7DuB,IAAI,CAACI,iBAAiB,GAAGJ,IAAI,CAACI,iBAAiB,EAAE8C,EAAE,CAACzE,WAAW,CAAC;UAChEuB,IAAI,CAACK,gBAAgB,GAAGL,IAAI,CAACK,gBAAgB,EAAE6C,EAAE,CAACzE,WAAW,CAAC;QAChE;QACA,IACEG,eAAe,IACfA,eAAe,KAAK7D,cAAc,CAAC6D,eAAe,EAClD;UACAoB,IAAI,CAACM,qBAAqB,GACxBN,IAAI,CAACM,qBAAqB,EAAE4C,EAAE,CAACtE,eAAe,CAAC;UACjDoB,IAAI,CAACO,oBAAoB,GACvBP,IAAI,CAACO,oBAAoB,EAAE2C,EAAE,CAACtE,eAAe,CAAC;QAClD;MACF;IACF;IACA,IAAI,SAAS,IAAIpE,IAAI,EAAE;MACrBA,IAAI,CAAC8D,OAAO,CAACC,KAAK,CAAC5B,IAAI,CAACqD,IAAI,CAAC;IAC/B,CAAC,MAAM,IAAI,SAAS,IAAIA,IAAI,EAAE;MAC5BxF,IAAI,GAAG;QAAE8D,OAAO,EAAE9D;MAAK,CAAC;MACxBA,IAAI,CAAC8D,OAAO,CAACC,KAAK,CAAC5B,IAAI,CAACqD,IAAI,CAAC;IAC/B,CAAC,MAAM;MACLxF,IAAI,CAAC+D,KAAK,CAAC5B,IAAI,CAACqD,IAAI,CAAC;IACvB;EACF;AACF;AAEA,SAASjE,WAAWA,CAClBb,IAAY,EACZC,cAAsB,EACtBc,WAAmB,EACnBE,SAAiB,EACN;EACX,OAAO;IACLiI,KAAK,EAAE;MACLlI,KAAK,EAAEf,cAAc,GAAGc,WAAW;MACnCf,IAAI;MACJmJ,MAAM,EAAEpI;IACV,CAAC;IACDqI,GAAG,EAAE;MACHpI,KAAK,EAAEf,cAAc,GAAGgB,SAAS;MACjCjB,IAAI;MACJmJ,MAAM,EAAElI;IACV;EACF,CAAC;AACH;AAAC6J,MAAA,CAAAC,OAAA,GAAAA,OAAA,CAAAC,OAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"parseFrcsSurveyFile.js","names":["_FrcsSurveyFile","require","_unitized","_chunksToLines","_validators","_getColumnRanges","_parsers","_normalizeTeamMemberName","_unwrapInvalid","parseFrcsSurveyFile","file","chunks","columns","defaultFrcsShotColumnConfig","outputColumns","normalizeNames","suppressWarnings","includeLocs","columnRanges","getColumnRanges","maxRange","Math","max","Object","values","decimal","map","r","cave","undefined","location","trips","rootLocs","issues","tripName","tripNameLoc","tripTeam","tripTeamLoc","tripDate","tripDateLoc","inTripComment","tripCommentStartLine","tripCommentEndLine","tripComment","commentLines","trip","lastShot","inBlockComment","section","sectionLoc","commentFromStationLruds","Map","unitsChanged","alternateUnits","nextShotUnits","lineNumber","line","lineStartIndex","lineIssues","tripIssues","began","startIndex","chunksToLines","includeStartIndex","length","test","match","exec","trim","indices","makeLineLoc","parseUnits","trailingComment","getComment","attachComment","startColumn","index","endColumn","dateMatch","team","substring","replace","matchAll","includes","name","push","addIssue","normalizeTeamMemberName","month","day","year","parseInt","parseMonth","Date","currentUnits","unwrapInvalid","units","distanceUnit","Length","inches","meters","feet","addCommentLine","comment","join","headerLocs","date","header","locs","some","i","type","INVALID","shots","tripNumber","azimuthUnit","Angle","degrees","inclinationUnit","ranges","feetAndInches","fromStation","fromStr","validate","isValidStation","from","lStr","left","isValidOptFloat","rStr","right","uStr","up","dStr","down","parseLrud","toStr","toStation","shot","to","distance","UnitizedNumber","frontsightAzimuth","backsightAzimuth","frontsightInclination","backsightInclination","fromLruds","addShot","get","delete","fromLrudMatch","RegExp","split","s","azmFsStr","isValidOptUFloat","azmBsStr","incFsStr","incBsStr","horizontalDistance","verticalDistance","feetStr","distanceFeet","inchesStr","distanceInches","isValidUInt","Unitize","parseFloat","add","distStr","isValidUFloat","distNum","Number","isFinite","specialKindStr","kind","exclude","specialKind","parseSpecialKind","excludeDistance","isSplay","isValidFloat","h","NaN","v","sqrt","atan2","in","d","asin","parseNumber","validateInclinationRange","parseAzimuth","validateAzimuthRange","toLruds","loc","forEach","every","t","unwrapped","parsedFromStationLruds","parseFromStationLruds","set","code","message","indicesArray","start","column","end","parseLengthUnit","slice","parseAngleUnit","backsightAzimuthCorrected","backsightInclinationCorrected","hasBacksightAzimuth","hasBacksightInclination","fieldName","validator","field","toUpperCase","azimuth","rawValue","unit","Infinity","gradians","radians","PI","milsNATO","inclination","recorded","unwrappedAlternateUnits","unwrappedShot","opposite","negate","module","exports","default"],"sources":["../../src/survey/parseFrcsSurveyFile.ts"],"sourcesContent":["import { defaultFrcsShotColumnConfig } from './FrcsSurveyFile'\nimport type {\n ParseFrcsSurveyFileOptions,\n FrcsSurveyFile,\n FrcsTrip,\n FrcsUnits,\n FrcsShot,\n InvalidFrcsSurveyFile,\n InvalidFrcsUnits,\n InvalidFrcsTrip,\n InvalidFrcsShot,\n FrcsTripHeader,\n} from './FrcsSurveyFile'\nimport { Angle, Length, UnitizedNumber, Unitize } from '@speleotica/unitized'\nimport { ParseIssue, ParseIssueSeverity } from '../ParseIssue'\nimport { chunksToLines } from '../chunksToLines'\nimport {\n isValidStation,\n isValidOptFloat,\n isValidOptUFloat,\n isValidUInt,\n isValidUFloat,\n isValidFloat,\n} from './validators'\nimport { getColumnRanges } from './getColumnRanges'\nimport {\n parseFromStationLruds,\n parseLengthUnit,\n parseAngleUnit,\n parseMonth,\n parseLrud,\n parseSpecialKind,\n parseNumber,\n parseAzimuth,\n} from './parsers'\nimport { normalizeTeamMemberName } from './normalizeTeamMemberName'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { SourceLoc } from '../SourceLoc'\n\n/**\n * Parses a raw cdata.fr survey file. These look like so:\n *\n <pre> Fisher Ridge Cave System, Hart Co., KY\n ENTRANCE DROPS, JOE'S \"I LOVE MY WIFE TRAVERSE\", TRICKY TRAVERSE\n PETER QUICK, KEITH ORTIZ - 2-15-81\n This File has Crumps test connected. 11/20/12\n *\n FT C DD A\n AE20 0 1 3 0 2\n * %FS\n * AE20 0 0 0 Bug-can't put before so put after-so can't make 2 fixed 10/28/12\n AE19 AE20 9.3 60.0 60.0-36.0 2 12 0 20\n AE18 AE19 24.5 0.0 0.0-90.0 6 10 25 0\n AE17 AE18 8.0 350.5 350.5 17.0 3 5 0 0\n AE16 AE17 6.7 0.0 0.0-90.0 3 5 6 1\n AE15 AE16 12.6 70.5 71.0-18.0 4 0 2 1\n AE14 AE15 10.0 21.5 20.0 6.0 5 5 0 3\n AE13 AE14 26.8 288.0 286.0-50.0 0 7 20 5\n *\n *SHORT CANYON AT THE BASE OF THE SECOND DROP\n AE12 AE13 20.7 236.0 236.0 34.0 3 5 4 4\n AE11 AE12 12.4 210.0 210.0 35.0 7 4 5 1\n AE10 AE13 25.7 40.0 40.0 -9.0 2 2 3 6\n *\n *AE10 AT JOE'S \" I LOVE MY WIFE TRAVERSE \"\n AE9 AE10 17.8 32.5 31.0 23.0 4 5 20 15\n AE1 AE9 13.7 82.0 82.0-13.0\n A1 AE1 34.3 46.0 48.0-17.5\n *\n *SURVEY TO DOME NEAR THE ENTRANCE DOME (ABOVE THE SECOND DROP)\n AD1 AE15 8.0 200.0 200.0 0.0 3 1 1 1\n AD2 AD1 17.7 161.0 161.0 7.0 1 4 25 1\n AD3 AD2 10.4 180.0 180.0 50.0 4 1 15 5\n *\n TRICKY TRAVERSE AND THEN FIRST SURVEY IN UPPER CROWLWAY\n DAN CROWL, KEITH ORTIZ, CHIP HOPPER, PETER QUICK, LARRY BEAN 14 FEB 1981\n *\n FI B DD\n A2 A1 48 10 292.0 110.0-42.0 5 10 35 5\n A3 A2 12 5 333.5 153.5 35.0 3 1 15 5\n A4 A3 4 2 0.0 0.0 90.0 3 1 10 10\n ...</pre>\n *\n */\nexport default async function parseFrcsSurveyFile(\n file: any, // eslint-disable-line @typescript-eslint/no-explicit-any\n chunks: Iterable<string> | AsyncIterable<string>,\n {\n columns = defaultFrcsShotColumnConfig,\n outputColumns = false,\n normalizeNames = true,\n suppressWarnings,\n includeLocs,\n }: ParseFrcsSurveyFileOptions = {}\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n const columnRanges = getColumnRanges(columns)\n const maxRange = Math.max(\n ...Object.values(columnRanges.decimal).map((r) => r[1])\n )\n\n let cave: string | undefined = undefined\n let location: string | undefined = undefined\n const trips: (FrcsTrip | InvalidFrcsTrip)[] = []\n const rootLocs: FrcsSurveyFile['locs'] = {}\n const issues: ParseIssue[] = []\n\n let tripName: string | undefined\n let tripNameLoc: SourceLoc | undefined\n let tripTeam: string[] | undefined\n let tripTeamLoc: SourceLoc[] | undefined\n let tripDate: Date | undefined\n let tripDateLoc: SourceLoc | undefined\n let inTripComment = true\n let tripCommentStartLine = 1\n let tripCommentEndLine = -1\n const tripComment: string[] = []\n const commentLines: string[] = []\n let trip: FrcsTrip | InvalidFrcsTrip | undefined\n let lastShot: FrcsShot | InvalidFrcsShot | undefined\n let inBlockComment = false\n let section\n let sectionLoc: SourceLoc | undefined\n const commentFromStationLruds = new Map<\n string,\n NonNullable<FrcsShot['fromLruds']>\n >()\n\n let unitsChanged = false\n let alternateUnits: FrcsUnits | InvalidFrcsUnits | undefined\n let nextShotUnits: FrcsUnits | InvalidFrcsUnits | undefined\n\n let lineNumber = 0\n let line: string\n let lineStartIndex = 0\n\n let lineIssues: number[] = []\n let tripIssues: number[] = []\n\n let began = false\n\n for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks, {\n includeStartIndex: true,\n })) {\n if (lineIssues.length) lineIssues = []\n\n lineNumber++\n\n if (!began) {\n began = true\n if (/^\\s+\\*/.test(line)) {\n continue\n }\n const match = /^\\s*([^,]+)(,(.*))?/d.exec(line)\n if (match) {\n cave = match[1].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[1]\n )\n }\n if (match[3]) {\n location = match[3].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[3]\n )\n }\n }\n }\n }\n\n if (unitsChanged) {\n unitsChanged = false\n alternateUnits = parseUnits()\n nextShotUnits = alternateUnits\n } else if (/^\\s{1,8}\\*(?!\\*)/.test(line)) {\n inTripComment = !inTripComment\n alternateUnits = nextShotUnits = undefined\n unitsChanged = false\n if (inTripComment) {\n const trailingComment = getComment()\n if (trailingComment) attachComment(lastShot, trailingComment)\n tripName = undefined\n tripNameLoc = undefined\n section = undefined\n sectionLoc = undefined\n tripTeam = undefined\n tripTeamLoc = undefined\n tripDate = undefined\n tripDateLoc = undefined\n tripComment.length = 0\n tripCommentStartLine = lineNumber\n } else {\n tripCommentEndLine = lineNumber\n }\n } else if (inTripComment) {\n if (lineNumber === tripCommentStartLine + 1) {\n tripName = line.trim()\n const startColumn = /\\S/.exec(line)?.index ?? 0\n const endColumn = startColumn + tripName.length\n tripNameLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n startColumn,\n endColumn\n )\n } else if (lineNumber === tripCommentStartLine + 2) {\n const dateMatch =\n /(?:[-.]\\s*)?((\\d+)[-/](\\d+)[-/](\\d{2,4})|((\\d+)[-/ ](january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)[-/ ](\\d{2,4}))|((january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)\\s+(\\d+)(?:,\\s*|,?\\s+)(\\d{2,4})))/di.exec(\n line\n )\n if (dateMatch) {\n const team = line.substring(0, dateMatch.index).replace(/\\.?\\s*$/, '')\n tripTeam = []\n tripTeamLoc = []\n for (const match of team.matchAll(\n team.includes(';')\n ? /\\s*([^;]+)\\s*/dg\n : team.includes(',')\n ? /\\s*([^,]+)\\s*/dg\n : team.includes('&')\n ? /\\s*([^&]+)\\s*/dg\n : /\\S {2,}\\S/.test(team)\n ? /(\\S+( \\S+)*)/dg\n : /(\\S+( \\S\\.? )? \\S{2,})/dg\n )) {\n const name = match[1].trim()\n tripTeam.push(name)\n if (includeLocs && match.indices) {\n const index = match.indices[1][0]\n tripTeamLoc.push(\n makeLineLoc(\n lineNumber,\n lineStartIndex,\n index,\n index + name.length\n )\n )\n }\n }\n if (!tripTeam.length) {\n addIssue(\n 'warning',\n 'missingTripTeam',\n 'Missing team',\n 0,\n dateMatch.index,\n tripIssues\n )\n }\n if (normalizeNames) tripTeam = tripTeam.map(normalizeTeamMemberName)\n let month, day, year\n if (dateMatch[2]) {\n month = parseInt(dateMatch[2])\n day = parseInt(dateMatch[3])\n year = parseInt(dateMatch[4])\n } else if (dateMatch[6]) {\n day = parseInt(dateMatch[6])\n month = parseMonth(dateMatch[7])\n year = parseInt(dateMatch[8])\n } else {\n month = parseMonth(dateMatch[10])\n day = parseInt(dateMatch[11])\n year = parseInt(dateMatch[12])\n }\n tripDate = new Date(year < 60 ? year + 2000 : year, month - 1, day)\n if (includeLocs && dateMatch.indices) {\n tripDateLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...dateMatch.indices[1]\n )\n }\n } else {\n addIssue(\n 'warning',\n 'missingTripDate',\n 'Missing date',\n line.length,\n line.length,\n tripIssues\n )\n }\n } else if (lineNumber > 1) {\n tripComment.push(line)\n }\n const match = /^\\*\\*\\*([^*]+)\\*\\*\\*/.exec(line)\n if (match) {\n section = match[1].trim()\n }\n } else if (/^(\\s{9,}|)\\*(?!\\*)/.test(line)) {\n if (/^\\*\\s*%NC(\\b|$)/.test(line)) {\n unitsChanged = true\n }\n let match: RegExpMatchArray | null\n if ((match = /^\\*\\s*%T([ITM])(\\b|$)/.exec(line))) {\n const currentUnits = alternateUnits || unwrapInvalid(trip)?.units\n if (currentUnits && !('INVALID' in currentUnits)) {\n alternateUnits = {\n ...currentUnits,\n distanceUnit:\n match[1] === 'I'\n ? Length.inches\n : match[1] === 'M'\n ? Length.meters\n : Length.feet,\n }\n nextShotUnits = alternateUnits\n }\n }\n if (/^\\*\\s*%/.test(line)) {\n inBlockComment = false\n continue\n }\n if (/[^\\s*]/.test(line)) {\n addCommentLine(line.replace(/^\\s*\\*/, ''))\n inBlockComment = false\n } else {\n inBlockComment = !inBlockComment\n if (inBlockComment) {\n const trailingComment = getComment()\n if (trailingComment) attachComment(lastShot, trailingComment)\n }\n }\n } else if (inBlockComment) {\n addCommentLine(line)\n } else if (lineNumber === tripCommentEndLine + 1) {\n if (trip) trips.push(trip)\n const comment = tripComment.join('\\n') || undefined\n const headerLocs: FrcsTripHeader['locs'] =\n includeLocs && tripNameLoc\n ? {\n name: tripNameLoc,\n date: tripDateLoc,\n section: sectionLoc,\n team: tripTeamLoc,\n }\n : undefined\n const header = {\n name: tripName || '',\n comment,\n section,\n date: tripDate,\n team: tripTeam,\n ...(headerLocs && { locs: headerLocs }),\n }\n const units = parseUnits()\n if (\n 'INVALID' in units ||\n tripIssues.some((i) => issues[i]?.type === 'error')\n ) {\n trip = {\n INVALID: {\n header,\n units,\n shots: [],\n },\n ...(tripIssues.length ? { issues: tripIssues } : {}),\n }\n } else {\n trip = {\n tripNumber: 1,\n header,\n units,\n shots: [],\n }\n }\n tripIssues = []\n } else if (trip) {\n let distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const azimuthUnit =\n unwrapInvalid(alternateUnits)?.azimuthUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).azimuthUnit ||\n Angle.degrees\n const inclinationUnit =\n unwrapInvalid(alternateUnits)?.inclinationUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).inclinationUnit ||\n Angle.degrees\n\n const inches = distanceUnit === Length.inches\n if (inches) distanceUnit = Length.feet\n\n const ranges = inches ? columnRanges.feetAndInches : columnRanges.decimal\n\n // from station name\n if (!/\\S/.test(line.substring(...ranges.fromStation))) continue\n const fromStr = validate(\n ...ranges.fromStation,\n 'from station',\n isValidStation\n )\n const from = fromStr.trim()\n\n // Sadly I have found negative LRUD values in Chip's format and apparently\n // his program doesn't fail on them, so I have to accept them here\n // isValidOptFloat instead of isValidOptUFloat\n const lStr = validate(...ranges.left, 'left', isValidOptFloat)\n const rStr = validate(...ranges.right, 'right', isValidOptFloat)\n const uStr = validate(...ranges.up, 'up', isValidOptFloat)\n const dStr = validate(...ranges.down, 'down', isValidOptFloat)\n\n const up = parseLrud(uStr, distanceUnit)\n const down = parseLrud(dStr, distanceUnit)\n const left = parseLrud(lStr, distanceUnit)\n const right = parseLrud(rStr, distanceUnit)\n\n // to station name\n const toStr = line.substring(...ranges.toStation)\n if (!toStr.trim()) {\n const shot: FrcsShot = {\n from,\n to: undefined,\n distance: new UnitizedNumber(0, distanceUnit),\n frontsightAzimuth: undefined,\n backsightAzimuth: undefined,\n frontsightInclination: undefined,\n backsightInclination: undefined,\n fromLruds: {\n left,\n right,\n up,\n down,\n },\n comment: getComment(),\n }\n addShot(\n lineIssues.length ? { INVALID: shot, issues: lineIssues } : shot\n )\n continue\n }\n if (!isValidStation(toStr)) {\n addIssue(\n 'error',\n 'invalidStationName',\n 'Invalid station name',\n ...ranges.toStation\n )\n }\n\n let fromLruds = commentFromStationLruds.get(from)\n if (fromLruds) {\n commentFromStationLruds.delete(from)\n } else {\n const fromLrudMatch = new RegExp(\n `^\\\\s+${fromStr\n .trim()\n .replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}((\\\\s+(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)){4})`\n ).exec(line.substring(maxRange))\n if (fromLrudMatch) {\n const [left, right, up, down] = fromLrudMatch[1]\n .trim()\n .split(/\\s+/g)\n .map((s) => parseLrud(s, distanceUnit))\n fromLruds = { left, right, up, down }\n }\n }\n\n const comment = getComment()\n\n // azimuth and inclination\n const azmFsStr = validate(\n ranges.frontsightAzimuth[0],\n ranges.frontsightAzimuth[1],\n 'azimuth',\n isValidOptUFloat\n )\n const azmBsStr = validate(\n ...ranges.backsightAzimuth,\n 'azimuth',\n isValidOptUFloat\n )\n const incFsStr = line.substring(...ranges.frontsightInclination)\n const incBsStr = line.substring(...ranges.backsightInclination)\n\n let distance: UnitizedNumber<Length> | undefined\n let horizontalDistance: UnitizedNumber<Length> | undefined\n let verticalDistance: UnitizedNumber<Length> | undefined\n let frontsightInclination: UnitizedNumber<Angle> | undefined\n let backsightInclination: UnitizedNumber<Angle> | undefined\n\n // parse distance\n if (inches) {\n const feetStr = validate(\n ...ranges.distanceFeet,\n 'feet',\n isValidOptUFloat\n )\n const inchesStr = validate(\n ...ranges.distanceInches,\n 'inches',\n isValidOptUFloat\n )\n if (!/\\S/.test(feetStr) && !/\\S/.test(inchesStr)) {\n addIssue(\n 'error',\n 'missingDistance',\n 'Missing distance',\n ranges.distanceFeet[0],\n ranges.distanceInches[1]\n )\n }\n // sometimes inches are omitted, hence the || 0...I'm assuming it's possible\n // for feet to be omitted as well\n else if (\n (isValidUInt(feetStr) && isValidOptUFloat(inchesStr)) ||\n (isValidOptUFloat(feetStr) && isValidUInt(inchesStr))\n ) {\n distance = Unitize.inches(parseFloat(inchesStr) || 0).add(\n Unitize.feet(parseFloat(feetStr) || 0)\n )\n }\n // NOTE there are two columns around here that can contain a *.\n // I think they might represent different values, but thisis confused by\n // the fact that for ft/in shots, if there is a D or H flag it occupies the\n // first column that can contain a * for decimal feet shots\n } else {\n const distStr = validate(...ranges.distance, 'distance', isValidUFloat)\n const distNum = parseFloat(distStr)\n distance = Number.isFinite(distNum)\n ? new UnitizedNumber(distNum, distanceUnit)\n : undefined\n }\n const specialKindStr = line.substring(...ranges.kind).trim()\n const exclude = line.substring(...ranges.exclude).trim()\n const specialKind = parseSpecialKind(specialKindStr)\n\n if (specialKindStr && !specialKind) {\n addIssue(\n 'error',\n 'invalidShotType',\n 'Invalid shot type',\n ranges.kind[0],\n ranges.kind[1]\n )\n }\n\n const excludeDistance = exclude === '*' || exclude === 's'\n const isSplay = exclude === 's'\n\n if (exclude && !excludeDistance) {\n addIssue(\n 'error',\n 'invalidShotFlag',\n 'Invalid shot flag',\n ranges.exclude[0],\n ranges.exclude[1]\n )\n }\n\n if (specialKind) {\n validate(\n ...ranges.frontsightInclination,\n 'vertical-distance',\n isValidFloat\n )\n }\n\n // convert horizontal and diagonal shots to standard\n // in this case incFs is the vertical offset between stations\n // fortunately it appears we can always count on incFs being specified\n // and incBs not being specified for these types of shots\n if (specialKind === 'horizontal') {\n // distance is horizontal offset and incFsStr is vertical offset\n horizontalDistance = distance\n const h = horizontalDistance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n distance = new UnitizedNumber(Math.sqrt(h * h + v * v), distanceUnit)\n frontsightInclination =\n verticalDistance && horizontalDistance\n ? Angle.atan2(verticalDistance, horizontalDistance).in(\n inclinationUnit\n )\n : undefined\n backsightInclination = undefined\n } else if (specialKind === 'diagonal') {\n // distance is as usual, but incFsStr is vertical offset\n const d = distance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n frontsightInclination = Angle.asin(v / d).in(inclinationUnit)\n backsightInclination = undefined\n } else {\n // frontsight inclination\n validate(\n ...ranges.frontsightInclination,\n 'inclination',\n isValidOptFloat\n )\n // backsight inclination\n validate(...ranges.backsightInclination, 'inclination', isValidOptFloat)\n frontsightInclination = parseNumber(incFsStr, inclinationUnit)\n backsightInclination = parseNumber(incBsStr, inclinationUnit)\n\n validateInclinationRange(\n frontsightInclination,\n ...ranges.frontsightInclination\n )\n validateInclinationRange(\n backsightInclination,\n ...ranges.backsightInclination\n )\n }\n\n const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit)\n const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit)\n\n validateAzimuthRange(frontsightAzimuth, ...ranges.frontsightAzimuth)\n validateAzimuthRange(backsightAzimuth, ...ranges.backsightAzimuth)\n\n if (!/\\S/.test(incFsStr) && !/\\S/.test(incBsStr)) {\n frontsightInclination = Unitize.degrees(0)\n }\n\n if (from && distance && !lineIssues.length) {\n const shot: FrcsShot = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot(shot)\n } else {\n const shot: InvalidFrcsShot['INVALID'] = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot({ INVALID: shot, issues: lineIssues })\n }\n }\n }\n\n if (trip) trips.push(trip)\n\n trips.forEach((trip, index) => (unwrapInvalid(trip).tripNumber = index + 1))\n\n if (\n !issues.some((i) => i.type === 'error') &&\n trips.every((t): t is FrcsTrip => !('INVALID' in t))\n ) {\n return {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(issues.length ? { issues } : undefined),\n ...(includeLocs && { locs: rootLocs }),\n }\n }\n\n return {\n INVALID: {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(includeLocs && { locs: rootLocs }),\n },\n issues,\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////\n\n function getComment(): string | undefined {\n if (!commentLines.length) return undefined\n const comment = commentLines.join('\\n').trim()\n commentLines.length = 0\n return comment || undefined\n }\n\n function attachComment(\n shot: FrcsShot | InvalidFrcsShot | undefined,\n comment: string\n ) {\n const unwrapped = unwrapInvalid(shot)\n if (!unwrapped) return\n if (unwrapped.comment) unwrapped.comment += '\\n' + comment\n else unwrapped.comment = comment\n }\n\n function addCommentLine(comment: string): void {\n if (trip) {\n const distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const parsedFromStationLruds = parseFromStationLruds(\n comment,\n distanceUnit\n )\n if (parsedFromStationLruds) {\n commentFromStationLruds.set(\n parsedFromStationLruds[0],\n parsedFromStationLruds[1]\n )\n return\n }\n }\n if (commentLines) {\n commentLines.push(comment)\n }\n }\n\n function addIssue(\n type: ParseIssueSeverity,\n code: string,\n message: string,\n startColumn: number,\n endColumn: number,\n indicesArray?: number[]\n ) {\n if (\n suppressWarnings &&\n type === 'warning' &&\n (suppressWarnings === true ||\n ('code' in suppressWarnings &&\n suppressWarnings[code as keyof typeof suppressWarnings] === true))\n ) {\n return\n }\n\n issues.push({\n type,\n code,\n message,\n loc: {\n start: {\n line: lineNumber,\n column: startColumn,\n index: lineStartIndex + startColumn,\n },\n end: {\n line: lineNumber,\n column: endColumn,\n index: lineStartIndex + endColumn,\n },\n },\n })\n if (!lineIssues) lineIssues = []\n lineIssues.push(issues.length - 1)\n indicesArray?.push(issues.length - 1)\n }\n\n function parseUnits(): FrcsUnits | InvalidFrcsUnits {\n // FT CC DD\n // 01234567\n const distanceUnit = parseLengthUnit(line.slice(0, 2))\n if (!distanceUnit) {\n addIssue('error', 'invalidDistanceUnit', 'Invalid distance unit', 0, 2)\n }\n const azimuthUnit = parseAngleUnit(line[6])\n if (!azimuthUnit) {\n addIssue('error', 'invalidAzimuthUnit', 'Invalid azimuth unit', 6, 7)\n }\n const inclinationUnit = parseAngleUnit(line[7])\n if (!inclinationUnit) {\n addIssue(\n 'error',\n 'invalidInclinationUnit',\n 'Invalid inclination unit',\n 7,\n 8\n )\n }\n const backsightAzimuthCorrected = line[3] === 'C'\n const backsightInclinationCorrected = line[4] === 'C'\n const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-'\n const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-'\n\n if (!/[-CB ]/.test(line[3])) {\n addIssue(\n 'error',\n 'invalidBacksightAzimuthType',\n 'Invalid backsight azimuth type',\n 3,\n 4\n )\n }\n if (!/[-CB ]/.test(line[4])) {\n addIssue(\n 'error',\n 'invalidBacksightInclinationType',\n 'Invalid backsight inclination type',\n 4,\n 5\n )\n }\n\n if (!distanceUnit || !azimuthUnit || !inclinationUnit) {\n return {\n INVALID: {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n },\n issues: lineIssues,\n }\n }\n\n return {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n }\n }\n\n function validate(\n startColumn: number,\n endColumn: number,\n fieldName: string,\n validator: (value: string) => boolean\n ): string {\n const field = line.substring(startColumn, endColumn)\n if (!validator(field)) {\n addIssue(\n 'error',\n `${\n field.trim() ? 'invalid' : 'missing'\n }${fieldName[0].toUpperCase()}${fieldName.substring(1)}`,\n (field.trim() ? 'Invalid ' : 'Missing ') + fieldName,\n startColumn,\n endColumn\n )\n }\n return field\n }\n\n function validateAzimuthRange(\n azimuth: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!azimuth) return\n const rawValue = azimuth.get(azimuth.unit)\n let max = Infinity\n switch (azimuth.unit) {\n case Angle.degrees:\n max = 360\n break\n case Angle.gradians:\n max = 400\n break\n case Angle.radians:\n max = Math.PI * 2\n break\n case Angle.milsNATO:\n max = 6400\n break\n }\n if (rawValue < 0 || rawValue >= max) {\n addIssue(\n 'error',\n 'azimuthOutOfRange',\n 'Azimuth out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function validateInclinationRange(\n inclination: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!inclination) return\n const rawValue = inclination.get(inclination.unit)\n let max = Infinity\n switch (inclination.unit) {\n case Angle.degrees:\n max = 90\n break\n case Angle.gradians:\n max = 100\n break\n case Angle.radians:\n max = Math.PI / 2\n break\n case Angle.milsNATO:\n max = 1600\n break\n }\n if (rawValue < -max || rawValue > max) {\n addIssue(\n 'error',\n 'inclinationOutOfRange',\n 'Inclination out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function addShot(shot: FrcsShot | InvalidFrcsShot) {\n lastShot = shot\n if (!trip) return\n if (alternateUnits) {\n const recorded:\n | FrcsShot['recorded']\n | InvalidFrcsShot['INVALID']['recorded'] = shot\n if ('INVALID' in shot) {\n shot = {\n INVALID: {\n ...shot.INVALID,\n recorded: shot,\n },\n issues: shot.issues,\n }\n } else {\n shot = { ...shot, recorded: shot }\n }\n if (nextShotUnits) {\n unwrapInvalid(recorded).units = nextShotUnits\n nextShotUnits = undefined\n }\n const {\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n } = unwrapInvalid(unwrapInvalid(trip).units)\n const unwrappedAlternateUnits = unwrapInvalid(alternateUnits)\n const unwrappedShot = unwrapInvalid(shot)\n {\n const alternateUnits = unwrappedAlternateUnits\n const shot = unwrappedShot\n if (\n alternateUnits.backsightAzimuthCorrected !== backsightAzimuthCorrected\n ) {\n shot.backsightAzimuth = shot.backsightAzimuth\n ? Angle.opposite(shot.backsightAzimuth)\n : undefined\n }\n if (\n alternateUnits.backsightInclinationCorrected !==\n backsightInclinationCorrected\n ) {\n shot.backsightInclination = shot.backsightInclination?.negate()\n }\n if (distanceUnit && distanceUnit !== alternateUnits.distanceUnit) {\n shot.distance = shot.distance?.in(distanceUnit)\n if (shot.fromLruds) {\n shot.fromLruds = { ...shot.fromLruds }\n shot.fromLruds.left = shot.fromLruds.left?.in(distanceUnit)\n shot.fromLruds.right = shot.fromLruds.right?.in(distanceUnit)\n shot.fromLruds.up = shot.fromLruds.up?.in(distanceUnit)\n shot.fromLruds.down = shot.fromLruds.down?.in(distanceUnit)\n }\n if (shot.toLruds) {\n shot.toLruds = { ...shot.toLruds }\n shot.toLruds.left = shot.toLruds.left?.in(distanceUnit)\n shot.toLruds.right = shot.toLruds.right?.in(distanceUnit)\n shot.toLruds.up = shot.toLruds.up?.in(distanceUnit)\n shot.toLruds.down = shot.toLruds.down?.in(distanceUnit)\n }\n }\n if (azimuthUnit && azimuthUnit !== alternateUnits.azimuthUnit) {\n shot.frontsightAzimuth = shot.frontsightAzimuth?.in(azimuthUnit)\n shot.backsightAzimuth = shot.backsightAzimuth?.in(azimuthUnit)\n }\n if (\n inclinationUnit &&\n inclinationUnit !== alternateUnits.inclinationUnit\n ) {\n shot.frontsightInclination =\n shot.frontsightInclination?.in(inclinationUnit)\n shot.backsightInclination =\n shot.backsightInclination?.in(inclinationUnit)\n }\n }\n }\n if ('INVALID' in trip) {\n trip.INVALID.shots.push(shot)\n } else if ('INVALID' in shot) {\n trip = { INVALID: trip }\n trip.INVALID.shots.push(shot)\n } else {\n trip.shots.push(shot)\n }\n }\n}\n\nfunction makeLineLoc(\n line: number,\n lineStartIndex: number,\n startColumn: number,\n endColumn: number\n): SourceLoc {\n return {\n start: {\n index: lineStartIndex + startColumn,\n line,\n column: startColumn,\n },\n end: {\n index: lineStartIndex + endColumn,\n line,\n column: endColumn,\n },\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/web/index.js
CHANGED
|
@@ -79,7 +79,7 @@ const convertLineBased = fn => {
|
|
|
79
79
|
return converted;
|
|
80
80
|
};
|
|
81
81
|
function chunksOf(input) {
|
|
82
|
-
return readableStreamValues((input instanceof ReadableStream ? input : input.stream()).pipeThrough(new TextDecoderStream()));
|
|
82
|
+
return readableStreamValues((input instanceof ReadableStream ? input : input.stream()).pipeThrough(new TextDecoderStream('windows-1252')));
|
|
83
83
|
}
|
|
84
84
|
function parseFrcsSurveyFile(file, input, options) {
|
|
85
85
|
if (file instanceof File) return (0, _parseFrcsSurveyFile2.default)(file.name, chunksOf(file), options);
|
package/web/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_parseFrcsSurveyFile2","_interopRequireDefault","require","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","LinesTransform","TransformStream","parts","constructor","transform","chunk","controller","end","match","matchAll","push","substring","index","enqueue","join","length","flush","readableStreamValues","stream","preventCancel","reader","getReader","next","result","read","done","releaseLock","e","return","value","cancelPromise","cancel","Symbol","asyncIterator","linesOf","input","ReadableStream","pipeThrough","TextDecoderStream","convertLineBased","fn","converted","file","File","name","chunksOf","parseFrcsSurveyFile","options","_parseFrcsSurveyFile","Blob","Error","parseFrcsPlotFile","exports","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/web/index.ts"],"sourcesContent":["import _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { ParseFrcsSurveyFileOptions } from '../survey/FrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\nimport type {\n FrcsSurveyFile,\n InvalidFrcsSurveyFile,\n} from '../survey/FrcsSurveyFile'\n\nclass LinesTransform extends TransformStream<string> {\n parts: string[] = []\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n let end = 0\n for (const match of chunk.matchAll(/\\r\\n?|\\n/gm)) {\n this.parts.push(chunk.substring(end, match.index))\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n end = match.index + match[0].length\n }\n if (end < chunk.length) this.parts.push(chunk.substring(end))\n },\n flush: (controller) => {\n if (this.parts.length) {\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n }\n },\n })\n }\n}\n\nfunction readableStreamValues<T>(\n stream: ReadableStream<T>,\n { preventCancel = false }: { preventCancel?: boolean } = {}\n): AsyncIterableIterator<T> {\n const reader = stream.getReader()\n return {\n async next() {\n try {\n const result = await reader.read()\n if (result.done) {\n reader.releaseLock()\n }\n return result\n } catch (e) {\n reader.releaseLock()\n throw e\n }\n },\n async return(value: T) {\n if (!preventCancel) {\n const cancelPromise = reader.cancel(value)\n reader.releaseLock()\n await cancelPromise\n } else {\n reader.releaseLock()\n }\n return { done: true, value }\n },\n [Symbol.asyncIterator]() {\n return this\n },\n }\n}\n\nfunction linesOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream())\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LinesTransform())\n )\n}\n\nconst convertLineBased = <T>(\n fn: (file: string, lines: AsyncIterable<string>) => Promise<T>\n) => {\n function converted(file: File): Promise<T>\n function converted(file: string, input: Blob | ReadableStream): Promise<T>\n function converted(\n file: string | File,\n input?: Blob | ReadableStream\n ): Promise<T> {\n if (file instanceof File) return converted(file.name, file)\n return fn(file, linesOf(input!))\n }\n return converted\n}\n\nfunction chunksOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream()).pipeThrough(\n new TextDecoderStream()\n )\n )\n}\n\nexport function parseFrcsSurveyFile(\n file: File,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string,\n input: Blob | ReadableStream<Uint8Array>,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string | File,\n input?: Blob | ReadableStream<Uint8Array> | ParseFrcsSurveyFileOptions,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n if (file instanceof File)\n return _parseFrcsSurveyFile(file.name, chunksOf(file), options)\n if (input instanceof Blob || input instanceof ReadableStream) {\n return _parseFrcsSurveyFile(file, chunksOf(input), options)\n }\n throw new Error(`input ust be a Blob or ReadableStream if file is not a File`)\n}\n\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","names":["_parseFrcsSurveyFile2","_interopRequireDefault","require","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","LinesTransform","TransformStream","parts","constructor","transform","chunk","controller","end","match","matchAll","push","substring","index","enqueue","join","length","flush","readableStreamValues","stream","preventCancel","reader","getReader","next","result","read","done","releaseLock","e","return","value","cancelPromise","cancel","Symbol","asyncIterator","linesOf","input","ReadableStream","pipeThrough","TextDecoderStream","convertLineBased","fn","converted","file","File","name","chunksOf","parseFrcsSurveyFile","options","_parseFrcsSurveyFile","Blob","Error","parseFrcsPlotFile","exports","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/web/index.ts"],"sourcesContent":["import _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { ParseFrcsSurveyFileOptions } from '../survey/FrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\nimport type {\n FrcsSurveyFile,\n InvalidFrcsSurveyFile,\n} from '../survey/FrcsSurveyFile'\n\nclass LinesTransform extends TransformStream<string> {\n parts: string[] = []\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n let end = 0\n for (const match of chunk.matchAll(/\\r\\n?|\\n/gm)) {\n this.parts.push(chunk.substring(end, match.index))\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n end = match.index + match[0].length\n }\n if (end < chunk.length) this.parts.push(chunk.substring(end))\n },\n flush: (controller) => {\n if (this.parts.length) {\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n }\n },\n })\n }\n}\n\nfunction readableStreamValues<T>(\n stream: ReadableStream<T>,\n { preventCancel = false }: { preventCancel?: boolean } = {}\n): AsyncIterableIterator<T> {\n const reader = stream.getReader()\n return {\n async next() {\n try {\n const result = await reader.read()\n if (result.done) {\n reader.releaseLock()\n }\n return result\n } catch (e) {\n reader.releaseLock()\n throw e\n }\n },\n async return(value: T) {\n if (!preventCancel) {\n const cancelPromise = reader.cancel(value)\n reader.releaseLock()\n await cancelPromise\n } else {\n reader.releaseLock()\n }\n return { done: true, value }\n },\n [Symbol.asyncIterator]() {\n return this\n },\n }\n}\n\nfunction linesOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream())\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LinesTransform())\n )\n}\n\nconst convertLineBased = <T>(\n fn: (file: string, lines: AsyncIterable<string>) => Promise<T>\n) => {\n function converted(file: File): Promise<T>\n function converted(file: string, input: Blob | ReadableStream): Promise<T>\n function converted(\n file: string | File,\n input?: Blob | ReadableStream\n ): Promise<T> {\n if (file instanceof File) return converted(file.name, file)\n return fn(file, linesOf(input!))\n }\n return converted\n}\n\nfunction chunksOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream()).pipeThrough(\n new TextDecoderStream('windows-1252')\n )\n )\n}\n\nexport function parseFrcsSurveyFile(\n file: File,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string,\n input: Blob | ReadableStream<Uint8Array>,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string | File,\n input?: Blob | ReadableStream<Uint8Array> | ParseFrcsSurveyFileOptions,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n if (file instanceof File)\n return _parseFrcsSurveyFile(file.name, chunksOf(file), options)\n if (input instanceof Blob || input instanceof ReadableStream) {\n return _parseFrcsSurveyFile(file, chunksOf(input), options)\n }\n throw new Error(`input ust be a Blob or ReadableStream if file is not a File`)\n}\n\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":"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","ignoreList":[]}
|