From 76bd8dcbf7904bcbfdd2b2508e024747e81fc0c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Tue, 24 Feb 2026 21:28:18 -0500 Subject: [PATCH 1/3] Config > + "direction_headsign_remove_route_[short_name/desc]" & "stop_code_prepend_if_missing" --- .../mtransit/parser/DefaultAgencyTools.java | 36 +++++++++++++++---- .../parser/config/gtfs/data/RouteConfig.kt | 6 ++++ .../mtransit/parser/gtfs/GAgencyTools.java | 6 ++++ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index 38c3741d..e387a47e 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -811,18 +811,33 @@ public boolean removeRouteLongNameFromDirectionHeadsign() { return Configs.getRouteConfig().getDirectionHeadsignRemoveRouteLongName(); } + @Override + public boolean removeRouteShortNameFromDirectionHeadsign() { + return Configs.getRouteConfig().getDirectionHeadsignRemoveRouteShortName(); + } + + @Override + public boolean removeRouteDescFromDirectionHeadsign() { + return Configs.getRouteConfig().getDirectionHeadsignRemoveRouteDesc(); + } + /** * @param directionId {@link org.mtransit.parser.gtfs.data.GDirectionId} (0 or 1 or missing/generated) */ @Override public @NotNull String cleanDirectionHeadsign(@Nullable GRoute gRoute, int directionId, boolean fromStopName, @NotNull String directionHeadSign) { - if (gRoute != null && removeRouteLongNameFromDirectionHeadsign() - && directionHeadSign.equals(gRoute.getRouteLongNameOrDefault())) { - //noinspection deprecation - return cleanDirectionHeadsign(directionId, fromStopName, ""); + if (gRoute != null) { + if (removeRouteLongNameFromDirectionHeadsign() && directionHeadSign.equals(gRoute.getRouteLongNameOrDefault())) { + directionHeadSign = ""; + } else if (removeRouteShortNameFromDirectionHeadsign() && directionHeadSign.equals(gRoute.getRouteShortName())) { + directionHeadSign = ""; + } else if (removeRouteDescFromDirectionHeadsign() && directionHeadSign.equals(gRoute.getRouteDescOrDefault())) { + directionHeadSign = ""; + } } //noinspection deprecation - return cleanDirectionHeadsign(directionId, fromStopName, directionHeadSign); + directionHeadSign = cleanDirectionHeadsign(directionId, fromStopName, directionHeadSign); + return directionHeadSign; } @SuppressWarnings("DeprecatedIsStillUsed") @@ -840,7 +855,8 @@ public String cleanDirectionHeadsign(int directionId, boolean fromStopName, @Not @NotNull @Override public String cleanDirectionHeadsign(boolean fromStopName, @NotNull String directionHeadSign) { - return cleanTripHeadsign(directionHeadSign); + directionHeadSign = cleanTripHeadsign(directionHeadSign); + return directionHeadSign; } @Override @@ -1164,9 +1180,17 @@ public String cleanStopHeadSign(@NotNull String stopHeadsign) { return cleanTripHeadsign(cleanStopHeadsign); } + @Override + public @Nullable String getStopCodePrependIfMissing() { + return Configs.getRouteConfig().getStopCodePrependIfMissing(); + } + @NotNull @Override public String getStopCode(@NotNull GStop gStop) { + if (getStopCodePrependIfMissing() != null && !gStop.getStopCode().startsWith(getStopCodePrependIfMissing())) { + return getStopCodePrependIfMissing() + gStop.getStopCode(); + } return gStop.getStopCode(); } 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 afd64780..c584705e 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 @@ -58,6 +58,10 @@ data class RouteConfig( val directionHeadsignCleaners: List = emptyList(), @SerialName("direction_headsign_remove_route_long_name") val directionHeadsignRemoveRouteLongName: Boolean = false, // OPT-IN feature + @SerialName("direction_headsign_remove_route_short_name") + val directionHeadsignRemoveRouteShortName: Boolean = false, // OPT-IN feature + @SerialName("direction_headsign_remove_route_desc") + val directionHeadsignRemoveRouteDesc: Boolean = false, // OPT-IN feature @SerialName("direction_splitter_enabled") val directionSplitterEnabled: Boolean = false, // OPT-IN feature @SerialName("direction_finder_enabled") @@ -73,6 +77,8 @@ data class RouteConfig( val useStopCodeForStopId: Boolean = false, // OPT-IN feature @SerialName("stop_code_to_stop_id_configs") val stopCodeToStopIdConfigs: List = emptyList(), + @SerialName("stop_code_prepend_if_missing") + val stopCodePrependIfMissing: String? = null, // optional @SerialName("stop_headsign_remove_trip_headsign") val stopHeadsignRemoveTripHeadsign: Boolean = false, // OPT-IN feature @SerialName("stop_headsign_remove_route_long_name") diff --git a/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java b/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java index 92bbac05..334b15a3 100644 --- a/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java +++ b/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java @@ -197,6 +197,10 @@ public interface GAgencyTools { boolean removeRouteLongNameFromDirectionHeadsign(); + boolean removeRouteShortNameFromDirectionHeadsign(); + + boolean removeRouteDescFromDirectionHeadsign(); + @NotNull String cleanDirectionHeadsign(@Nullable GRoute gRoute, int directionId, boolean fromStopName, @NotNull String directionHeadSign); @@ -301,6 +305,8 @@ public interface GAgencyTools { @NotNull String cleanStopHeadSign(@NotNull String stopHeadsign); + @Nullable String getStopCodePrependIfMissing(); + @NotNull String getStopCode(@NotNull GStop gStop); From 4bcfed6a30d7732f5679a0bd3768543937eff83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 25 Feb 2026 08:00:09 -0500 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/main/java/org/mtransit/parser/DefaultAgencyTools.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index e387a47e..32bbeaa6 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -1188,8 +1188,9 @@ public String cleanStopHeadSign(@NotNull String stopHeadsign) { @NotNull @Override public String getStopCode(@NotNull GStop gStop) { - if (getStopCodePrependIfMissing() != null && !gStop.getStopCode().startsWith(getStopCodePrependIfMissing())) { - return getStopCodePrependIfMissing() + gStop.getStopCode(); + final String prepend = getStopCodePrependIfMissing(); + if (prepend != null && !gStop.getStopCode().startsWith(prepend)) { + return prepend + gStop.getStopCode(); } return gStop.getStopCode(); } From 1788d94004cfd637c06f14c97a7318ed8179a4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 25 Feb 2026 08:06:02 -0500 Subject: [PATCH 3/3] + `direction_types` --- src/main/java/org/mtransit/parser/DefaultAgencyTools.java | 3 +++ .../java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index 32bbeaa6..e1c61204 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -930,6 +930,9 @@ public int getDirectionType() { @NotNull @Override public List getDirectionTypes() { + if (!Configs.getRouteConfig().getDirectionTypes().isEmpty()) { + return Configs.getRouteConfig().getDirectionTypes(); + } //noinspection deprecation final int deprecatedDirectionType = getDirectionType(); if (deprecatedDirectionType != -1 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 c584705e..926855ec 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 @@ -54,6 +54,8 @@ data class RouteConfig( @SerialName("trip_id_clean_merged") val tripIdCleanMerged: Boolean = false, // OPT-IN feature // DIRECTION + @SerialName("direction_types") + val directionTypes: List = emptyList(), @SerialName("direction_headsign_cleaners") val directionHeadsignCleaners: List = emptyList(), @SerialName("direction_headsign_remove_route_long_name")