o
    Rŀg                     @   s|   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd de	Z
dddZdd ZG dd deZG dd dejZdS )z5Code for calling and parsing ScanProsite from ExPASy.    )	urlencode)urlopen)handler)ExpatParserc                   @   s   e Zd ZdZdd ZdS )RecordzRepresents search results returned by ScanProsite.

    This record is a list containing the search results returned by
    ScanProsite. The record also contains the data members n_match,
    n_seq, capped, and warning.
    c                 C   s   d| _ d| _d| _d| _dS Initialize the class.N)n_matchn_seqcappedwarningself r   J/var/www/html/myenv/lib/python3.10/site-packages/Bio/ExPASy/ScanProsite.py__init__   s   
zRecord.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s    r    https://prosite.expasy.orgxmlc           
      K   sN   | |d}|  D ]\}}|dur|||< q	t|}| d| }t|}	|	S )a	  Execute a ScanProsite search.

    Arguments:
     - mirror:   The ScanProsite mirror to be used
                 (default: https://prosite.expasy.org).
     - seq:      The query sequence, or UniProtKB (Swiss-Prot,
                 TrEMBL) accession
     - output:   Format of the search results
                 (default: xml)

    Further search parameters can be passed as keywords; see the
    documentation for programmatic access to ScanProsite at
    https://prosite.expasy.org/scanprosite/scanprosite_doc.html
    for a description of such parameters.

    This function returns a handle to the search results returned by
    ScanProsite. Search results in the XML format can be parsed into a
    Python object, by using the Bio.ExPASy.ScanProsite.read function.

    )seqoutputNz(/cgi-bin/prosite/scanprosite/PSScan.cgi?)itemsr   r   )
r   mirrorr   keywords
parameterskeyvaluecommandurlhandler   r   r   scan"   s   
r$   c                 C   s*   t  }t }|| ||  |j}|S )zBParse search results returned by ScanProsite into a Python object.)ContentHandlerParsersetContentHandlerparserecord)r#   content_handler	saxparserr)   r   r   r   readA   s   

r,   c                   @   s"   e Zd ZdZdd ZdddZdS )	r&   z7Process the result from a ScanProsite search (PRIVATE).c                 C   s   t |  d| _dS )r   TN)r   r   	firsttimer   r   r   r   r   Q   s   

zParser.__init__r   c                 C   s8   | j r|dd ddkrt|d| _ t| ||S )zRaise an Error if plain text is received in the data.

        This is to show the Error messages returned by ScanProsite.
        N   zutf-8z<?xmlF)r-   decode
ValueErrorr   feed)r   dataisFinalr   r   r   r1   V   s
   
zParser.feedN)r   )r   r   r   r   r   r1   r   r   r   r   r&   N   s    r&   c                   @   s8   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dS )r%   zAProcess and fill in the records, results of the search (PRIVATE).)startstop)sequence_acsequence_idsequence_dbsignature_aclevel	level_tagc                 C   s
   g | _ dS r   )elementr   r   r   r   r   t   s   
zContentHandler.__init__c                 C   sp   | j | d| _| j dgkr%t | _t|d | j_t|d | j_dS | j ddgkr6i }| j| dS dS )z>Define the beginning of a record and stores the search record.r   matchsetr	   r
   matchN)r<   appendcontentr   r)   intr	   r
   )r   nameattrsr>   r   r   r   startElementx   s   zContentHandler.startElementc                 C   sp   || j  ks	J | j ddgkr6| jd }|tjv r#t| j||< dS |tjv r/| j||< dS | j||< dS dS )z$Define the end of the search record.r=   r>   N)r<   popr)   r%   integersrA   r@   strings)r   rB   r>   r   r   r   
endElement   s   


zContentHandler.endElementc                 C   s   |  j |7  _ dS )zStore the record content.N)r@   )r   r@   r   r   r   
characters   s   zContentHandler.charactersN)
r   r   r   r   rG   rH   r   rD   rI   rJ   r   r   r   r   r%   g   s    	r%   N)r   r   r   )r   urllib.parser   urllib.requestr   xml.saxr   xml.sax.expatreaderr   listr   r$   r,   r&   r%   r   r   r   r   <module>   s   
