
    JeT8                         d Z ddlZddlmZ ddlZddlZddl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ZdZd	Z G d
 de      Zy)zSearch thread.    N)QMutexQMutexLockerQThreadSignal)_)is_text_file)SpyderPalettez...P   (   c                        e Zd ZdZg dZg dZdgZ ee      Z	 ee
      Z ee
      Z ee      Z eee      Z ee      ZdZdZd fd	Zd Zd	 Zd
 Zd Zd Zd Zd Zd Z xZS )SearchThreadzFind in files search thread.)z.pyz.pywz.pyxz.ipyz.pyiz.pyt)z.ipynb.mdz.cz.cppz.hz.cxxz.fz.f03z.f90z.jsonz.datz.csvz.tsvz.txtr   z.rstz.ymlz.yamlz.iniz.batz.shz.uiz.svgr   	   c                 Z   t         |   |       || _        || _        || _        t               | _        d | _        d | _        d | _	        d | _
        d | _        d | _        d | _        d | _        d | _        d| _        d| _	        d| _        i | _        d| _        g | _        g | _        d| _        y )NTr   F)super__init__search_text
text_colormax_resultsr   mutexstoppedpathlisttotal_matches
error_flagrootpathexcludetextstext_re	completedcase_sensitiveis_fileresults	num_filesfilespartial_resultstotal_items)selfparentr   r   r   	__class__s        R/usr/lib/python3/dist-packages/spyder/plugins/findinfiles/widgets/search_thread.pyr   zSearchThread.__init__9   s     &$&X
!
"
!    c                     || _         |rt        j                  |      | _        || _        || _        || _        d| _        d| _        || _	        y )NF)
r   recompiler   r   r   r!   r   r   r    )r'   pathr!   r   r   r   r    s          r*   
initializezSearchThread.initializeS   sG    ::g.DL
,r+   c                 j   	 g | _         | j                  r| j                  | j                         n| j	                  | j                         | j                          | j                  j                  | j                         y # t
        $ r' t        j                          t        d      | _	        Y ew xY w)Nz&Unexpected error: see internal console)	filenamesr!   find_string_in_filer   find_files_in_path	Exception	traceback	print_excr   r   stopsig_finishedemitr   r'   s    r*   runzSearchThread.run_   s    	JDN||((7''6 			t~~.  	J ! HIDO	Js   A
B -B21B2c                 f    t        | j                        5  d| _        d d d        y # 1 sw Y   y xY w)NT)r   r   r   r;   s    r*   r8   zSearchThread.stopo   s*    $**% 	 DL	  	  	 s   '0c                    | j                   g | _         | j                   j                  |       t        j                  |      D ]~  \  }}}t	        | j
                        5  | j                  r	 d d d         y	 d d d        	 |d d  D ]  }t	        | j
                        5  | j                  r	 d d d          y	 d d d        t        j                  j                  ||      }t        j                  |      j                  }t        j                  |      s|j                  |       | j                  rCt        j                  | j                  |t        j                   z         r|j                  |       |j#                  d      s|j                  |        |D ]  }t	        | j
                        5  | j                  r	 d d d          y	 d d d        t        j                  j                  ||      }t%        j&                  |      d   }		 t        j                  |      j                  }
