# Copyright 2018, University of Freiburg
# Chair of Algorithms and Datastructures
# Authors: Patrick Brosi <brosi@informatik.uni-freiburg.de>

[rail]

# OSM entities to keep on different levels, as k=v. Applies
# to nodes, edges and relations.
# Nodes included in kept ways are always kept.
# Ways included in kept relations are always kept.

osm_filter_keep:
	railway=rail
	railway=light_rail
	railway=narrow_gauge
	route=rail
	route=train
	public_transport=stop_area|rel_flat

osm_filter_lvl1:
	usage=branch

osm_filter_lvl2:

osm_filter_lvl3:
	service=crossover
	service=siding
	# we cannot completely drop service=yard, because it is often used
	# incorrectly for crossovers
	service=yard

osm_filter_lvl4:

osm_filter_lvl5:
	usage=industrial
	usage=military
	usage=test
	service=spur
	railway:traffic_mode=freight

# OSM entities to drop, as k=v. Applies to nodes, edges and
# relations.
# Nodes included in non-dropped ways are kept regardless of
# a matching drop filter.
# Ways included in non-dropped relations are kept regardless of
# a matching drop filter.

osm_filter_drop:
	railway=abandoned
	railway=construction
	railway=disused
	railway=miniature
	railway=signal
	railway=razed
	railway=proposed
	metro=yes
	area=yes
	# access=no
	type=multipolygon
	railway=platform
	public_transport=platform
	building=yes
	building=train_station
	amenity=shelter
	amenity=bus_station
	building=roof

# Nodes that should act as "no-hup" nodes. These are nodes
# that are contained in multiple ways, but cannot be used
# to switch from one way to another (for example, a
# track crossing in rail networks)

osm_filter_nohup:
	railway:switch=no
	railway=railway_crossing

# Edges that should act as one-way nodes.

osm_filter_oneway:
	oneway=yes
	railway:preferred_direction=forward

osm_filter_oneway_reverse:
	railway:preferred_direction=backward

# Edges that may explicitely be used in
# both directions. May be used to set exception
# to "osm_filter_oneway"

osm_filter_undirected:
	oneway=false
	oneway=no
	oneway=-1
	railway:preferred_direction=both
	railway:bidirectional=regular

# Nodes that are stations.
# Only nodes that have been kept during the filtering above will be
# checked.
osm_filter_station:
	public_transport=stop_position
	railway=stop
	railway=halt
	railway=station
	#railway=tram_stop
	railway=subway_stop
	tram_stop=*
	stop=*

# Relation fields that should be used for catching the lines that
# occur on an edge. Only relations that have been kept during the
# filtering above will be checked. The 'linename' will be normalized
# according to the rules in line_normalization_chain.
# The 'from_name' and 'to_name' will be normalized according to the
# rules in station_normalization_chain.
# The relations tags are given in the order of their relevance -
# the first normalized tag-value that is not null/empty will be
# taken.
osm_line_relation_tags:

# attr name together with the
# max distance in meters between any of the groups members and
# a potential new member
# first matching rule will be taken
# only applies to nodes that match osm_filter_station!
osm_station_group_attrs:
	uic_ref=500
	wikidata=500
	[public_transport=stop_area]uic_ref=500
	[public_transport=stop_area]wikidata=500
	name=100
	[public_transport=stop_area]name=100

# max distance in meters between a snapped station position and the
# original station position
osm_max_snap_distance:	10, 100, 200

# max edge level to which station will be snapped
osm_max_snap_level: 2

# sorted by priority, first found attr will be taken
osm_station_name_attrs:
	name
	[public_transport=stop_area]name
	uic_name

# the track number tag in edges, first match is taken
osm_edge_track_number_tags:
	railway:track_ref
	local_ref
	ref

# the track number tag in stop nodes, first match is taken,
# overwrites osm_edge_track_number_tags
osm_track_number_tags:
	local_ref
	ref

