
    i                     T   d gZ ddlZddlmZmZ ddlmZ  ed      Z	ej                  rddlmZ deeej                  f   defd	Zdeeej                  f   defd
Zdededeeef   fdZ	 ddedeeej                  f   dz  fdZddddeeej                  f   dz  dedz  fdZy)get_bang_url    N)
quote_plusurlparse)EXTERNAL_BANGS   )SearchQueryexternal_bangs_dbbangc                 z    | d   }d}d}|D ])  }||z  }||v st        |t              s||   }||z  }d}+ |||fS )Ntrie )
isinstancedict)r	   r
   nodeafterbeforebang_letters         $/root/searxng/searx/external_bang.pyget_noder      se    V$DEF D=Zd3;DeOFE     c                 v   t        | |      \  }}}d }g }|dk7  r1|D ](  }|j                  |      s|j                  ||z          * ||fS t        |t              rC|j                  t              }|j                         D cg c]  }|t        k7  s||z    }}||fS t        |t              r|}g }||fS c c}w )Nr   )	r   
startswithappendr   r   getLEAF_KEYkeysstr)r	   r
   r   r   r   bang_definitionbang_ac_listks           r   get_bang_definition_and_acr!      s    "#4d;D&%OL{ 	0A||E"##FQJ/	0 L(( 
D$	((8,,0IIKIq1=
II
 L((	 
D#	L(( Js   B6B6r   queryreturnc                 B   | j                  t        d            \  }}|j                  d      rd|z   }|r%|j                  t        d      t	        |            }n't        |      }|j                  dz   |j                  z   }t        |      dkD  rt        |      nd}||fS )N   z//zhttps:   z://r   )
splitchrr   replacer   r   schemenetloclenint)r   r"   urlrankos        r   resolve_bang_definitionr1   1   s    %%c!f-IC
~~dnkk#a&*U"34 SMhh)D	A3t91D;r   c                    |t         }t        ||       \  }}g }g |}t               }t        |      dkD  r|j	                  d      }|j                  |       t        ||      \  }}	|r"t        |d      \  }
}|j                  ||f       |	D ]  }||vs||vs|j                  |        t        |      dkD  r|j                  d        t        t        d |            }||fS )Nr   r   c                     | d    | d   fS )Nr%   r    ts    r   <lambda>z6get_bang_definition_and_autocomplete.<locals>.<lambda>W   s    !A$! r   )keyc                     | d   S )Nr   r4   r5   s    r   r7   z6get_bang_definition_and_autocomplete.<locals>.<lambda>X   s
    !A$ r   )r   r!   setr,   popaddr1   r   sortlistmap)r
   r	   r   r   new_autocompletecurrentdonebang_accurrent_bang_definitioncurrent_bang_ac_list_ordernew_bangs                r   $get_bang_definition_and_autocompleterI   @   s     *$>?PRV$W!O\oG5D
g,
++a.8RSdfm8n5!5"./FKHAu##We$45, 	)Ht#(?x(	) g,
 56C0@AB,,,r   search_queryr   c                     d}|t         }| j                  rDt        || j                        \  }}|r)t        |t              rt        || j                        d   }|S )z
    Redirects if the user supplied a correct bang search.
    :param search_query: This is a search_query object which contains preferences and the submitted queries.
    :return: None if the bang was invalid, else a string of the redirect url.
    Nr   )r   external_bangr!   r   r   r1   r"   )rJ   r	   ret_valr   rF   s        r   r   r   ]   s_     G *!!78I<KeKefz/3?-o|?Q?QRSTUGNr   )N)__all__typingr6   urllib.parser   r   
searx.datar   r(   r   TYPE_CHECKINGsearx.search.modelsr   r   r   Anyr   r!   tupler-   r1   rI   r   r4   r   r   <module>rV      s    
  - %r7??/
S!%%Z 0 
 
)$sAEEz2B )# )&S  sCx   =A-
-"&sAEEz"2T"9-:} c155jAQTXAX dgjndn r   