From dc32f2ceaeda53e62986e607ec6e0a0ac292e351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 6 May 2026 13:56:53 -0400 Subject: [PATCH 1/3] JSON config > + `additional_languages` & `stop_code_cleaners` --- .../mtransit/parser/DefaultAgencyTools.java | 22 ++++++++++--------- .../parser/config/gtfs/data/AgencyConfig.kt | 10 ++++++++- .../parser/config/gtfs/data/RouteConfig.kt | 5 +++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index d860e65..e06f390 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -192,23 +192,20 @@ public void start(@NotNull String[] args) { @Override public void addSupportedLanguage(@Nullable String supportedLanguage) { - if (supportedLanguage == null) { - return; - } + if (supportedLanguage == null) return; final Locale supportedLocale = Locale.forLanguageTag(supportedLanguage); - if (this.supportedLanguages.contains(supportedLocale)) { - return; - } + if (this.supportedLanguages.contains(supportedLocale)) return; this.supportedLanguages.add(supportedLocale); } @Nullable @Override public List getSupportedLanguages() { - if (!this.supportedLanguages.isEmpty()) { + if (Configs.getAgencyConfig() != null) { + return Configs.getAgencyConfig().getAllLanguages(this.supportedLanguages); + } else { return this.supportedLanguages; } - return null; // no-op } @SuppressWarnings("WeakerAccess") @@ -1276,15 +1273,20 @@ public String cleanStopHeadSign(@NotNull String stopHeadsign) { public String getStopCode(@NotNull GStop gStop) { final String prepend = getStopCodePrependIfMissing(); //noinspection DiscouragedApi - final String stopCode = + String stopCode = Configs.getRouteConfig().getUseStopIdForStopCode() ? gStop.getStopId() : - gStop.getStopCode(); + cleanStopCode(gStop.getStopCode()); if (prepend != null && !stopCode.startsWith(prepend)) { return prepend + stopCode; } return stopCode; } + @NotNull + private String cleanStopCode(@NotNull String stopCode) { + return Configs.getRouteConfig().cleanStopCode(getFirstLanguageNN(), stopCode); + } + @Deprecated @Nullable @Override diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt index 81acfc5..8bcc88b 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt @@ -2,6 +2,7 @@ package org.mtransit.parser.config.gtfs.data import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import java.util.Locale @Serializable data class AgencyConfig( @@ -28,6 +29,8 @@ data class AgencyConfig( val originalRouteTypeId: Int = targetRouteTypeId, // REQUIRED (default to target route type ID) @SerialName("extended_target_route_type_id") val extendedTargetRouteTypeId: Int? = null, // OPTIONAL + @SerialName("additional_languages") + val additionalLanguages: List = emptyList(), // OPT-IN feature // STRINGS /** * (Optional) Default string cleaner enabled/disabled (based on language/country/field) @@ -58,4 +61,9 @@ data class AgencyConfig( val serviceIdCleanMerged: Boolean = false, // OPT-IN feature @SerialName("service_id_not_unique_allowed") val serviceIdNotUniqueAllowed: Boolean = false, // OPT-IN feature -) +) { + fun getAllLanguages(supportedLanguages: List?): List? { + supportedLanguages?.takeIf { it.isNotEmpty() } ?: return null + return supportedLanguages + additionalLanguages.map { Locale.forLanguageTag(it) } + } +} diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt index 98b1c3a..5529486 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt @@ -117,6 +117,8 @@ data class RouteConfig( val stopIdPreviousCharConfigs: List = emptyList(), @SerialName("stop_original_id_to_stop_id_configs") val stopOriginalIdToStopIdConfigs: List = emptyList(), + @SerialName("stop_code_cleaners") + val stopCodeCleaners: List = emptyList(), @SerialName("stop_code_prepend_if_missing") val stopCodePrependIfMissing: String? = null, // optional @SerialName("use_stop_id_hash_code") @@ -290,6 +292,9 @@ data class RouteConfig( fun cleanStopName(lang: Locale, stopName: String) = cleanString(lang, stopName, this.stopNameCleaners) + fun cleanStopCode(lang: Locale, stopCode: String) = + cleanString(lang, stopCode, this.stopCodeCleaners) + fun cleanStopHeadsign(gRoute: GRoute, gTrip: GTrip, @Suppress("unused") gStopTime: GStopTime, stopHeadsign: String): String { if (stopHeadsign.isEmpty()) return stopHeadsign if (stopHeadsignRemoveTripHeadsign && stopHeadsign == gTrip.tripHeadsign) { From 7591554889d4a50d64df33d6f36444e08d3b2a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 6 May 2026 14:22:53 -0400 Subject: [PATCH 2/3] PR comments --- .../mtransit/parser/DefaultAgencyTools.java | 24 ++++++++++++------- .../parser/config/gtfs/data/AgencyConfig.kt | 7 +++--- .../org/mtransit/parser/gtfs/GReader.java | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index e06f390..b23ea9d 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -188,24 +188,30 @@ public void start(@NotNull String[] args) { } @NotNull - private final List supportedLanguages = new ArrayList<>(); + private final List agencySupportedLanguages = new ArrayList<>(); + + @Nullable + private List allLanguages = null; @Override public void addSupportedLanguage(@Nullable String supportedLanguage) { if (supportedLanguage == null) return; final Locale supportedLocale = Locale.forLanguageTag(supportedLanguage); - if (this.supportedLanguages.contains(supportedLocale)) return; - this.supportedLanguages.add(supportedLocale); + if (this.agencySupportedLanguages.contains(supportedLocale)) return; + this.agencySupportedLanguages.add(supportedLocale); } @Nullable @Override public List getSupportedLanguages() { + if (this.allLanguages != null) return this.allLanguages; // cached + if (this.agencySupportedLanguages.isEmpty()) return null; // no-op if (Configs.getAgencyConfig() != null) { - return Configs.getAgencyConfig().getAllLanguages(this.supportedLanguages); + this.allLanguages = Configs.getAgencyConfig().getAllLanguages(this.agencySupportedLanguages); } else { - return this.supportedLanguages; + this.allLanguages = this.agencySupportedLanguages; } + return this.allLanguages; } @SuppressWarnings("WeakerAccess") @@ -1273,9 +1279,11 @@ public String cleanStopHeadSign(@NotNull String stopHeadsign) { public String getStopCode(@NotNull GStop gStop) { final String prepend = getStopCodePrependIfMissing(); //noinspection DiscouragedApi - String stopCode = - Configs.getRouteConfig().getUseStopIdForStopCode() ? gStop.getStopId() : - cleanStopCode(gStop.getStopCode()); + final String stopCode = + cleanStopCode( + Configs.getRouteConfig().getUseStopIdForStopCode() ? gStop.getStopId() : + gStop.getStopCode() + ); if (prepend != null && !stopCode.startsWith(prepend)) { return prepend + stopCode; } diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt index 8bcc88b..b10305a 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt @@ -62,8 +62,9 @@ data class AgencyConfig( @SerialName("service_id_not_unique_allowed") val serviceIdNotUniqueAllowed: Boolean = false, // OPT-IN feature ) { - fun getAllLanguages(supportedLanguages: List?): List? { - supportedLanguages?.takeIf { it.isNotEmpty() } ?: return null - return supportedLanguages + additionalLanguages.map { Locale.forLanguageTag(it) } + fun getAllLanguages(supportedLanguages: List): List? { + if (supportedLanguages.isEmpty()) return null + if (additionalLanguages.isEmpty()) return supportedLanguages + return (supportedLanguages + additionalLanguages.map { Locale.forLanguageTag(it) }).distinct() } } diff --git a/src/main/java/org/mtransit/parser/gtfs/GReader.java b/src/main/java/org/mtransit/parser/gtfs/GReader.java index 1cc585e..cb02091 100644 --- a/src/main/java/org/mtransit/parser/gtfs/GReader.java +++ b/src/main/java/org/mtransit/parser/gtfs/GReader.java @@ -74,7 +74,7 @@ public static GSpec readGtfsZipFile(@NotNull String gtfsDir, } try { final boolean skipDataCleanup = calendarsOnly || routeTripCalendarsOnly; - // AGENCY + // AGENCY // 1st (setup supported language) if (!calendarsOnly) { readFile(gtfsDir, GAgency.FILENAME, true, line -> processAgency(agencyTools, gSpec, line) From ab7ed2d9e07e479581729a8da44a0c2510e3e73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 6 May 2026 15:39:00 -0400 Subject: [PATCH 3/3] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/main/java/org/mtransit/parser/DefaultAgencyTools.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index b23ea9d..57f12f7 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -199,6 +199,7 @@ public void addSupportedLanguage(@Nullable String supportedLanguage) { final Locale supportedLocale = Locale.forLanguageTag(supportedLanguage); if (this.agencySupportedLanguages.contains(supportedLocale)) return; this.agencySupportedLanguages.add(supportedLocale); + this.allLanguages = null; // invalidate cached supported languages } @Nullable