routing_lvl0_fac:	1  # default level
routing_lvl1_fac:	1.25
routing_lvl2_fac:	1.5
routing_lvl3_fac:	2
routing_lvl4_fac:	2.5
routing_lvl5_fac:	3.5
routing_lvl6_fac:	5
routing_lvl7_fac:	7

# Punishment (in meters) to add to the distance
# function if a vehicle performans a full turn
routing_full_turn_punish:			3000

routing_station_distance_punish_fac: 3.14

routing_non_osm_station_punish:		100

routing_platform_unmatched_punish:	2000

# Max angle that should be counted as a full turn
routing_full_turn_angle:			100

# Max angle in a route from a station to an already reachable neighbar
routing_snap_full_turn_angle:	100

# Punishment (in meters) to add to the distance
# function if a vehicle passes a station node without
# stopping there
routing_pass_thru_station_punish:   100

# Punishment factor for every meter a vehicle
# travels through a one-way edge
routing_one_way_meter_punish_fac:   1

# Punishment factor for every meter a vehicle
# travels through an edge without any matching line
# information
routing_line_unmatched_punish_fac:  1

# special line normalization for trains
line_normalize_chain:
	, -> ' ';
	- -> ' ';
	_ -> ' ';
	" -> '';
	' -> '';
	` -> '';
	/ -> ' ';
	< -> ' ';
	> -> ' ';
	& -> '+';
	ä -> ae;
	ö -> oe;
	ü -> ue;
	ß -> ss;
	è -> e;
	é -> e;
	á -> a;
	à -> a;
	ó -> o;
	ò -> o;
	í -> i;
	ú -> u;
	ù -> u;
	ë -> e;
	ç -> c;
	å -> ae;
	â -> a;
	ê -> e;
	ï -> i;
	œ -> oe;
	ø -> oe;
	^line -> '';
	^linie -> '';
	^metro -> '';
	^tram -> '';
	^strassenbahn -> '';
	^bus -> '';

	# delete everything in brackets
	\(.+\) -> ' ';
	\[.+\] -> ' ';

	# whitespace
	\s+ -> ' ';
	^\s -> '';
	\s$ -> '';

	# line/number combs ALWAYS with whitespace (ICE101 -> ICE 101)
	^([a-zA-Z]+)([0-9]+)$ -> \1 \2;

	# if a character line number is present, delete the numeric part
	^([a-zA-Z]+) [0-9]+$ -> \1;

[bus]

# OSM entities to keep on different levels, as k=v. Applies
# to nodes, edges and relations.
# Nodes included in kept ways are always kept.
# Ways included in kept relations are always kept.

osm_filter_keep:
	# highways
	highway=motorway
	highway=trunk
	highway=primary
	highway=secondary
	highway=tertiary
	highway=residential
	highway=living_street
	highway=unclassified

	# highway links
	highway=motorway_link
	highway=trunk_link
	highway=primary_link
	highway=secondary_link
	highway=tertiary_link
	highway=residential_link

	way=primary
	way=seconday
	way=bus_guideway
	highway=bus_guideway
	busway=*
	psv=yes
	psv=designated

	trolley_wire=yes
	trolleywire=yes
	trolleybus=yes
	trolley_bus=yes

	route=bus
	route=trolleybus
	bus=yes
	bus=designated
	minibus=designated
	minibus=yes

	public_transport=stop_position
	bus_stop=*
	stop=*
	highway=bus_stop
	amenity=bus_station|no_match_ways|no_match_rels

	# relations for the restriction system
	type=restriction
	type=restriction:bus
	type=restriction:motorcar

osm_filter_lvl1:
	highway=secondary
	highway=secondary_link
	bus=yes
	bus=designated
	minibus=yes
	minibus=designated
	psv=designated
	psv=yes
	access=psv
	access=bus
	trolley_wire=yes
	trolleywire=yes
	trolleybus=yes
	trolley_bus=yes
	psv=designated

osm_filter_lvl2:
	highway=tertiary
	highway=tertiary_link

osm_filter_lvl3:
	highway=unclassified
	highway=residential
	highway=road

osm_filter_lvl4:
	highway=living_street
	highway=pedestrian
	highway=service
	psv=no

osm_filter_lvl5:
	bus=no
	service=siding
	access=permissive
	access=private
	access=no
	service=parking_aisle
	highway=footway

# OSM entities to drop, as k=v. Applies to nodes, edges and
# relations.
# Nodes included in non-dropped ways are kept regardless of
# a matching drop filter.
# Ways included in non-dropped relations are kept regardless of
# a matching drop filter.

osm_filter_drop:
	area=yes
	train=yes|no_match_ways
	# access=no
	public_transport=stop_area|no_match_nds|no_match_rels
	type=multipolygon
	railway=platform
	railway=station
	# service=parking_aisle
	highway=proposed
	highway=footway
	highway=construction
	building=yes
	building=train_station
	leisure=garden
	leisure=park

# Nodes that should act as "no-hup" nodes. These are nodes
# that are contained in multiple ways, but cannot be used
# to switch from one way to another (for example, a
# track crossing in rail networks)

osm_filter_nohup:

# Configuration of the OSM road restriction system
# We only support restriction with a single via node
# atm

osm_node_negative_restriction:
	restriction=no_right_turn
	restriction=no_left_turn
	restriction=no_u_turn
	restriction=no_straight_on
	restriction:bus=no_right_turn
	restriction:bus=no_left_turn
	restriction:bus=no_u_turn
	restriction:bus=no_straight_on

osm_node_positive_restriction:
	restriction=only_left_turn
	restriction=only_straight_on
	restriction=only_right_turn
	restriction:bus=only_left_turn
	restriction:bus=only_straight_on
	restriction:bus=only_right_turn

osm_filter_no_restriction:
	except=psv|mult_val_match
	except=bus|mult_val_match

# Edges that should act as one-way nodes.

osm_filter_oneway:
	junction=roundabout		# oneway=yes is implied
	highway=motorway		# oneway=yes is implied
	oneway=yes
	oneway=1
	oneway=true
	oneway:bus=yes
	oneway:bus=1
	oneway:bus=true
	oneway:psv=yes
	oneway:psv=1
	oneway:psv=true

osm_filter_oneway_reverse:
	oneway=-1

# Edges that may explicitely be used in
# both directions. May be used to set exception
# to "osm_filter_oneway"

osm_filter_undirected:
	oneway=false
	oneway=0
	oneway=alternating
	oneway=reversible
	oneway=no
	oneway:bus=no
	oneway:bus=0
	oneway:bus=false
	oneway:psv=no
	oneway:psv=0
	oneway:psv=false
	busway=opposite_lane
	busway=opposite
	busway:left=opposite_lane
	busway:right=opposite_lane
	psv=opposite_lane
	psv=opposite

# Nodes that are stations.
# Only nodes that have been kept during the filtering above will be
# checked.
osm_filter_station:
	public_transport=stop_position
	bus_stop=*
	stop=*
	highway=bus_stop
	amenity=bus_station

# Relation fields that should be used for catching the lines that
# occur on an edge. Only relations that have been kept during the
# filtering above will be checked. The 'linename' will be normalized
# according to the rules in line_normalization_chain.
# The 'from_name' and 'to_name' will be normalized according to the
# rules in station_normalization_chain.
# The relations tags are given in the order of their relevance -
# the first normalized tag-value that is not null/empty will be
# taken.
osm_line_relation_tags:

# attr name together with the
# max distance in meters between any of the groups members and
# a potential new member
# first matching rule will be taken
# only applies to nodes that match osm_filter_station!
osm_station_group_attrs:
	uic_ref=500
	wikidata=500
	name=100

# max distance in meters between a snapped station position and the
# original station position
osm_max_snap_distance:	10 , 50, 100

osm_max_snap_level: 5

osm_max_osm_station_distance: 7.5

# sorted by priority, first found attr will be taken
osm_station_name_attrs:
	name
	uic_name

# the track number tag in stop nodes, first one is taken
osm_track_number_tags:	local_ref

routing_lvl0_fac:	1  # default level
routing_lvl1_fac:	1.25
routing_lvl2_fac:	1.5
routing_lvl3_fac:	1.75
routing_lvl4_fac:	2.25
routing_lvl5_fac:	3
routing_lvl6_fac:	4
routing_lvl7_fac:	5

# Punishment (in meters) to add to the distance
# function if a vehicle performans a full turn
routing_full_turn_punish:			500

routing_station_distance_punish_fac: 2.5

routing_non_osm_station_punish:		500

# Max angle that should be counted as a full turn
routing_full_turn_angle:			20

# Max angle in a route from a station to an already reachable neighbor
routing_snap_full_turn_angle:	110

osm_max_node_block_distance:	10

# Punishment (in meters) to add to the distance
# function if a vehicle passes a station node without
# stopping there
routing_pass_thru_station_punish:   0

# Punishment factor for every meter a vehicle
# travels through a one-way edge
routing_one_way_meter_punish_fac:	4

routing_one_way_edge_punish:	5000

# Punishment factor for every meter a vehicle
# travels through an edge without any matching line
# information
# routing_line_unmatched_punish_fac:  1.75

[tram, subway, funicular]

# OSM entities to keep on different levels, as k=v. Applies
# to nodes, edges and relations.
# Nodes included in kept ways are always kept.
# Ways included in kept relations are always kept.

osm_filter_keep:
	route=tram
	railway=subway
	railway=light_rail
	railway=tram
	railway=funicular
	railway=station
	railway=halt
	railway=tram_stop
	route=subway
	route=light_rail
	subway=yes
	tram=yes

osm_filter_lv2:
	service=siding

osm_filter_lvl5:
	service=crossover
	service=yard

# OSM entities to drop, as k=v. Applies to nodes, edges and
# relations.
# Nodes included in non-dropped ways are kept regardless of
# a matching drop filter.
# Ways included in non-dropped relations are kept regardless of
# a matching drop filter.

osm_filter_drop:
	area=yes
	public_transport=stop_area
	type=multipolygon
	railway=platform
	public_transport=platform
	service=alley

# Nodes that should act as "no-hup" nodes. These are nodes
# that are contained in multiple ways, but cannot be used
# to switch from one way to another (for example, a
# track crossing in rail networks)

osm_filter_nohup:
	railway:switch=no
	railway=railway_crossing

# Edges that should act as one-way nodes.

osm_filter_oneway:
	oneway=yes

# Edges that may explicitely be used in
# both directions. May be used to set exception
# to "osm_filter_oneway"

osm_filter_undirected:

# Nodes that are stations.
# Only nodes that have been kept during the filtering above will be
# checked.
osm_filter_station:
	public_transport=stop_position
	station=subway
	station=tram
	railway=stop
	railway=halt
	railway=station
	railway=tram_stop
	railway=subway_stop
	tram_stop=*
	stop=*

# Relation fields that should be used for catching the lines that
# occur on an edge. Only relations that have been kept during the
# filtering above will be checked. The 'linename' will be normalized
# according to the rules in line_normalization_chain.
# The 'from_name' and 'to_name' will be normalized according to the
# rules in station_normalization_chain.
# The relations tags are given in the order of their relevance -
# the first normalized tag-value that is not null/empty will be
# taken.
osm_line_relation_tags:

# attr name together with the
# max distance in meters between any of the groups members and
# a potential new member
# first matching rule will be taken
# only applies to nodes that match osm_filter_station!
osm_station_group_attrs:
	uic_ref=500
	wikidata=500
	name=100

# max distance in meters between a snapped station position and the
# original station position
osm_max_snap_distance:	10, 50, 100

osm_max_snap_level: 4


# sorted by priority, first found attr will be taken
osm_station_name_attrs:
	name
	uic_name

# the track number tag in stop nodes, first one is taken
osm_track_number_tags:	local_ref

routing_lvl0_fac:	1  # default level
routing_lvl1_fac:	1.5
routing_lvl2_fac:	2
routing_lvl3_fac:	2.5
routing_lvl4_fac:	3.5
routing_lvl5_fac:	5
routing_lvl6_fac:	5
routing_lvl7_fac:	5

# Punishment (in meters) to add to the distance
# function if a vehicle performans a full turn
routing_full_turn_punish:			2000

routing_station_distance_punish_fac: 3.14

routing_non_osm_station_punish:	235

# Max angle that should be counted as a full turn
routing_full_turn_angle:			80

# Max angle in a route from a station to an already reachable neighbar
routing_snap_full_turn_angle:	80

# Punishment (in meters) to add to the distance
# function if a vehicle passes a station node without
# stopping there
routing_pass_thru_station_punish:   100

# Punishment factor for every meter a vehicle
# travels through a one-way edge
routing_one_way_meter_punish_fac:   1

# Punishment factor for every meter a vehicle
# travels through an edge without any matching line
# information
routing_line_unmatched_punish_fac:  0.5

[ferry]

# OSM entities to keep on different levels, as k=v. Applies
# to nodes, edges and relations.
# Nodes included in kept ways are always kept.
# Ways included in kept relations are always kept.

osm_filter_keep:
	route=ferry
	waterway=river
	motorboat=yes
	ferry=yes

# Nodes that are stations.
# Only nodes that have been kept during the filtering above will be
# checked.
osm_filter_station:
	public_transport=stop_position
	station=ferry
	railway=stop
	railway=halt
	railway=station
	stop=*

# Relation fields that should be used for catching the lines that
# occur on an edge. Only relations that have been kept during the
# filtering above will be checked. The 'linename' will be normalized
# according to the rules in line_normalization_chain.
# The 'from_name' and 'to_name' will be normalized according to the
# rules in station_normalization_chain.
# The relations tags are given in the order of their relevance -
# the first normalized tag-value that is not null/empty will be
# taken.
osm_line_relation_tags:

# attr name together with the
# max distance in meters between any of the groups members and
# a potential new member
# first matching rule will be taken
# only applies to nodes that match osm_filter_station!
osm_station_group_attrs:
	uic_ref=500
	wikidata=500
	name=100

# max distance in meters between a snapped station position and the
# original station position
osm_max_snap_distance:	10, 100, 200

osm_max_snap_level: 4


# sorted by priority, first found attr will be taken
osm_station_name_attrs:
	name
	uic_name

# the track number tag in stop nodes, first one is taken
osm_track_number_tags:	local_ref

routing_lvl0_fac:	1  # default level
routing_lvl1_fac:	1.5
routing_lvl2_fac:	2
routing_lvl3_fac:	2.5
routing_lvl4_fac:	3.5
routing_lvl5_fac:	5
routing_lvl6_fac:	5
routing_lvl7_fac:	5

# Punishment (in meters) to add to the distance
# function if a vehicle performans a full turn
routing_full_turn_punish:			100

routing_station_distance_punish_fac: 3.14

routing_non_osm_station_punish:	50

# Max angle that should be counted as a full turn
routing_full_turn_angle:			45

# Max angle in a route from a station to an already reachable neighbar
routing_snap_full_turn_angle:	0

# Punishment (in meters) to add to the distance
# function if a vehicle passes a station node without
# stopping there
routing_pass_thru_station_punish:   0

# Punishment factor for every meter a vehicle
# travels through a one-way edge
routing_one_way_meter_punish_fac:   1

# Punishment factor for every meter a vehicle
# travels through an edge without any matching line
# information
routing_line_unmatched_punish_fac:  0.5

[tram, bus, subway, rail, gondola, funicular, ferry]
# Regular expressions and station comparision is
# always case insensitive!
station_normalize_chain:
	, -> ' ';
	- -> ' ';
	— -> ' ';
	_ -> ' ';
	" -> '';
	' -> '';
	` -> '';
	\( -> ' ';
	\) -> ' ';
	\[ -> ' ';
	\] -> ' ';
	/ -> ' ';
	'\\' -> ' ';
	< -> ' ';
	> -> ' ';
	& -> '+';
	ä -> ae;
	ö -> oe;
	ü -> ue;
	ß -> ss;
	è -> e;
	é -> e;
	á -> a;
	à -> a;
	ó -> o;
	ò -> o;
	ô -> o;
	ç -> c;
	í -> i;
	ú -> u;
	ù -> u;
	ë -> e;
	å -> ae;
	â -> a;
	ê -> e;
	ï -> i;
	œ -> oe;
	ø -> oe;
	str\. -> strasse;
	av\. -> avenue;

	# always separate 'street', 'strasse'
	'([a-zA-Z])strasse($| )' -> '\1 strasse\2';
	'([a-zA-Z])street($| )' -> '\1 street\2';

	# always use "street"
	'(^| )strasse($| )' -> '\1street\2';

	# always use "avenue"
	'(^| )avenida($| )' -> '\1avenue\2';
	'(^| )avenu($| )' -> '\1avenue\2';

	# normalize every possible abbr. of german "Bahnhof", "Hauptbahnhof", "Busbahnhof"
	'(^| )hauptbf\.($| )' -> '\1hauptbahnhof\2';
	'(^| )hauptbf($| )' -> '\1hauptbahnhof\2';
	'(^| )hauptbhf\.($| )' -> '\1hauptbahnhof\2';
	'(^| )hauptbhf($| )' -> '\1hauptbahnhof\2';
	'(^| )zentraler busbahnhof($| )$' -> \1busbahnhof\2;
	'(^| )zentraler omnibusbahnhof($| )$' -> \1busbahnhof\2;
	'(^| )omnibusbahnhof($| )' -> '\1busbahnhof\2';
	'(^| )omnibusbhf($| )' -> '\1busbahnhof\2';
	'(^| )busbf\.($| )' -> '\1busbahnhof\2';
	'(^| )busbf($| )' -> '\1busbahnhof\2';
	'(^| )bus bf\.($| )' -> '\1busbahnhof\2';
	'(^| )bus bf($| )' -> '\1busbahnhof\2';
	'(^| )busbhf\.($| )' -> '\1busbahnhof\2';
	'(^| )busbhf($| )' -> '\1busbahnhof\2';
	'(^| )bus bhf\.($| )' -> '\1busbahnhof\2';
	'(^| )bus bhf($| )' -> '\1busbahnhof\2';
	'(^| )zob($| )' -> '\1busbahnhof\2';
	'(^| )hbf\.($| )' -> '\1hauptbahnhof\2';
	'(^| )hbf($| )' -> '\1hauptbahnhof\2';
	'(^| )hb\.($| )' -> '\1hauptbahnhof\2';
	'(^| )hb($| )' -> '\1hauptbahnhof\2';
	'(^| )bf\.($| )' -> '\1bahnhof\2';
	'(^| )bf($| )' -> '\1bahnhof\2';
	'(^| )bhf\.($| )' -> '\1bahnhof\2';
	'(^| )bhf($| )' -> '\1bahnhof\2';
	'(^| )bhfeingang($| )' -> '\1bahnhofeingang\2';
	'(^| )gare de($| )' -> '\1gare\2';


	# if a stations starts with  single station identifier
	# always put it at the end (for example, "hauptbahnhof freiburg" becomes "freiburg hauptbahnhof")
	'^hauptbahnhof (.+)$' -> \1 hauptbahnhof;
	'^bahnhof (.+)$' -> \1 bahnhof;
	'^busbahnhof (.+)$' -> \1 busbahnhof;
	'^gare (.+)$' -> \1 gare;
	'^station (.+)$' -> \1 station;

	'(^| )busbahnhof($| )' -> '\1bbahnhof\2';

	# normalize line types in station names
	'(^| )u bahn\.($| )' -> '\1ubahn\2';
	'(^| )metro\.($| )' -> '\1ubahn\2';
	'(^| )subway\.($| )' -> '\1ubahn\2';
	'(^| )underground\.($| )' -> '\1ubahn\2';
	'(^| )ubahn($| )' -> '\1u\2';
	'(^| )s bahn\.($| )' -> '\1sbahn\2';
	'(^| )sbahn($| )' -> '\1s\2';
	'(^| )tramway($| )' -> '\1tram\2';
	'(^| )stadtbahn($| )' -> '\1tram\2';
	'(^| )strassenbahn($| )' -> '\1tram\2';
	'(^| )streetcar($| )' -> '\1tram\2';
	'(^| )tram($| )' -> '\1t\2';

	# delete track information from name
	'(^| )kante [a-zA-Z0-9]{1,2}($| )' -> ' ';
	'(^| )gleis [a-zA-Z0-9]{1,2}($| )' -> ' ';
	'(^| )track [a-zA-Z0-9]{1,2}($| )' -> ' ';
	'(^| )voie [a-zA-Z0-9]{1,2}($| )' -> ' ';

	# abbrv
	'(^| )und($| )' -> '\1+\2';
	'(^| )and($| )' -> '\1+\2';
	'(^| )et($| )' -> '\1+\2';

	# noise
	'\sde\s' -> ' ';
	'\sda\s' -> ' ';
	'\sdi\s' -> ' ';
	'\sdel\s' -> ' ';
	'\sdal\s' -> ' ';

	# abbrv in most western languages
	'(^| )saint ' -> '\1st. ';
	'(^| )sankt ' -> '\1st. ';
	'(^| )sanct ' -> '\1st. ';

	\. -> ' ';

	# whitespace
	\s+ -> ' ';
	^\s -> '';
	\s$ -> '';

