db-vendo-client/parse/warning.js

110 lines
3.3 KiB
JavaScript
Raw Permalink Normal View History

2022-05-07 16:17:37 +02:00
import brToNewline from '@derhuerst/br2nl'
import omit from 'lodash/omit.js'
2018-06-07 18:46:24 +02:00
const typesByIcon = Object.assign(Object.create(null), {
HimWarn: 'status'
})
const parseMsgEdge = (ctx) => (e) => {
const res = omit(e, [
'icoX',
'fLocX', 'fromLocation',
'tLocX', 'toLocation'
])
2019-08-23 16:02:34 +02:00
res.icon = e.icon || null
res.fromLocation = Array.isArray(e.fromLocations) && e.fromLocations[0] || e.fromLocation || null
res.toLocation = Array.isArray(e.toLocations) && e.toLocations[0] || e.toLocation || null
2019-02-25 15:04:25 +01:00
return res
}
const fallbackTime = '000000' // midnight
2020-01-15 18:17:06 +01:00
const parseMsgEvent = (ctx) => (e) => {
const {profile} = ctx // todo: test that covers this
2019-02-25 15:04:25 +01:00
return {
fromLocation: Array.isArray(e.fromLocations) && e.fromLocations[0] || e.fromLocation || null,
toLocation: Array.isArray(e.toLocations) && e.toLocations[0] || e.toLocation || null,
start: profile.parseDateTime(ctx, e.fDate, e.fTime || fallbackTime, null),
end: profile.parseDateTime(ctx, e.tDate, e.tTime || fallbackTime, null),
2019-02-25 15:04:25 +01:00
sections: e.sectionNums || [] // todo: parse
}
}
const parseWarning = (ctx, w) => {
const {profile, res: resp, common} = ctx
// todo: https://github.com/marudor/BahnhofsAbfahrten/blob/46a74957d68edc15713112df44e1a25150f5a178/src/types/HAFAS/HimSearch.ts#L31-L53
// todo: act, pub, lead, tckr
// todo: cat (1, 2), pubChL, rRefL/hints, impactL
// todo: pubChL
2018-06-07 18:46:24 +02:00
// [ { name: 'timetable',
// fDate: '20180606',
// fTime: '073000',
// tDate: '20180713',
// tTime: '030000' },
// { name: 'export',
// fDate: '20180606',
// fTime: '073000',
// tDate: '20180713',
// tTime: '030000' } ]
2019-02-25 15:04:25 +01:00
// { name: '1',
// fDate: '20190219',
// fTime: '000000',
// tDate: '20190225',
// tTime: '120000' }
// todo: w.regionRefL & res.common.himMsgRegionL
2018-06-07 18:46:24 +02:00
2019-08-23 16:02:34 +02:00
const icon = w.icon || null
2018-10-27 14:50:45 +02:00
const type = icon && icon.type && typesByIcon[icon.type] || 'warning'
const res = {
2019-03-27 18:58:34 +01:00
id: w.hid || null,
type,
2019-02-25 15:04:25 +01:00
summary: w.head ? brToNewline(w.head) : null, // todo: decode HTML entities?
text: w.text ? brToNewline(w.text) : null, // todo: decode HTML entities?
icon, // todo: parse icon
2018-06-07 18:46:24 +02:00
priority: w.prio,
}
if ('prod' in w) res.products = profile.parseProductsBitmask(ctx, w.prod)
if ('comp' in w) res.company = w.comp || null
// todo: parse to sth meaningful
if ('cat' in w) res.category = w.cat
if (w.catRefL && resp.common && resp.common.himMsgCatL) {
res.categories = w.catRefL
.map(i => resp.common.himMsgCatL[i])
.filter(e => !!e)
.map(cat => cat.id)
}
2019-02-25 15:04:25 +01:00
if (w.edgeRefL && resp.common && resp.common.himMsgEdgeL) {
2019-02-25 15:04:25 +01:00
res.edges = w.edgeRefL
.map(i => resp.common.himMsgEdgeL[i])
2019-02-25 15:04:25 +01:00
.filter(e => !!e)
.map(parseMsgEdge(ctx))
2019-02-25 15:04:25 +01:00
}
if (w.eventRefL && resp.common && resp.common.himMsgEventL) {
2019-02-25 15:04:25 +01:00
res.events = w.eventRefL
.map(i => resp.common.himMsgEventL[i])
2019-02-25 15:04:25 +01:00
.filter(e => !!e)
.map(parseMsgEvent(ctx))
2019-02-25 15:04:25 +01:00
}
if (w.affProdRefL) {
res.affectedLines = w.affProdRefL
.map(i => common.lines[i])
.filter(l => !!l)
}
if (w.fromLocations) res.fromStops = w.fromLocations
if (w.toLocations) res.toStops = w.toLocations
if (w.sDate && w.sTime) res.validFrom = profile.parseDateTime(ctx, w.sDate, w.sTime, null)
if (w.eDate && w.eTime) res.validUntil = profile.parseDateTime(ctx, w.eDate, w.eTime, null)
if (w.lModDate && w.lModTime) res.modified = profile.parseDateTime(ctx, w.lModDate, w.lModTime, null)
return res
2018-06-07 18:46:24 +02:00
}
2022-05-07 16:17:37 +02:00
export {
parseWarning,
}