o
    i{`                     @   sD  d dl Z d dlmZmZmZmZmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z  dZ!d	Z"d
Z#i ddddddddddddddddddddddd d!d"d!d#d$d%d$d&d$d'd$d(d$iZ$G d)d* d*Z%G d+d, d,Z&G d-d. d.Z'dS )/    N)AnyDictListOptionalTupleUnion   )Errors)escape_htmlminify_htmlregistry   )TPL_DEP_ARCSTPL_DEP_SVGTPL_DEP_WORDSTPL_DEP_WORDS_LEMMATPL_ENTTPL_ENT_RTLTPL_ENTS
TPL_FIGURETPL_KB_LINKTPL_PAGETPL_SPANTPL_SPAN_RTLTPL_SPAN_SLICETPL_SPAN_SLICE_RTLTPL_SPAN_STARTTPL_SPAN_START_RTL	TPL_SPANS	TPL_TITLEenltrz#dddORGz#7aececPRODUCTz#bfeeb7GPEz#feca74LOCz#ff9561PERSONz#aa9cfcNORPz#c887fbFACz#9cc9ccEVENTz#ffeb80LAWz#ff8197LANGUAGEWORK_OF_ARTz#f0d0ffDATEz#bfe1d9TIMEMONEYz#e4e7d2QUANTITYORDINALCARDINALPERCENTc                   @   s  e Zd ZdZdZi fdeeef ddfddZ	dd	e	eeef  d
e
de
defddZde	e de	eeef  dee defddZede	e de	eeef  de	eee	eeef  f  fddZde	eeef  defddZde	e defddZde	e defddZdS )SpanRendererzRender Spans as SVGs.spanoptionsreturnNc                 C   s   t t}tj }| D ]}t|r| }t|t s&tt	j
jt|d|| q||di  t| _dd | D | _t| _t| _|dd| _|dd| _|d	d
| _|d}|ru|d | _|d | _|d | _dS | jdkrt| _t| _t| _dS t | _t!| _t"| _dS )zfInitialise span renderer

        options (dict): Visualiser-specific options (colors, spans)
        objcolorsc                 S      i | ]	\}}|  |qS  upper.0labelcolorr<   r<   I/home/ubuntu/.local/lib/python3.10/site-packages/spacy/displacy/render.py
<dictcomp>K       z)SpanRenderer.__init__.<locals>.<dictcomp>
top_offset(   span_label_offset   top_offset_step   templater5   slicestartrtlN)#dictDEFAULT_LABEL_COLORSr   displacy_colorsget_allvaluescallable
isinstance
ValueErrorr	   E925formattypeupdategetDEFAULT_ENTITY_COLORdefault_coloritemsr:   DEFAULT_DIR	directionDEFAULT_LANGlangrF   rH   offset_stepspan_templatespan_slice_templatespan_start_templater   r   r   r   r   r   selfr6   r:   user_colors
user_colorrL   r<   r<   rC   __init__9   s8   







zSpanRenderer.__init__Fparsedpageminifyc           
   
   C      g }t |D ]-\}}|dkr"|di }|dt| _|dt| _|| |d |d |d q|rKdd	d
 |D }t	j
|| j| jd}	nd|}	|rVt|	S |	S )Render complete markup.

        parsed (list): Dependency parses to render.
        page (bool): Render parses wrapped as full HTML page.
        minify (bool): Minify HTML markup.
        RETURNS (str): Rendered SVG or HTML markup.
        r   settingsra   rc   tokensspanstitle c                 S      g | ]}t j|d qS )contentr   rY   r@   docr<   r<   rC   
<listcomp>y       z'SpanRenderer.render.<locals>.<listcomp>ry   rc   dir)	enumerater\   r`   ra   rb   rc   appendrender_spansjoinr   rY   r   
ri   rm   rn   ro   renderediprr   docsmarkupr<   r<   rC   renderf   s   
$
zSpanRenderer.renderrs   rt   ru   c                 C   s>   |  ||}| |}tj|| jd}|rtj|d| }|S )a  Render span types in text.

        Spans are rendered per-token, this means that for each token, we check if it's part
        of a span slice (a member of a span type) or a span start (the starting token of a
        given span type).

        tokens (list): Individual tokens in the text
        spans (list): Individual entity spans and their start, end, label, kb_id and kb_url.
        title (str / None): Document title set in Doc.user_data['title'].
        ry   r   ru   )_assemble_per_token_info_render_markupr   rY   ra   r   )ri   rs   rt   ru   per_token_infor   r<   r<   rC   r      s   