line_normalize_chain:
	, -> ' ';
	- -> ' ';
	_ -> ' ';
	" -> '';
	' -> '';
	` -> '';
	/ -> ' ';
	< -> ' ';
	> -> ' ';
	& -> '+';
	ä -> ae;
	ö -> oe;
	ü -> ue;
	ß -> ss;
	è -> e;
	é -> e;
	á -> a;
	à -> a;
	ó -> o;
	ò -> o;
	í -> i;
	ú -> u;
	ù -> u;
	ë -> e;
	å -> ae;
	ç -> c;
	â -> a;
	ê -> e;
	ï -> i;
	œ -> oe;
	ø -> oe;
	^line -> '';
	^linie -> '';
	^metro -> '';
	^tram -> '';
	^strassenbahn -> '';
	^bus -> '';

	# delete everything in brackets
	\(.+\) -> ' ';
	\[.+\] -> ' ';

	# whitespace
	\s+ -> ' ';
	^\s -> '';
	\s$ -> '';

	# line/number combs ALWAYS without whitespace (T 2 -> T2)
	^([a-zA-Z]+) ([0-9]+)$ -> \1\2;

track_normalize_chain:
	'(^| )gleis($| )' -> '';
	'(^| )gl\.($| )' -> '';
	'(^| )platform($| )' -> '';
	'(^| )track($| )' -> '';
	'(^| )rail($| )' -> '';
	# line/number combs ALWAYS without whitespace (1 A -> 1A)
	^([a-zA-Z]+) ([0-9]+)$ -> \1\2;
	^([0-9]+) ([a-zA-Z]+)$ -> \1\2;

	# delete track numbers greater than 999
	^[0-9]{4,}$ -> '';
