
    Ri                         d Z ddlmZ ddlmZ ddlmZ ddlmZ dZ	 G d de
      Zd	e	d
fdZd Z G d de      Z G d dej                        Zy)z5Code for calling and parsing ScanProsite from ExPASy.    )	urlencode)urlopen)handler)ExpatParserzhttps://prosite.expasy.orgc                       e Zd ZdZd Zy)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                 <    d| _         d| _        d| _        d| _        yInitialize the class.N)n_matchn_seqcappedwarningselfs    N/home/agent/.friday_env/lib/python3.12/site-packages/Bio/ExPASy/ScanProsite.py__init__zRecord.__init__   s    
    N)__name__
__module____qualname____doc__r    r   r   r   r      s    r   r    xmlc                     |dk7  rt        d      | |d}|j                         D ]  \  }}|	|||<    t        |      }| d| }t        |      }	|	S )a  Execute a ScanProsite search.

    Arguments:
     - mirror:   The ScanProsite mirror to be used
                 (default: PROSITE_URL).
     - 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.

    r   z)Only output='xml' is supported currently.)seqoutputz(/cgi-bin/prosite/scanprosite/PSScan.cgi?)NotImplementedErroritemsr   r   )
r   mirrorr   keywords
parameterskeyvaluecommandurlhandles
             r   scanr)   $   su    * !"MNN/Jnn& $
U#JsO$ 
#GH<WI
FCS\FMr   c                     t               }t               }|j                  |       |j                  |        |j                  }|S )zBParse search results returned by ScanProsite into a Python object.)ContentHandlerParsersetContentHandlerparserecord)r(   content_handler	saxparserr/   s       r   readr2   E   s;    $&OI0OOF##FMr   c                       e Zd ZdZd ZddZy)r,   z7Process the result from a ScanProsite search (PRIVATE).c                 <    t        j                  |        d| _        y)r   TN)r   r   	firsttimer   s    r   r   zParser.__init__U   s    T"r   c                     | j                   r"|dd j                  d      dk7  rt        |      d| _         t        j                  | ||      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<scanprosite_response>F)r5   decode
ValueErrorr   feed)r   dataisFinals      r   r:   zParser.feedZ   sL     >>CRy(,DD &&dG44r   N)r   )r   r   r   r   r   r:   r   r   r   r,   r,   R   s    A
5r   r,   c                   0    e Zd ZdZdZdZd Zd Zd Zd Z	y)	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                     g | _         yr
   )elementr   s    r   r   zContentHandler.__init__x   s	    r   c                 \   | j                   j                  |       d| _        | j                   ddgk(  rJt               | _        t        |d         | j                  _        t        |d         | j                  _        y| j                   g dk(  ri }| j                  j                  |       yy)z>Define the beginning of a record and stores the search record.r   scanprosite_responsematchsetr   r   rI   rJ   matchN)rG   appendcontentr   r/   intr   r   )r   nameattrsrL   s       r   startElementzContentHandler.startElement|   s    D!<<2J?? (DK"%eI&6"7DKK #E'N 3DKK\\JJEKKu% Kr   c                 <   || j                   j                         k(  sJ | j                   g dk(  rl| j                  d   }|t        j                  v rt        | j                        ||<   y|t        j                  v r| j                  ||<   y| j                  ||<   yy)z$Define the end of the search record.rK   N)rG   popr/   r+   integersrO   rN   strings)r   rP   rL   s      r   
endElementzContentHandler.endElement   s    t||''))))<<HHKKOE~...!$,,/d///"lld #lld Ir   c                 .    | xj                   |z  c_         y)zStore the record content.N)rN   )r   rN   s     r   
characterszContentHandler.characters   s    r   N)
r   r   r   r   rV   rW   r   rR   rX   rZ   r   r   r   r+   r+   k   s%    K HG
&+ r   r+   N)r   urllib.parser   urllib.requestr   xml.saxr   xml.sax.expatreaderr   PROSITE_URLlistr   r)   r2   r,   r+   r   r   r   <module>ra      s[    < " "  + +T   E B5[ 52, W++ , r   