zSpanRenderer.render_spansc                 C   s0  g }t |dd d}|D ]}d|d< qt| D ]~\}}i }||d< g }g }|D ]d}	i }
|	d |  kr9|	d k rn nL||	d k}|	d	 |
d	< ||
d
< |r]t|rW|d d ndd |	d< ||	 |	d |
d< |	dd}|	dd}|r}tj||dnd|
d< ||
 q'd|	d< q'||d< || q|S )a6  Assembles token info used to generate markup in render_spans().
        tokens (List[str]): Tokens in text.
        spans (List[Dict[str, Any]]): Spans in text.
        RETURNS (List[Dict[str, List[Dict, str, Any]]]): Per token info needed to render HTML markup for given tokens
            and spans.
        c                 S   s    | d | d | d   | d fS )Nstart_token	end_tokenrA   r<   )sr<   r<   rC   <lambda>   s   z7SpanRenderer._assemble_per_token_info.<locals>.<lambda>keyr   render_slottextr   r   rA   is_startr   kb_idrv   kb_url#r   r   kb_linkentities)sortedr   lenr   r\   r   rY   )rs   rt   r   r   idxtokentoken_markupintersecting_spansr   r5   ent
span_startr   r   r<   r<   rC   r      sF   
	
 

z%SpanRenderer._assemble_per_token_infor   c           	      C   s   d}|D ]P}t |d dd d}|d  dk}|rJ|sJ| |d }| |d }| j| j | jt|d   }|| jj	t
|d |||d7 }q|t
|d d	 7 }q|S )
z,Render the markup from per-token informationrv   r   c                 S   s   | d S )Nr   r<   )dr<   r<   rC   r      s    z-SpanRenderer._render_markup.<locals>.<lambda>r   r   r   )r   span_slicesspan_startstotal_height )r   strip_get_span_slices_get_span_startsrF   rH   rd   r   re   rY   r
   )	ri   r   r   r   r   is_whitespaceslicesstartsr   r<   r<   rC   r      s*   

zSpanRenderer._render_markupr   c                 C   sb   g }|D ]'}| j |d  | j}| j| j|d d   }| jj||d}|| qd	|S )z*Get the rendered markup of all Span slicesrA   r   r   )bgrF   rv   )
r:   r\   r>   r^   rF   rd   rf   rY   r   r   )ri   r   r   entityrB   rF   
span_slicer<   r<   rC   r      s   
zSpanRenderer._get_span_slicesc                 C   sz   g }|D ]3}| j |d  | j}| j| j|d d   }|d r0| jj|||d |d dnd}|| qd	|S )z0Get the rendered markup of all Span start tokensrA   r   r   r   r   )r   rF   rA   r   rv   )
r:   r\   r>   r^   rF   rd   rg   rY   r   r   )ri   r   r   r   rB   rF   r   r<   r<   rC   r     s"   


zSpanRenderer._get_span_startsFF)__name__
__module____qualname____doc__styler   strr   rl   r   boolr   r   r   staticmethodr   r   r   r   r<   r<   r<   rC   r4   4   sD    .

Fr4   c                   @   sB  e Zd ZdZdZi fdeeef ddfddZ	d*d	e	eeef  d
e
de
defddZdeeef de	eeef  de	eeef  defddZdededededef
ddZdedededededefddZded ed!ed"edef
d#d$Zded%ed ededef
d&d'Zde	eeef  deeeeef ef fd(d)ZdS )+DependencyRendererz!Render dependency parses as SVGs.depr6   r7   Nc                 C   s   | dd| _| dd| _| d| jrdnd| _| d| jr"d	nd
| _| dd| _| d| jr5dnd| _| dd| _| dd| _| dd| _	| dd| _
t| _t| _dS )zInitialise dependency renderer.

        options (dict): Visualiser-specific options (compact, word_spacing,
            arrow_spacing, arrow_width, arrow_stroke, distance, offset_x,
            color, bg, font)
        compactFword_spacing-   arrow_spacing   rI   arrow_width   
   arrow_stroker   distance      offset_x2   rB   z#000000r   z#fffffffontArialN)r\   r   r   r   r   r   r   r   rB   r   r   r`   ra   rb   rc   )ri   r6   r<   r<   rC   rl   (  s   
zDependencyRenderer.__init__Frm   rn   ro   c                 C   s   t  j}g }t|D ]C\}}|dkr'|di }|dt| _|dt| _| d| }	| 	|	|d |d }
|drIt
j|dd	|
 }
||
 q|rfd
