docs: def _extract_authors(pub, idx, _root):
      """
      Create a concatenated string of author names. Separate names with semi-colons.
      :param any pub: Publication author structure is ambiguous
      :param int idx: Index number of Pub
      """
      logger_ts.info("enter extract_authors")
      try:
          # DOI Author data. We'd prefer to have this first.
          names = pub['author']
      except KeyError as e:
          try:
              # Manually entered author data. This is second best.
              names = pub['authors']
          except KeyError as e:
              # Couldn't find any author data. Skip it altogether.
              names = False
              logger_ts.info("extract_authors: KeyError: author data not provided, {}".format(e))
  
      # If there is author data, find out what type it is
      if names:
          # Build author names onto empty string
          auth = ''
          # Is it a list of dicts or a list of strings? Could be either
          # Authors: Stored as a list of dictionaries or list of strings
          if isinstance(names, list):
              for name in names:
                  if isinstance(name, str):
                      auth += name + ';'
                  elif isinstance(name, dict):
                      for k, v in name.items():
                          auth += v + ';'
          elif isinstance(names, str):
              auth = names
          # Enter finished author string into target
          _root['pub' + str(idx + 1) + '_author'] = auth[:-1]
      return _root