
    i02                        d dl mZmZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ  G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d      Zy)    )abstractmethodABCN)settings)sxng_locales)
categoriesenginesengine_shortcuts)$get_bang_definition_and_autocomplete)	EngineRef)VALID_LANGUAGE_CODEc                   F    e Zd ZdZeed               Zd Zed        Zd Z	y)QueryPartParserraw_text_queryenable_autocompletec                      y)z Check if raw_value can be parsedN 	raw_values    /root/searxng/searx/query.pycheckzQueryPartParser.check           c                      || _         || _        y Nr   )selfr   r   s      r   __init__zQueryPartParser.__init__   s    ,#6 r   c                      y)zTry to parse raw_value: set the self.raw_text_query properties

        return True if raw_value has been parsed

        self.raw_text_query.autocomplete_list is also modified
        if self.enable_autocomplete is True
        Nr   r   r   s     r   __call__zQueryPartParser.__call__   r   r   c                     || j                   j                  vr&| j                   j                  j                  |       y y r   )r   autocomplete_listappendr   values     r   _add_autocompletez!QueryPartParser._add_autocomplete&   s5    ++===1188? >r   N)
__name__
__module____qualname__	__slots__staticmethodr   r   r   r    r&   r   r   r   r   r      s@    7I/  /7  @r   r   c                   .    e Zd Zed        Zd Zd Zd Zy)TimeoutParserc                     | d   dk(  S )Nr   <r   r   s    r   r   zTimeoutParser.check,       |s""r   c                     |dd  }t        |      dkD  r| j                  |      nd}| j                  r|s| j                          |S )N   r   F)len_parser   _autocompleter   r   r%   founds       r   r    zTimeoutParser.__call__0   sC    !"&)%j1nE"%##E r   c                     |j                         syt        |      }|dk  rt        |      | j                  _        y|dz  | j                  _        y)NFd   g     @@T)isdigitintfloatr   timeout_limit)r   r%   raw_timeout_limits      r   r4   zTimeoutParser._parse7   sR    }}Js"056G0HD-  1BF0JD-r   c                 4    dD ]  }| j                  |        y )N)z<3z<850r&   )r   
suggestions     r   r5   zTimeoutParser._autocompleteC   s    ( 	/J"":.	/r   Nr'   r(   r)   r+   r   r    r4   r5   r   r   r   r-   r-   +   s#    # #
/r   r-   c                   .    e Zd Zed        Zd Zd Zd Zy)LanguageParserc                     | d   dk(  S )Nr   :r   r   s    r   r   zLanguageParser.checkI   r0   r   c                     |dd  j                         j                  dd      }t        |      dkD  r| j                  |      nd}| j                  r|s| j                  |       |S )Nr2   _-r   F)lowerreplacer3   r4   r   r5   r6   s       r   r    zLanguageParser.__call__M   s[    !"##%--c37&)%j1nE"%##Eu%r   c                 :   d}t         D ]  }t        t        j                  |      \  }}}}}||k(  s ||k(  s||k(  s|j	                  dd      |k(  sH|| j
                  j                  vsad}|j                  d      }	t        |	      dk(  r@| j
                  j                  j                  |	d   dz   |	d   j                         z          n%| j
                  j                  j                  |       ||k(  s n t        j                  |      s|dk(  r|j                  d      }	t        |	      dkD  r*|	d   j                         dz   |	d   j                         z   }|| j
                  j                  vr'| j
                  j                  j                  |       d}|S )	NFrI    T   r   r2   auto)r   mapstrrJ   rK   r   	languagessplitr3   r#   upperr   match)
r   r%   r7   lclang_id	lang_namecountryenglish_name_flag
lang_partss
             r   r4   zLanguageParser._parseT   s     	B?B399b?Q<GYu  EY$6%<:OSXS`S`adfiSjnuSut22<<<$]]3/
