
    Xf                         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e	          Z
ddZd Z G d de          Z G d dej                  ZdS )z5Code for calling and parsing ScanProsite from ExPASy.    )	urlencode)urlopen)handler)ExpatParserc                       e Zd ZdZ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                 >    d| _         d| _        d| _        d| _        dS Initialize the class.N)n_matchn_seqcappedwarningselfs    6lib/python3.11/site-packages/Bio/ExPASy/ScanProsite.py__init__zRecord.__init__   s"    
    N)__name__
__module____qualname____doc__r    r   r   r   r      s-             r   r    https://prosite.expasy.orgxmlc                     | |d}|                                 D ]\  }}||||<   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handles
             r   scanr)   "   sn    * //Jnn&& $ $
U#JsO
##G
F
FW
F
FCS\\FMr   c                     t                      }t                      }|                    |           |                    |            |j        }|S )zBParse search results returned by ScanProsite into a Python object.)ContentHandlerParsersetContentHandlerparserecord)r(   content_handler	saxparserr/   s       r   readr2   A   sI    $&&OI000OOF#FMr   c                        e Zd ZdZd ZddZdS )r,   z7Process the result from a ScanProsite search (PRIVATE).c                 <    t          j        |            d| _        dS )r   TN)r   r   	firsttimer   s    r   r   zParser.__init__Q   s    T"""r   r   c                     | j         r0|dd                             d          dk    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<?xmlF)r5   decode
ValueErrorr   feed)r   dataisFinals      r   r:   zParser.feedV   sW     > 	'BQBxw''722 &&&dG444r   N)r   )r   r   r   r   r   r:   r   r   r   r,   r,   N   s=        AA  
5 5 5 5 5 5r   r,   c                   2    e Zd ZdZdZdZd Zd Zd Z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                     g | _         dS r
   )elementr   s    r   r   zContentHandler.__init__t   s    r   c                 \   | j                             |           d| _        | j         dgk    rSt                      | _        t          |d                   | j        _        t          |d                   | j        _        dS | j         ddgk    ri }| j                            |           dS dS )z>Define the beginning of a record and stores the search record.r   matchsetr   r   matchN)rG   appendcontentr   r/   intr   r   )r   nameattrsrJ   s       r   startElementzContentHandler.startElementx   s    D!!!<J<'' ((DK"%eI&6"7"7DK #E'N 3 3DK\j'222EKu%%%%% 32r   c                    || j                                         k    sJ | j         ddgk    rZ| 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.rI   rJ   N)rG   popr/   r+   integersrM   rL   strings)r   rN   rJ   s      r   
endElementzContentHandler.endElement   s    t|''))))))<J000KOE~...!$,//d///"ld #ld 10r   c                 &    | xj         |z  c_         dS )zStore the record content.N)rL   )r   rL   s     r   
characterszContentHandler.characters   s    r   N)
r   r   r   r   rT   rU   r   rP   rV   rX   r   r   r   r+   r+   g   sb        KK HG  
& 
& 
&+ + +         r   r+   N)r   r   r   )r   urllib.parser   urllib.requestr   xml.saxr   xml.sax.expatreaderr   listr   r)   r2   r,   r+   r   r   r   <module>r^      s   < ; " " " " " " " " " " " "       + + + + + +    T   (   >  5 5 5 5 5[ 5 5 52,  ,  ,  ,  , W+ ,  ,  ,  ,  , r   