text: """
  Read graphs in LEDA format.
  
  LEDA is a C++ class library for efficient data types and algorithms.
  
  Format
  ------
  See http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html
  
  """
  # Original author: D. Eppstein, UC Irvine, August 12, 2003.
  # The original code at http://www.ics.uci.edu/~eppstein/PADS/ is public domain.
  __author__ = """Aric Hagberg (hagberg@lanl.gov)"""
  #    Copyright (C) 2004-2019 by
  #    Aric Hagberg <hagberg@lanl.gov>
  #    Dan Schult <dschult@colgate.edu>
  #    Pieter Swart <swart@lanl.gov>
  #    All rights reserved.
  #    BSD license.
  
  __all__ = ['read_leda', 'parse_leda']
  
  import networkx as nx
  from networkx.exception import NetworkXError
  from networkx.utils import open_file, is_string_like
  
  
  @open_file(0, mode='rb')
  def read_leda(path, encoding='UTF-8'):
      """Read graph in LEDA format from path.
  
      Parameters
      ----------
      path : file or string
         File or filename to read.  Filenames ending in .gz or .bz2  will be
         uncompressed.
  
      Returns
      -------
      G : NetworkX graph
  
      Examples
      --------
      G=nx.read_leda('file.leda')
  
      References
      ----------
      .. [1] http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html
      """
      lines = (line.decode(encoding) for line in path)
      G = parse_leda(lines)
      return G
  
  
  def parse_leda(lines):
      """Read graph in LEDA format from string or iterable.
  
      Parameters
      ----------
      lines : string or iterable
         Data in LEDA format.
  
      Returns
      -------
      G : NetworkX graph
  
      Examples
      --------
      G=nx.parse_leda(string)
  
      References
      ----------
      .. [1] http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html
      """
      if is_string_like(lines):
          lines = iter(lines.split('\n'))
      lines = iter([line.rstrip('\n') for line in lines
                    if not (line.startswith('#') or line.startswith('\n') or line == '')])
      for i in range(3):
          next(lines)
      # Graph
      du = int(next(lines))  # -1=directed, -2=undirected
      if du == -1:
          G = nx.DiGraph()
      else:
          G = nx.Graph()
  
      # Nodes
      n = int(next(lines))  # number of nodes
      node = {}
      for i in range(1, n + 1):  # LEDA counts from 1 to n
          symbol = next(lines).rstrip().strip('|{}|  ')
          if symbol == "":
              symbol = str(i)  # use int if no label - could be trouble
          node[i] = symbol
  
      G.add_nodes_from([s for i, s in node.items()])
  
      # Edges
      m = int(next(lines))  # number of edges
      for i in range(m):
          try:
              s, t, reversal, label = next(lines).split()
          except:
              raise NetworkXError('Too few fields in LEDA.GRAPH edge %d' % (i + 1))
          # BEWARE: no handling of reversal edges
          G.add_edge(node[int(s)], node[int(t)], label=label[2:-2])
      return G
  