ojp-sdk
Version:
OJP (Open Journey Planner) Javascript SDK
155 lines (154 loc) • 6.62 kB
JavaScript
import { Location } from '../../location/location';
import { PathGuidance } from '../path-guidance';
import { LegTrack } from './leg-track';
import { TripLeg } from "./trip-leg";
import { Duration } from '../../shared/duration';
import { ServiceBooking } from './continous-leg/service-booking';
export class TripContinousLeg extends TripLeg {
constructor(legType, legIDx, legDistance, fromLocation, toLocation) {
super(legType, legIDx, fromLocation, toLocation);
this.legTransportMode = null;
this.legDistance = legDistance;
this.pathGuidance = null;
this.walkDuration = null;
this.serviceBooking = null;
this.transferMode = null;
}
static initWithTreeNode(legIDx, treeNode, legType) {
var _a;
const legStartPlaceRefTreeNode = treeNode.findChildNamed('LegStart');
const legEndPlaceRefTreeNode = treeNode.findChildNamed('LegEnd');
if (legStartPlaceRefTreeNode === null || legEndPlaceRefTreeNode === null) {
return null;
}
const legStartPlaceRef = Location.initWithTreeNode(legStartPlaceRefTreeNode);
const legEndPlaceRef = Location.initWithTreeNode(legEndPlaceRefTreeNode);
if (legStartPlaceRef === null || legEndPlaceRef === null) {
return null;
}
let distanceS = (_a = treeNode.findTextFromChildNamed('Length')) !== null && _a !== void 0 ? _a : '0';
const legDistance = parseInt(distanceS);
const tripLeg = new TripContinousLeg(legType, legIDx, legDistance, legStartPlaceRef, legEndPlaceRef);
tripLeg.legDuration = Duration.initWithTreeNode(treeNode);
tripLeg.pathGuidance = PathGuidance.initWithTreeNode(treeNode);
tripLeg.legTransportMode = tripLeg.computeLegTransportModeFromTreeNode(treeNode, legType);
tripLeg.transferMode = tripLeg.computeLegTransferModeFromTreeNode(treeNode);
const isOthersDriveCar = tripLeg.legTransportMode === 'taxi' || tripLeg.legTransportMode === 'others-drive-car';
if (isOthersDriveCar) {
tripLeg.serviceBooking = ServiceBooking.initWithLegTreeNode(treeNode);
}
tripLeg.legTrack = LegTrack.initWithLegTreeNode(treeNode);
if (legType === 'TransferLeg') {
tripLeg.walkDuration = Duration.initWithTreeNode(treeNode, 'WalkDuration');
}
return tripLeg;
}
computeLegTransportModeFromTreeNode(treeNode, legType) {
let legModeS = null;
if (legType === 'TransferLeg') {
return null;
}
if (legType === 'TimedLeg' || legType === 'ContinousLeg') {
legModeS = treeNode.findTextFromChildNamed('Service/IndividualMode');
if (legModeS === null) {
const personalModeParts = [];
const personalNodePaths = [
'Service/PersonalMode',
'Service/PersonalModeOfOperation',
'Service/Mode/PtMode',
'Service/Mode/siri:RailSubmode',
'Service/Mode/siri:WaterSubmode',
];
personalNodePaths.forEach(personalNodePath => {
const personalNodeValue = treeNode.findTextFromChildNamed(personalNodePath);
if (personalNodeValue !== null) {
personalModeParts.push(personalNodeValue);
}
});
legModeS = personalModeParts.join('.');
}
}
const firstBookingAgency = treeNode.findTextFromChildNamed('Service/BookingArrangements/BookingArrangement/BookingAgencyName/Text');
const legMode = this.computeLegTransportModeFromString(legModeS, firstBookingAgency);
if (legMode === null) {
console.error('ERROR computeLegTransportModeFromString');
console.log('=> CANT handle mode --' + legModeS + '--');
console.log(treeNode);
}
return legMode;
}
computeLegTransferModeFromTreeNode(treeNode) {
const transferModeS = treeNode.findTextFromChildNamed('TransferMode');
if (transferModeS === null) {
return null;
}
if (transferModeS === 'walk') {
return 'walk';
}
if (transferModeS === 'remainInVehicle') {
return 'remainInVehicle';
}
console.error('CANT map TransferMode from ==' + transferModeS + '==');
return null;
}
computeLegTransportModeFromString(legModeS, firstBookingAgency = null) {
if (legModeS === null) {
return null;
}
if (legModeS === 'walk') {
return 'walk';
}
if (legModeS === 'self-drive-car') {
return 'self-drive-car';
}
if (legModeS === 'cycle') {
return 'cycle';
}
if (legModeS === 'taxi') {
// HACK: BE returns 'taxi' for limo, check first booking agency to see if is actually a limo leg
if ((firstBookingAgency === null || firstBookingAgency === void 0 ? void 0 : firstBookingAgency.indexOf('_limousine_')) !== -1) {
return 'others-drive-car';
}
return 'taxi';
}
if (legModeS === 'car.own') {
return 'self-drive-car';
}
if (legModeS === 'car.own.rail.vehicleTunnelTransportRailService') {
return 'car-shuttle-train';
}
if (legModeS === 'car.own.water.localCarFerry') {
return 'car-ferry';
}
return null;
}
isDriveCarLeg() {
return this.legTransportMode === 'self-drive-car';
}
isSharedMobility() {
if (this.legTransportMode === null) {
return false;
}
const sharedMobilityModes = ['cycle', 'bicycle_rental', 'car_sharing', 'escooter_rental'];
const hasSharedMobilityMode = sharedMobilityModes.indexOf(this.legTransportMode) !== -1;
return hasSharedMobilityMode;
}
isWalking() {
return this.legTransportMode === 'walk';
}
isTaxi() {
return this.legTransportMode === 'taxi' || this.legTransportMode === 'others-drive-car';
}
formatDistance() {
if (this.legDistance > 1000) {
const distanceKmS = (this.legDistance / 1000).toFixed(1) + ' km';
return distanceKmS;
}
return this.legDistance + ' m';
}
addToXMLNode(parentNode) {
const tripLegNode = parentNode.ele('ojp:TripLeg');
tripLegNode.ele('ojp:LegId', this.legID);
tripLegNode.ele('ojp:' + this.legType);
}
}