Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kitinerary for openSUSE:Factory checked in at 2022-05-14 22:53:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kitinerary (Old) and /work/SRC/openSUSE:Factory/.kitinerary.new.1538 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kitinerary" Sat May 14 22:53:01 2022 rev:48 rq:976798 version:22.04.1 Changes: -------- --- /work/SRC/openSUSE:Factory/kitinerary/kitinerary.changes 2022-04-24 00:19:43.184267555 +0200 +++ /work/SRC/openSUSE:Factory/.kitinerary.new.1538/kitinerary.changes 2022-05-14 22:53:32.795094717 +0200 @@ -1,0 +2,8 @@ +Tue May 10 16:30:10 UTC 2022 - Christophe Giboudeaux <[email protected]> + +- Update to 22.04.1 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/gear/22.04.1/ + +------------------------------------------------------------------- Old: ---- kitinerary-22.04.0.tar.xz kitinerary-22.04.0.tar.xz.sig New: ---- kitinerary-22.04.1.tar.xz kitinerary-22.04.1.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kitinerary.spec ++++++ --- /var/tmp/diff_new_pack.M1GvkY/_old 2022-05-14 22:53:33.323095377 +0200 +++ /var/tmp/diff_new_pack.M1GvkY/_new 2022-05-14 22:53:33.327095382 +0200 @@ -18,7 +18,7 @@ %bcond_without released Name: kitinerary -Version: 22.04.0 +Version: 22.04.1 Release: 0 Summary: Data model and extraction system for travel reservations License: LGPL-2.1-or-later ++++++ kitinerary-22.04.0.tar.xz -> kitinerary-22.04.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/.gitlab-ci.yml new/kitinerary-22.04.1/.gitlab-ci.yml --- old/kitinerary-22.04.0/.gitlab-ci.yml 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/.gitlab-ci.yml 2022-05-07 12:07:42.000000000 +0200 @@ -6,3 +6,4 @@ - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows.yml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/CMakeLists.txt new/kitinerary-22.04.1/CMakeLists.txt --- old/kitinerary-22.04.0/CMakeLists.txt 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/CMakeLists.txt 2022-05-07 12:07:42.000000000 +0200 @@ -3,7 +3,7 @@ # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16 FATAL_ERROR) -set(PIM_VERSION "5.20.0") +set(PIM_VERSION "5.20.1") project(KItinerary VERSION ${PIM_VERSION}) set(KF5_MIN_VERSION "5.91.0") @@ -41,8 +41,8 @@ find_package(SharedMimeInfo 1.3 REQUIRED) endif() -set(KMIME_VERSION "5.20.0") -set(PIM_PKPASS "5.20.0") +set(KMIME_VERSION "5.20.1") +set(PIM_PKPASS "5.20.1") find_package(KF5Mime ${KMIME_VERSION} CONFIG REQUIRED) find_package(KF5CalendarCore ${KF5_MIN_VERSION} CONFIG) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json new/kitinerary-22.04.1/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json --- old/kitinerary-22.04.0/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json 2022-05-07 12:07:42.000000000 +0200 @@ -3,6 +3,10 @@ "@context": "http://schema.org", "@type": "TrainReservation", "modifiedTime": "2017-12-29T18:46:02+01:00", + "programMembershipUsed": { + "@type": "ProgramMembership", + "programName": "Ayant Droit Avec Fichet" + }, "reservationFor": { "@type": "TrainTrip", "arrivalStation": { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/po/zh_CN/kitinerary.po new/kitinerary-22.04.1/po/zh_CN/kitinerary.po --- old/kitinerary-22.04.0/po/zh_CN/kitinerary.po 2022-04-15 02:23:39.000000000 +0200 +++ new/kitinerary-22.04.1/po/zh_CN/kitinerary.po 2022-05-10 07:57:47.000000000 +0200 @@ -8,7 +8,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2022-03-13 03:06+0000\n" -"PO-Revision-Date: 2022-04-14 15:36\n" +"PO-Revision-Date: 2022-05-08 08:17\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/cli/org.kde.kitinerary-extractor.appdata.xml new/kitinerary-22.04.1/src/cli/org.kde.kitinerary-extractor.appdata.xml --- old/kitinerary-22.04.0/src/cli/org.kde.kitinerary-extractor.appdata.xml 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/cli/org.kde.kitinerary-extractor.appdata.xml 2022-05-07 12:07:42.000000000 +0200 @@ -104,9 +104,9 @@ <binary>kitinerary-extractor</binary> </provides> <releases> + <release version="5.20.1" date="2022-05-12"/> <release version="5.20.0" date="2022-04-21"/> <release version="5.19.3" date="2022-03-03"/> <release version="5.19.2" date="2022-02-03"/> - <release version="5.19.1" date="2022-01-06"/> </releases> </component> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/extractorpostprocessor.cpp new/kitinerary-22.04.1/src/lib/extractorpostprocessor.cpp --- old/kitinerary-22.04.0/src/lib/extractorpostprocessor.cpp 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/extractorpostprocessor.cpp 2022-05-07 12:07:42.000000000 +0200 @@ -117,6 +117,11 @@ elem = d->processEvent(elem.value<Event>()); } + // non-reservation types + else if (JsonLd::isA<ProgramMembership>(elem)) { + elem = d->processProgramMembership(elem.value<ProgramMembership>()); + } + d->mergeOrAppend(elem); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/booking.js new/kitinerary-22.04.1/src/lib/scripts/booking.js --- old/kitinerary-22.04.0/src/lib/scripts/booking.js 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/booking.js 2022-05-07 12:07:42.000000000 +0200 @@ -87,6 +87,36 @@ } } +function parseHtmlCommon(doc, node, res) +{ + const aElems = doc.eval('//a'); + for (aElem of aElems) { + const href = aElem.attribute('href'); + if (href.startsWith('tel:')) { + res.reservationFor.telephone = aElem.content; + } else if (href.startsWith('mailto:')) { + res.reservationFor.email = href.substr(7); + // reservation id is the prefix in the mailto link, unlike other occurrences this seems most reliably present + res.reservationNumber = href.match(/mailto:(\d+)-/)[1]; + } else if (aElem.attribute('universal') == 'true') { + res.reservationFor.name = aElem.content; + } else if (aElem.content.match(/modify/) && href.startsWith("https:")) { + res.modifyReservationUrl = href; + } + } + + const times = doc.eval('//time'); + res.checkinTime = times[0].attribute("datetime"); + res.checkoutTime = times[1].attribute("datetime"); + + const guest = doc.root.recursiveContent.match(/(?:Guest name|Nombre del hu??sped|Name des Gastes)[\n\s]+?(\S.*)\n/); + if (guest) { + res.underName.name = guest[1]; + } + + return res; +} + function parseHtml(doc, node) { if (node.result.length > 0) @@ -125,19 +155,20 @@ res.reservationStatus = "ReservationCancelled" } } - res.reservationFor.telephone = elem.eval(".//*[@class=\"u-phone\"]")[0].content; + return parseHtmlCommon(doc, node, res); +} - // reservation id is the prefix in the mailto link, unlike other occurrences this seems most reliably present - var email = elem.eval(".//tr/td/a")[1].attribute("href").match(/mailto:(\d+)-/); - if (email) { - res.reservationNumber = email[1] - } - - elem = doc.eval("//table[@class=\"mg_conf_booking_summary\"]")[0]; - var times = elem.eval(".//time"); - res.checkinTime = times[0].attribute("datetime"); - res.checkoutTime = times[1].attribute("datetime"); +function parseHtmlAlternative(doc, node) +{ + if (node.result.length > 0) + return null; // this is just backup if we have no structured data + var res = JsonLd.newLodgingReservation(); - return res; + const addrElems = doc.eval('//address')[0].content.split(',\n'); + res.reservationFor.address.streetAddress = addrElems[0]; + res.reservationFor.address.addressLocality = addrElems[1]; + res.reservationFor.address.postalCode = addrElems[2]; + res.reservationFor.address.addressCountry = addrElems[3]; + return parseHtmlCommon(doc, node, res); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/booking.json new/kitinerary-22.04.1/src/lib/scripts/booking.json --- old/kitinerary-22.04.0/src/lib/scripts/booking.json 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/booking.json 2022-05-07 12:07:42.000000000 +0200 @@ -9,5 +9,11 @@ "filter": [ { "field": "From", "match": "@booking.com", "mimeType": "message/rfc822", "scope": "Ancestors" } ], "script": "booking.js", "function": "parseHtml" + }, + { + "mimeType": "text/html", + "filter": [ { "field": "From", "match": "@booking.com", "mimeType": "message/rfc822", "scope": "Ancestors" } ], + "script": "booking.js", + "function": "parseHtmlAlternative" } ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/eurowings.js new/kitinerary-22.04.1/src/lib/scripts/eurowings.js --- old/kitinerary-22.04.0/src/lib/scripts/eurowings.js 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/eurowings.js 2022-05-07 12:07:42.000000000 +0200 @@ -6,11 +6,11 @@ function main(text) { var reservations = new Array(); - var bookingRef = text.match(/(?:Individual reservation code|Individueller Buchungscode):\s*\*\* ([A-Z0-9]{6})/); + var bookingRef = text.match(/(?:Individual reservation code|Individueller Buchungscode):?\s*(?:\(beim Check-In angeben\))?\s*\*\* ([A-Z0-9]{6})/); var pos = 0; while (true) { - var flightLine = text.substr(pos).match(/(?:Flight|Flug): ([0-9]{2}\.[0-9]{2}\.[0-9]{4})\s*\|\s*([A-Z0-9]{2}) ([0-9]{3,4}).*\n/); + var flightLine = text.substr(pos).match(/(?:Flight|Flug): ([0-9]{2}\.[0-9]{2}\.[0-9]{4})\s*\|\s*(?:Flugnummer\:)?\s*([A-Z0-9]{2}) ([0-9]{3,4}).*\n/); if (!flightLine) break; var idx = flightLine.index + flightLine[0].length; @@ -21,20 +21,20 @@ res.reservationFor.airline.iataCode = flightLine[2]; - var opByLine = text.substr(pos + idx).match(/^\s*\* (?:operated by|durchgef??hrt von) (.*)\n/); + var opByLine = text.substr(pos + idx).match(/^\s*\* (?:[Oo]perated by|durchgef??hrt von) (.*)\n/); if (opByLine) { idx += opByLine.index + opByLine[0].length; res.reservationFor.airline.name = opByLine[1]; } - var depLine = text.substr(pos + idx).match(/(?:Departure|Abflug):\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); + var depLine = text.substr(pos + idx).match(/(?:Departure|Abflug):?\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); if (!depLine) break; idx += depLine.index + depLine[0].length; res.reservationFor.departureTime = JsonLd.toDateTime(flightLine[1] + ' ' + depLine[1], "dd.MM.yyyy hh:mm", "en"); res.reservationFor.departureAirport.name = depLine[2]; - var arrLine = text.substr(pos + idx).match(/(?:Arrival|Ankunft):\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); + var arrLine = text.substr(pos + idx).match(/(?:Arrival|Ankunft):?\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/); if (!arrLine) break; idx += arrLine.index + arrLine[0].length; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.js new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.js --- old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.js 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.js 2022-05-07 12:07:42.000000000 +0200 @@ -6,12 +6,12 @@ function main(content) { - const resId = content.match(/Buchungsnummer:(.+)/)[1] + const resId = content.match(/Buchungsnummer:\n?\s*(.+)/)[1] - const arrivalDate = content.match(/Anreisetag: (.+)/)[1] - const departureDate = content.match(/Abreisetag: (.+)/)[1] + const arrivalDate = content.match(/Anreisetag:\n? (.+)/)[1] + const departureDate = content.match(/Abreisetag:\n? (.+)/)[1] - const guestName = content.match(/Gastname: (Herr|Frau) (.+)/)[2] + const guestName = content.match(/Gastname:\n? (?:Herr|Frau)? ?(.+)/)[1] const addressBlock = content.match(/Ihr\n(.*)\n(.*)\n(.*)/) @@ -30,11 +30,11 @@ const telephone = content.match(/Tel.: (.*)/)[1] const email = content.match(/E-Mail: (.*)/)[1] - const price = content.match(/Gesamtpreis: (.*) EUR/)[1].replace(',', '.') + const price = content.match(/Gesamtpreis:\n? (.*) EUR/)[1].replace(',', '.') - const numberAdults = content.match(/Anzahl der Erwachsene[rn]: ([0-9]+)/)[1] + const numberAdults = content.match(/Anzahl der Erwachsene[rn]:\n? ([0-9]+)/)[1] - const numberChildren = content.match(/Anzahl der Kinder: ([0-9]+)/)[1] + const numberChildren = content.match(/Anzahl der Kinder:\n? ([0-9]+)/)[1] var res = JsonLd.newLodgingReservation() @@ -59,3 +59,18 @@ return res } + +function parsePkPass(pass) +{ + var res = JsonLd.newLodgingReservation(); + res.reservationFor.name = pass.organizationName; + res.checkinTime = JsonLd.toDateTime(pass.field['BGcheckin'].value.substr(0, 18), 'dd.MM.yyyy - hh:mm', 'de'); + res.checkoutTime = JsonLd.toDateTime(pass.field['BGcheckout'].value.substr(0, 18), 'dd.MM.yyyy - hh:mm', 'de'); + res.reservationFor.geo.latitude = pass.locations[0].latitude; + res.reservationFor.geo.longitude = pass.locations[0].longitude; + res.reservationFor.address.streetAddress = pass.field['address'].value; + res.reservationFor.telephone = pass.field['phone'].value; + res.reservationNumber = pass.field['bookId'].value; + res.underName.name = pass.field['guestname'].value; + return res; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.json new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.json --- old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.json 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.json 2022-05-07 12:07:42.000000000 +0200 @@ -1,4 +1,4 @@ -{ +[{ "filter": [ { "field": "From", @@ -10,4 +10,17 @@ "function": "main", "mimeType": "text/plain", "script": "onepagebooking.js" -} +}, +{ + "filter": [ + { + "field": "passTypeIdentifier", + "match": "pass.onepagebooking.com", + "mimeType": "application/vnd.apple.pkpass", + "scope": "Current" + } + ], + "function": "parsePkPass", + "mimeType": "application/vnd.apple.pkpass", + "script": "onepagebooking.js" +}] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/simplebooking.js new/kitinerary-22.04.1/src/lib/scripts/simplebooking.js --- old/kitinerary-22.04.0/src/lib/scripts/simplebooking.js 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/simplebooking.js 2022-05-07 12:07:42.000000000 +0200 @@ -18,12 +18,15 @@ res.reservationFor.geo.latitude = text.match(/Latitude:\s(-?\d+.\d+)/)[1] * 1.0; res.reservationFor.geo.longitude = text.match(/Longitude:\s(-?\d+.\d+)/)[1] * 1.0; - var addr = text.match(/Lodging information[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+Telephone: (.*?)\n.*\n*\s+Email:\s+(.*?)\n\s+Internet:\s+(.*?)\n/); + var addr = text.match(/Lodging information[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+(?:Telep|P)hone: (.*?)\n.*\n*\s+Email:\s+(.*?)\n\s+Internet:\s+(.*?)\n/); res.reservationFor.address.streetAddress = addr[2]; res.reservationFor.address.addressLocality = addr[3]; res.reservationFor.telephone = addr[4]; res.reservationFor.email = addr[5]; res.reservationFor.url = addr[6]; + const guest = text.match(/Guest data[\n\s]+Name: (.*)/); + res.underName.name = guest[1]; + return res; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/sncf.js new/kitinerary-22.04.1/src/lib/scripts/sncf.js --- old/kitinerary-22.04.0/src/lib/scripts/sncf.js 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/sncf.js 2022-05-07 12:07:42.000000000 +0200 @@ -1,9 +1,25 @@ /* - SPDX-FileCopyrightText: 2017-2019 Volker Krause <[email protected]> - + SPDX-FileCopyrightText: 2017-2022 Volker Krause <[email protected]> SPDX-License-Identifier: LGPL-2.0-or-later */ +// see https://community.kde.org/KDE_PIM/KItinerary/SNCF_Barcodes#Tariff_Codes +const tariffs = { + 'CF00': 'Ayant Droit Avec Fichet', + 'CF90': 'Ayant Droit Sans Fichet', + 'CJ11': 'Carte Jeune', + 'CW00': 'Carte Advantage Adulte', + 'CW11': 'Carte Advantage Adulte', + 'CW12': 'Carte Advantage Adulte', + 'CW25': 'Carte Advantage Adulte', + 'EF11': 'Carte Enfant+', + 'EF99': 'Carte Enfant+', + 'IR00': 'Interrail', + 'IR01': 'Interrail', + 'SE11': 'Carte Advantage Senior', + 'SR50': 'Carte Senior' +}; + function parseSncfPdfText(text) { var reservations = new Array(); var bookingRef = text.match(/(?:DOSSIER VOYAGE|BOOKING FILE REFERENCE|REFERENCE NUMBER) ?: +([A-Z0-9]{6})/); @@ -115,6 +131,7 @@ res1.reservationFor.trainNumber = barcode.substr(43, 5); res1.reservedTicket.ticketToken = "aztecCode:" + barcode; res1.reservedTicket.ticketedSeat.seatingType = barcode.substr(110, 1); + res1.programMembershipUsed.programName = tariffs[barcode.substr(111, 4)]; reservations.push(res1); if (barcode.substr(115, 1) != '0') { @@ -164,6 +181,8 @@ legs[j].reservationFor.departureStation.identifier = barcodeRes[j].reservationFor.departureStation.identifier; legs[j].reservationFor.arrivalStation.identifier = barcodeRes[j].reservationFor.arrivalStation.identifier; legs[j].reservedTicket.ticketedSeat.seatingType = barcodeRes[j].reservedTicket.ticketedSeat.seatingType; + legs[j].reservationNumber = barcodeRes[j].reservationNumber; + legs[j].programMembershipUsed = barcodeRes[j].programMembershipUsed; } reservations.push(legs[j]); } @@ -198,6 +217,7 @@ leg.underName = res.underName; leg.reservationNumber = res.reservationNumber; leg.reservedTicket = res.reservedTicket; + leg.programMembershipUsed = res.programMembershipUsed; reservations.push(leg); } @@ -224,6 +244,7 @@ leg.underName = res.underName; leg.reservationNumber = res.reservationNumber; leg.reservedTicket = res.reservedTicket; + leg.programMembershipUsed = res.programMembershipUsed; reservations.push(leg); } @@ -246,6 +267,7 @@ res.reservedTicket.ticketToken = "aztecbin:" + ByteArray.toBase64(triggerNode.content); res.underName.familyName = code.substr(116, 19); res.underName.givenName = code.substr(135, 19); + res.programMembershipUsed.programName = tariffs[code.substr(92, 4)]; var text = pdf.pages[triggerNode.location].text; var pnr = text.match(res.reservationNumber + '[^\n]* ([A-Z0-9]{6})\n'); @@ -469,3 +491,22 @@ } return reservations; } + +// see https://community.kde.org/KDE_PIM/KItinerary/SNCF_Barcodes#Carte_Advantage +function parseSncfCarte(code) { + var carte = JsonLd.newObject("ProgramMembership"); + carte.programName = tariffs[code.substr(111, 4)]; + carte.membershipNumber = code.substr(53, 17); + carte.token = 'aztec:' + code; + return carte.programName != undefined ? carte : undefined; +} + +function parseSncfCartePdf(pdf, node, barcode) { + const text = pdf.pages[barcode.location].text; + var carte = node.result[0]; + carte.member = JsonLd.newObject("Person"); + carte.member.familyName = text.match(/Nom\s*:\s*(.*)/)[1]; + carte.member.givenName = text.match(/Pr??nom\s*:\s*(.*)/)[1]; + // TODO validity period, once the data model supports that + return carte; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/sncf.json new/kitinerary-22.04.1/src/lib/scripts/sncf.json --- old/kitinerary-22.04.0/src/lib/scripts/sncf.json 2022-04-13 00:01:51.000000000 +0200 +++ new/kitinerary-22.04.1/src/lib/scripts/sncf.json 2022-05-07 12:07:42.000000000 +0200 @@ -111,5 +111,29 @@ "function": "parseOuigoConfirmation", "mimeType": "text/html", "script": "sncf.js" + }, + { + "filter": [ + { + "match": "^h0FV", + "mimeType": "text/plain", + "scope": "Current" + } + ], + "function": "parseSncfCarte", + "mimeType": "text/plain", + "script": "sncf.js" + }, + { + "filter": [ + { + "match": "^h0FV", + "mimeType": "text/plain", + "scope": "Descendants" + } + ], + "function": "parseSncfCartePdf", + "mimeType": "application/pdf", + "script": "sncf.js" } ]
