
    io+                     J   d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZmZ d dlmZmZ d dlmZmZ d	ee   d
ee   fdZd	ee   ded
eee   ee   ee   f   fdZdeeef   d
efdZdedeeef   ded
efdZdedeeef   d
efdZdeeef   d
ee   fdZdeeef   ded
ee   fdZdee   deded
dfdZ dedeeeef      d
ee   fdZ!dee   dee   d
ee   fdZ"dedeeef   dee   d
ee   fdZ#d Z$dedeeef   d
eeeee   ee   ef   fd Z%y)!    )defaultdict)DictListOptionalTuple)SearxParameterException)VALID_LANGUAGE_CODE)RawTextQuery)
categoriesengines)SearchQuery	EngineRef)Preferences	is_lockedengineref_listreturnc                     | D ci c]  }|j                   dz   |j                  z   |! }}t        |j                               S c c}w )N|)categorynamelistvalues)r   qengineref_dicts      !/root/searxng/searx/webadapter.pydeduplicate_engineref_listr      sF    <JKqajj3&/2KNK%%'(( Ls   $Apreferencesc                     g }g }g }| D ]m  }|j                   t        vr|j                  |       't        |j                      }|j                  |      s|j                  |       ]|j                  |       o |||fS )a  Validate query_engines according to the preferences

    Returns:
        List[EngineRef]: list of existing engines with a validated token
        List[EngineRef]: list of unknown engine
        List[EngineRef]: list of engine with invalid token according to the preferences
    )r   r   appendvalidate_token)r   r   validunknownno_token	enginerefengines          r   validate_engineref_listr&      s     EGH# 
 	>>(NN9%())&1OOI&Y
  '8##    formc                     | j                  dd      }|j                         rt        |      dk  rt        d|      t        |      S )Npageno1   )getisdigitintr   )r(   pageno_params     r   parse_pagenor1   0   sB    88Hc*L!S%6%:%h==|r'   raw_text_queryc                 "   t        d      r| j                  d      S t        |j                        r|j                  d   }n'd|v r|j	                  d      }n| j                  d      }t        j                  |      s|dk7  rt        d|      |S )Nlanguageauto)r   	get_valuelen	languagesr-   r	   matchr   )r   r(   r2   
query_langs       r   
parse_langr<   7   s    $$Z00 >##$#--b1
	t	XXj)
 **:6
 $$Z0Z65I%j*==r'   c                    t        d      r| j                  d      S d|v r9|j                  d      }|j                         st	        d|      t        |      }n| j                  d      }|dk  s|dkD  rt	        d|      |S )N
safesearchr      )r   r7   r-   r.   r   r/   )r   r(   query_safesearchs      r   parse_safesearchrA   K   s    $$\22t88L1'')),8HII/0&00> !/!3%l4DEEr'   c                 X    | j                  d      }|dv rd n|}|dvrt        d|      |S )N
time_range) None)Ndayweekmonthyear)r-   r   )r(   query_time_ranges     r   parse_time_rangerK   _   s>    xx-/<?tEUEE%l4DEEr'   c                     |j                   }|| j                  d      }||dv ry 	 t        |      S # t        $ r}t	        d|      |d }~ww xY w)Ntimeout_limit)rE   rD   )rM   r-   float
ValueErrorr   )r(   r2   rM   es       r   parse_timeoutrQ   h   sc    "00M1 =M]## M%o}E1LMs   
3 	AA		Aquery_categoriesr   valueNc           	      (   |dk(  r@| j                  d t        t        j                  |j	                  d            D               y |j                  d      r<|dd  }|t        vry |dk7  r| j                  |       y || v r| j                  |       y y y )Nr   c              3   2   K   | ]  }|t         v s|  y wN)r   ).0categs     r   	<genexpr>z&parse_category_form.<locals>.<genexpr>w   s     k%W\`jWjks   ,	category_	   off)	extendmapstrstripsplit
startswithr   r   remove)rR   r   rS   r   s       r   parse_category_formre   u   s    |k3syy%++cBR3Skk		%8 :%E>##H-))##H- * 
&r'   c                     g }t        d      s'|%|j                         D ]  \  }}t        |||        |s)| j                  d      }|D ]  }|j	                  |        |sdg}|S )Nr   general)r   itemsre   r7   r   )r   r(   selected_categoriesr   rS   cookie_categoriesccategs          r   get_selected_categoriesrl      s    \"t'7::< 	BKD% 3T5A	B '11,?' 	/F&&v.	/
 (kr'   category_listdisabled_enginesc                 `    g }| D ]$  |j                  fdt           D               & |S )Nc              3   j   K   | ]*  }|j                   fvrt        |j                          , y wrV   )r   r   )rW   r%   rX   rn   s     r   rY   z3get_engineref_from_category_list.<locals>.<genexpr>   s6      
