parse ambiguous type in brackets

git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@566 0924bc21-9374-b0fa-ee44-9ff1593b38f0
This commit is contained in:
andreas.schildbach@gmail.com 2011-04-16 09:26:50 +00:00
parent eeee8303a2
commit ab24e4284b
2 changed files with 26 additions and 10 deletions

View file

@ -319,7 +319,7 @@ public final class BvgProvider extends AbstractHafasProvider
private static final Pattern P_PRE_ADDRESS = Pattern.compile( private static final Pattern P_PRE_ADDRESS = Pattern.compile(
"<select[^>]*name=\"(REQ0JourneyStopsS0K|REQ0JourneyStopsZ0K|REQ0JourneyStops1\\.0K)\"[^>]*>\n(.*?)</select>", Pattern.DOTALL); "<select[^>]*name=\"(REQ0JourneyStopsS0K|REQ0JourneyStopsZ0K|REQ0JourneyStops1\\.0K)\"[^>]*>\n(.*?)</select>", Pattern.DOTALL);
private static final Pattern P_ADDRESSES = Pattern.compile("<option[^>]*>\\s*(.*?)\\s*</option>", Pattern.DOTALL); private static final Pattern P_ADDRESSES = Pattern.compile("<option[^>]*>\\s*(.*?)\\s*(?:\\[([^\\]]*)\\]\\s*)?</option>", Pattern.DOTALL);
@Override @Override
public QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date, final boolean dep, 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); final Matcher mPreAddress = P_PRE_ADDRESS.matcher(page);
while (mPreAddress.find()) while (mPreAddress.find())
{ {
final String type = mPreAddress.group(1); final String optionsType = mPreAddress.group(1);
final String options = mPreAddress.group(2); final String options = mPreAddress.group(2);
final Matcher mAddresses = P_ADDRESSES.matcher(options); final Matcher mAddresses = P_ADDRESSES.matcher(options);
final List<Location> addresses = new ArrayList<Location>(); final List<Location> addresses = new ArrayList<Location>();
while (mAddresses.find()) while (mAddresses.find())
{ {
final String address = ParserUtils.resolveEntities(mAddresses.group(1)).trim(); final String name = ParserUtils.resolveEntities(mAddresses.group(1)).trim();
if (!addresses.contains(address)) final String typeStr = ParserUtils.resolveEntities(mAddresses.group(2));
addresses.add(new Location(LocationType.ANY, 0, null, address + "!")); 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; fromAddresses = addresses;
else if (type.equals("REQ0JourneyStopsZ0K")) else if (optionsType.equals("REQ0JourneyStopsZ0K"))
toAddresses = addresses; toAddresses = addresses;
else if (type.equals("REQ0JourneyStops1.0K")) else if (optionsType.equals("REQ0JourneyStops1.0K"))
viaAddresses = addresses; viaAddresses = addresses;
else else
throw new IllegalStateException(type); throw new IllegalStateException("cannot handle: '" + optionsType + "'");
} }
if (fromAddresses != null || viaAddresses != null || toAddresses != null) if (fromAddresses != null || viaAddresses != null || toAddresses != null)

View file

@ -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) public static String resolveEntities(final CharSequence str)
{ {
@ -250,6 +250,8 @@ public final class ParserUtils
c = '"'; c = '"';
else if (namedEntity.equals("apos")) else if (namedEntity.equals("apos"))
c = '\''; c = '\'';
else if (namedEntity.equals("szlig"))
c = 'ß';
else else
throw new IllegalStateException("unknown entity: " + namedEntity); throw new IllegalStateException("unknown entity: " + namedEntity);
} }