trackswap 0.0.1 → 0.0.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/dist/FIT/base.d.ts +91 -0
- package/dist/FIT/base.js +101 -0
- package/dist/FIT/crc.d.ts +1 -0
- package/dist/FIT/crc.js +16 -0
- package/dist/FIT/decoder.d.ts +83 -0
- package/dist/FIT/decoder.js +323 -0
- package/dist/FIT/encoder.d.ts +142 -0
- package/dist/FIT/encoder.js +445 -0
- package/dist/FIT/index.d.ts +12 -0
- package/dist/FIT/index.js +13 -0
- package/dist/FIT/mesg.d.ts +40 -0
- package/dist/FIT/mesg.js +208 -0
- package/dist/FIT/middleware.d.ts +48 -0
- package/dist/FIT/middleware.js +206 -0
- package/dist/FIT/plugins.d.ts +26 -0
- package/dist/FIT/plugins.js +104 -0
- package/dist/FIT/processor.d.ts +58 -0
- package/dist/FIT/processor.js +170 -0
- package/dist/FIT/types/course_point.d.ts +56 -0
- package/dist/FIT/types/course_point.js +58 -0
- package/dist/FIT/types/event.d.ts +49 -0
- package/dist/FIT/types/event.js +50 -0
- package/dist/FIT/types/event_type.d.ts +18 -0
- package/dist/FIT/types/event_type.js +19 -0
- package/dist/FIT/types/file.d.ts +23 -0
- package/dist/FIT/types/file.js +24 -0
- package/dist/FIT/types/index.d.ts +119 -0
- package/dist/FIT/types/index.js +297 -0
- package/dist/FIT/types/mesg_num.d.ts +105 -0
- package/dist/FIT/types/mesg_num.js +106 -0
- package/dist/FIT/types/sport.d.ts +47 -0
- package/dist/FIT/types/sport.js +48 -0
- package/dist/FIT/types.d.ts +231 -0
- package/dist/FIT/types.js +1 -0
- package/dist/FIT/util.d.ts +1 -0
- package/dist/FIT/util.js +7 -0
- package/dist/GPX/base.d.ts +43 -67
- package/dist/GPX/base.js +40 -67
- package/dist/GPX/converters.d.ts +12 -36
- package/dist/GPX/converters.js +11 -103
- package/dist/GPX/decoder.d.ts +5 -5
- package/dist/GPX/decoder.js +6 -0
- package/dist/GPX/encoder.d.ts +4 -0
- package/dist/GPX/encoder.js +3 -0
- package/dist/GPX/index.d.ts +1 -1
- package/dist/GPX/index.js +1 -1
- package/dist/GPX/middleware.d.ts +27 -0
- package/dist/GPX/middleware.js +93 -0
- package/dist/GPX/processor.d.ts +1 -1
- package/dist/GPX/processor.js +12 -11
- package/dist/GPX/types.d.ts +2 -3
- package/dist/TCX/base.d.ts +52 -0
- package/dist/TCX/base.js +62 -0
- package/dist/TCX/converters.d.ts +75 -0
- package/dist/TCX/converters.js +333 -0
- package/dist/TCX/decoder.d.ts +87 -0
- package/dist/TCX/decoder.js +350 -0
- package/dist/TCX/encoder.d.ts +150 -0
- package/dist/TCX/encoder.js +513 -0
- package/dist/TCX/index.d.ts +10 -0
- package/dist/TCX/index.js +9 -0
- package/dist/TCX/middleware.d.ts +27 -0
- package/dist/TCX/middleware.js +93 -0
- package/dist/TCX/processor.d.ts +48 -0
- package/dist/TCX/processor.js +197 -0
- package/dist/TCX/types.d.ts +203 -0
- package/dist/TCX/types.js +1 -0
- package/dist/core/base.d.ts +119 -0
- package/dist/core/base.js +138 -0
- package/dist/core/decoder.d.ts +66 -0
- package/dist/core/decoder.js +90 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +4 -0
- package/dist/core/processor.d.ts +69 -0
- package/dist/core/processor.js +265 -0
- package/dist/core/xml-utils.d.ts +41 -0
- package/dist/core/xml-utils.js +140 -0
- package/package.json +8 -5
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { IProcessingContext } from "../core/base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Session 对应 AbstractTrackType Lap 对应 RouteSegType Records 对应 RouteType 每个Record 对应 PointType
|
|
4
|
+
*/
|
|
5
|
+
export interface FITFileType {
|
|
6
|
+
fileIdMesgs?: FileIdMesgType[];
|
|
7
|
+
fileCreatorMesgs?: FileCreatorMesgType[];
|
|
8
|
+
eventMesgs?: EventMesgType[];
|
|
9
|
+
deviceInfoMesgs?: DeviceInfoMesgType[];
|
|
10
|
+
deviceSettingsMesgs?: DeviceSettingsMesgType[];
|
|
11
|
+
userProfileMesgs?: UserProfileMesgType[];
|
|
12
|
+
sessionMesgs?: SessionMesgType[];
|
|
13
|
+
courseMesgs?: any[];
|
|
14
|
+
}
|
|
15
|
+
export type FITDecoderMesgs = {
|
|
16
|
+
fileIdMesgs?: FileIdMesgType[];
|
|
17
|
+
fileCreatorMesgs?: FileCreatorMesgType[];
|
|
18
|
+
eventMesgs?: EventMesgType[];
|
|
19
|
+
deviceInfoMesgs?: DeviceInfoMesgType[];
|
|
20
|
+
deviceSettingsMesgs?: DeviceSettingsMesgType[];
|
|
21
|
+
userProfileMesgs?: UserProfileMesgType[];
|
|
22
|
+
sessionMesgs?: Omit<SessionMesgType, "lapMesgs">[];
|
|
23
|
+
lapMesgs?: Omit<SessionMesgType, "recordMesgs">[];
|
|
24
|
+
recordMesgs?: RecordMesgType[];
|
|
25
|
+
courseMesgs?: any[];
|
|
26
|
+
[key: string]: any[] | undefined;
|
|
27
|
+
};
|
|
28
|
+
export interface FileIdMesgType {
|
|
29
|
+
serialNumber?: number;
|
|
30
|
+
timeCreated?: string;
|
|
31
|
+
manufacturer?: string;
|
|
32
|
+
product?: number;
|
|
33
|
+
type?: string;
|
|
34
|
+
garminProduct?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface FileCreatorMesgType {
|
|
37
|
+
softwareVersion?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface EventMesgType {
|
|
40
|
+
timestamp?: string;
|
|
41
|
+
data?: number;
|
|
42
|
+
event?: string;
|
|
43
|
+
eventType?: string;
|
|
44
|
+
eventGroup?: number;
|
|
45
|
+
timerTrigger?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface DeviceInfoMesgType {
|
|
48
|
+
timestamp?: string;
|
|
49
|
+
serialNumber?: number;
|
|
50
|
+
manufacturer?: string;
|
|
51
|
+
product?: number;
|
|
52
|
+
softwareVersion?: number;
|
|
53
|
+
deviceIndex?: string;
|
|
54
|
+
deviceType?: number;
|
|
55
|
+
garminProduct?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface DeviceSettingsMesgType {
|
|
58
|
+
utcOffset?: number;
|
|
59
|
+
timeOffset?: number;
|
|
60
|
+
activeTimeZone?: number;
|
|
61
|
+
timeMode?: string;
|
|
62
|
+
timeZoneOffset?: number;
|
|
63
|
+
backlightMode?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* FIT userProfileMesg
|
|
67
|
+
*/
|
|
68
|
+
export interface UserProfileMesgType {
|
|
69
|
+
friendlyName?: string;
|
|
70
|
+
weight?: number;
|
|
71
|
+
gender?: string;
|
|
72
|
+
age?: number;
|
|
73
|
+
height?: number;
|
|
74
|
+
language?: string;
|
|
75
|
+
elevSetting?: string;
|
|
76
|
+
weightSetting?: string;
|
|
77
|
+
defaultMaxBikingHeartRate?: number;
|
|
78
|
+
defaultMaxHeartRate?: number;
|
|
79
|
+
hrSetting?: string;
|
|
80
|
+
speedSetting?: string;
|
|
81
|
+
distSetting?: string;
|
|
82
|
+
powerSetting?: string;
|
|
83
|
+
activityClass?: number;
|
|
84
|
+
positionSetting?: string;
|
|
85
|
+
temperatureSetting?: string;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* FIT SessionMesg
|
|
89
|
+
*/
|
|
90
|
+
export interface SessionMesgType {
|
|
91
|
+
/**
|
|
92
|
+
* 时间
|
|
93
|
+
*/
|
|
94
|
+
timestamp?: string;
|
|
95
|
+
/**
|
|
96
|
+
* 开始时间
|
|
97
|
+
*/
|
|
98
|
+
startTime?: string;
|
|
99
|
+
startPositionLat?: number;
|
|
100
|
+
startPositionLong?: number;
|
|
101
|
+
totalElapsedTime?: number;
|
|
102
|
+
totalTimerTime?: number;
|
|
103
|
+
totalDistance?: number;
|
|
104
|
+
totalCycles?: number;
|
|
105
|
+
necLat?: number;
|
|
106
|
+
necLong?: number;
|
|
107
|
+
swcLat?: number;
|
|
108
|
+
swcLong?: number;
|
|
109
|
+
totalWork?: number;
|
|
110
|
+
messageIndex?: number;
|
|
111
|
+
totalCalories?: number;
|
|
112
|
+
totalFatCalories?: number;
|
|
113
|
+
avgSpeed?: number;
|
|
114
|
+
maxSpeed?: number;
|
|
115
|
+
avgPower?: number;
|
|
116
|
+
maxPower?: number;
|
|
117
|
+
/**
|
|
118
|
+
* 总爬升
|
|
119
|
+
*/
|
|
120
|
+
totalAscent?: number;
|
|
121
|
+
/**
|
|
122
|
+
* 总下降
|
|
123
|
+
*/
|
|
124
|
+
totalDescent?: number;
|
|
125
|
+
firstLapIndex?: number;
|
|
126
|
+
numLaps?: number;
|
|
127
|
+
normalizedPower?: number;
|
|
128
|
+
trainingStressScore?: number;
|
|
129
|
+
intensityFactor?: number;
|
|
130
|
+
thresholdPower?: number;
|
|
131
|
+
event?: string;
|
|
132
|
+
eventType?: string;
|
|
133
|
+
sport?: string;
|
|
134
|
+
subSport?: string;
|
|
135
|
+
avgCadence?: number;
|
|
136
|
+
maxCadence?: number;
|
|
137
|
+
trigger?: number;
|
|
138
|
+
totalStrokes?: number;
|
|
139
|
+
enhancedAvgSpeed?: number;
|
|
140
|
+
enhancedMaxSpeed?: number;
|
|
141
|
+
lapMesgs?: LapMesgType[];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* FIT RecordMesg
|
|
145
|
+
*/
|
|
146
|
+
export interface RecordMesgType {
|
|
147
|
+
timestamp?: string;
|
|
148
|
+
positionLat?: number;
|
|
149
|
+
positionLong?: number;
|
|
150
|
+
altitude?: number;
|
|
151
|
+
distance?: number;
|
|
152
|
+
accumulatedPower?: number;
|
|
153
|
+
speed?: number;
|
|
154
|
+
power?: number;
|
|
155
|
+
cadence?: number;
|
|
156
|
+
heartRate?: number;
|
|
157
|
+
temperature?: number;
|
|
158
|
+
enhancedAltitude?: number;
|
|
159
|
+
enhancedSpeed?: number;
|
|
160
|
+
[key: string]: number | string | undefined | any;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* FIT 文件额外记录的数据 LapMesg
|
|
164
|
+
*/
|
|
165
|
+
export interface LapMesgType {
|
|
166
|
+
timestamp?: string;
|
|
167
|
+
startTime?: string;
|
|
168
|
+
startPositionLat?: number;
|
|
169
|
+
startPositionLong?: number;
|
|
170
|
+
endPositionLat?: number;
|
|
171
|
+
endPositionLong?: number;
|
|
172
|
+
totalElapsedTime?: number;
|
|
173
|
+
totalTimerTime?: number;
|
|
174
|
+
totalDistance?: number;
|
|
175
|
+
totalCycles?: number;
|
|
176
|
+
totalWork?: number;
|
|
177
|
+
messageIndex?: number;
|
|
178
|
+
totalCalories?: number;
|
|
179
|
+
totalFatCalories?: number;
|
|
180
|
+
avgSpeed?: number;
|
|
181
|
+
maxSpeed?: number;
|
|
182
|
+
avgPower?: number;
|
|
183
|
+
maxPower?: number;
|
|
184
|
+
totalAscent?: number;
|
|
185
|
+
totalDescent?: number;
|
|
186
|
+
normalizedPower?: number;
|
|
187
|
+
event?: string;
|
|
188
|
+
eventType?: string;
|
|
189
|
+
avgCadence?: number;
|
|
190
|
+
maxCadence?: number;
|
|
191
|
+
lapTrigger?: string;
|
|
192
|
+
sport?: string;
|
|
193
|
+
totalStrokes?: number;
|
|
194
|
+
enhancedAvgSpeed?: number;
|
|
195
|
+
enhancedMaxSpeed?: number;
|
|
196
|
+
recordMesgs?: RecordMesgType[];
|
|
197
|
+
}
|
|
198
|
+
export interface ActivityMesgType {
|
|
199
|
+
timestamp?: string;
|
|
200
|
+
totalTimerTime?: number;
|
|
201
|
+
numSessions?: number;
|
|
202
|
+
type?: string;
|
|
203
|
+
event?: string;
|
|
204
|
+
eventType?: string;
|
|
205
|
+
[key: string]: number | string | undefined | any;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* FIT 消息处理上下文
|
|
209
|
+
*/
|
|
210
|
+
export interface FITContext extends IProcessingContext {
|
|
211
|
+
/** 原始二进制数据 */
|
|
212
|
+
rawData?: Buffer;
|
|
213
|
+
/** FIT SDK 解析的原始消息 */
|
|
214
|
+
rawMessages?: FITDecoderMesgs;
|
|
215
|
+
/** 最终结果 */
|
|
216
|
+
result?: FITFileType;
|
|
217
|
+
/** FIT 文件头信息 */
|
|
218
|
+
fileHeader?: {
|
|
219
|
+
type?: string;
|
|
220
|
+
manufacturer?: string;
|
|
221
|
+
product?: number;
|
|
222
|
+
};
|
|
223
|
+
/** FIT 特定的性能统计 */
|
|
224
|
+
performance: {
|
|
225
|
+
startTime: number;
|
|
226
|
+
parseTime?: number;
|
|
227
|
+
extractTime?: number;
|
|
228
|
+
structureTime?: number;
|
|
229
|
+
endTime?: number;
|
|
230
|
+
};
|
|
231
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const FITRecordOriginKey: string[];
|
package/dist/FIT/util.js
ADDED
package/dist/GPX/base.d.ts
CHANGED
|
@@ -1,84 +1,60 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IPlugin as ICorePlugin, IConverterPlugin as ICoreConverterPlugin, IMiddlewarePlugin as ICoreMiddlewarePlugin, BaseConverter as CoreBaseConverter, BaseMiddleware as CoreBaseMiddleware } from "../core/base.js";
|
|
2
2
|
import { DecoderContext, GPX11Type } from "./types.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* GPX 插件接口(继承通用插件接口)
|
|
5
5
|
*/
|
|
6
|
-
export interface
|
|
7
|
-
/** 插件名称 */
|
|
8
|
-
name: string;
|
|
9
|
-
/** 插件版本 */
|
|
10
|
-
version?: string;
|
|
11
|
-
/** 插件描述 */
|
|
12
|
-
description?: string;
|
|
13
|
-
/** 依赖的其他插件 */
|
|
14
|
-
dependencies?: string[];
|
|
15
|
-
/** 支持的标签 */
|
|
16
|
-
supportedTags?: string[];
|
|
17
|
-
/** 插件初始化 */
|
|
18
|
-
initialize?(context: DecoderContext): Promise<void> | void;
|
|
19
|
-
/** 插件销毁 */
|
|
20
|
-
destroy?(context: DecoderContext): Promise<void> | void;
|
|
21
|
-
/** 插件验证 */
|
|
22
|
-
validate?(context: DecoderContext): Promise<boolean> | boolean;
|
|
6
|
+
export interface IGPXPlugin extends ICorePlugin<DecoderContext> {
|
|
23
7
|
}
|
|
24
8
|
/**
|
|
25
|
-
*
|
|
9
|
+
* GPX 转换器插件接口(继承通用转换器接口)
|
|
26
10
|
*/
|
|
27
|
-
export interface
|
|
28
|
-
/** 转换方法 */
|
|
29
|
-
convert(ast: TokenAST, context: DecoderContext): any | undefined;
|
|
30
|
-
/** 是否支持该标签 */
|
|
31
|
-
supports(tag: string): boolean;
|
|
32
|
-
/** 优先级(数字越小优先级越高) */
|
|
33
|
-
priority?: number;
|
|
11
|
+
export interface IGPXConverterPlugin extends ICoreConverterPlugin<DecoderContext> {
|
|
34
12
|
}
|
|
35
13
|
/**
|
|
36
|
-
*
|
|
14
|
+
* GPX 中间件插件接口(继承通用中间件接口)
|
|
37
15
|
*/
|
|
38
|
-
export interface
|
|
39
|
-
/** 在tokenize阶段执行 */
|
|
40
|
-
onTokenize?(tokens: Token[], context: DecoderContext): Promise<Token[]> | Token[];
|
|
41
|
-
/** 在AST生成阶段执行 */
|
|
42
|
-
onAstGenerate?(ast: TokenAST, context: DecoderContext): Promise<TokenAST> | TokenAST;
|
|
43
|
-
/** 在转换阶段执行 */
|
|
44
|
-
onConvert?(result: any, context: DecoderContext): Promise<any> | any;
|
|
45
|
-
/** 在完成阶段执行 */
|
|
46
|
-
onComplete?(result: GPX11Type, context: DecoderContext): Promise<GPX11Type> | GPX11Type;
|
|
47
|
-
/** 错误处理 */
|
|
48
|
-
onError?(error: Error, context: DecoderContext): Promise<void> | void;
|
|
16
|
+
export interface IGPXMiddlewarePlugin extends ICoreMiddlewarePlugin<DecoderContext, GPX11Type> {
|
|
49
17
|
}
|
|
50
18
|
/**
|
|
51
|
-
*
|
|
19
|
+
* GPX 基础转换器抽象类(继承通用基础转换器)
|
|
52
20
|
*/
|
|
53
|
-
export declare abstract class
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
protected
|
|
66
|
-
protected extractAttributes<U extends Record<string, any>>(ast: TokenAST, target: U, mapping: Record<string, keyof U>): void;
|
|
67
|
-
protected processChildren<U extends Record<string, any>>(ast: TokenAST, target: U, processors: Record<string, (child: TokenAST, target: U) => void>): void;
|
|
21
|
+
export declare abstract class BaseGPXConverter extends CoreBaseConverter<DecoderContext> implements IGPXConverterPlugin {
|
|
22
|
+
/**
|
|
23
|
+
* 解析 GPX 坐标值(经纬度)
|
|
24
|
+
*/
|
|
25
|
+
protected parseCoordinate(value: string | number | undefined): number | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* 解析 GPX 时间格式
|
|
28
|
+
*/
|
|
29
|
+
protected parseGPXTime(value: string | undefined): Date | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* 提取数值属性(GPX 常用的处理方式)
|
|
32
|
+
*/
|
|
33
|
+
protected extractNumericAttributes<U extends Record<string, any>>(ast: any, target: U, mapping: Record<string, keyof U>): void;
|
|
68
34
|
}
|
|
69
35
|
/**
|
|
70
|
-
*
|
|
36
|
+
* GPX 基础中间件抽象类(继承通用基础中间件)
|
|
71
37
|
*/
|
|
72
|
-
export declare abstract class
|
|
73
|
-
abstract name: string;
|
|
74
|
-
version: string;
|
|
75
|
-
description: string;
|
|
76
|
-
initialize(context: DecoderContext): Promise<void>;
|
|
77
|
-
destroy(context: DecoderContext): Promise<void>;
|
|
78
|
-
validate(context: DecoderContext): Promise<boolean>;
|
|
79
|
-
onTokenize(tokens: Token[], context: DecoderContext): Promise<Token[]>;
|
|
80
|
-
onAstGenerate(ast: TokenAST, context: DecoderContext): Promise<TokenAST>;
|
|
81
|
-
onConvert(result: any, context: DecoderContext): Promise<any>;
|
|
82
|
-
onComplete(result: GPX11Type, context: DecoderContext): Promise<GPX11Type>;
|
|
38
|
+
export declare abstract class BaseGPXMiddleware extends CoreBaseMiddleware<DecoderContext, GPX11Type> implements IGPXMiddlewarePlugin {
|
|
83
39
|
onError(error: Error, context: DecoderContext): Promise<void>;
|
|
84
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated 使用 IGPXPlugin 替代
|
|
43
|
+
*/
|
|
44
|
+
export type IPlugin = IGPXPlugin;
|
|
45
|
+
/**
|
|
46
|
+
* @deprecated 使用 IGPXConverterPlugin 替代
|
|
47
|
+
*/
|
|
48
|
+
export type IConverterPlugin = IGPXConverterPlugin;
|
|
49
|
+
/**
|
|
50
|
+
* @deprecated 使用 IGPXMiddlewarePlugin 替代
|
|
51
|
+
*/
|
|
52
|
+
export type IMiddlewarePlugin = IGPXMiddlewarePlugin;
|
|
53
|
+
/**
|
|
54
|
+
* @deprecated 使用 BaseGPXConverter 替代
|
|
55
|
+
*/
|
|
56
|
+
export declare const BaseConverter: typeof BaseGPXConverter;
|
|
57
|
+
/**
|
|
58
|
+
* @deprecated 使用 BaseGPXMiddleware 替代
|
|
59
|
+
*/
|
|
60
|
+
export declare const BaseMiddleware: typeof BaseGPXMiddleware;
|
package/dist/GPX/base.js
CHANGED
|
@@ -1,83 +1,56 @@
|
|
|
1
|
-
|
|
1
|
+
import { BaseConverter as CoreBaseConverter, BaseMiddleware as CoreBaseMiddleware, } from "../core/base.js";
|
|
2
|
+
// ============ GPX 特定基础类 ============
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
+
* GPX 基础转换器抽象类(继承通用基础转换器)
|
|
4
5
|
*/
|
|
5
|
-
export class
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return 0;
|
|
29
|
-
}
|
|
30
|
-
parseString(value) {
|
|
31
|
-
return String(value || "");
|
|
32
|
-
}
|
|
33
|
-
hasRequiredAttributes(ast, required) {
|
|
34
|
-
return required.every((attr) => ast.attributes?.[attr]);
|
|
35
|
-
}
|
|
36
|
-
extractAttributes(ast, target, mapping) {
|
|
6
|
+
export class BaseGPXConverter extends CoreBaseConverter {
|
|
7
|
+
// GPX 特定的工具方法可以在这里添加
|
|
8
|
+
/**
|
|
9
|
+
* 解析 GPX 坐标值(经纬度)
|
|
10
|
+
*/
|
|
11
|
+
parseCoordinate(value) {
|
|
12
|
+
const coord = this.parseFloat(value);
|
|
13
|
+
return coord === 0 ? undefined : coord;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 解析 GPX 时间格式
|
|
17
|
+
*/
|
|
18
|
+
parseGPXTime(value) {
|
|
19
|
+
if (!value)
|
|
20
|
+
return undefined;
|
|
21
|
+
// GPX 使用 ISO 8601 格式
|
|
22
|
+
const date = new Date(value);
|
|
23
|
+
return isNaN(date.getTime()) ? undefined : date;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 提取数值属性(GPX 常用的处理方式)
|
|
27
|
+
*/
|
|
28
|
+
extractNumericAttributes(ast, target, mapping) {
|
|
37
29
|
if (!ast.attributes)
|
|
38
30
|
return;
|
|
39
31
|
Object.entries(ast.attributes).forEach(([key, value]) => {
|
|
40
32
|
const targetKey = mapping[key];
|
|
41
|
-
if (targetKey && targetKey in target) {
|
|
33
|
+
if (targetKey && targetKey in target && typeof value !== "undefined") {
|
|
42
34
|
target[targetKey] = this.parseFloat(value);
|
|
43
35
|
}
|
|
44
36
|
});
|
|
45
37
|
}
|
|
46
|
-
processChildren(ast, target, processors) {
|
|
47
|
-
ast.children?.forEach((child) => {
|
|
48
|
-
const processor = processors[child.tag];
|
|
49
|
-
if (processor) {
|
|
50
|
-
processor(child, target);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
38
|
}
|
|
55
39
|
/**
|
|
56
|
-
*
|
|
40
|
+
* GPX 基础中间件抽象类(继承通用基础中间件)
|
|
57
41
|
*/
|
|
58
|
-
export class
|
|
59
|
-
|
|
60
|
-
this.version = "1.0.0";
|
|
61
|
-
this.description = "";
|
|
62
|
-
}
|
|
63
|
-
async initialize(context) { }
|
|
64
|
-
async destroy(context) { }
|
|
65
|
-
async validate(context) {
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
async onTokenize(tokens, context) {
|
|
69
|
-
return tokens;
|
|
70
|
-
}
|
|
71
|
-
async onAstGenerate(ast, context) {
|
|
72
|
-
return ast;
|
|
73
|
-
}
|
|
74
|
-
async onConvert(result, context) {
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
async onComplete(result, context) {
|
|
78
|
-
return result;
|
|
79
|
-
}
|
|
42
|
+
export class BaseGPXMiddleware extends CoreBaseMiddleware {
|
|
43
|
+
// GPX 特定的中间件逻辑可以在这里添加
|
|
80
44
|
async onError(error, context) {
|
|
81
|
-
console.error(
|
|
45
|
+
console.error(`GPX中间件 ${this.name} 处理错误:`, error);
|
|
46
|
+
context.warnings.push(`中间件 ${this.name} 错误: ${error.message}`);
|
|
82
47
|
}
|
|
83
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* @deprecated 使用 BaseGPXConverter 替代
|
|
51
|
+
*/
|
|
52
|
+
export const BaseConverter = BaseGPXConverter;
|
|
53
|
+
/**
|
|
54
|
+
* @deprecated 使用 BaseGPXMiddleware 替代
|
|
55
|
+
*/
|
|
56
|
+
export const BaseMiddleware = BaseGPXMiddleware;
|
package/dist/GPX/converters.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { TokenAST
|
|
1
|
+
import { BaseGPXConverter } from "./base.js";
|
|
2
|
+
import { TokenAST } from "../types.js";
|
|
3
3
|
import { BoundsType, CopyrightType, EmailType, LinkType, MetadataType, PersonType, RteType, TrksegType, TrkType, WptType, DecoderContext } from "./types.js";
|
|
4
4
|
/**
|
|
5
5
|
* WPT转换器
|
|
6
6
|
*/
|
|
7
|
-
export declare class WptConverter extends
|
|
7
|
+
export declare class WptConverter extends BaseGPXConverter {
|
|
8
8
|
name: string;
|
|
9
9
|
supportedTags: string[];
|
|
10
10
|
version: string;
|
|
@@ -13,7 +13,7 @@ export declare class WptConverter extends BaseConverter {
|
|
|
13
13
|
/**
|
|
14
14
|
* Route转换器
|
|
15
15
|
*/
|
|
16
|
-
export declare class RteConverter extends
|
|
16
|
+
export declare class RteConverter extends BaseGPXConverter {
|
|
17
17
|
name: string;
|
|
18
18
|
supportedTags: string[];
|
|
19
19
|
convert(ast: TokenAST, context: DecoderContext): RteType | undefined;
|
|
@@ -21,7 +21,7 @@ export declare class RteConverter extends BaseConverter {
|
|
|
21
21
|
/**
|
|
22
22
|
* Track转换器
|
|
23
23
|
*/
|
|
24
|
-
export declare class TrkConverter extends
|
|
24
|
+
export declare class TrkConverter extends BaseGPXConverter {
|
|
25
25
|
name: string;
|
|
26
26
|
supportedTags: string[];
|
|
27
27
|
convert(ast: TokenAST, context: DecoderContext): TrkType | undefined;
|
|
@@ -29,7 +29,7 @@ export declare class TrkConverter extends BaseConverter {
|
|
|
29
29
|
/**
|
|
30
30
|
* Track Segment转换器
|
|
31
31
|
*/
|
|
32
|
-
export declare class TrksegConverter extends
|
|
32
|
+
export declare class TrksegConverter extends BaseGPXConverter {
|
|
33
33
|
name: string;
|
|
34
34
|
supportedTags: string[];
|
|
35
35
|
convert(ast: TokenAST, context: DecoderContext): TrksegType | undefined;
|
|
@@ -37,7 +37,7 @@ export declare class TrksegConverter extends BaseConverter {
|
|
|
37
37
|
/**
|
|
38
38
|
* Link转换器
|
|
39
39
|
*/
|
|
40
|
-
export declare class LinkConverter extends
|
|
40
|
+
export declare class LinkConverter extends BaseGPXConverter {
|
|
41
41
|
name: string;
|
|
42
42
|
supportedTags: string[];
|
|
43
43
|
convert(ast: TokenAST, context: DecoderContext): LinkType | undefined;
|
|
@@ -45,7 +45,7 @@ export declare class LinkConverter extends BaseConverter {
|
|
|
45
45
|
/**
|
|
46
46
|
* Metadata转换器
|
|
47
47
|
*/
|
|
48
|
-
export declare class MetadataConverter extends
|
|
48
|
+
export declare class MetadataConverter extends BaseGPXConverter {
|
|
49
49
|
name: string;
|
|
50
50
|
supportedTags: string[];
|
|
51
51
|
convert(ast: TokenAST, context: DecoderContext): MetadataType | undefined;
|
|
@@ -53,7 +53,7 @@ export declare class MetadataConverter extends BaseConverter {
|
|
|
53
53
|
/**
|
|
54
54
|
* Person转换器
|
|
55
55
|
*/
|
|
56
|
-
export declare class PersonConverter extends
|
|
56
|
+
export declare class PersonConverter extends BaseGPXConverter {
|
|
57
57
|
name: string;
|
|
58
58
|
supportedTags: string[];
|
|
59
59
|
convert(ast: TokenAST, context: DecoderContext): PersonType | undefined;
|
|
@@ -61,7 +61,7 @@ export declare class PersonConverter extends BaseConverter {
|
|
|
61
61
|
/**
|
|
62
62
|
* Email转换器
|
|
63
63
|
*/
|
|
64
|
-
export declare class EmailConverter extends
|
|
64
|
+
export declare class EmailConverter extends BaseGPXConverter {
|
|
65
65
|
name: string;
|
|
66
66
|
supportedTags: string[];
|
|
67
67
|
convert(ast: TokenAST, context: DecoderContext): EmailType | undefined;
|
|
@@ -69,7 +69,7 @@ export declare class EmailConverter extends BaseConverter {
|
|
|
69
69
|
/**
|
|
70
70
|
* Copyright转换器
|
|
71
71
|
*/
|
|
72
|
-
export declare class CopyrightConverter extends
|
|
72
|
+
export declare class CopyrightConverter extends BaseGPXConverter {
|
|
73
73
|
name: string;
|
|
74
74
|
supportedTags: string[];
|
|
75
75
|
convert(ast: TokenAST, context: DecoderContext): CopyrightType | undefined;
|
|
@@ -77,32 +77,8 @@ export declare class CopyrightConverter extends BaseConverter {
|
|
|
77
77
|
/**
|
|
78
78
|
* Bounds转换器
|
|
79
79
|
*/
|
|
80
|
-
export declare class BoundsConverter extends
|
|
80
|
+
export declare class BoundsConverter extends BaseGPXConverter {
|
|
81
81
|
name: string;
|
|
82
82
|
supportedTags: string[];
|
|
83
83
|
convert(ast: TokenAST, context: DecoderContext): BoundsType | undefined;
|
|
84
84
|
}
|
|
85
|
-
/**
|
|
86
|
-
* 性能监控中间件
|
|
87
|
-
*/
|
|
88
|
-
export declare class PerformanceMiddleware extends BaseMiddleware {
|
|
89
|
-
name: string;
|
|
90
|
-
description: string;
|
|
91
|
-
onTokenize(tokens: Token[], context: DecoderContext): Promise<Token[]>;
|
|
92
|
-
onAstGenerate(ast: TokenAST, context: DecoderContext): Promise<TokenAST>;
|
|
93
|
-
onComplete(result: any, context: DecoderContext): Promise<any>;
|
|
94
|
-
private countNodes;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* 验证中间件
|
|
98
|
-
*/
|
|
99
|
-
export declare class ValidationMiddleware extends BaseMiddleware {
|
|
100
|
-
name: string;
|
|
101
|
-
description: string;
|
|
102
|
-
onComplete(result: any, context: DecoderContext): Promise<any>;
|
|
103
|
-
private validateGPX;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* 注册所有默认中间件
|
|
107
|
-
*/
|
|
108
|
-
export declare function registerDefaultMiddlewares(decoder: any): Promise<void>;
|