dd |D }tj|| j| jd}nd
|}|rqt|S |S )rq   r   rr   ra   rc   -wordsarcsru   r   rv   c                 S   rw   rx   rz   )r@   svgr<   r<   rC   r}   U  r~   z-DependencyRenderer.render.<locals>.<listcomp>r   )uuiduuid4hexr   r\   r`   ra   rb   rc   
render_svgr   rY   r   r   r   r   )ri   rm   rn   ro   	id_prefixr   r   r   rr   	render_idr   ry   r   r<   r<   rC   r   <  s*   



zDependencyRenderer.renderr   r   r   c                    s     | _t j dd _ jd  j  j  _ jt	| j   _
 jd j   _| _ fddt|D } fddt|D }d|d| }tj j j
 j j j j| j jd		S )
a  Render SVG.

        render_id (Union[int, str]): Unique ID, typically index of document.
        words (list): Individual words and their tags.
        arcs (list): Individual arcs and their start, end, direction and label.
        RETURNS (str): Rendered SVG markup.
        r   defaultr      c              
      s0   g | ]\}}  |d  |d |dd|qS )r   taglemmaN)render_wordr\   )r@   r   wri   r<   rC   r}   r  s    z1DependencyRenderer.render_svg.<locals>.<listcomp>c              	      s2   g | ]\}}  |d  |d |d |d |qS )rA   rN   endr   )render_arrow)r@   r   ar   r<   rC   r}   v  s     rv   )	idwidthheightrB   r   r   ry   r   rc   )
get_levelslevelsmaxrT   highest_levelr   r   offset_yr   r   r   r   r   r   r   r   r   rY   rB   r   r   ra   rc   )ri   r   r   r   	words_svgarcs_svgry   r<   r   rC   r   _  s0   

zDependencyRenderer.render_svgr   r   r   r   c                 C   sf   | j | j }| j|| j  }| jdkr| j| }t|}|dur*tj|||||dS t	j||||dS )zRender individual word.

        text (str): Word text.
        tag (str): Part-of-speech tag.
        i (int): Unique ID, typically word index.
        RETURNS (str): Rendered SVG markup.
        rO   N)r   r   r   xy)r   r   r   r   )
r   r   r   r   ra   r   r
   r   rY   r   )ri   r   r   r   r   r   r   	html_textr<   r<   rC   r     s   


zDependencyRenderer.render_wordrA   rN   r   ra   c              	   C   s^  |dk s|dk rt ||||d}ttjjdi || j|||f }| j|| j  | j }| j	dkr8| j
| }| j}	| j|| | j  || j  | j| j|  d  }
| j	dkr^| j
|
 }
| j|| j d  }| jru| j|| j d  }|dkrt| j dddkr| j }| |||	|
}| ||	||
}| j	dkrd	nd
}tj| j|| j||||dS )a5  Render individual arrow.

        label (str): Dependency label.
        start (int): Index of start word.
        end (int): Index of end word.
        direction (str): Arrow direction, 'left' or 'right'.
        i (int): Unique ID, typically arrow index.
        RETURNS (str): Rendered SVG markup.
        r   )rN   r   rA   r   rO      r   r   r      rightleft)r   r   strokeheadrA   
label_sidearcNr<   )rP   rW   r	   E157rY   r   r   r   r   ra   r   r   r   r   r   rT   get_arrowheadget_arcr   r   r   )ri   rA   rN   r   ra   r   
error_argslevelx_startr   x_endy_curve	arrowheadr   r   r<   r<   rC   r     sF   



zDependencyRenderer.render_arrowr  r   r  r  c                 C   s    d}| j rd}|j||||dS )uS  Render individual arc.

        x_start (int): X-coordinate of arrow start point.
        y (int): Y-coordinate of arrow start and end point.
        y_curve (int): Y-corrdinate of Cubic Bézier y_curve point.
        x_end (int): X-coordinate of arrow end point.
        RETURNS (str): Definition of the arc path ('d' attribute).
        z!M{x},{y} C{x},{c} {e},{c} {e},{y}z M{x},{y} {x},{c} {e},{c} {e},{y})r   r   ce)r   rY   )ri   r  r   r  r  rL   r<   r<   rC   r     s   	zDependencyRenderer.get_arcr   c                 C   s   |dkr||| j  d || j  d }}}n||| j  d || j  d }}}d| d|d  d| d|| j   d| d|| j   S )aR  Render individual arrow head.

        direction (str): Arrow direction, 'left' or 'right'.
        x (int): X-coordinate of arrow start point.
        y (int): Y-coordinate of arrow start and end point.
        end (int): X-coordinate of arrow end point.
        RETURNS (str): Definition of the arrow head path ('d' attribute).
        r   r   M,z Lr   )r   )ri   ra   r   r   r   p1p2p3r<   r<   rC   r     s   	&$8z DependencyRenderer.get_arrowheadc                 C   s   dd dd |D D }t dd |D dd}dg| }i }t|dd	 d
D ]-}t ||d |d  d }t|d |d D ]}|||< q?|||d |d |d f< q&|S )a  Calculate available arc height "levels".
        Used to calculate arrow heights dynamically and without wasting space.

        args (list): Individual arcs and their start, end, direction and label.
        RETURNS (dict): Arc levels keyed by (start, end, label).
        c                 S   s   g | ]}t |qS r<   )rP   )r@   tr<   r<   rC   r}         z1DependencyRenderer.get_levels.<locals>.<listcomp>c                 S   s   h | ]
}t t| qS r<   )tupler   r_   r@   r   r<   r<   rC   	<setcomp>  s    z0DependencyRenderer.get_levels.<locals>.<setcomp>c                 S   s   g | ]}|d  qS )r   r<   r  r<   r<   rC   r}     r  r   r   c                 S   s   | d | d  S )Nr   rN   r<   )r   r<   r<   rC   r     s    z/DependencyRenderer.get_levels.<locals>.<lambda>r   rN   r   r   rA   )r   r   range)ri   r   length	max_levelr   r   r   r   r<   r<   rC   r     s   

zDependencyRenderer.get_levelsr   )r   r   r   r   r   r   r   r   rl   r   r   r   r   intr   r   r   r   r   r   r   r<   r<   r<   rC   r   #  sP    
#

(
.4r   c                	   @   s   e Zd ZdZdZi fdeeef ddfddZ	dd	e	eeef  d
e
de
defddZdede	eeef  dee defddZdS )EntityRendererzRender named entities as HTML.r   r6   r7   Nc                 C   s   t t}tj }| D ]}t|r| }t|t s&tt	j
jt|d|| q||di  t| _dd | D | _|dd| _| jdurWdd | jD | _t| _t| _|d	}|ri|| _dS | jd
krst| _dS t| _dS )zhInitialise entity renderer.

        options (dict): Visualiser-specific options (colors, ents)
        r8   r:   c                 S   r;   r<   r=   r?   r<   r<   rC   rD     rE   z+EntityRenderer.__init__.<locals>.<dictcomp>entsNc                 S   s   g | ]}|  qS r<   r=   )r@   r   r<   r<   rC   r}     r  z+EntityRenderer.__init__.<locals>.<listcomp>rL   rO   )rP   rQ   r   rR   rS   rT   rU   rV   rW   r	   rX   rY   rZ   r[   r\   r]   r^   r_   r:   r  r`   ra   rb   rc   ent_templater   r   rh   r<   r<   rC   rl     s,   







zEntityRenderer.__init__Frm   rn   ro   c           
   
   C   rp   )rq   r   rr   ra   rc   r   r  ru   rv   c                 S   rw   rx   rz   r{   r<   r<   rC   r}   /  r~   z)EntityRenderer.render.<locals>.<listcomp>r   )r   r\   r`   ra   rb   rc   r   render_entsr   r   rY   r   r   r<   r<   rC   r     s   
$
zEntityRenderer.renderr   rt   ru   c                 C   s  d}d}|D ]}|d }|d }|d }	| dd}
| dd}|
r)tj|
|d	nd}| d
i }t|||	 }||| d}t|D ]\}}|t|7 }t|dkrb|t|d krb|d7 }qF| jdu so| | jv r| j	 | | j
}||||d}|| || jjdi |7 }n||7 }|	}q||d d}t|D ]\}}|t|7 }t|dkr|t|d kr|d7 }qtj|| jd}|rtj|d| }|S )zRender entities in text.

        text (str): Original text.
        spans (list): Individual entity spans and their start, end, label, kb_id and kb_url.
        title (str / None): Document title set in Doc.user_data['title'].
        rv   r   rA   rN   r   r   r   r   r   params
r   z<br>N)rA   r   r   r   r   r   r<   )r\   r   rY   r
   splitr   r   r  r>   r:   r^   r[   r  r   ra   r   )ri   r   rt   ru   r   offsetr5   rA   rN   r   r   r   r   additional_paramsr   	fragmentsr   fragmentrB   ent_settingsr<   r<   rC   r  7  sL   	
zEntityRenderer.render_entsr   )r   r   r   r   r   r   r   r   rl   r   r   r   r   r  r<   r<   r<   rC   r    s.    !
r  )(r   typingr   r   r   r   r   r   errorsr	   utilr
   r   r   	templatesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   r`   r]   rQ   r4   r   r  r<   r<   r<   rC   <module>   sd     P	
 p V