docs: def parse_reference_line(ref_line, kbs, bad_titles_count={}, linker_callback=None):
      """Parse one reference line
  
      @input a string representing a single reference bullet
      @output parsed references (a list of elements objects)
      """
      # Strip the 'marker' (e.g. [1]) from this reference line:
      line_marker, ref_line = remove_reference_line_marker(ref_line)
      # Find DOI sections in citation
      ref_line, identified_dois = identify_and_tag_DOI(ref_line)
      # Identify and replace URLs in the line:
      ref_line, identified_urls = identify_and_tag_URLs(ref_line)
      # Tag <cds.JOURNAL>, etc.
      tagged_line, bad_titles_count = tag_reference_line(ref_line,
                                                         kbs,
                                                         bad_titles_count)
  
      # Debug print tagging (authors, titles, volumes, etc.)
      LOGGER.debug("tags %r", tagged_line)
  
      # Using the recorded information, create a MARC XML representation
      # of the rebuilt line:
      # At the same time, get stats of citations found in the reference line
      # (titles, urls, etc):
      citation_elements, line_marker, counts = \
          parse_tagged_reference_line(line_marker,
                                      tagged_line,
                                      identified_dois,
                                      identified_urls)
  
      # Transformations on elements
      split_volume_from_journal(citation_elements)
      format_volume(citation_elements)
      handle_special_journals(citation_elements, kbs)
      format_report_number(citation_elements)
      format_author_ed(citation_elements)
      look_for_books(citation_elements, kbs)
      format_hep(citation_elements)
      remove_b_for_nucl_phys(citation_elements)
      mangle_volume(citation_elements)
      arxiv_urls_to_report_numbers(citation_elements)
      look_for_hdl(citation_elements)
      look_for_hdl_urls(citation_elements)
  
      # Link references if desired
      if linker_callback:
          associate_recids(citation_elements, linker_callback)
  
      # Split the reference in multiple ones if needed
      splitted_citations = split_citations(citation_elements)
  
      # Look for implied ibids
      look_for_implied_ibids(splitted_citations)
      # Find year
      add_year_elements(splitted_citations)
      # Look for books in misc field
      look_for_undetected_books(splitted_citations, kbs)
  
      if linker_callback:
          # Link references with the newly added ibids/books information
          for citations in splitted_citations:
              associate_recids(citations, linker_callback)
  
      # FIXME: Needed?
      # Remove references with only misc text
      # splitted_citations = remove_invalid_references(splitted_citations)
      # Merge references with only misc text
      # splitted_citations = merge_invalid_references(splitted_citations)
  
      remove_duplicated_authors(splitted_citations)
      remove_duplicated_dois(splitted_citations)
      remove_duplicated_collaborations(splitted_citations)
      add_recid_elements(splitted_citations)
  
      # For debugging purposes
      print_citations(splitted_citations, line_marker)
  
      return splitted_citations, line_marker, counts, bad_titles_count