Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

Commit 562845ce authored by Daniel Vrátil's avatar Daniel Vrátil 🤖

Semantic formatter: add extractor for RegioJet

RegioJet (formerly StudentAgency) is a Czech bus and train service operator.
The electronic tickets are identical for both buses and trains, so the code
is shared, but uses a different semantic data types for each.

Differential Revision: https://phabricator.kde.org/D11398
parent 602428f3
[
{
"@type": "BusReservation",
"modifyReservationUrl": "https://jizdenky.studentagency.cz/OnlineTicket?pam1=9876543210&pam2=0123456789",
"reservationFor": {
"@type": "BusTrip",
"arrivalStation": {
"@type": "BusStation",
"name": "Wien, Lassallestr./Praterstern"
},
"arrivalTime": "2012-08-11T11:20:00",
"busName": "Praha → Vídeň",
"busNumber": "SA",
"departureStation": {
"@type": "BusStation",
"name": "Brno, AN u hotelu Grand"
},
"departureTime": "2012-08-11T09:30:00"
},
"reservationNumber": "0123456789",
"reservedTicket": {
"@type": "Ticket",
"ticketedSeat": {
"@type": "Seat",
"seatNumber": "51, 52, 55, 56"
}
}
},
{
"@type": "BusReservation",
"modifyReservationUrl": "https://jizdenky.studentagency.cz/OnlineTicket?pam1=9876543210&pam2=0123456789",
"reservationFor": {
"@type": "BusTrip",
"arrivalStation": {
"@type": "BusStation",
"name": "Brno, AN u hotelu Grand"
},
"arrivalTime": "2012-08-12T00:30:00",
"busName": "Vídeň → Praha",
"busNumber": "SA",
"departureStation": {
"@type": "BusStation",
"name": "Wien, Lassallestr./Praterstern"
},
"departureTime": "2012-08-11T22:40:00"
},
"reservationNumber": "0123456789",
"reservedTicket": {
"@type": "Ticket",
"ticketedSeat": {
"@type": "Seat",
"seatNumber": "35, 36, 39, 40"
}
}
}
]
Elektronická jízdenka č. 0123456789
Počet cestujících (použité tarify): 4 (Dospělý, Dospělý, ISIC, ISIC)
Cesta tam
Datum Zastávka/Přestup Příjezd Odjezd Nást. Spoj Vůz/sedadla
So 11.8.12 Brno, AN u hotelu Grand 9:30 Praha → Vídeň (SA) 51, 52, 55, 56
Wien, Lassallestr./Praterstern 11:20
Cesta zpět
Datum Zastávka/Přestup Příjezd Odjezd Nást. Spoj Vůz/sedadla
So 11.8.12 Wien, Lassallestr./Praterstern 22:40 Vídeň → Praha (SA) 35, 36, 39, 40
Ne 12.8.12 Brno, AN u hotelu Grand 0:30
Cena: 1 443 CZK
Stornovací podmínky: více než 5 hodin: 0 %, méně než 5 hodin: nelze stornovat
Podmínky přerezervace: více než 5 hodin: 0 CZK, méně než 5 hodin: nelze přerezervovat
Akce: Flexi (http://jizdenky.studentagency.cz/cs/ceniky/ceniky-podstranky/flexi-jizdenka.html)
Důležité informace:
Zavazadla - bezplatně přepravujeme pro 1 cestujícího:
1 příruční zavazadlo (max. rozměry 15 x 25 x 35 cm)
a 1 zavazadlo v zavazadlovém prostoru do 30 kg a rozměrů 30 x 60 x 80 cm.
Poplatek za každé další zavazadlo/poplatek za nadrozměrné zavazadlo/poplatek za přepravu kola je 100 Kč/ 4 EUR.
Dopravci:
SA - STUDENT AGENCY, s.r.o., IČO: 25317075, internet: www.studentagency.cz, telefon: +420 542 42 42 42
Vaši jízdenku můžete spravovat zde https://jizdenky.studentagency.cz/OnlineTicket?pam1=9876543210&pam2=0123456789 (k přihlášení potřebujete číslo jízdenky)
S pozdravem
STUDENT AGENCY Express
STUDENT AGENCY s.r.o.
www.studentagency.cz
tel: +420 841 101 101, +420 542 42 42 42, pro letenky +420 800 100 300
--------------------------------------------------------------------------------
STUDENT AGENCY express je online rezervační systém autobusové dopravy společnosti STUDENT AGENCY (http://www.studentagency.cz).
Pokud nechcete automaticky dostávat emaily o změnách v rezervacích, proveďte změnu v sekci nastavení.
[
{
"@type": "BusReservation",
"modifyReservationUrl": "http://jizdenky.studentagency.cz/OnlineTicket?pam1=0987654321&pam2=0123456789",
"reservationFor": {
"@type": "BusTrip",
"arrivalStation": {
"@type": "BusStation",
"name": "Wien, SchwechatAirport Bbf."
},
"arrivalTime": "2012-06-29T05:35:00",
"busName": "Praha → Vídeň",
"busNumber": "SA",
"departureStation": {
"@type": "BusStation",
"name": "Brno, AN u hotelu Grand"
},
"departureTime": "2012-06-29T03:20:00"
},
"reservationNumber": "0123456789",
"reservedTicket": {
"@type": "Ticket",
"ticketedSeat": {
"@type": "Seat",
"seatNumber": "43"
}
}
}
]
Elektronická jízdenka č. 0123456789
Počet cestujících (použité tarify): 1 (ISIC)
Cesta
Datum Zastávka/Přestup Příjezd Odjezd Nást. Spoj Vůz/sedadla
Pá 29.6.12 Brno, AN u hotelu Grand 3:20 Praha → Vídeň (SA) 43
Wien, SchwechatAirport Bbf. 5:35
Cena: 272 CZK
Stornovací podmínky: více než 5 hodin: 0 %, méně než 5 hodin: nelze stornovat
Podmínky přerezervace: více než 5 hodin: 0 CZK, méně než 5 hodin: nelze přerezervovat
Akce: Flexi (http://jizdenky.studentagency.cz/cs/ceniky/ceniky-podstranky/flexi-jizdenka.html)
Důležité informace:
Zavazadla - bezplatně přepravujeme pro 1 cestujícího:
1 příruční zavazadlo (max. rozměry 15 x 25 x 35 cm)
a 1 zavazadlo v zavazadlovém prostoru do 30 kg a rozměrů 30 x 60 x 80 cm.
Poplatek za každé další zavazadlo/poplatek za nadrozměrné zavazadlo/poplatek za přepravu kola je 100 Kč/ 4 EUR.
Dopravci:
SA - STUDENT AGENCY, s.r.o., IČO: 25317075, internet: www.studentagency.cz, telefon: +420 542 42 42 42
Vaši jízdenku můžete spravovat zde http://jizdenky.studentagency.cz/OnlineTicket?pam1=0987654321&pam2=0123456789 (k přihlášení potřebujete číslo jízdenky)
S pozdravem
STUDENT AGENCY Express
STUDENT AGENCY s.r.o.
www.studentagency.cz
tel: +420 841 101 101, +420 542 42 42 42, pro letenky +420 800 100 300
--------------------------------------------------------------------------------
STUDENT AGENCY express je online rezervační systém autobusové dopravy společnosti STUDENT AGENCY (http://www.studentagency.cz).
Pokud nechcete automaticky dostávat emaily o změnách v rezervacích, proveďte změnu v sekci nastavení.
[
{
"@type": "BusReservation",
"modifyReservationUrl": "https://jizdenky.studentagency.cz/OnlineTicket?pam1=0987654321&pam2=0123456789",
"reservationFor": {
"@type": "BusTrip",
"arrivalStation": {
"@type": "BusStation",
"name": "Brno, AN u hotelu Grand"
},
"arrivalTime": "2015-08-01T00:30:00",
"busName": "Vienna → Prague",
"busNumber": "SA",
"departurePlatform": "2",
"departureStation": {
"@type": "BusStation",
"name": "Wien, Schwechat Airport Bbf."
},
"departureTime": "2015-07-31T22:10:00"
},
"reservationNumber": "0123456789",
"reservedTicket": {
"@type": "Ticket",
"ticketedSeat": {
"@type": "Seat",
"seatNumber": "48"
}
}
}
]
Electronic ticket 0123456789
Number of passengers (used tarifs): 1 (Adult)
Passengers: Daniel Vratil
Route
Date Station/Transfer Arrival Departure Platf. Connection Coach/Seats
Fri 31/07/15 Wien, Schwechat Airport Bbf. 22:10 2 Vienna → Prague (SA) 48
Sat 01/08/15 Brno, AN u hotelu Grand 00:30
Price: 340 CZK
Cancellation terms: more than 1 hour: 0 %, less than 1 hour: not possible
Rebook terms: more than 1 hour: by cancellation for 0 CZK, less than 1 hour: not possible
Action: Flexi (https://bustickets.studentagency.eu/en/special-offers/special-offers-details/akce-praha-drazdany-berlin-nejlevnejsi-cena-2015.html)
Important information:
Dear passengers! Please have your valid travel document (ID card or passport) ready for inspection when boarding the bus. Residence permits, travel document copies, etc. are not a valid travel document! Clients without valid travel documents will not be transported.
Luggage – luggage transported for one passenger free of charge:
1 piece of hand luggage (maximum size 15 x 25 x 35 cm)
and 1 piece of luggage in the luggage compartment not exceeding 30 kg or the size of 30 x 60 x 80 cm.
The fee for each extra piece of luggage/fee for luggage exceeding the maximum size/fee the transport of a bicycle is 100 CZK/ 4 € while paying by a coach or 50 CZK /2 € for payment in advance in the reservation system.
Operators:
SA - STUDENT AGENCY k.s., ID: 25317075, internet: www.studentagency.cz, phone: +420 841 101 101
You can manage your ticket here https://jizdenky.studentagency.cz/OnlineTicket?pam1=0987654321&pam2=0123456789 (you will need the ticket number to log in)
To board the bus, you only need to give the ticket number unless otherwise stated in the conditions.
Yours sincerely
STUDENT AGENCY/ REGIOJET
www.studentagency.cz, www.regiojet.cz
phone: +420 841 101 101, +420 542 42 42 42
--------------------------------------------------------------------------------
Thank you for using online bus/train ticket reservation system utilized by STUDENT AGENCY and REGIOJET (http://www.studentagency.cz; http://www.regiojet.cz).
[
{
"@type": "TrainReservation",
"modifyReservationUrl": "https://jizdenky.regiojet.cz/OnlineTicket?pam1=0987654321&pam2=0123456789",
"reservationFor": {
"@type": "TrainTrip",
"arrivalStation": {
"@type": "TrainStation",
"name": "Praha, hl.n."
},
"arrivalTime": "2017-07-02T14:12:00",
"departureStation": {
"@type": "TrainStation",
"name": "Olomouc, hl.n."
},
"departureTime": "2017-07-02T11:56:00",
"trainName": "Návsí (Jablunkov) → Praha",
"trainNumber": "RJ, RJ 1010"
},
"reservationNumber": "0123456789",
"reservedTicket": {
"@type": "Ticket",
"ticketedSeat": {
"@type": "Seat",
"seatNumber": "48",
"seatSection": "1"
}
}
}
]
Elektronická jízdenka č. 0123456789
Počet cestujících (použité tarify): 1 (Dospělý)
Cesta
Datum Zastávka/Přestup Příjezd Odjezd Nást. Spoj Vůz/sedadla
Ne 2.7.17 Olomouc, hl.n. 11:56 Návsí (Jablunkov) → Praha (RJ, RJ 1010) 1/48
Praha, hl.n. 14:12
Cena: 239 CZK
Stornovací podmínky: více než 15 minut: 0 %, méně než 15 minut: nelze stornovat
Podmínky přerezervace: více než 15 minut: stornem za 0 CZK, méně než 15 minut: nelze přerezervovat
Tarif: LOW COST - bez servisu
Důležité informace:
Vybrali jste si sedadlo ve třídě LOW COST – bez servisu. Sedadla jsou vybavana loketními opěrkami a jsou nepolohovatelná, proto jsou vhodná pro cestování na krátkých trasách. K dispozici je balená voda Rajec, denní tisk a časopisy na představcích. Užijte si ničím nerušenou jízdu s možností sledování více než 50 filmů, poslechem hudby a hraním her ve vlastním zařízení.
Dopravci:
RJ - REGIOJET a.s., IČO: 28333187, DIČ: CZ28333187, internet: www.regiojet.cz, telefon: +420841101101
Vaši jízdenku můžete spravovat zde https://jizdenky.regiojet.cz/OnlineTicket?pam1=0987654321&pam2=0123456789 (k přihlášení potřebujete číslo jízdenky)
K odbavení u spoje postačuje sdělit číslo jízdenky, není-li v podmínkách uvedeno jinak.
S pozdravem
REGIOJET
www.regiojet.cz
tel: +420 841 101 101, +420 542 42 42 42
--------------------------------------------------------------------------------
Děkujeme, že používáte online rezervační systém autobusové a vlakové dopravy společnosti REGIOJET (http://www.regiojet.cz).
Online rezervační systém spravuje STUDENT AGENCY k.s., Česká republika
Pokud nechcete automaticky dostávat emaily, proveďte změnu v sekci nastavení.
......@@ -14,6 +14,8 @@
<file>iberia.js</file>
<file>klm.json</file>
<file>klm.js</file>
<file>regiojet.json</file>
<file>regiojet.js</file>
<file>sncf.json</file>
<file>sncf.js</file>
<file>swiss.json</file>
......
/*
Copyright (c) 2017 Volker Krause <vkrause@kde.org>
Copyright (c) 2018 Daniel Vrátil <dvratil@kde.org>
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
*/
var regExMap = new Array();
regExMap["cs_CZ"] = new Array();
regExMap["cs_CZ"]["ticketId"] = /Elektronická jízdenka č\.\s+([0-9]+)/;
regExMap["cs_CZ"]["singleTripHeader"] = /Cesta/;
regExMap["cs_CZ"]["thereTripHeader"] = /Cesta tam/;
regExMap["cs_CZ"]["returnTripHeader"] = /Cesta zpět/;
regExMap["cs_CZ"]["columns"] = [ /Datum/, /Zastávka\/Přestup/, /Příjezd/, /Odjezd/, /Nást\./, /Spoj/, /Vůz\/sedadla/ ];
regExMap["cs_CZ"]["date"] = /([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{2})/;
regExMap["en_US"] = new Array();
regExMap["en_US"]["ticketId"] = /Electronic ticket\s+([0-9]+)/;
regExMap["en_US"]["singleTripHeader"] = /Route/;
regExMap["en_US"]["thereTripHeader"] = /Route there/;
regExMap["en_US"]["returnTripHeader"] = /Route back/;
regExMap["en_US"]["columns"] = [ /Date/, /Station\/Transfer/, /Arrival/, /Departure/, /Platf\./, /Connection/, /Coach\/Seats/ ];
regExMap["en_US"]["date"] = /([0-9]{2})\/([0-9]{2})\/([0-9]{2})/;
function padDigit(s) {
while (s.length < 2) {
s = '0' + s;
}
return s;
}
function parseDate(date, time, locale) {
var d = date.match(regExMap[locale]["date"]);
var t = time.match(/([0-9]{1,2}):([0-9]{1,2})/);
if (!d || !t) {
return null;
}
return JsonLd.toDateTime(padDigit(d[1]) + "." + padDigit(d[2]) + ".20" + d[3] + " "
+ padDigit(t[1]) + ":" + padDigit(t[2]),
"dd.MM.yyyy HH:mm", locale);
}
var Columns = Object.freeze({
Date: 0,
Station: 1,
ArrivalTime: 2,
DepartureTime: 3,
Platform: 4,
Connection: 5,
Seat: 6,
ColumnCount: 7
});
function columnValue(line, columns, column, locale) {
var start = columns.match(regExMap[locale]["columns"][column]);
if (!start) {
return "";
}
if (column < Columns.ColumnCount - 1) {
var end = columns.match(regExMap[locale]["columns"][column + 1]);
if (!end) {
return "";
}
return line.substr(start.index, end.index - start.index).trim();
} else {
return line.substr(start.index).trim();
}
}
function parseTrip(trip, locale) {
var text = trip.split("\n")
var columns = text[0];
var reservations = new Array();
var transportType = "Bus";
for (var i = 1; i < text.length; i++) {
// Skip the destination arrival part, we already populated it as part
// of completing the previous departure line
if (i < text.length - 1 && !text[i + 1]) {
break;
}
var connection = columnValue(text[i], columns, Columns.Connection, locale);
var number = null;
var name = null;
if (connection) {
var split = connection.lastIndexOf("(")
name = connection.substr(0, split - 1);
number = connection.substr(split + 1, connection.length - split - 2);
transportType = number.match(/RJ [0-9]+/) ? "Train" : "Bus";
}
var res = JsonLd.newObject(transportType + "Reservation");
res.reservationFor = JsonLd.newObject(transportType + "Trip");
if (transportType == "Bus") {
if (number) {
res.reservationFor.busNumber = number;
}
if (name) {
res.reservationFor.busName = name;
}
} else if (transportType == "Train") {
if (number) {
res.reservationFor.trainNumber = number;
}
if (name) {
res.reservationFor.trainName = name;
}
}
var arrivalTime = columnValue(text[i + 1], columns, Columns.ArrivalTime, locale);
var arrivalDate = columnValue(text[i + 1], columns, Columns.Date, locale);
if (!arrivalTime) {
arrivalTime = columnValue(text[i], columns, Columns.ArrivalTime, locale);
}
if (!arrivalDate) {
arrivalDate = columnValue(text[i], columns, Columns.Date, locale);
}
if (arrivalDate && arrivalTime) {
res.reservationFor.arrivalStation = JsonLd.newObject(transportType + "Station");
res.reservationFor.arrivalStation.name = columnValue(text[i+1], columns, Columns.Station, locale);
res.reservationFor.arrivalTime = parseDate(arrivalDate, arrivalTime, locale);
}
var departureTime = columnValue(text[i], columns, Columns.DepartureTime, locale);
var departure = "";
if (departureTime != "") {
departure = text[i];
} else if (i > 0) {
departure = text[i - 1];
departureTime = columnValue(departure, columns, Columns.DepartureTime, locale);
}
if (departure) {
res.reservationFor.departureStation = JsonLd.newObject(transportType + "Station");
res.reservationFor.departureStation.name = columnValue(departure, columns, Columns.Station, locale);
res.reservationFor.departureTime = parseDate(columnValue(departure, columns, Columns.Date, locale),
departureTime, locale);
var platform = columnValue(departure, columns, Columns.Platform, locale);
if (platform) {
res.reservationFor.departurePlatform = platform;
}
// seats are always bound to departur
var seat = columnValue(departure, columns, Columns.Seat, locale);
if (seat) {
var r = seat.match(/([0-9]+)\/([0-9]+)/);
res.reservedTicket = JsonLd.newObject("Ticket");
res.reservedTicket.ticketedSeat = JsonLd.newObject("Seat");
if (r) {
res.reservedTicket.ticketedSeat.seatSection = r[1];
res.reservedTicket.ticketedSeat.seatNumber = r[2];
} else {
res.reservedTicket.ticketedSeat.seatNumber = seat;
}
}
}
reservations.push(res);
}
return reservations;
}
function main(text) {
var reservations = new Array();
for (var locale in regExMap) {
var ticketId = text.match(regExMap[locale]["ticketId"]);
if (!ticketId) {
continue;
}
var resUrl = text.match(/http(s)?:\/\/jizdenky\.(regiojet|studentagency)\.cz\/OnlineTicket\?pam1=[0-9]+\&pam2=[0-9]+/)
var returnHeader = text.match(regExMap[locale]["returnTripHeader"]);
var isReturn = (returnHeader != null);
var routeHeader = text.match(regExMap[locale][isReturn ? "thereTripHeader" : "singleTripHeader"]);
if (!routeHeader) {
break;
}
var trip = text.substr(routeHeader.index + routeHeader[0].length + 1);
var newRes = parseTrip(trip, locale);
if (newRes.length == 0) {
break;
}
reservations = reservations.concat(newRes);
if (isReturn) {
trip = text.substr(returnHeader.index + returnHeader[0].length + 1);
reservations = reservations.concat(parseTrip(trip, locale));
}
for (var i = 0; i < reservations.length; ++i) {
reservations[i].reservationNumber = ticketId[1];
if (resUrl) {
reservations[i].modifyReservationUrl = resUrl[0];
}
}
// No need to scan any further locales
break;
}
return reservations;
}
{
"filter": [
{ "header": "From", "match": "express@studentagency.cz" },
{ "header": "From", "match": "info@regiojet.cz" }
],
"script": "regiojet.js"
}
......@@ -17,7 +17,11 @@
<tr>
<td>{{ item.reservationFor.departureTimeLocalized }}</td>
<td style="white-space: nowrap; text-align:center;">
{{ item.reservationFor.trainName }} {{ item.reservationFor.trainNumber }}
{% if item.reservationFor.trainName and item.reservationFor.trainNumber %}
{{ item.reservationFor.trainName }} <br> {{ item.reservationFor.trainNumber }}
{% else %}
{{ item.reservationFor.trainName }} {{ item.reservationFor.trainNumber }}
{% endif %}
</td>
<td>{{ item.reservationFor.arrivalTimeLocalized }}</td>
</tr>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment