o
    ›¨Êh  ã                   @   s   d dl mZ G dd„ dƒZdS )é    )Ú
strip_tagsc                   @   sF   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	dd„ Z
ddd„ZdS )ÚHighlighterÚhighlightedÚspanéÈ   Ú c                 K   sZ   || _ d|v rt|d ƒ| _d|v r|d | _d|v r |d | _dd„ | j  ¡ D ƒ| _d S )NÚ
max_lengthÚhtml_tagÚ	css_classc                 S   s   h | ]}|  d ¡s| ¡ ’qS )ú-)Ú
startswithÚlower)Ú.0Úword© r   úM/var/www/html/env/lib/python3.10/site-packages/haystack/utils/highlighting.pyÚ	<setcomp>   s
    
ÿÿz'Highlighter.__init__.<locals>.<setcomp>)ÚqueryÚintr   r	   r
   ÚsplitÚquery_words)Úselfr   Úkwargsr   r   r   Ú__init__
   s   

ÿzHighlighter.__init__c                 C   s.   t |ƒ| _|  ¡ }|  |¡\}}|  |||¡S )N)r   Ú
text_blockÚfind_highlightable_wordsÚfind_windowÚrender_html)r   r   Úhighlight_locationsÚstart_offsetÚ
end_offsetr   r   r   Ú	highlight   s   
zHighlighter.highlightc                 C   s~   i }t | jƒ}| j ¡ }| jD ]-}||vrg ||< d}||k r<| |||¡}|dkr+n||  |¡ |t |ƒ }||k sq|S )Nr   éÿÿÿÿ)Úlenr   r   r   ÚfindÚappend)r   Úword_positionsr    Úlower_text_blockr   r   Únext_offsetr   r   r   r       s    


÷€z$Highlighter.find_highlightable_wordsc                 C   s"  d}| j }t|ƒs||fS g }| ¡ D ]\}}t|ƒr | |¡ qt|ƒs)||fS t|ƒdkr:|d |d | j  fS t|ƒ}d}|d d… d | j krX|d d… d }|| j  }t|d d… ƒD ],\}}	d}
||d d … D ]}||	 | j k r||
d7 }
nd}
|
|kr‹|	}|	| j  }|
}qnq`||fS )Nr   é   r"   )r   r#   ÚitemsÚextendÚsortedÚ	enumerate)r   r   Ú
best_startÚbest_endÚwords_foundÚ_Úoffset_listÚhighest_densityÚcountÚstartÚcurrent_densityÚendr   r   r   r   ;   s>   
€


€õzHighlighter.find_windowNc                    s2  | j ˆ |… }g }| ¡ D ]\‰}|‡ ‡fdd„|D ƒ7 }qt|ƒ}| jr.d| j| jf }nd| j }d| j }	d}
d}d}d}|D ]9\}}|||t|ƒ … }| ¡ |kr{||t|ƒ k r_qB|
||t|ƒ |… | | |	 7 }
|}|}|t|ƒ }qB|
||d … 7 }
ˆ dkrŒd|
 }
|t| j ƒk r—d	|
 }
|
S )
Nc                    s   g | ]}|ˆ  ˆf‘qS r   r   )r   Úloc©r   Útermr   r   Ú
<listcomp>w   s    z+Highlighter.render_html.<locals>.<listcomp>z<%s class="%s">z<%s>z</%s>r   r   z...%sz%s...)r   r*   r,   r
   r	   r#   r   )r   r   r   r    ÚtextÚ	term_listÚ	locationsÚloc_to_termÚhl_startÚhl_endÚhighlighted_chunkÚmatched_so_farÚprevÚprev_strÚcurÚcur_strÚactual_termr   r9   r   r   o   s>   

ÿ€zHighlighter.render_html)NNN)Ú__name__Ú
__module__Ú__qualname__r
   r	   r   r   r   r!   r   r   r   r   r   r   r   r      s    4r   N)Údjango.utils.htmlr   r   r   r   r   r   Ú<module>   s    