docs: def plot_route_folium(G, route, route_map=None, popup_attribute=None,
                        tiles='cartodbpositron', zoom=1, fit_bounds=True,
                        route_color='#cc0000', route_width=5, route_opacity=1):
      """
      Plot a route on an interactive folium web map.
  
      Parameters
      ----------
      G : networkx multidigraph
      route : list
          the route as a list of nodes
      route_map : folium.folium.Map
          if not None, plot the route on this preexisting folium map object
      popup_attribute : string
          edge attribute to display in a pop-up when an edge is clicked
      tiles : string
          name of a folium tileset
      zoom : int
          initial zoom level for the map
      fit_bounds : bool
          if True, fit the map to the boundaries of the route's edges
      route_color : string
          color of the route's line
      route_width : numeric
          width of the route's line
      route_opacity : numeric
          opacity of the route lines
  
      Returns
      -------
      route_map : folium.folium.Map
      """
  
      # check if we were able to import folium successfully
      if not folium:
          raise ImportError('The folium package must be installed to use this optional feature.')
  
      # create gdf of the route edges
      gdf_edges = graph_to_gdfs(G, nodes=False, fill_edge_geometry=True)
      route_nodes = list(zip(route[:-1], route[1:]))
      index = [gdf_edges[(gdf_edges['u']==u) & (gdf_edges['v']==v)].index[0] for u, v in route_nodes]
      gdf_route_edges = gdf_edges.loc[index]
  
      # get route centroid
      x, y = gdf_route_edges.unary_union.centroid.xy
      route_centroid = (y[0], x[0])
  
      # create the folium web map if one wasn't passed-in
      if route_map is None:
          route_map = folium.Map(location=route_centroid, zoom_start=zoom, tiles=tiles)
  
      # add each route edge to the map
      for _, row in gdf_route_edges.iterrows():
          pl = make_folium_polyline(edge=row, edge_color=route_color, edge_width=route_width,
                                    edge_opacity=route_opacity, popup_attribute=popup_attribute)
          pl.add_to(route_map)
  
      # if fit_bounds is True, fit the map to the bounds of the route by passing
      # list of lat-lng points as [southwest, northeast]
      if fit_bounds:
          tb = gdf_route_edges.total_bounds
          bounds = [(tb[1], tb[0]), (tb[3], tb[2])]
          route_map.fit_bounds(bounds)
  
      return route_map