z?a'''1188A9LzZ[}ObObOd9de''1188AG##	( $$U+uS)J:""1++-3jm6I6I6KKD//999##--44U;r   c                 0   |st        t        d   d         dk  r:t        d   d   D ]*  }| j                  j                  j	                  d|z          , y dD ]'  }| j                  j                  j	                  |       ) y t
        D ]  }|d   t        d   d   vrt        t        j                  |      \  }}}}}|j                  |      rIt        |      dk  r'| j                  d|j                  d      d   z          n| j                  d|z          |j                  |      s|j                  |      r| j                  d|z          |j                  |j                  dd	            s| j                  d|j                  d	d
      z           y )NsearchrR   
   rF   )z:enz:en_usz:englishz:united_kingdomr   rN   rI   rM   rH   )r3   r   r   r"   r#   r   rP   rQ   rJ   
startswithr&   rS   rK   )	r   r%   langrV   rW   rX   rY   rZ   r[   s	            r   r5   zLanguageParser._autocompletev   s   8H%k23b8$X.{; MD''99@@tLM
  M GD''99@@FG 	HB!uHX.{;;?B399b?Q<GYu !!%(u:?**3s1CA1F+FG**3=9 ##E*l.E.Ee.L&&sY7 !!%--S"9:&&sW__S#-F'FG'	Hr   NrB   r   r   r   rD   rD   H   s%    # # DHr   rD   c                   .    e Zd Zed        Zd Zd Zd Zy)ExternalBangParserc                 D    | j                  d      xr t        |       dkD  S )N!!rN   )r`   r3   r   s    r   r   zExternalBangParser.check   s!    ##D)@c)nq.@@r   c                     |dd  j                         }t        |      dkD  r| j                  |      ndg f\  }}| j                  r| j	                  |       |S )NrN   r   F)rJ   r3   r4   r   r5   )r   r   r%   r7   bang_ac_lists        r   r    zExternalBangParser.__call__   sV    !"##%47JNdkk%0PR|##|,r   c                 T    d}t        |      \  }}||| j                  _        d}||fS )NFT)r
   r   external_bang)r   r%   r7   bang_definitionrg   s        r   r4   zExternalBangParser._parse   s:    (LU(S%&05D-El""r   c                 F    |sg d}|D ]  }| j                  d|z           y )N)gddgbingre   r@   )r   rg   ri   s      r   r5   z ExternalBangParser._autocomplete   s,    /L) 	9M""4-#78	9r   NrB   r   r   r   rc   rc      s%    A A#9r   rc   c                   .    e Zd Zed        Zd Zd Zd Zy)
BangParserc                 F    | d   dk(  xr t        |       dk  xs | d   dk7  S )Nr   !rN   r2   )r3   r   s    r   r   zBangParser.check   s/     |s"RI(:(Qilc>QRr   c                 &   |dd  j                  dd      j                  dd      j                         }t        |      dkD  r| j                  |      nd}|r|d   dk(  rd| j                  _        | j                  r| j                  |d   |       |S )	Nr2   rI   rM   rH   r   Frr   T)rK   rJ   r3   r4   r   specificr   r5   r6   s       r   r    zBangParser.__call__   s    !"%%c3/77SAGGI&)%j1nE"%Yq\S(+/D(##y|U3r   c                     t         v r	t            t        v r0 j                  j                  j	                  t        d             yt        v r7 j                  j                  j                   fdt           D               yy)NnoneTc              3      K   | ]>  }|j                   fj                  j                  vrt        |j                          @ y wr   )namer   disabled_enginesr   ).0enginer   r%   s     r   	<genexpr>z$BangParser._parse.<locals>.<genexpr>   sA      2KK't/B/B/S/SS &++u-2s   AAF)r	   r   r   
enginerefsr#   r   r   extendr$   s   ``r   r4   zBangParser._parse   s    $$$U+E G**11)E62JK J **11 2(/2 
 r   c                    |s=dD ]7  }|| j                   j                  vs	|t        v s$| j                  ||z          9 y t        D ]8  }|j	                  |      s| j                  ||j                  dd      z          : t        D ]8  }|j	                  |      s| j                  ||j                  dd      z          : t        D ](  }|j	                  |      s| j                  ||z          * y )N)images	wikipediaosmrM   rH   )r   ry   r   r&   r`   rK   r   r	   )r   
first_charr%   rA   categoryr{   engine_shortcuts          r   r5   zBangParser._autocomplete   s    < D
T%8%8%I%IIZ[eMe**:
+BCD  # 	PH""5)&&zH4D4DS#4N'NO	P
  	NF  '&&zFNN34L'LM	N
  0 	EO))%0&&zO'CD	Er   NrB   r   r   r   rp   rp      s&    S S.Er   rp   c                   "    e Zd Zed        Zd Zy)FeelingLuckyParserc                     | dk(  S )Nre   r   r   s    r   r   zFeelingLuckyParser.check   s    D  r   c                 &    d| j                   _        y)NT)r   redirect_to_first_resultr   s     r   r    zFeelingLuckyParser.__call__   s    7;4r   N)r'   r(   r)   r+   r   r    r   r   r   r   r      s    ! !r   r   c                   X    e Zd ZdZeeeeegZ	de
defdZd Zd Zd Zd Zd	 Zd
 Zd Zy)RawTextQueryz4parse raw text query (the value from the html input)queryry   c                     t        |t              sJ || _        |r|ng | _        g | _        g | _        d | _        d | _        d| _        g | _	        g | _
        g | _        d | _        d| _        | j                          y )NF)
isinstancerQ   r   ry   r}   rR   r=   ri   rt   r"   query_partsuser_query_partsautocomplete_locationr   _parse_query)r   r   ry   s      r   r   zRawTextQuery.__init__  s    %%%%
4D 0"!!!# "%)"(-%r   c                    t        j                  d| j                        }d}t        |      dz
  }t	        |      D ]  \  }}|j                         s|dk(  rd}t        j                  D ]'  }|j                  |      s  || ||k(        |      } n |r| j                  n| j                  }|j                  |       |t        |      dz
  f} || _        y)zn
        parse self.query, if tags are set, which
        change the search engine or search-language
        z(\s+)Nr2    F)rerS   r   r3   	enumerateisspacer   PARSER_CLASSESr   r   r   r#   r   )	r   raw_query_partslast_index_locationautocomplete_indexi
query_partspecial_partparser_classqlists	            r   r   zRawTextQuery._parse_query  s     ((8TZZ8" 1A5&7 	:MAz!!#zR'7 !L , ; ; %%j1#N<a;M6M#Nz#ZL )5D$$$:O:OELL$#(#e*q."9	:" &9"r   c                 J    | j                   \  }}|||<   | j                         S r   )r   getFullQuery)r   textr   positions       r   get_autocomplete_full_queryz(RawTextQuery.get_autocomplete_full_query7  s)    44xh  ""r   c                     |j                         j                         | _        | j                         | _        | j                  t        | j                        dz
  f| _        g | _        | S )Nr2   )striprS   r   r   r   r3   r   r"   )r   r   s     r   changeQueryzRawTextQuery.changeQuery<  sZ     % 3 3 5&&(
&*&;&;SAVAV=WZ[=[%\"!#r   c                 8    dj                  | j                        S )NrM   )joinr   r   s    r   getQueryzRawTextQuery.getQueryC  s    xx--..r   c                     dj                  dj                  | j                        | j                               j	                         S )z6
        get full query including whitespaces
        z{0} {1}rM   )formatr   r   r   r   r   s    r   r   zRawTextQuery.getFullQueryF  s5     )9)9 :DMMOLRRTTr   c                 "    | j                         S r   )r   r   s    r   __str__zRawTextQuery.__str__L  s      ""r   c                    d| j                   j                   dd| j                  dz   d| j                  dz   d| j                  dz   d| j
                  dz   d| j                  dz   d	| j                  dz   d
| j                  dz   d| j                  dz   d| j                  dz   d| j                  dz   d| j                  z   S )Nr/   rM   zquery=zdisabled_engines=z
  z
languages=ztimeout_limit=zexternal_bang=z	specific=zenginerefs=zautocomplete_list=zquery_parts=zuser_query_parts=z >
zredirect_to_first_result=)	__class__r'   r   ry   rR   r=   ri   rt   r}   r"   r   r   r   r   s    r   __repr__zRawTextQuery.__repr__O  s1   ''(*tzznA&'!$"7"7!:$?@ 4>>,A./ t114A6	7
 t114A67 $--*!,- DOO.d34 #4#9#9"<DAB T--05	6 "$"7"7!:$?
@ *$*G*G)JKL	
r   N)r'   r(   r)   __doc__r-   rD   rc   rp   r   r   rQ   listr   r   r   r   r   r   r   r   r   r   r   r   r      sT    > 	Nc T &9>#
/U#
r   r   )abcr   r   r   searxr   searx.sxng_localesr   searx.enginesr   r   r	   searx.external_bangr
   searx.search.modelsr   searx.webutilsr   r   r-   rD   rc   rp   r   r   r   r   r   <module>r      s    $ 	  + ? ? D ) .@c @8/O /:LH_ LH^9 96;E ;E| c
 c
r   