Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kitinerary for openSUSE:Factory checked in at 2026-02-06 19:03:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kitinerary (Old) and /work/SRC/openSUSE:Factory/.kitinerary.new.1670 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kitinerary" Fri Feb 6 19:03:40 2026 rev:94 rq:1331275 version:25.12.2 Changes: -------- --- /work/SRC/openSUSE:Factory/kitinerary/kitinerary.changes 2026-01-12 10:20:11.630717346 +0100 +++ /work/SRC/openSUSE:Factory/.kitinerary.new.1670/kitinerary.changes 2026-02-06 19:04:35.301567606 +0100 @@ -1,0 +2,16 @@ +Tue Feb 3 10:05:45 UTC 2026 - Christophe Marin <[email protected]> + +- Update to 25.12.2 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/gear/25.12.2/ +- Changes since 25.12.1: + * Find ZXing 3.0 as well and remove pre-3.0 version workarounds + * Adapt to ZXing 3.0 BarcodeFormats API change + * Namespace ZXING_* macros + * Adapt to Poppler 26.02 API changes + * Support SNCF TER pass barcodes + * Adapt to Poppler 26.02 API removal + * Extract more information from SNCF TER barcodes + +------------------------------------------------------------------- Old: ---- kitinerary-25.12.1.tar.xz kitinerary-25.12.1.tar.xz.sig New: ---- kitinerary-25.12.2.tar.xz kitinerary-25.12.2.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kitinerary.spec ++++++ --- /var/tmp/diff_new_pack.W0Y2y5/_old 2026-02-06 19:04:36.133602574 +0100 +++ /var/tmp/diff_new_pack.W0Y2y5/_new 2026-02-06 19:04:36.133602574 +0100 @@ -18,11 +18,11 @@ %define kf6_version 6.19.0 %define qt6_version 6.9.0 -%define kpim6_version 6.6.0 +%define kpim6_version 6.6.2 %bcond_without released Name: kitinerary -Version: 25.12.1 +Version: 25.12.2 Release: 0 Summary: Data model and extraction system for travel reservations License: LGPL-2.1-or-later ++++++ kitinerary-25.12.1.tar.xz -> kitinerary-25.12.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/CMakeLists.txt new/kitinerary-25.12.2/CMakeLists.txt --- old/kitinerary-25.12.1/CMakeLists.txt 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/CMakeLists.txt 2026-02-02 17:53:57.000000000 +0100 @@ -7,10 +7,10 @@ # KDE Application Version, managed by release script set (RELEASE_SERVICE_VERSION_MAJOR "25") set (RELEASE_SERVICE_VERSION_MINOR "12") -set (RELEASE_SERVICE_VERSION_MICRO "1") +set (RELEASE_SERVICE_VERSION_MICRO "2") set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}") -set(PIM_VERSION "6.6.1") +set(PIM_VERSION "6.6.2") project(KItinerary VERSION ${PIM_VERSION}) set(QT_REQUIRED_VERSION "6.7.0") @@ -50,17 +50,19 @@ find_package(SharedMimeInfo 1.3 REQUIRED) endif() -set(KMIME_VERSION "6.6.1") -set(PIM_PKPASS "6.6.1") +set(KMIME_VERSION "6.6.2") +set(PIM_PKPASS "6.6.2") find_package(KPim6Mime ${KMIME_VERSION} CONFIG REQUIRED) find_package(KPim6PkPass ${PIM_PKPASS} CONFIG REQUIRED) find_package(Poppler COMPONENTS Core) set_package_properties("Poppler" PROPERTIES TYPE REQUIRED PURPOSE "Support for extraction from PDF booking confirmations.") -find_package(ZXing 2.0 CONFIG) -if (NOT TARGET ZXing::ZXing) - find_package(ZXing 1.1.1 CONFIG) -endif() +foreach(ver 3.0 2.0 1.1.1) + find_package(ZXing ${ver} CONFIG QUIET) + if (TARGET ZXing::ZXing) + break() + endif() +endforeach() set_package_properties("ZXing" PROPERTIES TYPE REQUIRED PURPOSE "Support for barcode decoding." URL "https://github.com/nu-book/zxing-cpp") find_package(ZLIB REQUIRED) set_package_properties("ZLIB" PROPERTIES PURPOSE "Support for decoding UIC 918-3 train tickets.") Binary files old/kitinerary-25.12.1/autotests/extractordata/sncf/20241217-ter-ticket.bin and new/kitinerary-25.12.2/autotests/extractordata/sncf/20241217-ter-ticket.bin differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/autotests/extractordata/sncf/20241217-ter-ticket.bin.json new/kitinerary-25.12.2/autotests/extractordata/sncf/20241217-ter-ticket.bin.json --- old/kitinerary-25.12.1/autotests/extractordata/sncf/20241217-ter-ticket.bin.json 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-25.12.2/autotests/extractordata/sncf/20241217-ter-ticket.bin.json 2026-02-02 17:53:57.000000000 +0100 @@ -0,0 +1,64 @@ +[ + { + "@context": "http://schema.org", + "@type": "TrainReservation", + "modifiedTime": "2024-12-17T16:38:00", + "reservationFor": { + "@type": "TrainTrip", + "arrivalStation": { + "@type": "TrainStation", + "address": { + "@type": "PostalAddress", + "addressCountry": "FR" + }, + "geo": { + "@type": "GeoCoordinates", + "latitude": 48.689701080322266, + "longitude": 6.173610210418701 + }, + "identifier": "sncf:FRENC", + "name": "FRENC" + }, + "departureDay": "2024-12-17", + "departureStation": { + "@type": "TrainStation", + "address": { + "@type": "PostalAddress", + "addressCountry": "FR" + }, + "geo": { + "@type": "GeoCoordinates", + "latitude": 48.58509826660156, + "longitude": 7.734260082244873 + }, + "identifier": "sncf:FRAEG", + "name": "FRAEG" + }, + "provider": { + "@type": "Organization", + "identifier": "uic:0087" + } + }, + "reservationNumber": "123456789", + "reservationStatus": "http://schema.org/ReservationConfirmed", + "reservedTicket": { + "@type": "Ticket", + "name": "GE PX05 DIGITAL TARI", + "priceCurrency": "EUR", + "ticketToken": "aztecbin:MjIwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMFQxMDA4NzEyMzQ1Njc4OUZSQUVHRlJFTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzE3MTIyMDI0MlBYMDVHRSBQWDA1IERJR0lUQUwgVEFSSURSQUdPTiAgICAgICAgICAgICBLT05RSSAgICAgICAgICAgICAgMTQxMDE5OTZBRFVMVEUgICAgMDEgICAgICAgICAgMDAxNzEyMjAyNDE3MTIyMDI0MDAwMDAwMDAwMDAwMTcxMjIwMjQxNjM4MDAwMDAwMzEzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA=", + "ticketedSeat": { + "@type": "Seat", + "seatingType": "2" + }, + "totalPrice": 31.3, + "validFrom": "2024-12-17T00:00:00", + "validUntil": "2024-12-17T00:00:00" + }, + "underName": { + "@type": "Person", + "familyName": "DRAGON", + "givenName": "KONQI", + "name": "KONQI DRAGON" + } + } +] Binary files old/kitinerary-25.12.1/autotests/extractordata/sncf/20250224-ter-zone-pass.bin and new/kitinerary-25.12.2/autotests/extractordata/sncf/20250224-ter-zone-pass.bin differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/autotests/extractordata/sncf/20250224-ter-zone-pass.bin.json new/kitinerary-25.12.2/autotests/extractordata/sncf/20250224-ter-zone-pass.bin.json --- old/kitinerary-25.12.1/autotests/extractordata/sncf/20250224-ter-zone-pass.bin.json 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-25.12.2/autotests/extractordata/sncf/20250224-ter-zone-pass.bin.json 2026-02-02 17:53:57.000000000 +0100 @@ -0,0 +1,23 @@ +[ + { + "@context": "http://schema.org", + "@type": "Ticket", + "name": "ALS ZU03 DIGITAL ALS", + "priceCurrency": "EUR", + "ticketNumber": "123456789", + "ticketToken": "aztecbin:MjIwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMFQ1MDA4NzEyMzQ1Njc4OSAgICAgICAgICAgICAgIFpPTkUgVVJCQUlORSBERSBTRUxFU1RBVCBaT05FIFVSQkFJTkUgREUgU0VMRVNUQVQgQTI0MDIyMDI1MlpVMDNBTFMgWlUwMyBESUdJVEFMIEFMU0RSQUdPTiAgICAgICAgICAgICBLT05RSSAgICAgICAgICAgICAgMTQxMDE5OTZBRFVMVEUgICAgMDEgICAgICAgICAgMDAyNDAyMjAyNTI1MDIyMDI1MDAwMDAwMDAwMDAwMjQwMjIwMjUxNjQ2MDAwMDAwMDM2MEFMU0FQTFVTIDI0SEVVUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA=", + "ticketedSeat": { + "@type": "Seat", + "seatingType": "2" + }, + "totalPrice": 3.6, + "underName": { + "@type": "Person", + "familyName": "DRAGON", + "givenName": "KONQI", + "name": "KONQI DRAGON" + }, + "validFrom": "2025-02-24T00:00:00", + "validUntil": "2025-02-25T00:00:00" + } +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/cli/org.kde.kitinerary-extractor.appdata.xml new/kitinerary-25.12.2/src/cli/org.kde.kitinerary-extractor.appdata.xml --- old/kitinerary-25.12.1/src/cli/org.kde.kitinerary-extractor.appdata.xml 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/cli/org.kde.kitinerary-extractor.appdata.xml 2026-02-02 17:53:57.000000000 +0100 @@ -131,6 +131,7 @@ </categories> <launchable type="desktop-id">org.kde.kitinerary-extractor.desktop</launchable> <releases> + <release version="6.6.2" date="2026-02-05"/> <release version="6.6.1" date="2026-01-08"/> <release version="6.6.0" date="2025-12-11"/> <release version="6.5.3" date="2025-11-06"/> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/barcodedecoder.cpp new/kitinerary-25.12.2/src/lib/barcodedecoder.cpp --- old/kitinerary-25.12.1/src/lib/barcodedecoder.cpp 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/barcodedecoder.cpp 2026-02-02 17:53:57.000000000 +0100 @@ -147,7 +147,7 @@ BarcodeDecoder::BarcodeType type; ZXing::BarcodeFormat zxingType; } static constexpr const zxing_format_map[] = { -#if ZXING_VERSION > QT_VERSION_CHECK(1, 1, 1) +#if KZXING_VERSION > QT_VERSION_CHECK(1, 1, 1) { BarcodeDecoder::Aztec, ZXing::BarcodeFormat::Aztec }, { BarcodeDecoder::QRCode, ZXing::BarcodeFormat::QRCode }, { BarcodeDecoder::PDF417, ZXing::BarcodeFormat::PDF417 }, @@ -166,13 +166,21 @@ #endif }; -static auto typeToFormats(BarcodeDecoder::BarcodeTypes types) +static ZXing::BarcodeFormats typeToFormats(BarcodeDecoder::BarcodeTypes types) { +#if KZXING_VERSION <QT_VERSION_CHECK(3, 0, 0) ZXing::BarcodeFormats formats; +#else + std::vector<ZXing::BarcodeFormat> formats; +#endif for (auto i : zxing_format_map) { if (types & i.type) { +#if KZXING_VERSION < QT_VERSION_CHECK(3, 0, 0) formats |= i.zxingType; +#else + formats.push_back(i.zxingType); +#endif } } return formats; @@ -194,7 +202,7 @@ case QImage::Format_ARGB32: case QImage::Format_RGB32: #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) return ZXing::ImageFormat::RGBA; #else return ZXing::ImageFormat::RGBX; @@ -206,7 +214,7 @@ return ZXing::ImageFormat::RGB; case QImage::Format_RGBX8888: case QImage::Format_RGBA8888: -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) return ZXing::ImageFormat::RGBA; #else return ZXing::ImageFormat::RGBX; @@ -224,14 +232,14 @@ return ZXing::ImageView{img.bits(), img.width(), img.height(), zxingImageFormat(img.format()), static_cast<int>(img.bytesPerLine())}; } -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) static void applyZXingResult(BarcodeDecoder::Result &result, const ZXing::Barcode &zxingResult, BarcodeDecoder::BarcodeTypes format) #else static void applyZXingResult(BarcodeDecoder::Result &result, const ZXing::Result &zxingResult, BarcodeDecoder::BarcodeTypes format) #endif { if (zxingResult.isValid()) { -#if ZXING_VERSION >= QT_VERSION_CHECK(1, 4, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(1, 4, 0) // detect content type std::string zxUtf8Text; if (zxingResult.contentType() == ZXing::ContentType::Text) { @@ -286,7 +294,7 @@ return; } -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) ZXing::ReaderOptions hints; #else ZXing::DecodeHints hints; @@ -296,9 +304,9 @@ hints.setIsPure((hint & BarcodeDecoder::IgnoreAspectRatio) == 0); // convert if img is in a format ZXing can't handle directly -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) ZXing::Barcode res; -#elif ZXING_VERSION > QT_VERSION_CHECK(1, 3, 0) +#elif KZXING_VERSION > QT_VERSION_CHECK(1, 3, 0) ZXing::Result res; #else ZXing::Result res(ZXing::DecodeStatus::NotFound); @@ -314,12 +322,12 @@ void BarcodeDecoder::decodeMultiIfNeeded(const QImage &img, BarcodeDecoder::BarcodeTypes hint, std::vector<BarcodeDecoder::Result> &results) const { -#if ZXING_VERSION > QT_VERSION_CHECK(1, 2, 0) +#if KZXING_VERSION > QT_VERSION_CHECK(1, 2, 0) if (std::any_of(results.begin(), results.end(), [hint](const auto &r) { return (r.positive & hint) || ((r.negative & hint) == hint); })) { return; } -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) ZXing::ReaderOptions hints; #else ZXing::DecodeHints hints; @@ -329,7 +337,7 @@ hints.setIsPure(false); // convert if img is in a format ZXing can't handle directly -#if ZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) +#if KZXING_VERSION >= QT_VERSION_CHECK(2, 3, 0) std::vector<ZXing::Barcode> zxingResults; #else std::vector<ZXing::Result> zxingResults; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/config-kitinerary.h.in new/kitinerary-25.12.2/src/lib/config-kitinerary.h.in --- old/kitinerary-25.12.1/src/lib/config-kitinerary.h.in 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/config-kitinerary.h.in 2026-02-02 17:53:57.000000000 +0100 @@ -14,11 +14,12 @@ #define KPOPPLER_VERSION_PATCH @POPPLER_VERSION_PATCH@ #define KPOPPLER_VERSION ((@POPPLER_VERSION_MAJOR@<<16)|(@POPPLER_VERSION_MINOR@<<8)|(@POPPLER_VERSION_PATCH@)) -#define ZXING_VERSION_STRING "@ZXing_VERSION@" -#define ZXING_VERSION_MAJOR @ZXing_VERSION_MAJOR@ -#define ZXING_VERSION_MINOR @ZXing_VERSION_MINOR@ -#define ZXING_VERSION_PATCH @ZXing_VERSION_PATCH@ -#define ZXING_VERSION ((@ZXing_VERSION_MAJOR@<<16)|(@ZXing_VERSION_MINOR@<<8)|(@ZXing_VERSION_PATCH@)) +// namespaced to not clash with the ZXING_* macros of zxing itself +#define KZXING_VERSION_STRING "@ZXing_VERSION@" +#define KZXING_VERSION_MAJOR @ZXing_VERSION_MAJOR@ +#define KZXING_VERSION_MINOR @ZXing_VERSION_MINOR@ +#define KZXING_VERSION_PATCH @ZXing_VERSION_PATCH@ +#define KZXING_VERSION ((KZXING_VERSION_MAJOR<<16)|(KZXING_VERSION_MINOR<<8)|(KZXING_VERSION_PATCH)) #cmakedefine01 HAVE_LIBXML2 #cmakedefine01 HAVE_PHONENUMBER diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/extractorcapabilities.cpp new/kitinerary-25.12.2/src/lib/extractorcapabilities.cpp --- old/kitinerary-25.12.1/src/lib/extractorcapabilities.cpp 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/extractorcapabilities.cpp 2026-02-02 17:53:57.000000000 +0100 @@ -35,7 +35,7 @@ "iCal support : kcal (" KCALENDARCORE_VERSION_STRING ")\n" - "Barcode decoder : ZXing (" ZXING_VERSION_STRING ")\n" + "Barcode decoder : ZXing (" KZXING_VERSION_STRING ")\n" "Phone number decoder: " #if HAVE_PHONENUMBER diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/pdf/pdfdocument.cpp new/kitinerary-25.12.2/src/lib/pdf/pdfdocument.cpp --- old/kitinerary-25.12.1/src/lib/pdf/pdfdocument.cpp 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/pdf/pdfdocument.cpp 2026-02-02 17:53:57.000000000 +0100 @@ -385,8 +385,12 @@ std::unique_ptr<PdfDocument> doc(new PdfDocument(parent)); doc->d->m_pdfData = data; // PDFDoc takes ownership of stream +#if KPOPPLER_VERSION < QT_VERSION_CHECK(26, 1, 90) auto stream = new MemStream(const_cast<char*>(doc->d->m_pdfData.constData()), 0, doc->d->m_pdfData.size(), Object()); - std::unique_ptr<PDFDoc> popplerDoc(new PDFDoc(stream)); +#else + auto stream = std::make_unique<MemStream>(const_cast<char*>(doc->d->m_pdfData.constData()), 0, doc->d->m_pdfData.size(), Object()); +#endif + auto popplerDoc = std::make_unique<PDFDoc>(std::move(stream)); if (!popplerDoc->isOk()) { qCWarning(Log) << "Got invalid PDF document!" << popplerDoc->getErrorCode(); return nullptr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/pdf/pdfextractoroutputdevice.cpp new/kitinerary-25.12.2/src/lib/pdf/pdfextractoroutputdevice.cpp --- old/kitinerary-25.12.1/src/lib/pdf/pdfextractoroutputdevice.cpp 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/pdf/pdfextractoroutputdevice.cpp 2026-02-02 17:53:57.000000000 +0100 @@ -313,3 +313,24 @@ PdfLink l(QString::fromStdString(uriLink->getURI()), QRectF(QPointF(std::min(xu1, xu2), std::min(yu1, yu2)), QPointF(std::max(xu1, xu2), std::max(yu1, yu2)))); m_links.push_back(std::move(l)); } + +#if KPOPPLER_VERSION >= QT_VERSION_CHECK(26, 1, 90) +void PdfExtractorOutputDevice::setDefaultCTM(const std::array<double, 6> &ctm) +{ + TextOutputDev::setDefaultCTM(ctm); + + const double det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + m_defICTM[0] = ctm[3] * det; + m_defICTM[1] = -ctm[1] * det; + m_defICTM[2] = -ctm[2] * det; + m_defICTM[3] = ctm[0] * det; + m_defICTM[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + m_defICTM[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; +} + +void PdfExtractorOutputDevice::cvtDevToUser(double dx, double dy, double *ux, double *uy) const +{ + *ux = m_defICTM[0] * dx + m_defICTM[2] * dy + m_defICTM[4]; + *uy = m_defICTM[1] * dx + m_defICTM[3] * dy + m_defICTM[5]; +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/pdf/pdfextractoroutputdevice_p.h new/kitinerary-25.12.2/src/lib/pdf/pdfextractoroutputdevice_p.h --- old/kitinerary-25.12.1/src/lib/pdf/pdfextractoroutputdevice_p.h 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/pdf/pdfextractoroutputdevice_p.h 2026-02-02 17:53:57.000000000 +0100 @@ -25,6 +25,10 @@ public: explicit PdfExtractorOutputDevice(); +#if KPOPPLER_VERSION >= QT_VERSION_CHECK(26, 1, 90) + void setDefaultCTM(const std::array<double, 6> &ctm) override; +#endif + // call once displaying has been completed void finalize(); @@ -61,6 +65,13 @@ // extracted links std::vector<PdfLink> m_links; + +private: +#if KPOPPLER_VERSION >= QT_VERSION_CHECK(26, 1, 90) + // removed in Poppler 26.02 + void cvtDevToUser(double dx, double dy, double *ux, double *uy) const; + std::array<double, 6> m_defICTM; +#endif }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-25.12.1/src/lib/scripts/sncf.js new/kitinerary-25.12.2/src/lib/scripts/sncf.js --- old/kitinerary-25.12.1/src/lib/scripts/sncf.js 2026-01-06 17:29:40.000000000 +0100 +++ new/kitinerary-25.12.2/src/lib/scripts/sncf.js 2026-02-02 17:53:57.000000000 +0100 @@ -291,8 +291,18 @@ res.underName.familyName = code.substr(116, 19); res.underName.givenName = code.substr(135, 19); res.programMembershipUsed.programName = tariffs[code.substr(92, 4)]; + res.reservedTicket.name = code.substr(96, 20); + res.reservedTicket.validFrom = JsonLd.toDateTime(code.substr(186, 8), "ddMMyyyy", "fr"); + res.reservedTicket.validUntil = JsonLd.toDateTime(code.substr(194, 8), "ddMMyyyy", "fr"); + res.modifiedTime = JsonLd.toDateTime(code.substr(214, 12), "ddMMyyyyHHmm", "fr"); res.reservedTicket.totalPrice = code.substr(226, 10) / 100; res.reservedTicket.priceCurrency = 'EUR'; + if (code.substr(82, 1) == 'A') { + let ticket = res.reservedTicket; + ticket.underName = res.underName; + ticket.issuer = res.reservationFor.provider; + return ticket; + } return res; }
