docs: def get_canonical_and_alternates_urls(
          url,
          drop_ln=True,
          washed_argd=None,
          quote_path=False):
      """
      Given an Invenio URL returns a tuple with two elements. The first is the
      canonical URL, that is the original URL with CFG_SITE_URL prefix, and
      where the ln= argument stripped. The second element element is mapping,
      language code -> alternate URL
  
      @param quote_path: if True, the path section of the given C{url}
                         is quoted according to RFC 2396
      """
      dummy_scheme, dummy_netloc, path, dummy_params, query, fragment = urlparse(
          url)
      canonical_scheme, canonical_netloc = urlparse(cfg.get('CFG_SITE_URL'))[0:2]
      parsed_query = washed_argd or parse_qsl(query)
      no_ln_parsed_query = [(key, value)
                            for (key, value) in parsed_query if key != 'ln']
      if drop_ln:
          canonical_parsed_query = no_ln_parsed_query
      else:
          canonical_parsed_query = parsed_query
      if quote_path:
          path = urllib.quote(path)
      canonical_query = urlencode(canonical_parsed_query)
      canonical_url = urlunparse(
          (canonical_scheme,
           canonical_netloc,
           path,
           dummy_params,
           canonical_query,
           fragment))
      alternate_urls = {}
      for ln in cfg.get('CFG_SITE_LANGS'):
          alternate_query = urlencode(no_ln_parsed_query + [('ln', ln)])
          alternate_url = urlunparse(
              (canonical_scheme,
               canonical_netloc,
               path,
               dummy_params,
               alternate_query,
               fragment))
          alternate_urls[ln] = alternate_url
      return canonical_url, alternate_urls