
    i                        d dl mZ d dlmZ d dlmZ d dlZ	 d dlmZ e G d d             Z
 ej                  d      Z ej                  d	ej                        Zd
edeedz  ef   fdZdedefdZdedefdZd
edeeef   fdZdedefdZdededz  fdZdededz  fdZdededz  fdZdedeedz  edz  f   fdZddededefdZd
ede
fdZy# e	$ r dZY w xY w)    )	dataclass)date)PathN)	PdfReaderc                       e Zd ZU eed<   eed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed	<   eed
<   eed<   eed<   eed<   y)ParsedExcursiontitlesummaryNexcursion_datestart_time_textstart_temperature_ccar_distance_kmmin_altitude_mmax_altitude_mhas_text_layerpage_count_estimatedraw_text_excerptextraction_status)	__name__
__module____qualname__str__annotations__r   floatintbool     C/var/www/excursionsavi.aluju.cat/backend/src/services/pdf_parser.pyr   r      s`    JL4K4Z%T\!$J$Jr   r   zA^(?P<yy>\d{2})\.(?P<mm>\d{2})\.(?P<dd>\d{2})\s*-\s*(?P<title>.+)$um   (dist[aà]ncia|desnivell|durada|hores?|itinerari|sortida|arribada|ruta|recorregut|dificultat|altitud|cota|km)pdf_pathreturnc                    | j                   j                         }t        j                  |      }|sd |fS t	        |j                  d            }t	        |j                  d            }t	        |j                  d            }|j                  d      j                         j                  d      }	 t        d|z   ||      }||fS # t        $ r d }Y ||fS w xY w)Nyymmddr	   .i  )	stemstripFILENAME_REmatchr   grouprstripr   
ValueError)r    r'   r*   r#   r$   r%   r	   parsed_dates           r   #_parse_date_and_title_from_filenamer/   #   s    == Dd#ETz	U[[	B	U[[	B	U[[	BKK &&(//4E4"9b"-   s   3C CCraw_pdfc                 @    t        t        j                  d|             S )Ns   /Type\s*/Page\b)lenrefindallr0   s    r   _estimate_page_countr6   6   s    rzz-w788r   c                 "    d| v xr
 d| v xr d| v S )Ns   BTs   ETs   /Fontr   r5   s    r   _detect_text_layerr8   :   s!    GH 0HX5HHr   c                    t         yt        t        |             }t        |j                        }g }|j                  D ]8  }|j	                         xs dj                         }|s(|j                  |       : |dj                  |      fS )N)r    r:   
)r   r   r2   pagesextract_textr(   appendjoin)r    reader
page_count
text_partspagetexts         r   _extract_text_with_pypdfrE   >   s    s8}%FV\\"JJ $!!#)r002d#$
 tyy,,,r   rD   c                 t    | j                  dd      } t        j                  dd|       } | j                         S )N     \s+)replacer3   subr(   )rD   s    r   _clean_textrL   M   s0    <<#&D66&#t$D::<r   c                     d}d| dd| df}|D ]_  }t        j                  || t         j                        }|s,t        |j	                  d            }t        j
                  dd|      }|c S  y )	Nu   (?:a\s+les\s+\d{1,2}(?::\d{2})?|(?:un|dos|tres)\s+quarts\s+de\s+[A-Za-zÀ-ÿ]+|prop\s+de\s+les\s+\d{1,2}|abans\s+de\s+les\s+\d{1,2})z%(?:Marxem|Sortim)\s+de\s+Sabadell\s+()zComencem\s+a\s+caminar\s+(flags   rI   rH   )r3   search
IGNORECASErL   r+   rK   )rD   	time_exprpatternspatternr*   values         r   _parse_start_time_textrX   S   s     XI01=%i[2H  		'4r}}=A/EFF63.EL r   c                     t        j                  d| t         j                        }|sy |j                  d      j	                  dd      }	 t        |      S # t        $ r Y y w xY w)Nu/   temperatura\s*(?:de\s*)?(\d+(?:[\.,]\d+)?)\s*ºrO   rQ   ,r&   )r3   rR   rS   r+   rJ   r   r-   )rD   r*   rW   s      r   _parse_temperature_cr[   b   s]    IIH$VXVcVcdEKKN""3,EU| s   
A 	A#"A#c                     t        j                  d| t         j                        }|sy 	 t        |d   j	                  dd            S # t
        $ r Y y w xY w)Nu'   Dist[aà]ncia\s*(\d+(?:[\.,]\d+)?)\s*KmrO   rZ   r&   )r3   r4   rS   r   rJ   r-   )rD   
candidatess     r   _parse_car_distance_kmr_   m   sU    FTVTaTabJZ^++C566 s   A	 		AAc                     t        j                  d| t         j                        }|syg }|D ]  }	 |j                  t	        |              |syt        |      t        |      fS # t
        $ r Y Dw xY w)Nz\(alt\.\s*(\d{2,4})\s*m\)rO   )NN)r3   r4   rS   r>   r   r-   minmax)rD   	altitudesvaluesraws       r   _parse_altitude_bounds_mrf   x   sw    

7R]]SIF 	MM#c(#
 v;F##	  		s   A''	A32A3max_lenc                    t        j                  d|       }g }d}dt        dt        fd}|D ]  }|j	                  dd      j                         s't        fd	|D              r<t        j                  d
      sS |      s\|j                         t        dj                  |            |kD  s n dj                  |      d | }|S )Ns   [\x20-\x7E]{8,})
z%PDFz objendobjstream	endstreamz/Typez/Pagesz/Fontz/XObjectz	/MediaBoxrD   r!   c                    t        |       dk  ryt        t        j                  d|             }|t        t        |       d      z  dkD  ryt        j                  d|       }t        |      dk  rydj	                  |      j                         }t        d	 |D              }t        |      d
kD  r|t        |      z  dk  ryy)N   Fu    [^A-Za-z0-9À-ÿ .,;:!?()'\"/\-]rQ   g{Gz?u   [A-Za-zÀ-ÿ]{2,}   r:   c              3   *   K   | ]  }|d v sd  yw)u   aeiouàèéíïòóúürQ   Nr   ).0cs     r   	<genexpr>zC_extract_human_text_excerpt.<locals>.is_humanish.<locals>.<genexpr>   s     O5N0N!Os   	r   g)\(?T)r2   r3   r4   rb   r?   lowersum)rD   invalid_charswordslettersvowel_counts        r   is_humanishz0_extract_human_text_excerpt.<locals>.is_humanish   s    t9r>BJJ'JDQR3s4y!,,t3

/6u:>''%.&&(OWOOw<!s7|!;t Cr   zlatin-1ignore)errorsc              3   &   K   | ]  }|v  
 y w)Nr   )rp   tokenrD   s     r   rr   z._extract_human_text_excerpt.<locals>.<genexpr>   s     6u}6s   z[A-Za-z]{3}rH   )r3   r4   r   r   decoder(   anyrR   r>   r2   r?   )	r0   rg   runscleanedskip_tokensry   runexcerptrD   s	           @r   _extract_human_text_excerptr      s    ::)73DGK# $ &  zz)Hz5;;=6+66yy.4 tsxx !G+ hhw)GNr   c                    | j                         }t        |       \  }}t        |      }t        |      }t	        |       \  }}t        |      }|rU|d d }	|xs |}
t        j                  |      rd}nd}t        |      }t        |      }t        |      }t        |      \  }}nBt        |      }	|}
d }d }d }d }d }t        |	      dk  rd}nt        j                  |	      rd}nd}|	r|	d d nd}t        ||||||||||
|	|      S )	Ni	  parsed_textmetadata_onlyP   
ocr_needed  zNo text excerpt available.)r	   r
   r   r   r   r   r   r   r   r   r   r   )
read_bytesr/   r6   r8   rE   rL   ROUTE_KEYWORDS_RErR   rX   r[   r_   rf   r   r2   r   )r    r0   r   r	   estimated_pagesr   pypdf_pages	full_text
clean_textr   rA   r   r   r   r   r   r   r
   s                     r   	parse_pdfr      sC   !!#G?INE*73O'0N5h?KY'JUd# 3O
##J/ - /0<2:>0<)A*)M&-g6$
"w<" ,%%g. / , 'getn-IG%'/'%%%' + r   )r   ) dataclassesr   datetimer   pathlibr   r3   pypdfr   ModuleNotFoundErrorr   compiler)   rS   r   tupler   r/   bytesr   r6   r   r8   rE   rL   rX   r   r[   r_   rf   r   r   r   r   r   <module>r      s   !   	
    bjj]^BJJtMM $ 5cAQ;R &9% 9C 9I I$ I-t -c3h -c c  t s ut|   $3 $5tS4Z1G+H $2 2 2 2j4 4 4i  Is   C C#"C#