t        j(                  |
      s	 | j                  r!t        j                  | j                  |      r|	| j,                  v r|	| j.                  v s|	| j0                  v st3        |      s| j5                  |       "  | j>                  r| jA                          y# 1 sw Y   kxY w# 1 sw Y   7xY w# 1 sw Y   ,xY w# t*        $ r Y vw xY w# t        j6                  $ r t9        d      | _        Y  yt<        $ r Y  yw xY w)NF.   zinvalid regular expressionT)!r   appendoswalkr   r   r   r/   joinstatst_modeS_ISDIRremover   r-   searchsep
startswithospsplitextS_ISREGOSErrorSKIPPED_EXTENSIONSPYTHON_EXTENSIONSUSEFUL_EXTENSIONSr   r3   errorr   r   FileNotFoundErrorr%   process_results)r'   r/   dirsr$   ddirnamest_dir_modeffilenameextst_file_modes              r*   r4   zSearchThread.find_files_in_paths   s   == DMT"!# B	D$djj) !<< ! !!>a 'A%djj1 )<<#() )') !ggll43G #%'''"2":":K<<4AIIdllGbff4DEAc*A%'*  ";A%djj1 )<<#() )')  "ww||D!4H,,x03C!')wwx'8'@'@#||L9$  : ||		$,,(I  d555  t5554#9#99(200:E";7B	J   "O! !) )*) )  # ! !$ 88 "#$@"A$ s   !K#L!K0/	L;CL
/L9K=	LA L4L
A%L/L#K-	0K:5L=LL
	LLLL#M MMc           	      	   d| _         | j                  j                  |       	 t        t	        |d            D ]  \  }}| j
                  D ]  \  }}t        | j                        5  | j                  r	 d d d          y	 d d d        |}| j                  s|j                         }| j                  rt        j                  ||      }| n|j                  |      }|dkD  s n 	 |j                        }| j                  s|j                         }| j                  rft        j"                  |      D ]J  }	t        | j                        5  | j                  r	 d d d          y	 d d d        | xj$                  dz  c_        |	j'                         |	j)                         }}
	 t+        |d |
 j                              }|t+        ||
| j                  |            z   }| j,                  j/                  t1        j2                  |      |dz   |||f       t+        | j,                        d| j4                  z  kD  s| j7                          | j4                  | j8                  k  s6| xj4                  dz  c_        M P|j                        }|dkD  sht        | j                        5  | j                  r	 d d d         y	 d d d        | xj$                  dz  c_        	 t+        |d | j                              }|t+        |j                  |            z   }| j,                  j/                  t1        j2                  |      |dz   |||f       t+        | j,                        d| j4                  z  kD  r>| j7                          | j4                  | j8                  k  r| xj4                  dz  c_        | j
                  D ]!  \  }}|j                  ||dz         }|dkD  s! n |dkD  rV 	 | j@                  r| j,                  r| j7                          d| _!        y # 1 sw Y   xY w# t         $ r |}Y Lw xY w# 1 sw Y   xY w# t         $ r |
}|}Y w xY w# 1 sw Y   xY w# t         $ r |}|t+        |      z   }Y mw xY w# t:        $ r)}|j<                  \  }}t?        d      | _         Y d }~d }~ww xY w)NFrbr@      z)permission denied errors were encounteredT)"r   sig_current_filer:   	enumerateopenr   r   r   r   r    lowerr   r-   rI   finddecodeUnicodeDecodeErrorfinditerr   startendlenr%   rA   rL   abspathpowerrU   	max_powerIOErrorargsr   r!   r   )r'   fnamelinenolinetextencline_searchfoundline_decmatchbstartbendrj   rk   xxx_todo_changeme_errno	_strerrors                    r*   r3   z SearchThread.find_string_in_file   sS   ""5)O	M )$ud*; < K&!% "ID#%djj1 )<<#() )') #'K..&1&7&7&9|| "		$ < ,! + 0 0 6 2:!"$#{{3/H **::<D<<!#T4!8 0)$**5 -#||',- -+- **a/*',{{}eiik'$'Wf(<(<S(A$BE"'#d6$.?.F.Fs.K*L"LC ,,33S[[5G5;aZ5:585=	5? @
 t3344::F 002#zzDNN: $

a
+0. !IIdOE"*)$**5 -#||',- -+- **a/*4$'Ve(;(;C(@$AE"'#dkk#.>*?"?C
 ,,33S[[5G5;aZ5:585=	5? @
 t3344::F 002#zzDNN: $

a
)- &ID#$(IIdEAI$>E$rz %&/  "*cK&b <<D00  "e) )  * $#H$- -  2 '$*E"&C'- -  2 4$)E"'#d)"3C4$  	M"3"8"8VY KLDOO	Ms  AR 'P+5
R A
R R %R )P8:AR Q
 
R ,=R *=Q'AR )R /0R !R 6Q+	R R -:Q8'CR -R 7R +P50R 8QR QR 
QR Q($R 'Q((R +Q5	0R 8RR RR 	S
!SS
c                    g }| j                   }| j                  D ]  }| j                  | j                  k  s|\  }}}}}|| j                  vrK| j                  j                  |       | j                  j                  |       | xj                  dz  c_        | j                  |||      }|||||f}	|j                  |	       | xj                  dz  c_         d| j                  z  }
| j                  }|dk(  rt        d      }n)t        d      }t        d      }|dkD  r|dz  }d||||fz  }|
|z   }
g | _        | j                  j                  ||
       y	)
