@speleotica/frcsdata 4.2.0 → 4.3.1
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/FrcsPlotFile.d.ts +1 -0
- package/FrcsPlotFile.d.ts.map +1 -0
- package/FrcsPlotFile.js +2 -1
- package/FrcsPlotFile.js.map +1 -0
- package/FrcsPlotShot.d.ts +1 -0
- package/FrcsPlotShot.d.ts.map +1 -0
- package/FrcsPlotShot.js +2 -1
- package/FrcsPlotShot.js.map +1 -0
- package/FrcsShot.d.ts +1 -0
- package/FrcsShot.d.ts.map +1 -0
- package/FrcsShot.js +2 -1
- package/FrcsShot.js.map +1 -0
- package/FrcsSurveyFile.d.ts +20 -0
- package/FrcsSurveyFile.d.ts.map +1 -0
- package/FrcsSurveyFile.js +20 -1
- package/FrcsSurveyFile.js.map +1 -0
- package/FrcsTrip.d.ts +1 -0
- package/FrcsTrip.d.ts.map +1 -0
- package/FrcsTrip.js +2 -1
- package/FrcsTrip.js.map +1 -0
- package/FrcsTripSummary.d.ts +1 -0
- package/FrcsTripSummary.d.ts.map +1 -0
- package/FrcsTripSummary.js +2 -1
- package/FrcsTripSummary.js.map +1 -0
- package/FrcsTripSummaryFile.d.ts +1 -0
- package/FrcsTripSummaryFile.d.ts.map +1 -0
- package/FrcsTripSummaryFile.js +2 -1
- package/FrcsTripSummaryFile.js.map +1 -0
- package/formatFrcsShot.d.ts +8 -2
- package/formatFrcsShot.d.ts.map +1 -0
- package/formatFrcsShot.js +85 -62
- package/formatFrcsShot.js.map +1 -0
- package/formatFrcsSurveyFile.d.ts +3 -0
- package/formatFrcsSurveyFile.d.ts.map +1 -0
- package/formatFrcsSurveyFile.js +165 -0
- package/formatFrcsSurveyFile.js.map +1 -0
- package/index.d.ts +3 -1
- package/index.d.ts.map +1 -0
- package/index.js +9 -1
- package/index.js.map +1 -0
- package/node/index.d.ts +2 -1
- package/node/index.d.ts.map +1 -0
- package/node/index.js +6 -2
- package/node/index.js.map +1 -0
- package/package.json +6 -3
- package/parseFrcsPlotFile.d.ts +1 -0
- package/parseFrcsPlotFile.d.ts.map +1 -0
- package/parseFrcsPlotFile.js +2 -1
- package/parseFrcsPlotFile.js.map +1 -0
- package/parseFrcsSurveyFile.d.ts +50 -46
- package/parseFrcsSurveyFile.d.ts.map +1 -0
- package/parseFrcsSurveyFile.js +281 -172
- package/parseFrcsSurveyFile.js.map +1 -0
- package/parseFrcsTripSummaryFile.d.ts +1 -0
- package/parseFrcsTripSummaryFile.d.ts.map +1 -0
- package/parseFrcsTripSummaryFile.js +2 -1
- package/parseFrcsTripSummaryFile.js.map +1 -0
- package/src/FrcsPlotFile.ts +9 -0
- package/src/FrcsPlotShot.ts +18 -0
- package/src/FrcsShot.ts +56 -0
- package/src/FrcsSurveyFile.ts +47 -0
- package/src/FrcsTrip.ts +25 -0
- package/src/FrcsTripSummary.ts +14 -0
- package/src/FrcsTripSummaryFile.ts +7 -0
- package/src/formatFrcsShot.ts +168 -0
- package/src/formatFrcsSurveyFile.ts +97 -0
- package/src/index.ts +29 -0
- package/src/node/index.ts +20 -0
- package/src/parseFrcsPlotFile.ts +168 -0
- package/src/parseFrcsSurveyFile.ts +788 -0
- package/src/parseFrcsTripSummaryFile.ts +76 -0
- package/src/string/index.ts +21 -0
- package/src/web/index.ts +119 -0
- package/string/index.d.ts +2 -1
- package/string/index.d.ts.map +1 -0
- package/string/index.js +6 -2
- package/string/index.js.map +1 -0
- package/web/index.d.ts +5 -4
- package/web/index.d.ts.map +1 -0
- package/web/index.js +15 -6
- package/web/index.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseFrcsSurveyFile.js","names":["_FrcsSurveyFile","require","_parseSegment","_unitized","_FrcsShot","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","_asyncIterator","n","Symbol","asyncIterator","iterator","call","AsyncFromSyncIterator","TypeError","AsyncFromSyncIteratorContinuation","Promise","reject","done","resolve","value","then","s","next","prototype","_return","_throw","parseNumber","unit","parseFloat","isNaN","UnitizedNumber","parseAzimuth","parsed","get","Angle","degrees","Unitize","parseKind","kind","FrcsShotKind","Horizontal","Diagonal","Normal","parseLengthUnit","Length","inches","feet","meters","parseAngleUnit","gradians","milsNATO","isValidStation","test","isValidUInt","isValidFloat","isValidOptFloat","isValidOptUFloat","isValidUFloat","isValidOptInclination","parseLrud","Number","isFinite","parseFromStationLruds","line","distanceUnit","fromStr","substring","undefined","gap","trim","lrudStr","lStr","rStr","uStr","dStr","up","down","left","right","getColumnRanges","config","result","toStation","fromStation","distance","distanceFeet","distanceInches","exclude","frontsightAzimuth","backsightAzimuth","frontsightInclination","backsightInclination","c","_i","_arr","entries","_arr$_i","_slicedToArray2","key","parseFrcsSurveyFile","_x","_x2","_parseFrcsSurveyFile","_asyncToGenerator2","_regenerator","mark","_callee","file","lines","_ref","_ref$columns","columns","ranges","maxRange","cave","location","trips","errors","tripName","tripTeam","tripDate","inTripComment","tripCommentStartLine","tripCommentEndLine","tripComment","commentLines","trip","inBlockComment","section","commentFromStationLruds","addCommentLine","getComment","unitsChanged","alternateUnits","nextShotUnits","lineNumber","errored","error","parseUnits","validate","addShot","began","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_loop","_ret","_iterator","_step","_args2","wrap","_callee$","_context2","prev","_getComment","comment","join","_addCommentLine","header","parsedFromStationLruds","set","defaultFrcsShotColumnConfig","Math","max","_toConsumableArray2","values","map","Map","message","startColumn","endColumn","SegmentParseError","Segment","source","startLine","startCol","slice","azimuthUnit","inclinationUnit","backsightAzimuthCorrected","backsightInclinationCorrected","hasBacksightAzimuth","hasBacksightInclination","fieldName","validator","field","shot","recorded","units","_trip$header","opposite","_shot$backsightInclin","negate","fromLruds","_shot$fromLruds$left","_shot$fromLruds$right","_shot$fromLruds$up","_shot$fromLruds$down","toLruds","_shot$toLruds$left","_shot$toLruds$right","_shot$toLruds$up","_shot$toLruds$down","_shot$frontsightAzimu","_shot$backsightAzimut","_shot$frontsightIncli","_shot$backsightInclin2","shots","match","_match","_match$k","k","team","dateMatch","month","day","year","_match2","_line","_line2","_line3","_line4","_ref2","_ref3","from","toStr","_shot","fromLrudMatch","_fromLrudMatch$1$trim","_fromLrudMatch$1$trim2","_left","_right","_up","_down","azmFsStr","azmBsStr","incFsStr","incBsStr","horizontalDistance","verticalDistance","excludeDistance","isSplay","_line5","_line6","feetStr","inchesStr","invalid","offset","_line7","_line8","_feetStr","_exclude","h","v","d","_v","_loop$","_context","abrupt","exec","split","indexOf","parseInt","Date","replace","name","date","concat","to","RegExp","add","sqrt","atan2","asin","stop","sent","delegateYield","t0","t1","finish","module","exports","default"],"sources":["src/parseFrcsSurveyFile.ts"],"sourcesContent":["import {\n FrcsShotColumnConfig,\n FrcsSurveyFile,\n defaultFrcsShotColumnConfig,\n} from './FrcsSurveyFile'\nimport { FrcsTrip, FrcsUnits } from './FrcsTrip'\nimport { Segment, SegmentParseError } from 'parse-segment'\nimport {\n Angle,\n Length,\n Unit,\n UnitizedNumber,\n UnitType,\n Unitize,\n} from '@speleotica/unitized'\nimport { FrcsShot, FrcsShotKind } from './FrcsShot'\n\nfunction parseNumber<T extends UnitType<T>>(\n s: string,\n unit: Unit<T>\n): UnitizedNumber<T> | null {\n const value = parseFloat(s)\n if (isNaN(value)) return null\n return new UnitizedNumber(value, unit)\n}\n\nfunction parseAzimuth(\n s: string,\n unit: Unit<Angle>\n): UnitizedNumber<Angle> | null {\n const parsed = parseNumber(s, unit)\n return parsed?.get(Angle.degrees) === 360 ? Unitize.degrees(0) : parsed\n}\n\nfunction parseKind(kind: string): FrcsShotKind {\n switch (kind) {\n case 'H':\n return FrcsShotKind.Horizontal\n case 'D':\n return FrcsShotKind.Diagonal\n default:\n return FrcsShotKind.Normal\n }\n}\n\nfunction parseLengthUnit(unit: string): Unit<Length> | null {\n switch (unit) {\n case 'FI':\n return Length.inches\n case 'FF':\n case 'FT':\n return Length.feet\n case 'MT':\n case 'MM':\n case 'M ':\n return Length.meters\n }\n return null\n}\nfunction parseAngleUnit(unit: string): Unit<Angle> | null {\n switch (unit) {\n case 'D':\n return Angle.degrees\n case 'G':\n return Angle.gradians\n case 'M':\n return Angle.milsNATO\n }\n return null\n}\n\n// determines if a cell contains a valid station name.\nfunction isValidStation(s: string): boolean {\n return /^\\s*\\S+\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned integer.\nfunction isValidUInt(s: string): boolean {\n return /^\\s*[0-9]+\\s*$/.test(s)\n}\n// determines if a cell contains a valid float.\nfunction isValidFloat(s: string): boolean {\n return /^\\s*[-+]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned float or whitespace.\nfunction isValidOptFloat(s: string): boolean {\n return /^\\s*[-+]?[0-9]*(\\.[0-9]*)?\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned float or whitespace.\nfunction isValidOptUFloat(s: string): boolean {\n return /^\\s*[0-9]*(\\.[0-9]*)?\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned float.\nfunction isValidUFloat(s: string): boolean {\n return /^\\s*([0-9]+(\\.[0-9]*)?|\\.[0-9]+)\\s*$/.test(s)\n}\n// determines if a cell contains a valid inclination or whitespace.\nfunction isValidOptInclination(s: string): boolean {\n return /^\\s*[-+]?[0-9]*(\\.[0-9]*)?\\s*$/.test(s)\n}\nfunction parseLrud<T extends UnitType<T>>(\n s: string,\n unit: Unit<Length>\n): UnitizedNumber<Length> | null {\n const value = parseFloat(s)\n return !Number.isFinite(value) || value < 0\n ? null\n : new UnitizedNumber(value, unit)\n}\n\nfunction parseFromStationLruds(\n line: string,\n distanceUnit: Unit<Length>\n): [string, NonNullable<FrcsShot['fromLruds']>] | undefined {\n const fromStr = line.substring(0, 5)\n if (!/^\\s*\\S+$/.test(fromStr)) return undefined\n const gap = line.substring(5, 40)\n if (gap.trim()) return undefined\n const lrudStr = line.substring(40, 52)\n if (!/\\d/.test(lrudStr)) return undefined\n const lStr = line.substring(40, 43)\n const rStr = line.substring(43, 46)\n const uStr = line.substring(46, 49)\n const dStr = line.substring(49, 52)\n if (\n !isValidOptFloat(lStr) ||\n !isValidOptFloat(rStr) ||\n !isValidOptFloat(uStr) ||\n !isValidOptFloat(dStr)\n ) {\n return undefined\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 return [fromStr.trim(), { left, right, up, down }]\n}\n\ntype ColumnRanges = {\n toStation: [number, number]\n fromStation: [number, number]\n distance: [number, number]\n distanceFeet: [number, number]\n distanceInches: [number, number]\n kind: [number, number]\n exclude: [number, number]\n frontsightAzimuth: [number, number]\n backsightAzimuth: [number, number]\n frontsightInclination: [number, number]\n backsightInclination: [number, number]\n left: [number, number]\n right: [number, number]\n up: [number, number]\n down: [number, number]\n}\n\nfunction getColumnRanges(config: FrcsShotColumnConfig): ColumnRanges {\n const result: ColumnRanges = {\n toStation: [0, 0],\n fromStation: [0, 0],\n distance: [0, 0],\n distanceFeet: [0, 0],\n distanceInches: [0, 0],\n kind: [0, 0],\n exclude: [0, 0],\n frontsightAzimuth: [0, 0],\n backsightAzimuth: [0, 0],\n frontsightInclination: [0, 0],\n backsightInclination: [0, 0],\n left: [0, 0],\n right: [0, 0],\n up: [0, 0],\n down: [0, 0],\n }\n\n let c = 0\n for (const [key, value] of Object.entries(config) as [\n keyof FrcsShotColumnConfig,\n FrcsShotColumnConfig[keyof FrcsShotColumnConfig]\n ][]) {\n if (key === 'distanceFeet' || key === 'distanceInches') continue\n result[key][0] = c\n result[key][1] = c + value\n c += value\n }\n if (config.distanceFeet) {\n result.distanceFeet[0] = result.distance[0]\n result.distanceFeet[1] = result.distance[0] + config.distanceFeet\n result.distanceInches[0] = result.distanceFeet[1]\n result.distanceInches[1] = result.distanceFeet[1] + config.distanceInches\n }\n return result\n}\n\nexport type ParseFrcsSurveyFileOptions = { columns?: FrcsShotColumnConfig }\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 lines: AsyncIterable<string>,\n { columns = defaultFrcsShotColumnConfig }: ParseFrcsSurveyFileOptions = {}\n): Promise<FrcsSurveyFile> {\n const ranges = getColumnRanges(columns)\n const maxRange = Math.max(...Object.values(ranges).map((r) => r[1]))\n\n let cave: string | null = null\n let location: string | null = null\n const trips: Array<FrcsTrip> = []\n const errors: Array<SegmentParseError> = []\n\n let tripName: string | undefined\n let tripTeam: string[] | undefined\n let tripDate: Date | undefined\n let inTripComment = true\n let tripCommentStartLine = 1\n let tripCommentEndLine = -1\n const tripComment: Array<string> = []\n const commentLines: Array<string> = []\n let trip: FrcsTrip | null = null\n let inBlockComment = false\n let section\n const commentFromStationLruds: Map<\n string,\n NonNullable<FrcsShot['fromLruds']>\n > = new Map()\n\n function addCommentLine(comment: string): void {\n if (trip) {\n const distanceUnit = trip.header.distanceUnit\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 getComment(): string | null {\n if (!commentLines?.length) return null\n const comment = commentLines.join('\\n').trim()\n commentLines.length = 0\n return comment || null\n }\n\n let unitsChanged = false\n let alternateUnits: FrcsUnits | undefined\n let nextShotUnits: FrcsUnits | undefined\n\n let lineNumber = 0\n let line: string\n\n let errored = false\n\n const error = (\n message: string,\n startColumn: number,\n endColumn: number\n ): void => {\n errored = true\n errors.push(\n new SegmentParseError(\n message,\n new Segment({\n value: line,\n source: file,\n startLine: lineNumber,\n startCol: 0,\n }).substring(startColumn, endColumn)\n )\n )\n }\n\n const parseUnits = (): FrcsUnits => {\n // FT CC DD\n // 01234567\n let distanceUnit = parseLengthUnit(line.slice(0, 2))\n if (!distanceUnit) {\n distanceUnit = Length.feet\n error('Invalid distance unit', 0, 2)\n }\n let azimuthUnit = parseAngleUnit(line[6])\n if (!azimuthUnit) {\n azimuthUnit = Angle.degrees\n error('Invalid azimuth unit', 6, 7)\n }\n let inclinationUnit = parseAngleUnit(line[7])\n if (!inclinationUnit) {\n inclinationUnit = Angle.degrees\n error('Invalid inclination unit', 7, 8)\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 error('Invalid backsight azimuth type', 3, 4)\n }\n if (!/[-CB ]/.test(line[4])) {\n error('Invalid backsight inclination type', 4, 5)\n }\n\n return {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n }\n }\n\n const 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 error(\n (field.trim() ? 'Invalid ' : 'Missing ') + fieldName,\n startColumn,\n endColumn\n )\n }\n return field\n }\n\n const addShot = (shot: FrcsShot) => {\n if (!trip) return\n if (alternateUnits) {\n const recorded: FrcsShot & { units?: FrcsUnits } = shot\n shot = {\n ...shot,\n recorded,\n }\n if (nextShotUnits) {\n recorded.units = nextShotUnits\n nextShotUnits = undefined\n }\n const {\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n } = trip.header\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 !== alternateUnits.distanceUnit) {\n shot.distance = shot.distance.in(distanceUnit)\n if (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.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 !== alternateUnits.azimuthUnit) {\n shot.frontsightAzimuth = shot.frontsightAzimuth?.in(azimuthUnit)\n shot.backsightAzimuth = shot.backsightAzimuth?.in(azimuthUnit)\n }\n if (inclinationUnit !== alternateUnits.inclinationUnit) {\n shot.frontsightInclination =\n shot.frontsightInclination?.in(inclinationUnit)\n shot.backsightInclination =\n shot.backsightInclination?.in(inclinationUnit)\n }\n }\n trip.shots.push(shot)\n }\n\n let began = false\n\n for await (line of lines) {\n errored = false\n\n lineNumber++\n\n if (!began) {\n if (/^\\s+\\*/.test(line)) {\n lineNumber++\n continue\n }\n began = true\n const match = /^\\s*([^,]+)(,(.*))?/.exec(line)\n if (match) {\n cave = match[1].trim()\n if (match[3]) {\n location = match[3].trim()\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 section = undefined\n tripTeam = undefined\n tripDate = 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 && line.trim()\n } else if (lineNumber === tripCommentStartLine + 2) {\n const match = /^(.+?,.+?)\\s*(?:[-.](.*))?$/.exec(line && line.trim())\n if (match) {\n let k = 1\n const team = match[k++]\n tripTeam = team.split(\n team.indexOf(';') >= 0 ? /\\s*;\\s*/g : /\\s*,\\s*/g\n )\n const dateMatch = /^(\\d+)[-/](\\d+)[-/](\\d+)$/.exec(match[k++]?.trim())\n if (dateMatch) {\n const month = parseInt(dateMatch[1])\n const day = parseInt(dateMatch[2])\n const year = parseInt(dateMatch[3])\n tripDate = new Date(year < 70 ? year + 2000 : year, month - 1, day)\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 if (/^\\*\\s*%/.test(line)) {\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 trip = {\n header: {\n name: tripName || '',\n comment: (tripComment && tripComment.join('\\n')) || null,\n section,\n date: tripDate,\n team: tripTeam,\n ...parseUnits(),\n },\n shots: [],\n }\n trips.push(trip)\n } else if (trip) {\n let { distanceUnit } = alternateUnits || trip.header\n const { azimuthUnit, inclinationUnit } = alternateUnits || trip.header\n\n const inches = distanceUnit === Length.inches\n if (inches) distanceUnit = Length.feet\n\n // rigorously check the values in all the columns to make sure this\n // is really a survey shot line, just in case any stray comments are\n // not properly delimited.\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 if (errored) continue\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: null,\n kind: FrcsShotKind.Normal,\n distance: new UnitizedNumber(0, distanceUnit),\n frontsightAzimuth: null,\n backsightAzimuth: null,\n frontsightInclination: null,\n backsightInclination: null,\n fromLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance: true,\n comment: getComment(),\n }\n addShot(shot)\n continue\n }\n if (!isValidStation(toStr)) {\n error('Invalid station name', ...ranges.toStation)\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,\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 if (errored) continue\n\n let kind: FrcsShotKind\n let distance: UnitizedNumber<Length>\n let horizontalDistance: UnitizedNumber<Length> | undefined\n let verticalDistance: UnitizedNumber<Length> | undefined\n let frontsightInclination: UnitizedNumber<Angle> | null\n let backsightInclination: UnitizedNumber<Angle> | null\n let excludeDistance: boolean\n let isSplay: boolean\n\n // parse distance\n if (inches) {\n const feetStr = line.substring(...ranges.distanceFeet)\n const inchesStr = line.substring(...ranges.distanceInches)\n // feet and inches are not both optional\n if (!isValidUInt(feetStr) && !isValidUInt(inchesStr)) {\n const invalid = feetStr.trim() || inchesStr.trim()\n error(\n invalid ? 'Invalid distance' : 'Missing distance',\n ranges.distanceFeet[0],\n ranges.distanceInches[1]\n )\n continue\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 distance = Unitize.inches(parseFloat(inchesStr) || 0).add(\n Unitize.feet(parseFloat(feetStr) || 0)\n )\n\n const offset =\n ranges.kind[0] === ranges.distance[1]\n ? ranges.distanceInches[1] - ranges.distance[1]\n : 0\n kind = parseKind(\n line\n .substring(ranges.kind[0] + offset, ranges.kind[1] + offset)\n .trim()\n )\n const exclude = line\n .substring(ranges.exclude[0] + offset, ranges.exclude[1] + offset)\n .trim()\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 excludeDistance = exclude === '*' || exclude === 's'\n isSplay = exclude === 's'\n } else {\n // decimal feet are not optional\n const feetStr = validate(...ranges.distance, 'distance', isValidUFloat)\n distance = new UnitizedNumber(parseFloat(feetStr), distanceUnit)\n kind = parseKind(line.substring(...ranges.kind).trim())\n const exclude = line.substring(...ranges.exclude).trim()\n excludeDistance = exclude === '*' || exclude === 's'\n isSplay = exclude === 's'\n }\n\n if (kind !== FrcsShotKind.Normal) {\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 (kind === FrcsShotKind.Horizontal) {\n // distance is horizontal offset and incFsStr is vertical offset\n horizontalDistance = distance\n const h = horizontalDistance.get(distanceUnit)\n const v = parseFloat(incFsStr)\n verticalDistance = new UnitizedNumber(v, distanceUnit)\n distance = new UnitizedNumber(Math.sqrt(h * h + v * v), distanceUnit)\n frontsightInclination = Angle.atan2(\n verticalDistance,\n horizontalDistance\n )\n backsightInclination = null\n } else if (kind === FrcsShotKind.Diagonal) {\n // distance is as usual, but incFsStr is vertical offset\n const d = distance.get(distanceUnit)\n const v = parseFloat(incFsStr)\n verticalDistance = new UnitizedNumber(v, distanceUnit)\n frontsightInclination = Angle.asin(v / d)\n backsightInclination = null\n } else {\n // frontsight inclination\n validate(\n ...ranges.frontsightInclination,\n 'inclination',\n isValidOptInclination\n )\n // backsight inclination\n validate(\n ...ranges.backsightInclination,\n 'inclination',\n isValidOptInclination\n )\n frontsightInclination = parseNumber(incFsStr, inclinationUnit)\n backsightInclination = parseNumber(incBsStr, inclinationUnit)\n }\n if (errored) continue\n\n const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit)\n const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit)\n\n if (!frontsightInclination && !backsightInclination) {\n frontsightInclination = Unitize.degrees(0)\n }\n\n const shot: FrcsShot = {\n from,\n to: toStr.trim(),\n kind,\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 }\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 }\n }\n\n return {\n cave,\n columns,\n location,\n trips,\n errors,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,3 +14,4 @@ import { FrcsTripSummaryFile } from './FrcsTripSummaryFile';
|
|
|
14
14
|
BS1-BS5 C1-C18 </pre>
|
|
15
15
|
*/
|
|
16
16
|
export default function parseFrcsTripSummaryFile(file: string, lines: AsyncIterable<string>): Promise<FrcsTripSummaryFile>;
|
|
17
|
+
//# sourceMappingURL=parseFrcsTripSummaryFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseFrcsTripSummaryFile.d.ts","sourceRoot":"","sources":["src/parseFrcsTripSummaryFile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAM3D;;;;;;;;;;;;;GAaG;AACH,wBAA8B,wBAAwB,CACpD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAmD9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseFrcsTripSummaryFile.js","names":["_unitized","require","_asyncIterator","r","n","t","o","e","Symbol","asyncIterator","iterator","call","AsyncFromSyncIterator","TypeError","AsyncFromSyncIteratorContinuation","Object","Promise","reject","done","resolve","value","then","s","next","prototype","apply","arguments","_return","_throw","tripSummaryRegex","parseFrcsTripSummaryFile","_x","_x2","_parseFrcsTripSummaryFile","_asyncToGenerator2","_regenerator","mark","_callee","file","lines","errors","tripSummaries","tripStartLine","lineNumber","team","shots","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_step","line","match","tripNumber","tripIndex","year","date","totalLength","numShots","name","excludedLength","numExcludedShots","_team","_shots","trimmed","wrap","_callee$","_context","prev","sent","exec","parseInt","Date","Unitize","feet","parseFloat","trim","abrupt","push","_toConsumableArray2","split","t0","finish","stop","module","exports","default"],"sources":["src/parseFrcsTripSummaryFile.ts"],"sourcesContent":["import { FrcsTripSummary } from './FrcsTripSummary'\nimport { FrcsTripSummaryFile } from './FrcsTripSummaryFile'\nimport { SegmentParseError } from 'parse-segment'\nimport { Unitize } from '@speleotica/unitized'\n\nconst tripSummaryRegex =\n /^\\s*(\\d+)\\s+(\\d{1,2})\\/(\\s\\d|\\d\\d)\\/(\\d{2,4})\\s+(\\d+(?:\\.\\d*)?)\\s+(\\d+)\\s+(\\S.*)EXCLUDED:\\s*(\\d+(?:\\.\\d{2})?)\\s*(\\d+)/\n/**\n * Parses data from a STAT_sum.txt file. Here is an excerpt of the format:\n<pre> 1 2/15/81 258.60 17 ENTRANCE DROPS, JOE'S \"I LOVE MY WIFE TRAVERSE\", TRICKY TRAVERSE EXCLUDED: 0.00 0\n Peter Quick Keith Ortiz\n A1 AD1-AD3 AE1 AE1 SIDE\n AE9 SIDE AE10-AE9 AE13 SIDE AE15 SIDE\n AE20-AE11\n\n 3 3/ 6/81 2371.20 61 DOUG'S DEMISE (50 FT DROP), CHRIS CROSS, CRAWL ABOVE DROP EXCLUDED: 0.00 0\n Peter Quick Chris Gerace Phil Oden Chip Hopper\n A13 SIDE B1-B5 B2 SIDE B3 SIDE\n B6-B18 B17 SIDE B19-B38 B32 SIDE\n BS1-BS5 C1-C18 </pre>\n */\nexport default async function parseFrcsTripSummaryFile(\n file: string,\n lines: AsyncIterable<string>\n): Promise<FrcsTripSummaryFile> {\n const errors: Array<SegmentParseError> = []\n const tripSummaries: Array<FrcsTripSummary | undefined> = []\n\n let tripStartLine = -2\n let lineNumber = 0\n\n let team: Array<string> = []\n let shots: Array<string> = []\n\n for await (const line of lines) {\n lineNumber++\n\n const match = tripSummaryRegex.exec(line)\n if (match) {\n tripStartLine = lineNumber\n const tripNumber = parseInt(match[1])\n const tripIndex = tripNumber - 1\n let year = parseInt(match[4])\n if (year < 1000) year += 1900\n const date = new Date(year, parseInt(match[2]) - 1, parseInt(match[3]))\n const totalLength = Unitize.feet(parseFloat(match[5]))\n const numShots = parseInt(match[6])\n const name = match[7].trim()\n const excludedLength = Unitize.feet(parseFloat(match[8]))\n const numExcludedShots = parseInt(match[9])\n team = []\n shots = []\n tripSummaries[tripIndex] = {\n tripNumber,\n tripIndex,\n date,\n totalLength,\n numShots,\n name,\n excludedLength,\n numExcludedShots,\n team,\n shots,\n }\n continue\n }\n if (lineNumber === tripStartLine + 1) {\n team.push(...line.trim().split(/\\s\\s+|\\t+/g))\n } else {\n const trimmed = line.trim()\n if (trimmed) shots.push(...trimmed.split(/\\s\\s+|\\t+/))\n }\n }\n\n return { errors, tripSummaries }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { UnitizedNumber, Length } from '@speleotica/unitized'
|
|
2
|
+
import { FrcsPlotShot } from './FrcsPlotShot'
|
|
3
|
+
import { SegmentParseError } from 'parse-segment'
|
|
4
|
+
|
|
5
|
+
export type FrcsPlotFile = {
|
|
6
|
+
totalLength: UnitizedNumber<Length>
|
|
7
|
+
shots: Array<FrcsPlotShot>
|
|
8
|
+
errors?: Array<SegmentParseError> | null
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { UnitizedNumber, Length } from '@speleotica/unitized'
|
|
2
|
+
|
|
3
|
+
export type FrcsPlotShot = {
|
|
4
|
+
toName: string
|
|
5
|
+
isSurface?: boolean | null
|
|
6
|
+
fromNumber: number
|
|
7
|
+
toNumber: number
|
|
8
|
+
easting: UnitizedNumber<Length>
|
|
9
|
+
northing: UnitizedNumber<Length>
|
|
10
|
+
elevation: UnitizedNumber<Length>
|
|
11
|
+
leftEasting: UnitizedNumber<Length>
|
|
12
|
+
leftNorthing: UnitizedNumber<Length>
|
|
13
|
+
rightEasting: UnitizedNumber<Length>
|
|
14
|
+
rightNorthing: UnitizedNumber<Length>
|
|
15
|
+
up: UnitizedNumber<Length>
|
|
16
|
+
down: UnitizedNumber<Length>
|
|
17
|
+
tripNumber?: number | null
|
|
18
|
+
}
|
package/src/FrcsShot.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { UnitizedNumber, Length, Angle } from '@speleotica/unitized'
|
|
2
|
+
import { FrcsUnits } from './FrcsTrip'
|
|
3
|
+
|
|
4
|
+
export enum FrcsShotKind {
|
|
5
|
+
Normal = ' ',
|
|
6
|
+
Horizontal = 'H',
|
|
7
|
+
Diagonal = 'D',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type FrcsShot = {
|
|
11
|
+
/**
|
|
12
|
+
* Name of from station
|
|
13
|
+
*/
|
|
14
|
+
from: string
|
|
15
|
+
/**
|
|
16
|
+
* Name of to station
|
|
17
|
+
*/
|
|
18
|
+
to?: string | null
|
|
19
|
+
kind: FrcsShotKind
|
|
20
|
+
distance: UnitizedNumber<Length>
|
|
21
|
+
horizontalDistance?: UnitizedNumber<Length> | null
|
|
22
|
+
verticalDistance?: UnitizedNumber<Length> | null
|
|
23
|
+
frontsightAzimuth?: UnitizedNumber<Angle> | null
|
|
24
|
+
frontsightInclination?: UnitizedNumber<Angle> | null
|
|
25
|
+
backsightAzimuth?: UnitizedNumber<Angle> | null
|
|
26
|
+
backsightInclination?: UnitizedNumber<Angle> | null
|
|
27
|
+
/**
|
|
28
|
+
* LRUDs at from station
|
|
29
|
+
*/
|
|
30
|
+
fromLruds?: {
|
|
31
|
+
left?: UnitizedNumber<Length> | null
|
|
32
|
+
right?: UnitizedNumber<Length> | null
|
|
33
|
+
up?: UnitizedNumber<Length> | null
|
|
34
|
+
down?: UnitizedNumber<Length> | null
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* LRUDs at to station
|
|
38
|
+
*/
|
|
39
|
+
toLruds?: {
|
|
40
|
+
left?: UnitizedNumber<Length> | null
|
|
41
|
+
right?: UnitizedNumber<Length> | null
|
|
42
|
+
up?: UnitizedNumber<Length> | null
|
|
43
|
+
down?: UnitizedNumber<Length> | null
|
|
44
|
+
}
|
|
45
|
+
excludeDistance?: boolean | null
|
|
46
|
+
isSplay?: boolean | null
|
|
47
|
+
comment?: string | null
|
|
48
|
+
/**
|
|
49
|
+
* In the edge case that the surveyors changed measurement units or
|
|
50
|
+
* corrected/uncorrected backsights in the middle of a trip, the measurements
|
|
51
|
+
* will be normalized to the initial trip settings, and this field will contain
|
|
52
|
+
* the actual values recorded, verbatim. The first shot of the group with
|
|
53
|
+
* changed units will include the changed units.
|
|
54
|
+
*/
|
|
55
|
+
recorded?: FrcsShot & { units?: FrcsUnits }
|
|
56
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { FrcsTrip } from './FrcsTrip'
|
|
2
|
+
import { SegmentParseError } from 'parse-segment'
|
|
3
|
+
|
|
4
|
+
export type FrcsSurveyFile = {
|
|
5
|
+
cave?: string | null
|
|
6
|
+
columns?: FrcsShotColumnConfig
|
|
7
|
+
location?: string | null
|
|
8
|
+
comment?: string | null
|
|
9
|
+
trips: Array<FrcsTrip>
|
|
10
|
+
errors?: Array<SegmentParseError> | null
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type FrcsShotColumnConfig = {
|
|
14
|
+
toStation: number
|
|
15
|
+
fromStation: number
|
|
16
|
+
distance: number
|
|
17
|
+
distanceFeet: number
|
|
18
|
+
distanceInches: number
|
|
19
|
+
kind: number
|
|
20
|
+
exclude: number
|
|
21
|
+
frontsightAzimuth: number
|
|
22
|
+
backsightAzimuth: number
|
|
23
|
+
frontsightInclination: number
|
|
24
|
+
backsightInclination: number
|
|
25
|
+
left: number
|
|
26
|
+
right: number
|
|
27
|
+
up: number
|
|
28
|
+
down: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const defaultFrcsShotColumnConfig: FrcsShotColumnConfig = {
|
|
32
|
+
toStation: 5,
|
|
33
|
+
fromStation: 5,
|
|
34
|
+
distance: 6,
|
|
35
|
+
distanceFeet: 4,
|
|
36
|
+
distanceInches: 3,
|
|
37
|
+
kind: 1,
|
|
38
|
+
exclude: 1,
|
|
39
|
+
frontsightAzimuth: 6,
|
|
40
|
+
backsightAzimuth: 6,
|
|
41
|
+
frontsightInclination: 5,
|
|
42
|
+
backsightInclination: 5,
|
|
43
|
+
left: 3,
|
|
44
|
+
right: 3,
|
|
45
|
+
up: 3,
|
|
46
|
+
down: 3,
|
|
47
|
+
}
|
package/src/FrcsTrip.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Unit, Length, Angle } from '@speleotica/unitized'
|
|
2
|
+
import { FrcsShot } from './FrcsShot'
|
|
3
|
+
|
|
4
|
+
export type FrcsUnits = {
|
|
5
|
+
distanceUnit: Unit<Length>
|
|
6
|
+
azimuthUnit: Unit<Angle>
|
|
7
|
+
inclinationUnit: Unit<Angle>
|
|
8
|
+
backsightAzimuthCorrected?: boolean | null
|
|
9
|
+
backsightInclinationCorrected?: boolean | null
|
|
10
|
+
hasBacksightAzimuth?: boolean | null
|
|
11
|
+
hasBacksightInclination?: boolean | null
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type FrcsTripHeader = FrcsUnits & {
|
|
15
|
+
name: string
|
|
16
|
+
comment?: string | null
|
|
17
|
+
section?: string | null
|
|
18
|
+
date?: Date | null
|
|
19
|
+
team?: Array<string> | null
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type FrcsTrip = {
|
|
23
|
+
header: FrcsTripHeader
|
|
24
|
+
shots: Array<FrcsShot>
|
|
25
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { UnitizedNumber, Length } from '@speleotica/unitized'
|
|
2
|
+
|
|
3
|
+
export type FrcsTripSummary = {
|
|
4
|
+
tripNumber: number
|
|
5
|
+
tripIndex: number
|
|
6
|
+
date: Date
|
|
7
|
+
totalLength: UnitizedNumber<Length>
|
|
8
|
+
numShots: number
|
|
9
|
+
name: string
|
|
10
|
+
excludedLength: UnitizedNumber<Length>
|
|
11
|
+
numExcludedShots: number
|
|
12
|
+
team: Array<string>
|
|
13
|
+
shots: Array<string>
|
|
14
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { FrcsUnits } from './FrcsTrip'
|
|
2
|
+
import { FrcsShot, FrcsShotKind } from './FrcsShot'
|
|
3
|
+
import { Length, Unit, UnitType, UnitizedNumber } from '@speleotica/unitized'
|
|
4
|
+
import {
|
|
5
|
+
FrcsShotColumnConfig,
|
|
6
|
+
defaultFrcsShotColumnConfig,
|
|
7
|
+
} from './FrcsSurveyFile'
|
|
8
|
+
|
|
9
|
+
export function makeFormatFrcsShot({
|
|
10
|
+
columns = defaultFrcsShotColumnConfig,
|
|
11
|
+
}: { columns?: FrcsShotColumnConfig } = {}) {
|
|
12
|
+
const EMPTY_TO_STATION = ' '.repeat(columns.toStation)
|
|
13
|
+
|
|
14
|
+
function formatFromStation(station: string): string {
|
|
15
|
+
if (station.length > columns.fromStation) {
|
|
16
|
+
throw new Error(`station is too long: ${station}`)
|
|
17
|
+
}
|
|
18
|
+
return station.padStart(columns.fromStation, ' ')
|
|
19
|
+
}
|
|
20
|
+
function formatToStation(station: string): string {
|
|
21
|
+
if (station.length > columns.toStation) {
|
|
22
|
+
throw new Error(`station is too long: ${station}`)
|
|
23
|
+
}
|
|
24
|
+
return station.padStart(columns.toStation, ' ')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function trimZeroes(str: string): string {
|
|
28
|
+
const match = /(-?\d+)(\.[1-9]*)0+$/.exec(str)
|
|
29
|
+
if (!match) return str
|
|
30
|
+
return match[2].length > 1 ? match[1] + match[2] : match[1]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const formatNumber = (width: number) => {
|
|
34
|
+
function formatNum(num: number | null | undefined): string
|
|
35
|
+
function formatNum<T extends UnitType<T>>(
|
|
36
|
+
num: UnitizedNumber<T> | null | undefined,
|
|
37
|
+
unit: Unit<T>,
|
|
38
|
+
verbatim?: boolean
|
|
39
|
+
): string
|
|
40
|
+
function formatNum<T extends UnitType<T>>(
|
|
41
|
+
num: number | UnitizedNumber<T> | null | undefined,
|
|
42
|
+
unit?: Unit<T>,
|
|
43
|
+
verbatim?: boolean
|
|
44
|
+
): string {
|
|
45
|
+
if (num instanceof UnitizedNumber) {
|
|
46
|
+
return formatNum(num.get(verbatim ? num.unit : unit || num.unit))
|
|
47
|
+
}
|
|
48
|
+
if (num == null || !Number.isFinite(num)) return ' '.repeat(width)
|
|
49
|
+
const precision = Math.max(0, width - String(Math.trunc(num)).length - 1)
|
|
50
|
+
const formatted = trimZeroes(num.toFixed(precision))
|
|
51
|
+
return formatted.length <= width
|
|
52
|
+
? formatted.padStart(width, ' ')
|
|
53
|
+
: formatted.substring(0, width)
|
|
54
|
+
}
|
|
55
|
+
return formatNum
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const formatLeft = formatNumber(columns.left)
|
|
59
|
+
const formatRight = formatNumber(columns.right)
|
|
60
|
+
const formatUp = formatNumber(columns.up)
|
|
61
|
+
const formatDown = formatNumber(columns.down)
|
|
62
|
+
|
|
63
|
+
const EMPTY_DISTANCE = ' '.repeat(columns.distance)
|
|
64
|
+
const formatDistance = formatNumber(columns.distance)
|
|
65
|
+
|
|
66
|
+
const EMPTY_FS_AZIMUTH = ' '.repeat(columns.frontsightAzimuth)
|
|
67
|
+
const formatFsAzimuth = formatNumber(columns.frontsightAzimuth)
|
|
68
|
+
const EMPTY_BS_AZIMUTH = ' '.repeat(columns.backsightAzimuth)
|
|
69
|
+
const formatBsAzimuth = formatNumber(columns.backsightAzimuth)
|
|
70
|
+
|
|
71
|
+
const EMPTY_FS_INCLINATION = ' '.repeat(columns.frontsightInclination)
|
|
72
|
+
const formatFsInclination = formatNumber(columns.frontsightInclination)
|
|
73
|
+
const EMPTY_BS_INCLINATION = ' '.repeat(columns.backsightInclination)
|
|
74
|
+
const formatBsInclination = formatNumber(columns.backsightInclination)
|
|
75
|
+
|
|
76
|
+
const formatVerticalDistance = formatNumber(columns.frontsightInclination)
|
|
77
|
+
|
|
78
|
+
const EMPTY_FEET = ' '.repeat(columns.distanceFeet)
|
|
79
|
+
|
|
80
|
+
function formatFeet(distance: UnitizedNumber<Length> | null | void): string {
|
|
81
|
+
if (!distance) return EMPTY_FEET
|
|
82
|
+
return formatNumber(columns.distanceFeet)(
|
|
83
|
+
Math.trunc(distance.get(Length.feet))
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const EMPTY_INCHES = ' '.repeat(columns.distanceInches)
|
|
88
|
+
|
|
89
|
+
function formatInches(
|
|
90
|
+
distance: UnitizedNumber<Length> | null | void
|
|
91
|
+
): string {
|
|
92
|
+
if (!distance) return EMPTY_INCHES
|
|
93
|
+
return formatNumber(columns.distanceInches)(
|
|
94
|
+
Math.round(distance.get(Length.inches) % 12)
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return function formatFrcsShot(shot: FrcsShot, header: FrcsUnits): string {
|
|
99
|
+
const { azimuthUnit, inclinationUnit } = header
|
|
100
|
+
let { distanceUnit } = header
|
|
101
|
+
|
|
102
|
+
const inches = distanceUnit === Length.inches
|
|
103
|
+
if (inches) distanceUnit = Length.feet
|
|
104
|
+
|
|
105
|
+
const isRecorded = shot.recorded !== null
|
|
106
|
+
|
|
107
|
+
if (!shot.to) {
|
|
108
|
+
const { left, right, up, down } =
|
|
109
|
+
shot.recorded?.fromLruds || shot.fromLruds || {}
|
|
110
|
+
return [
|
|
111
|
+
EMPTY_TO_STATION,
|
|
112
|
+
formatFromStation(shot.from),
|
|
113
|
+
EMPTY_DISTANCE,
|
|
114
|
+
' ', // kind
|
|
115
|
+
' ', // exclude
|
|
116
|
+
EMPTY_FS_AZIMUTH,
|
|
117
|
+
EMPTY_BS_AZIMUTH,
|
|
118
|
+
EMPTY_FS_INCLINATION,
|
|
119
|
+
EMPTY_BS_INCLINATION,
|
|
120
|
+
formatLeft(left, distanceUnit, isRecorded),
|
|
121
|
+
formatRight(right, distanceUnit, isRecorded),
|
|
122
|
+
formatUp(up, distanceUnit, isRecorded),
|
|
123
|
+
formatDown(down, distanceUnit, isRecorded),
|
|
124
|
+
].join('')
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const distColumnValue =
|
|
128
|
+
shot.kind === FrcsShotKind.Horizontal
|
|
129
|
+
? shot.horizontalDistance
|
|
130
|
+
: shot.distance
|
|
131
|
+
|
|
132
|
+
return [
|
|
133
|
+
formatToStation(shot.to),
|
|
134
|
+
formatFromStation(shot.from),
|
|
135
|
+
inches
|
|
136
|
+
? formatFeet(distColumnValue)
|
|
137
|
+
: formatDistance(distColumnValue, distanceUnit, isRecorded),
|
|
138
|
+
inches ? formatInches(distColumnValue) : shot.kind,
|
|
139
|
+
inches ? shot.kind : shot.excludeDistance ? '*' : ' ',
|
|
140
|
+
formatFsAzimuth(shot.frontsightAzimuth, azimuthUnit, isRecorded),
|
|
141
|
+
formatBsAzimuth(shot.backsightAzimuth, azimuthUnit, isRecorded),
|
|
142
|
+
shot.kind === FrcsShotKind.Normal
|
|
143
|
+
? formatFsInclination(
|
|
144
|
+
shot.frontsightInclination,
|
|
145
|
+
inclinationUnit,
|
|
146
|
+
isRecorded
|
|
147
|
+
)
|
|
148
|
+
: formatVerticalDistance(
|
|
149
|
+
shot.verticalDistance,
|
|
150
|
+
distanceUnit,
|
|
151
|
+
isRecorded
|
|
152
|
+
),
|
|
153
|
+
shot.kind === FrcsShotKind.Normal
|
|
154
|
+
? formatBsInclination(
|
|
155
|
+
shot.backsightInclination,
|
|
156
|
+
inclinationUnit,
|
|
157
|
+
isRecorded
|
|
158
|
+
)
|
|
159
|
+
: EMPTY_BS_INCLINATION,
|
|
160
|
+
formatLeft(shot.toLruds?.left, distanceUnit, isRecorded),
|
|
161
|
+
formatRight(shot.toLruds?.right, distanceUnit, isRecorded),
|
|
162
|
+
formatUp(shot.toLruds?.up, distanceUnit, isRecorded),
|
|
163
|
+
formatDown(shot.toLruds?.down, distanceUnit, isRecorded),
|
|
164
|
+
].join('')
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export default makeFormatFrcsShot()
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Angle, Length, Unit } from '@speleotica/unitized'
|
|
2
|
+
import { FrcsSurveyFile } from './FrcsSurveyFile'
|
|
3
|
+
import { FrcsUnits } from './FrcsTrip'
|
|
4
|
+
import { makeFormatFrcsShot } from './formatFrcsShot'
|
|
5
|
+
|
|
6
|
+
export async function* formatFrcsSurveyFile(
|
|
7
|
+
file: FrcsSurveyFile
|
|
8
|
+
): AsyncIterable<string> {
|
|
9
|
+
const formatFrcsShot = makeFormatFrcsShot(file)
|
|
10
|
+
if (file.cave) {
|
|
11
|
+
yield ` ${file.cave}${file.location ? `, ${file.location}` : ''}\n`
|
|
12
|
+
}
|
|
13
|
+
for (let tripIndex = 0; tripIndex < file.trips.length; tripIndex++) {
|
|
14
|
+
const trip = file.trips[tripIndex]
|
|
15
|
+
const { shots, header } = trip
|
|
16
|
+
const { name, team, date, comment } = header
|
|
17
|
+
if (tripIndex > 0) yield ' *\n'
|
|
18
|
+
yield name.replace(/\n?$/, '\n')
|
|
19
|
+
const line2 = [
|
|
20
|
+
...(team?.length ? [team.join(', ')] : []),
|
|
21
|
+
...(date ? [formatDate(date)] : []),
|
|
22
|
+
].join('. ')
|
|
23
|
+
if (line2) yield `${line2}\n`
|
|
24
|
+
if (comment) yield comment.replace(/\n?$/, '\n')
|
|
25
|
+
yield ' *\n'
|
|
26
|
+
yield formatUnits(header)
|
|
27
|
+
|
|
28
|
+
let alternateUnits: FrcsUnits | undefined
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < shots.length; i++) {
|
|
31
|
+
const shot = shots[i]
|
|
32
|
+
if (shot.comment) {
|
|
33
|
+
const lines = shot.comment.split(/\n/gm)
|
|
34
|
+
yield '*\n'
|
|
35
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
36
|
+
yield lines[i].replace(/\n?$/, '\n')
|
|
37
|
+
}
|
|
38
|
+
yield `* ${lines[lines.length - 1].replace(/\n?$/, '\n')}`
|
|
39
|
+
}
|
|
40
|
+
if (shot.recorded?.units) {
|
|
41
|
+
alternateUnits = shot.recorded.units
|
|
42
|
+
yield `* %NC\n`
|
|
43
|
+
yield formatUnits(shot.recorded.units)
|
|
44
|
+
}
|
|
45
|
+
yield formatFrcsShot(
|
|
46
|
+
shot.recorded || shot,
|
|
47
|
+
alternateUnits || header
|
|
48
|
+
).replace(/\n?$/, '\n')
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function formatUnits(units: FrcsUnits): string {
|
|
54
|
+
const distUnit = formatLengthUnit(units.distanceUnit)
|
|
55
|
+
const azmMode = units.hasBacksightAzimuth
|
|
56
|
+
? units.backsightAzimuthCorrected
|
|
57
|
+
? 'C'
|
|
58
|
+
: 'B'
|
|
59
|
+
: ' '
|
|
60
|
+
const incMode = units.hasBacksightInclination
|
|
61
|
+
? units.backsightInclinationCorrected
|
|
62
|
+
? 'C'
|
|
63
|
+
: 'B'
|
|
64
|
+
: ' '
|
|
65
|
+
const azmUnit = formatAngleUnit(units.azimuthUnit)
|
|
66
|
+
const incUnit = formatAngleUnit(units.inclinationUnit)
|
|
67
|
+
|
|
68
|
+
return `${distUnit} ${azmMode}${incMode} ${azmUnit}${incUnit}\n`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function formatDate(date: Date): string {
|
|
72
|
+
return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear() % 100}`
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function formatLengthUnit(unit: Unit<Length>): string {
|
|
76
|
+
switch (unit) {
|
|
77
|
+
case Length.meters:
|
|
78
|
+
return 'M '
|
|
79
|
+
case Length.feet:
|
|
80
|
+
return 'FT'
|
|
81
|
+
case Length.inches:
|
|
82
|
+
return 'FI'
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(`invalid length unit: ${unit}`)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function formatAngleUnit(unit: Unit<Angle>): string {
|
|
89
|
+
switch (unit) {
|
|
90
|
+
case Angle.degrees:
|
|
91
|
+
return 'D'
|
|
92
|
+
case Angle.gradians:
|
|
93
|
+
return 'G'
|
|
94
|
+
default:
|
|
95
|
+
throw new Error(`invalid angle unit: ${unit}`)
|
|
96
|
+
}
|
|
97
|
+
}
|