Return reaction properties defined in the XHTML notes.

    Older SBML models often define additional properties in the XHTML notes
    section because structured methods for defining properties had not been
    developed. This will try to parse the following properties: ``SUBSYSTEM``,
    ``GENE ASSOCIATION``, ``EC NUMBER``, ``AUTHORS``, ``CONFIDENCE``.

    Args:
        entry: :class:`SBMLReactionEntry`.

def parse_xhtml_reaction_notes(entry):
    """Return reaction properties defined in the XHTML notes.

    Older SBML models often define additional properties in the XHTML notes
    section because structured methods for defining properties had not been
    developed. This will try to parse the following properties: ``SUBSYSTEM``,
    ``GENE ASSOCIATION``, ``EC NUMBER``, ``AUTHORS``, ``CONFIDENCE``.

    Args:
        entry: :class:`SBMLReactionEntry`.
    """
    properties = {}
    if entry.xml_notes is not None:
        cobra_notes = dict(parse_xhtml_notes(entry))

        if 'subsystem' in cobra_notes:
            properties['subsystem'] = cobra_notes['subsystem']

        if 'gene_association' in cobra_notes:
            properties['genes'] = cobra_notes['gene_association']

        if 'ec_number' in cobra_notes:
            properties['ec'] = cobra_notes['ec_number']

        if 'authors' in cobra_notes:
            properties['authors'] = [
                a.strip() for a in cobra_notes['authors'].split(';')]

        if 'confidence' in cobra_notes:
            try:
                value = int(cobra_notes['confidence'])
            except ValueError:
                logger.warning(
                    'Unable to parse confidence level for {} as an'
                    ' integer: {}'.format(
                        entry.id, cobra_notes['confidence']))
                value = cobra_notes['confidence']
            properties['confidence'] = value

    return properties