[pim/kitinerary/release/26.08] src/lib/scripts: Support new Westbahn PDF ticket layout
Volker Krause <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 9f1fb28dd8574054d29783ff9fda0e44448826d5 by Volker Krause.
Committed on 06/08/2026 at 16:09.
Pushed by vkrause into branch 'release/26.08'.
Support new Westbahn PDF ticket layout
(cherry picked from commit 3feed55bd5e1df2ed3add6ac6685086471393e2d)
M +44 -19 src/lib/scripts/westbahn.js
https://invent.kde.org/pim/kitinerary/-/commit/9f1fb28dd8574054d29783ff9fda0e44448826d5
diff --git a/src/lib/scripts/westbahn.js b/src/lib/scripts/westbahn.js
index cfca0733..795e156e 100644
--- a/src/lib/scripts/westbahn.js
+++ b/src/lib/scripts/westbahn.js
@@ -5,29 +5,54 @@
function parseTicket(pdf, node, triggerNode) {
const page = pdf.pages[triggerNode.location];
- const leftCol = page.textInRect(0.0, 0.0, 0.5, 1.0);
- const rightCol = page.textInRect(0.5, 0.0, 1.0, 1.0);
+ const text = page.text;
let res = JsonLd.newTrainReservation();
- res.reservedTicket.name = rightCol.match(/TICKET\n(.*)/)[1];
+
res.reservedTicket.ticketToken = 'qrcode:' + triggerNode.content;
- res.reservedTicket.ticketNumber = rightCol.match(/TICKET NUMMER\n(.*)/)[1];
- res.reservationNumber = rightCol.match(/TICKET CODE\n(.*)/)[1];
- const leg = rightCol.match(/VERBINDUNG\n(.*) . (.*)/);
- res.reservationFor.departureStation.name = leg[1];
- res.reservationFor.arrivalStation.name = leg[2];
- const date = rightCol.match(/GÜLTIGKEIT\n.*(\d\d\.\d\d.\d{4})/)[1];
+ const token = triggerNode.content.match(/\/(\d{3})(\d{4})(\d{4})([A-Z0-9]{3})([A-Z0-9]{3})/);
+ res.reservedTicket.ticketNumber = token[1] + '-' + token[2] + '-' + token[3];
+ res.reservationNumber = token[4] + '-' + token[5];
+
+ const date = text.match(/Gültig am (\d\d\.\d\d.\d{4})/)[1];
res.reservationFor.departureDay = JsonLd.toDateTime(date, 'dd.MM.yyyy', 'de');
- const seat = rightCol.match(/Wagen (\d+) .* Sitz (.*)/);
- if (seat) {
- res.reservedTicket.ticketedSeat.seatSection = seat[1];
- res.reservedTicket.ticketedSeat.seatNumber = seat[2];
- }
- const train = leftCol.match(/(\d\d:\d\d) +(\d\d:\d\d)\n.*\n.* +(\S.*?) +/);
- if (train) {
- res.reservationFor.trainNumber = train[3];
- res.reservationFor.departureTime = JsonLd.toDateTime(date + ' ' + train[1], 'dd.MM.yyyy hh:mm', 'de');
- res.reservationFor.arrivalTime = JsonLd.toDateTime(date + ' ' + train[2], 'dd.MM.yyyy hh:mm', 'de');
+
+ const rightCol = page.textInRect(0.5, 0.0, 1.0, 1.0);
+ const ticketName = rightCol.match(/TICKET\n(.*)/);
+ if (ticketName) { // two column layout
+ res.reservedTicket.name = ticketName[1];
+ const leg = rightCol.match(/VERBINDUNG\n(.*) . (.*)/);
+ res.reservationFor.departureStation.name = leg[1];
+ res.reservationFor.arrivalStation.name = leg[2];
+ const seat = rightCol.match(/Wagen (\d+) .* Sitz (.*)/);
+ if (seat) {
+ res.reservedTicket.ticketedSeat.seatSection = seat[1];
+ res.reservedTicket.ticketedSeat.seatNumber = seat[2];
+ }
+
+ const leftCol = page.textInRect(0.0, 0.0, 0.5, 1.0);
+ const train = leftCol.match(/(\d\d:\d\d) +(\d\d:\d\d)\n.*\n.* +(\S.*?) +/);
+ if (train) {
+ res.reservationFor.trainNumber = train[3];
+ res.reservationFor.departureTime = JsonLd.toDateTime(date + ' ' + train[1], 'dd.MM.yyyy hh:mm', 'de');
+ res.reservationFor.arrivalTime = JsonLd.toDateTime(date + ' ' + train[2], 'dd.MM.yyyy hh:mm', 'de');
+ }
+ } else { // single column layout
+ const leg = text.match(/(\d\d:\d\d).*\n.*(\d\d:\d\d)\n(\S.*\S) +(\S.*\S)\n/);
+ res.reservationFor.departureTime = JsonLd.toDateTime(leg[1], "HH:mm", "de");
+ res.reservationFor.arrivalTime = JsonLd.toDateTime(leg[2], "HH:mm", "de");
+ res.reservationFor.departureStation.name = leg[3];
+ res.reservationFor.arrivalStation.name = leg[4];
+ const ticket = text.match(/^ *(\d) *West(\S.*)/);
+ res.reservedTicket.name = ticket[2];
+ res.reservedTicket.ticketedSeat.seatingType = ticket[1];
+ const seat = text.match(/Zug *Wagen \/ Deck *Sitz\n *(\S+) +(\S+).* (\S+)\n/);
+ if (seat) {
+ res.reservationFor.trainNumber = seat[1];
+ res.reservedTicket.ticketedSeat.seatSection = seat[2];
+ res.reservedTicket.ticketedSeat.seatNumber = seat[3];
+ }
}
+
ExtractorEngine.extractPrice(rightCol, res);
return res;
}