aT  
        Process all matches found inside a file.

        Creates the necessary files and emits signal for the creation of file
        item.

        Creates the necessary data for lines found and emits signal for the
        creation of line items in batch.

        Creates the title based on the last entry of the lines batch.
        r@   z'%s' - r   zString not foundz
matches infilesz%d %s %d %sN)r   r%   r&   r   r$   rA   sig_file_matchr:   r#   truncate_resultr   r   sig_line_match)r'   itemsnum_matchesresultr[   rs   colno	match_endrt   itemtitlenb_filesru   text_matches
text_filess                  r*   rU   zSearchThread.process_results  s]    ((** 	&F$"2"22;A8&%D4::-JJ%%h/'',,X6NNa'N++D%C &%yAT"  A% 	& D,,,>>q='(D\?L6J!|c!
 K$,j$: :D!  .r+   c                    ddddddfd}t        |      }|d| ||| ||d }}}t        |      t        kD  rAt        |      t        |      z
  d	z  }|j                  d
      }t        |      }	|	dk(  r'|d   }t        |      t        kD  rt
        || d z   }|g}|j                  d
      }t        |      }
|
dk(  r&|d   }t        |      t        kD  r|d| t
        z   }|g}|dd }|dd }t        |      |	k  r
t
        g|z   }t        |      |
k  r
|t
        gz   }d
j                  |      }d
j                  |      }t        |      t        kD  rt
        |dd z   }t        |      t        kD  r|dd t
        z   }t        j                  }t        dj                  |||g      d| j                   d ||       d| d ||       d ||       d      }|S )zU
        Shorten text on line to display the match within `max_line_length`.
        z&amp;z&quot;z&apos;z&gt;z&lt;)&"'><c                 8    dj                  fd| D              S )zProduce entities within text. c              3   B   K   | ]  }j                  ||        y wN)get).0chtml_escape_tables     r*   	<genexpr>zDSearchThread.truncate_result.<locals>.html_escape.<locals>.<genexpr>V  s     E1,00A6Es   )rD   )ru   r   s    r*   html_escapez1SearchThread.truncate_result.<locals>.html_escapeT  s    77EEEEr+   Nra    r@   r      i   r   z<span style="color:z">z<span style="background-color:z</span>)ru   formatted_text)strrl   MAX_RESULT_LENGTHsplitMAX_NUM_CHAR_FRAGMENTELLIPSISrD   r	   COLOR_OCCURRENCE_4dictr   )r'   rt   rj   rk   r   leftrz   rightoffsetnum_left_wordsnum_right_wordsmatch_color
trunc_liner   s                @r*   r   zSearchThread.truncate_resultH  s   
 
	F 4y!&5\4c?DJUet9(($i#e*,2F::c?D YN"Awt944#dF78n4DvKK$E!%jO!#au: 55!'6NX5E9D"1IE4y>) zD(5zO+
*88D>DHHUOE4y00$st*,5z11cr
X-#66$u-.%doo%6bt$%0Ru%&u%&

 r+   c                 ^    | j                   | j                  | j                  | j                  fS r   )r"   r   r   r   r;   s    r*   get_resultszSearchThread.get_results  s#    ||T]]D,>,>OOr+   )i  )__name__
__module____qualname____doc__rQ   rR   rP   r   boolr9   r   rb   sig_current_folderobjectr   r   sig_out_printrn   ro   r   r0   r<   r8   r4   r3   rU   r   r   __classcell__)r)   s   @r*   r   r   "   s    &G !$<Lc{F^NFF+N6NM EI4
-/  L\Xt+/ZHTPr+   r   )r   rB   os.pathr/   rL   r-   rE   r6   qtpy.QtCorer   r   r   r   spyder.api.translationsr   spyder.utils.encodingr   spyder.utils.paletter	   r   r   r   r    r+   r*   <module>r      sQ     
  	   > = & . .
   
qP7 qPr+   