docs: def parse_compound_file(f, context=None):
      """Iterate over the compound entries in the given file"""
  
      f.readline()  # Skip header
      for lineno, row in enumerate(csv.reader(f, delimiter='\t')):
          compound_id, names, formula = row[:3]
          names = (decode_name(name) for name in names.split(',<br>'))
  
          # ModelSEED sometimes uses an asterisk and number at
          # the end of formulas. This seems to have a similar
          # meaning as '(...)n'.
          m = re.match(r'^(.*)\*(\d*)$', formula)
          if m is not None:
              if m.group(2) != '':
                  formula = '({}){}'.format(m.group(1), m.group(2))
              else:
                  formula = '({})n'.format(m.group(1))
  
          formula = formula.strip()
          if formula == '' or formula == 'noformula':
              formula = None
  
          mark = FileMark(context, lineno, 0)
          yield CompoundEntry(compound_id, names, formula, filemark=mark)