U#+;; fkk5)
s   03)r^   r   )rm   rn   resultrX   s    ` @r    get_engineref_from_category_listrr      s>     F 
 
$U+
 	

 Mr'   c           	          g }g }d}t        d      s|j                         D ]  \  }}|dk(  rst        t        j                  |j                  d            D cg c]*  }|t        v r t        |t        |   j                  d         , }	}|	sj|j                  |	       d}~t        |||        |r|r|j                  t        ||             |S |st        | d       }|j                  t        ||             |S c c}w )NFr   r   rZ   r   T)r   rh   r_   r`   ra   rb   r   r   r   r^   re   rr   rl   )
r   r(   rn   query_engineref_listrR   explicit_engine_listpd_namepdengine_name
pd_enginess
             r   parse_genericrz      s    !\"::< 	CKGR)# (+399bhhsm'D#"g- k7;+?+J+J1+MN
 
 (//
;+/(#$4grB	C  ''(HIY[k(lm      7{DI 	##$DEUWg$hi7s   /C;c                     t        t              }| j                         D ]4  \  }}|j                  d      s|j	                  d      \  }}}|||   |<   6 |S )Nengine_data-)r   dictrh   rc   rb   )r(   r|   kv_r%   keys          r   parse_engine_datar      s[    d#K

 )1<<&WWS\NAvs'(K$) r'   c                 x   |j                  d      st        dd      | j                  j                         }t	        |d   |      }|j                         }t        |      }t        | |      }t        |      }t        ||      }|j                  }	|j                  }
t        |      }t        | ||      }|}|dk(  r| j                  j                  xs d}t!        d      s|j"                  r|j$                  }nt'        | ||      }t)        |      }t+        ||       \  }}}t-        ||||||||	||

      ||||fS )a  Assemble data from preferences and request.form (from the HTML form) needed
    in a search query.

    The returned tuple consists of:

    1. instance of :py:obj:`searx.search.SearchQuery`
    2. instance of :py:obj:`searx.query.RawTextQuery`
    3. list of :py:obj:`searx.search.EngineRef` instances
    4. string with the *selected locale* of the query

    About language/locale: if the client selects the alias ``auto`` the
    language preferred by the :py:obj:`Preferences.client` is used.
    If client does not have a preference, the default ``all`` is used.

    The *selected locale* in the tuple always represents the selected
    language/locale and might differ from the language recognition.

    r   rD   r6   allr   )external_bangr|   redirect_to_first_result)r-   r   r   get_disabledr
   getQueryr1   rA   rK   rQ   r   r   r   r<   client
locale_tagr   specific
enginerefsrz   r   r&   r   )r   r(   rn   r2   queryquery_pagenor@   rJ   query_timeoutr   r   r|   r;   selected_localert   query_engineref_list_unknownquery_engineref_list_notokens                    r   get_search_query_from_webappr      sl   , 88C=%c2.. #**779 "$s)-=>N ##%E%L'T:'-!$7M"00M-FF#D)KK~>J OV ''22;e
\"~'>'>  .88  -[$@PQ56JKWnkXT68T
 	 '#%=	
 	$$! r'   )&collectionsr   typingr   r   r   r   searx.exceptionsr   searx.webutilsr	   searx.queryr
   searx.enginesr   r   searx.search.modelsr   r   searx.preferencesr   r   r   r&   r`   r/   r1   r<   rA   rK   rN   rQ   re   rl   rr   rz   r   r    r'   r   <module>r      s#   $ . . 4 . $ - 6 4
)tI )4	? )
$O$2=$
4	?DOT)_<=$6tCH~ # K tCH~ | `c (+ T#s(^  (4S> hsm 
MS#X 
M 
MRW 
M.$s) .3 .s .t .$ HT#s(^<T Y]^aYb .93i 
)_% { % $sCx. % TXY\T] % bfgpbq % POO$(cNO
;d9otIKLOr'   