
    j5jS                       U d Z ddlmZ ddlZddlZddlZddlZddl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mZmZ ddlmZmZ ej.                  d	k(  rddlZej2                  Zd
ed<   nddlmZ  eg d      ZeZd
ed<    ej:                  e      Z ed      Z  ed      Z!ddZ"d dZ#d!dZ$d"dZ%d#d$dZ&d#d$dZ'd%dZ(d#d$dZ)d#d$dZ*d#d&dZ+e*e&e'e)gZ,d'dZ-d(dZ.d)dZ/d#dZ0y)*zFFind Tesseract and Ghostscript binaries on Windows using the registry.    )annotationsN)CallableIterableIterator)chainPath)Any	TypeAliasTypeVar)InvalidVersionVersionwin32r   HKEYType)Mock)r   EnumKey	EnumValueHKEY_LOCAL_MACHINEOpenKey)specTTkeyc                    	 | j                  dd      D cg c]  }t        |       }}t        |      dk  r |j                  d       t        |      dk  r |d   |d   |d   fS c c}w # t        $ r Y yw xY w)z$Compare Ghostscript version numbers..   )maxsplitr         r   r   r   )splitintlenappend
ValueError)selemreleases      R/var/www/html/qr/venv/lib/python3.12/site-packages/ocrmypdf/subprocess/_windows.pyghostscript_version_keyr)   (   s    )*q)AB3t9BB'lQNN1 'lQ
GAJ
33 C  s'   A, A'/A, A, 'A, ,	A87A8c              #     K   d}d}||k  r	  || |       |dz  }||k  r||k(  rt        d|        y # t         $ r Y w xY ww)Ni  r   r   zToo many registry keys under )OSErrorr$   )keyenum_fnlimitns       r(   registry_enumr0   3   sn     E	A
e)	#q/!FA e) 	Ez8>??   		s*   
A7 AA	A AAAc                6    t        | t        j                        S N)r0   winregr   r,   s    r(   registry_subkeysr5   @   s    fnn--    c                6    t        | t        j                        S r2   )r0   r3   r   r4   s    r(   registry_valuesr8   D   s    f..//r6   c              #    K   ~ 	 t        j                  t         j                  d      5 }t        t	        |      t
        d      }d d d        t        j                  t         j                  d       5 }t        |      D ]  \  }}}t        |      dz    	 d d d        y # 1 sw Y   _xY w# 1 sw Y   y xY w# t        $ r}t        j                  |       Y d }~y d }~ww xY ww)Nz SOFTWARE\Artifex\GPL Ghostscriptr   )r,   defaultz!SOFTWARE\Artifex\GPL Ghostscript\bin)r3   r   r   maxr5   r)   r8   r	   r+   logwarning)envk	latest_gs_gs_pathes         r(   registry_path_ghostscriptrE   H   s     ^^%%'J
 	 #)@)I	 ^^%%*KI;'W
 	,!0!3 ,7A7me++,	, 	,	 		, 	,
  Asi   C&$B; B#/B; 4%B/B; "C&#B,(B; /B84B; 7C&8B; ;	C#CC&C##C&c              #  ,  K   ~ 	 t        j                  t         j                  d      5 }t        |      D ]  \  }}}|dk(  st	        |      }|  	 d d d        y # 1 sw Y   y xY w# t
        $ r}t        j                  |       Y d }~y d }~ww xY ww)NzSOFTWARE\Tesseract-OCR
InstallDir)r3   r   r   r8   r	   r+   r=   r>   )r?   r@   subkeyval_valtypetesseract_pathrD   s          r(   registry_path_tesseractrL   Z   s     ^^F557PQ 	)UV)8); )%X\)%)#YN(()	) 	) 	)
  AsW   B$A) AAA) BA&"A) %B&A) )	B2BBBBc                    t        j                  dt        |             }|r!	 |j                  d      }t	        |      }d|fS | j                  dfS # t
        $ r Y w xY w)a  Key function for comparing Ghostscript and Tesseract paths.

    Ghostscript installs on Windows:
        %PROGRAMFILES%/gs/gs9.56.1/bin -> ('gs', Version('9.56.1'))
        %PROGRAMFILES%/gs/9.24/bin -> ('gs', Version('9.24'))

    Tesseract looks like:
        %PROGRAMFILES%/Tesseract-OCR -> ('Tesseract-OCR', None)

    Thus ensuring the resulting tuple will order the alternatives correctly,
    e.g. gs10.0 > gs9.99.
    zgs[/\\]?([0-9.]+)[/\\]binr   gsN)researchstrgroupr   r   name)pathmatchversion_strversions       r(   _gs_version_in_path_keyrX   f   sf     II2CI>E	++a.Kk*G=  99d?  		s   A 	AAc                    | st         j                  } | j                  dd      dfd}t        t	        d  |       D        t
        d            S )NPROGRAMFILES c               3  0  K   t              j                         D ]s  } | j                         s| j                  j	                         dk(  r|  6| j                  j	                         dk(  sTd | j                  d      D        E d {    u y 7 w)Nztesseract-ocrrN   c              3  B   K   | ]  }|j                         s|  y wr2   )is_dir.0ps     r(   	<genexpr>z;program_files_paths.<locals>.path_walker.<locals>.<genexpr>   s     I!ahhjAIs   z**/bin)r	   iterdirr^   rS   lowerglob)rT   program_filess    r(   path_walkerz(program_files_paths.<locals>.path_walker   sz     '//1 	JD;;=yy O3
"d*Ityy':III	J Js   A-B1BBBc              3      K   | ]  }|  y wr2    r_   s     r(   rb   z&program_files_paths.<locals>.<genexpr>   s     &1Q&s   T)r,   reversereturnzIterator[Path])osenvirongetitersortedrX   )r?   rg   rf   s     @r(   program_files_pathsrr   ~   sL    jjGGNB/MJ &&'	
 r6   c                :    d t        j                  |       D        S )Nc              3  8   K   | ]  }|st        |        y wr2   r   r_   s     r(   rb   z!paths_from_env.<locals>.<genexpr>   s     8aDG8   )rm   get_exec_path)r?   s    r(   paths_from_envrw      s    8R--c288r6   c                ~    |st         j                  }t         j                  j                  d  | |      D              S )Nc              3  8   K   | ]  }|st        |        y wr2   rQ   r_   s     r(   rb   zshim_path.<locals>.<genexpr>   s     ?aQ3q6?ru   )rm   rn   pathsepjoin)	new_pathsr?   s     r(   	shim_pathr~      s+    jj::???9S>???r6   c                    | j                         j                  d      rt        j                  g|z   }t        D ]2  }t        ||      }t        j                  |d   |      }|s,||d<    |S  |S )zIAdjust our desired program and command line arguments for use on Windows.z.pyr   rT   )rd   endswithsys
executableSHIMSr~   shutilwhich)programargsr?   shimshimmed_path	new_args0s         r(   fix_windows_argsr      su     }}&$&   s+LLa|<	DGK Kr6   c              #  x   K   t               }|j                  }| D ]  } ||      }||vs ||       |  yw)z'List unique elements, preserving order.N)setadd)iterabler,   seenseen_addelementr@   s         r(   unique_everseenr      sC      eDxxH LD=QKM	s   (::c                >    t         j                  t        |             S r2   )rQ   casefoldr   s    r(   _casefold_pathr      s    <<D	""r6   c                      t         j                   t        j                   fdt        D              }t         j
                  j                  d t        |t              D              S )Nc              3  .   K   | ]  } |        y wr2   ri   )r`   r   r?   s     r(   rb   z shim_env_path.<locals>.<genexpr>   s     $A4T#Y$As   c              3  2   K   | ]  }t        |        y wr2   rz   r_   s     r(   rb   z shim_env_path.<locals>.<genexpr>   s      As   r4   )	rm   rn   r   from_iterabler   r{   r|   r   r   )r?   
shim_pathss   ` r(   shim_env_pathr      sP    
{jj$$$A5$AAJ::?? '
G  r6   )r%   rQ   rl   ztuple[int, int, int])r,   r   r-   zCallable[[HKEYType, int], T]rl   Iterator[T])r,   r   rl   zIterator[str])r,   r   rl   zIterator[tuple[str, Any, int]]r2   rk   )rT   r	   rl   ztuple[str, Version | None])r}   zCallable[[Any], Iterator[Path]]rl   rQ   )r   rQ   )r   zIterable[T]r,   zCallable[[T], Tkey]rl   r   )rT   r	   rl   rQ   )1__doc__
__future__r   loggingrm   rO   r   r   collections.abcr   r   r   	itertoolsr   pathlibr	   typingr
   r   r   packaging.versionr   r   platformr3   r   __annotations__unittest.mockr   	getLogger__name__r=   r   r   r)   r0   r5   r8   rE   rL   rX   rr   rw   r~   r   r   r   r   r   ri   r6   r(   <module>r      s    M "  	 	  
 8 8   * * 5<<7 //Hi)"RF Hi g!CLv
@.0$	0.9@ 		$
#r6   