
    %$}gc                     0   d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZ dd	lmZmZ dd
lmZ  ej        e          Ze                    de            ee          deeeef                  dedededef
d            Zdeeeef                  dedededee         f
dZ ed          dedefd            Zdddedee         dee         dedededee         fdZdedededefd Z ee          d!e
e         dee         d"ed#eded$ed%edee         fd&            Z d'ed(ededefd)Z!dededee         fd*Z"d+eeeef                  d,edefd-Z#d$eeeef                  defd.Z$d%eeeef                  defd/Z%dS )0z/
Filters for date parsing and date validators.
    N)Counter)datetime)	lru_cache)mktime)MatchOptionalPatternUnionr      )
CACHE_SIZEMIN_DATE)	Extractorzminimum date setting: %s)maxsize
date_inputoutputformatearliestlatestreturnc           	      @   | dS t          | t                    r| }n	 |dk    rQt          t          | dd                   t          | dd                   t          | dd                             }nt          j        | |          }n# t          $ r Y dS w xY w|j        |j        cxk    r|j        k    rKn nH|                                |                                cxk    r|                                k    rn nd	S t                              d
|            dS )zEValidate a string w.r.t. the chosen outputformat and basic heuristicsNF%Y-%m-%d            
   Tzdate not valid: %s)	
isinstancer   intstrptime
ValueErroryear	timestampLOGGERdebug)r   r   r   r   
dateobjects        S/var/www/py-google-trends/myenv/lib/python3.11/site-packages/htmldate/validators.pyis_valid_dater&      sJ    u *h'' 

		z))%
2A2''Z!_)=)=s:aPRdCS?T?T 


 &.z<HH
 	 	 	55	
 	7777FK77777  J$8$8$:$:PPPPf>N>N>P>PPPPPPt
LL%z2225s   A,B 
BBc                     t          | |||          rd	 t                              d|            |                     |          S # t          $ r&}t                              d| |           Y d}~nd}~ww xY wdS )z5Robust validation and conversion for plausible dates.zcustom parse result: %sz$value error during conversion: %s %sN)r&   r"   r#   strftimer   error)r   r   r   r   errs        r%   validate_and_convertr+   <   s     Zx@@ R	RLL2J???&&|444 	R 	R 	RLL?SQQQQQQQQ	R4s   /A 
A4A//A4   c                 <   t          ddddd          }	 |                    |            n;# t          t          f$ r'}t                              d| |           Y d}~dS d}~ww xY wt          | t                    rd| vrt                              d	|            dS d
S )z*Validate the output format in the settingsi  	   r   r   z"wrong output format or type: %s %sNF%zmalformed output format: %sT)r   r(   	TypeErrorr   r"   r)   r   str)r   r$   r*   s      r%   is_valid_formatr2   L   s     $1a++JL))))z"   9<MMMuuuuu lC(( C|,C,C2LAAAu4s   + A#AA#F)
incomplete
htmlstringpatternyearpatr3   c                   t          |                    |                     }t          |          D ]}|                    |          }|t                              d|           ||= 8|d         }	|st          |	          }
n"|	d         dk    rdnd}t          ||	z             }
|j        |
cxk    r|j        k    s n t                              d|           ||= |S )	z5Filter the date patterns to find plausible years onlyNznot a year pattern: %sr   r   91920zno potential year: %s)r   findalllistsearchr"   r#   r   r    )r4   r5   r6   r   r   r3   occurrencesitem
year_match
lastdigitspotential_yearcenturys               r%   plausible_year_filterrD   ]   s     '//*5566K[!! " "^^D))
LL14888D!]
 	7 __NN(ms22ddG :!566N}====&+====LL0$777D!    	referenceattemptoptionsc                 X   	 t          t          t          j        ||j                                                                      }n5# t          $ r(}t                              d||           | cY d}~S d}~ww xY w|j	        r| rt          | |          n|} nt          | |          } | S )z*Compare the date expression to a referencez-datetime.strptime exception: %s for string %sN)r   r   r   r   format	timetuple	Exceptionr"   r#   originalminmax)rF   rG   rH   r!   r*   s        r%   compare_valuesrP   ~   s    x0'.IISSUUVVWW		   Dc7SSS  .1:IC	9---				9--	s   AA	 	
A;A60A;6A;	bestmatchoriginal_datecopyearmin_datemax_datec                    | d                     | d         | d         | d         g          }t          |d||          rL|dk    st          | d                   |k    r-t                              d	||           t          |d|          S dS )
z-Filter free text candidates in the YMD formatN-r         r   r   r   r   zdate found for pattern "%s": %s)joinr&   r   r"   r#   convert_date)rQ   r5   rR   rS   r   rT   rU   pagedates           r%   filter_ymd_candidater^      s     88Yq\9Q<1FGG:RRR 	DqLLC	!--88LL:GXNNN*lCCC 4rE   
datestringinputformatc                     ||k    r| S t          | t                    r|                     |          S t          j        | |          }|                    |          S )z.Parse date and return string in desired format)r   r   r(   r   )r_   r`   r   r$   s       r%   r\   r\      sa     l""*h'' 1""<000":{;;J|,,,rE   c                     | dk    rRt          j        |           }|                    |j                  }t	          ||j        |j        |j                  r|S dS )z4Test if the extracted reference date can be returnedr   rZ   N)r   fromtimestampr(   rJ   r&   rN   rO   )rF   rH   r$   	converteds       r%   check_extracted_referencere      sc    1}}+I66
''77	w~GK
 
 
 	 4rE   date_objectdefaultc                     t          | t                    r| S t          | t                    r@	 t          j        |           S # t          $ r t
                              d|            Y nw xY w|S )zTCheck if the input is a usable datetime or ISO date string, return default otherwisezinvalid datetime string: %s)r   r   r1   fromisoformatr   r"   warning)rf   rg   s     r%   check_date_inputrk      s     +x(( +s## G	G)+666 	G 	G 	GNN8+FFFFF	GNs   A %A*)A*c                 ,    t          | t                    S )zEValidates the minimum date and/or defaults to earliest plausible date)rk   r   )rT   s    r%   get_min_daterm      s    Hh///rE   c                 D    t          | t          j                              S )zCValidates the maximum date and/or defaults to latest plausible date)rk   r   now)rU   s    r%   get_max_daterp      s    Hhlnn555rE   )&__doc__loggingcollectionsr   r   	functoolsr   timer   typingr   r   r	   r
   Counter_Typesettingsr   r   utilsr   	getLogger__name__r"   r#   r1   boolr&   r+   r2   rD   r   rP   r^   r\   re   rk   rm   rp    rE   r%   <module>r~      s                             K K K K K K K K K K K K K K * * * * * * * *       
	8	$	$ ' 2 2 2 :"x}-."" " 	"
 
" " " "Jx}-.  	
 c]     2# $    .    S\ S\	
    #   Bc C )      :SzS\  	
    c]   :
-S 
-s 
-# 
-# 
- 
- 
- 
-	 	y 	Xc] 	 	 	 	%#./:B   08E(C-$89 0h 0 0 0 0
68E(C-$89 6h 6 6 6 6 6 6rE   