diff --git a/src/de/schildbach/pte/BvgProvider.java b/src/de/schildbach/pte/BvgProvider.java index 1e71d0ae..4993883f 100644 --- a/src/de/schildbach/pte/BvgProvider.java +++ b/src/de/schildbach/pte/BvgProvider.java @@ -319,7 +319,7 @@ public final class BvgProvider extends AbstractHafasProvider private static final Pattern P_PRE_ADDRESS = Pattern.compile( "]*name=\"(REQ0JourneyStopsS0K|REQ0JourneyStopsZ0K|REQ0JourneyStops1\\.0K)\"[^>]*>\n(.*?)", Pattern.DOTALL); - private static final Pattern P_ADDRESSES = Pattern.compile("]*>\\s*(.*?)\\s*", Pattern.DOTALL); + private static final Pattern P_ADDRESSES = Pattern.compile("]*>\\s*(.*?)\\s*(?:\\[([^\\]]*)\\]\\s*)?", Pattern.DOTALL); @Override public QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date, final boolean dep, @@ -335,26 +335,40 @@ public final class BvgProvider extends AbstractHafasProvider final Matcher mPreAddress = P_PRE_ADDRESS.matcher(page); while (mPreAddress.find()) { - final String type = mPreAddress.group(1); + final String optionsType = mPreAddress.group(1); final String options = mPreAddress.group(2); final Matcher mAddresses = P_ADDRESSES.matcher(options); final List addresses = new ArrayList(); while (mAddresses.find()) { - final String address = ParserUtils.resolveEntities(mAddresses.group(1)).trim(); - if (!addresses.contains(address)) - addresses.add(new Location(LocationType.ANY, 0, null, address + "!")); + final String name = ParserUtils.resolveEntities(mAddresses.group(1)).trim(); + final String typeStr = ParserUtils.resolveEntities(mAddresses.group(2)); + final LocationType type; + if (typeStr == null) + type = LocationType.ANY; + else if ("Haltestelle".equals(typeStr)) + type = LocationType.STATION; + else if ("Sonderziel".equals(typeStr)) + type = LocationType.POI; + else if ("Straße Hausnummer".equals(typeStr)) + type = LocationType.ADDRESS; + else + throw new IllegalStateException("cannot handle: '" + typeStr + "'"); + + final Location location = new Location(type, 0, null, name + "!"); + if (!addresses.contains(location)) + addresses.add(location); } - if (type.equals("REQ0JourneyStopsS0K")) + if (optionsType.equals("REQ0JourneyStopsS0K")) fromAddresses = addresses; - else if (type.equals("REQ0JourneyStopsZ0K")) + else if (optionsType.equals("REQ0JourneyStopsZ0K")) toAddresses = addresses; - else if (type.equals("REQ0JourneyStops1.0K")) + else if (optionsType.equals("REQ0JourneyStops1.0K")) viaAddresses = addresses; else - throw new IllegalStateException(type); + throw new IllegalStateException("cannot handle: '" + optionsType + "'"); } if (fromAddresses != null || viaAddresses != null || toAddresses != null) diff --git a/src/de/schildbach/pte/util/ParserUtils.java b/src/de/schildbach/pte/util/ParserUtils.java index 41bd5ec1..56770c42 100644 --- a/src/de/schildbach/pte/util/ParserUtils.java +++ b/src/de/schildbach/pte/util/ParserUtils.java @@ -220,7 +220,7 @@ public final class ParserUtils } } - private static final Pattern P_ENTITY = Pattern.compile("&(?:#(x[\\da-f]+|\\d+)|(amp|quot|apos));"); + private static final Pattern P_ENTITY = Pattern.compile("&(?:#(x[\\da-f]+|\\d+)|(amp|quot|apos|szlig));"); public static String resolveEntities(final CharSequence str) { @@ -250,6 +250,8 @@ public final class ParserUtils c = '"'; else if (namedEntity.equals("apos")) c = '\''; + else if (namedEntity.equals("szlig")) + c = 'ß'; else throw new IllegalStateException("unknown entity: " + namedEntity); }