mirror of
				https://github.com/public-transport/db-vendo-client.git
				synced 2025-11-01 00:26:31 +02:00 
			
		
		
		
	parseIcon, parseHint, parseLocation: handle more edge cases 🐛
This commit is contained in:
		
							parent
							
								
									36a8b388f2
								
							
						
					
					
						commit
						2cb6a0c32b
					
				
					 5 changed files with 28 additions and 3 deletions
				
			
		|  | @ -1,7 +1,8 @@ | |||
| 'use strict' | ||||
| 
 | ||||
| const codesByIcon = Object.assign(Object.create(null), { | ||||
| 	cancel: 'cancelled' | ||||
| 	cancel: 'cancelled', | ||||
| 	himWarn: 'disturbance', | ||||
| }) | ||||
| 
 | ||||
| const linkTypesByCode = Object.assign(Object.create(null), { | ||||
|  | @ -29,7 +30,8 @@ const parseHint = (ctx, h) => { | |||
| 
 | ||||
| 	if (h.type === 'I' && h.code && h.txtN) { | ||||
| 		if (h.code in linkTypesByCode) { | ||||
| 			return {type: linkTypesByCode[h.code], text: h.txtN} | ||||
| 			const text = h.txtN === 'NULL' ? null : h.txtN | ||||
| 			return {type: linkTypesByCode[h.code], text} | ||||
| 		} | ||||
| 		if (h.code === 'TW' && h.txtN[0] === '$') { | ||||
| 			return {type: 'local-fare-zone', text: h.txtN.slice(1)} | ||||
|  | @ -70,7 +72,7 @@ const parseHint = (ctx, h) => { | |||
| 
 | ||||
| 	if ( | ||||
| 		h.type === 'D' || h.type === 'U' || h.type === 'R' || h.type === 'N' || | ||||
| 		h.type === 'Y' || h.type === 'Q' | ||||
| 		h.type === 'Y' || h.type === 'Q' || h.type === 'P' | ||||
| 	) { | ||||
| 		// todo: how can we identify the individual types?
 | ||||
| 		// todo: does `D` mean "disturbance"?
 | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| 'use strict' | ||||
| 
 | ||||
| const parseIcon = (ctx, i) => { | ||||
| 	if (i.res === 'Empty') return null | ||||
| 	const res = { | ||||
| 		type: i.res || null, | ||||
| 		title: i.text || i.txt || i.txtS || null | ||||
|  |  | |||
|  | @ -24,6 +24,9 @@ const parseLocation = (ctx, l) => { | |||
| 	if (l.crd) { | ||||
| 		res.latitude = l.crd.y / 1000000 | ||||
| 		res.longitude = l.crd.x / 1000000 | ||||
| 	} else if (('X' in lid) && ('Y' in lid)) { | ||||
| 		res.latitude = lid.Y / 1000000 | ||||
| 		res.longitude = lid.X / 1000000 | ||||
| 	} | ||||
| 
 | ||||
| 	if (l.type === STATION) { | ||||
|  | @ -70,6 +73,7 @@ const parseLocation = (ctx, l) => { | |||
| 			const i = text.indexOf(':') | ||||
| 			return [text.slice(0, i), text.slice(i + 1)] | ||||
| 		}) | ||||
| 		.filter(([src]) => src !== 'NULL') | ||||
| 		if (otherIds.length > 0) { | ||||
| 			if (!stop.ids) stop.ids = {} | ||||
| 			for (const [src, id] of otherIds) stop.ids[src] = id | ||||
|  |  | |||
|  | @ -66,5 +66,11 @@ test('parses icons correctly', (t) => { | |||
| 		fgColor: {r: 255, g: 255, b: 255, a: 255}, | ||||
| 		bgColor: {r: 0, g: 51, b: 153, a: 255} | ||||
| 	}) | ||||
| 
 | ||||
| 	const empty = { | ||||
| 		"res": "Empty" | ||||
| 	} | ||||
| 	t.equal(parse(ctx, empty), null) | ||||
| 
 | ||||
| 	t.end() | ||||
| }) | ||||
|  |  | |||
|  | @ -107,3 +107,15 @@ test('parses a stop correctly', (t) => { | |||
| 
 | ||||
| 	t.end() | ||||
| }) | ||||
| 
 | ||||
| test('falls back to coordinates from `lid`', (t) => { | ||||
| 	const {location} = parse(ctx, { | ||||
| 		type: 'S', | ||||
| 		name: 'foo', | ||||
| 		lid: 'a=b@L=foo@X=12345678@Y=23456789' | ||||
| 	}) | ||||
| 	t.ok(location) | ||||
| 	t.equal(location.latitude, 23.456789) | ||||
| 	t.equal(location.longitude, 12.345678) | ||||
| 	t.end() | ||||
| }) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue