
    "#hc                        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j/                  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%y)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           	         | yt        | t              r| }nN	 |dk(  r2t        t        | dd       t        | dd       t        | dd             }nt        j                  | |      }|j
                  |j
                  cxk  r|j
                  k  r:n n7|j                         |j                         cxk  r|j                         k  ry	 t        j                  d
|        y# t        $ r Y yw xY w)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        P/var/www/html/sandstorm/venv/lib/python3.12/site-packages/htmldate/validators.pyis_valid_dater&      s      *h'
		z)%
2A'Z!_)=s:aPRCS?T

 &..z<H
 	7FKK7 J$8$8$:Pf>N>N>PP Q LL%z2  		s   AC 	C+*C+c                     t        | |||      r(	 t        j                  d|        | j                  |      S y# t        $ r!}t        j                  d| |       Y d}~yd}~ww xY w)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+   <   sh     Zx@	RLL2J?&&|44   	RLL?SQQ	Rs   &8 	A"AA"   c                    t        ddddd      }	 |j                  |        t        | t              rd| vrt        j                  d	|        yy
# t        t        f$ r!}t        j                  d| |       Y d}~yd}~ww xY w)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)
 lC(C|,C2LA z" 9<Ms   A A>A99A>F)
incomplete
htmlstringpatternyearpatr3   c                   t        |j                  |             }t        |      D ]  }|j                  |      }|t        j                  d|       ||= 0|d   }	|st        |	      }
n|	d   dk(  rdnd}t        ||	z         }
|j                  |
cxk  r|j                  k  r}n t        j                  d|       ||=  |S )z5Filter the date patterns to find plausible years onlyz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6K[! "^^D)
LL148D!]
 _N(ms2dG :!56N}}=&++=LL0$7D!!"$     	referenceattemptoptionsc                 >   	 t        t        t        j                  ||j                        j                                     }|j                  r| rt        | |      } | S |} | S t        | |      } | S # t        $ r#}t        j                  d||       | cY d}~S d}~ww xY w)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0'..ISSUVW	 1:C	9-	  AJ	  	9-	  Dc7Ss   A A0 0	B9BBB	bestmatchoriginal_datecopyearmin_datemax_datec                     | fdj                  | d   | d   | d   g      }t        |d||      r:|dk(  st        | d         |k\  r$t        j	                  d	||       t        |d|      S y)
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^      su     88Yq\9Q<1FG:RqLC	!-8LL:GXN*lCC rE   
datestringinputformatc                     ||k(  r| S t        | t              r| j                  |      S t        j                  | |      }|j                  |      S )z.Parse date and return string in desired format)r   r   r(   r   )r_   r`   r   r$   s       r%   r\   r\      sP     l"*h'""<00"":{;J|,,rE   c                     | dkD  r_t        j                  |       }|j                  |j                        }t	        ||j                  |j
                  |j                        r|S y)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      sU    1}++I6
''7	w~~GKK
 rE   date_objectdefaultc                     t        | t              r| S t        | t              r	 t        j                  |       S |S # t        $ r t
        j                  d|        Y |S w xY w)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      sc     +x(+s#	G))+66 N  	GNN8+FN	Gs   ; 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                 >    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    Hhlln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 *  
		8	$ ' 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
68E(C-$89 6h 6rE   