From d9b7df693a29d366264a7b8ac465fdf1af4c8d0d Mon Sep 17 00:00:00 2001 From: Jannis R Date: Sat, 30 Jun 2018 18:04:44 +0200 Subject: [PATCH] parse hint & warning types using icons [ci skip] --- lib/request.js | 6 ++- parse/hint.js | 100 +++++++++++++++++++++++------------------------ parse/warning.js | 11 +++++- 3 files changed, 61 insertions(+), 56 deletions(-) diff --git a/lib/request.js b/lib/request.js index 4022bed4..6cedd1ca 100644 --- a/lib/request.js +++ b/lib/request.js @@ -83,11 +83,13 @@ const request = (profile, opt, data) => { d.hints = [] if (opt.remarks && Array.isArray(c.remL)) { - d.hints = c.remL.map(hint => profile.parseHint(profile, hint)) + const icons = opt.remarks && c.icoL || [] + d.hints = c.remL.map(hint => profile.parseHint(profile, hint, icons)) } d.warnings = [] if (opt.remarks && Array.isArray(c.himL)) { - d.warnings = c.himL.map(w => profile.parseWarning(profile, w)) + const icons = opt.remarks && c.icoL || [] + d.warnings = c.himL.map(w => profile.parseWarning(profile, w, icons)) } if (Array.isArray(c.opL)) { d.operators = c.opL.map(op => profile.parseOperator(profile, op)) diff --git a/parse/hint.js b/parse/hint.js index 734accfc..9bec071a 100644 --- a/parse/hint.js +++ b/parse/hint.js @@ -4,173 +4,172 @@ const hints = Object.assign(Object.create(null), { fb: { type: 'hint', code: 'bicycle-conveyance', - text: 'bicycles conveyed' + summary: 'bicycles conveyed' }, fr: { type: 'hint', code: 'bicycle-conveyance-reservation', - text: 'bicycles conveyed, subject to reservation' + summary: 'bicycles conveyed, subject to reservation' }, nf: { type: 'hint', code: 'no-bicycle-conveyance', - text: 'bicycles not conveyed' + summary: 'bicycles not conveyed' }, k2: { type: 'hint', code: '2nd-class-only', - text: '2. class only' + summary: '2. class only' }, eh: { type: 'hint', code: 'boarding-ramp', - text: 'vehicle-mounted boarding ramp available' + summary: 'vehicle-mounted boarding ramp available' }, wv: { type: 'hint', code: 'wifi', - text: 'WiFi available' + summary: 'WiFi available' }, wi: { type: 'hint', code: 'wifi', - text: 'WiFi available' + summary: 'WiFi available' }, sn: { type: 'hint', code: 'snacks', - text: 'snacks available for purchase' + summary: 'snacks available for purchase' }, mb: { type: 'hint', code: 'snacks', - text: 'snacks available for purchase' + summary: 'snacks available for purchase' }, mp: { type: 'hint', code: 'snacks', - text: 'snacks available for purchase at the seat' + summary: 'snacks available for purchase at the seat' }, bf: { type: 'hint', code: 'barrier-free', - text: 'barrier-free' + summary: 'barrier-free' }, rg: { type: 'hint', code: 'barrier-free-vehicle', - text: 'barrier-free vehicle' + summary: 'barrier-free vehicle' }, bt: { type: 'hint', code: 'on-board-bistro', - text: 'Bordbistro available' + summary: 'Bordbistro available' }, br: { type: 'hint', code: 'on-board-restaurant', - text: 'Bordrestaurant available' + summary: 'Bordrestaurant available' }, ki: { type: 'hint', code: 'childrens-area', - text: `children's area available` + summary: `children's area available` }, kr: { type: 'hint', code: 'kids-service', - text: 'DB Kids Service available' + summary: 'DB Kids Service available' }, ls: { type: 'hint', code: 'power-sockets', - text: 'power sockets available' + summary: 'power sockets available' }, ev: { type: 'hint', code: 'replacement-service', - text: 'replacement service' + summary: 'replacement service' }, kl: { type: 'hint', code: 'air-conditioned', - text: 'air-conditioned vehicle' + summary: 'air-conditioned vehicle' }, r0: { type: 'hint', code: 'upward-escalator', - text: 'upward escalator' + summary: 'upward escalator' }, au: { type: 'hint', code: 'elevator', - text: 'elevator available' + summary: 'elevator available' }, ck: { type: 'hint', code: 'komfort-checkin', - text: 'Komfort-Checkin available' + summary: 'Komfort-Checkin available' }, it: { type: 'hint', code: 'ice-sprinter', - text: 'ICE Sprinter service' + summary: 'ICE Sprinter service' }, rp: { type: 'hint', code: 'compulsory-reservation', - text: 'compulsory seat reservation' + summary: 'compulsory seat reservation' }, sk: { type: 'hint', code: 'oversize-luggage-forbidden', - text: 'oversize luggage not allowed' + summary: 'oversize luggage not allowed' }, hu: { type: 'hint', code: 'animals-forbidden', - text: 'animals not allowed, except guide dogs' + summary: 'animals not allowed, except guide dogs' }, ik: { type: 'hint', code: 'baby-cot-required', - text: 'baby cot/child seat required' + summary: 'baby cot/child seat required' }, ee: { type: 'hint', code: 'on-board-entertainment', - text: 'on-board entertainment available' + summary: 'on-board entertainment available' }, toilet: { type: 'hint', code: 'toilet', - text: 'toilet available' + summary: 'toilet available' }, iz: { type: 'hint', code: 'intercity-2', - text: 'Intercity 2' + summary: 'Intercity 2' } }) +const codesByIcon = Object.assign(Object.create(null), { + cancel: 'cancelled' +}) + // todo: is passing in profile necessary? -const parseHint = (profile, h) => { +const parseHint = (profile, h, icons) => { // todo: C const text = h.txtN && h.txtN.trim() || '' + const icon = 'number' === typeof h.icoX && icons[h.icoX] || null + const code = h.code || (icon && icon.res && codesByIcon[icon.res]) || null if (h.type === 'M') { return { type: 'status', - code: h.code || null, summary: h.txtS && h.txtS.trim() || '', - text - } - } - if (h.type === 'D') { - return { - type: 'status', - code: h.code || null, + code, text } } @@ -191,21 +190,13 @@ const parseHint = (profile, h) => { text } } - // todo: - // { - // "type": "U", - // "code": "", - // "icoX": 3, - // "txtN": "entrance and exit not possible" - // } - if (h.type === 'U') { + if (h.type === 'G' && text.toLowerCase() === 'platform change') { return { type: 'status', - code: h.code || null, + code: 'changed platform', text } } - if (h.type === 'L') { return { type: 'status', @@ -215,13 +206,18 @@ const parseHint = (profile, h) => { } } if (h.type === 'A') { - return hints[h.code && h.code.trim().toLowerCase()] || null + const hint = hints[h.code && h.code.trim().toLowerCase()] + if (hint) { + return Object.assign({text: h.txtN}, hint) + } + return null } - if (h.type === 'R') { + + if (h.type === 'D' || h.type === 'U' || h.type === 'R' || h.type === 'N') { // todo: how can we identify the individual types? return { type: 'status', - code: h.code, + code, text } } diff --git a/parse/warning.js b/parse/warning.js index f6e1ce2f..face0052 100644 --- a/parse/warning.js +++ b/parse/warning.js @@ -4,8 +4,12 @@ const brToNewline = require('br2nl') const parseDateTime = require('./date-time') +const typesByIcon = Object.assign(Object.create(null), { + HimWarn: 'status' +}) + // todo: is passing in profile necessary? -const parseWarning = (profile, w) => { +const parseWarning = (profile, w, icons) => { // todo: hid, act, pub, lead, tckr, icoX, fLocX, tLocX, prod, comp, // todo: cat (1, 2), pubChL // pubChL: @@ -20,8 +24,11 @@ const parseWarning = (profile, w) => { // tDate: '20180713', // tTime: '030000' } ] + const icon = 'number' === typeof h.icoX && icons[h.icoX] || null + const type = icon && icon.res && typesByIcon[icon.res] || 'warning' + return { - type: 'warning', + type, summary: brToNewline(w.head), text: brToNewline(w.text), priority: w.prio,