U
    YSh[                     @   sl  d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
Z
zddlmZmZmZ dZW n ek
rt   dZY nX zddlZW n: ek
r   zddlZW n ek
r   dZY nX Y nX dd	d
dgZddddddgddgdgddgdZdZdZdZG dd deZG dd deZG dd  d ZG d!d deZG d"d	 d	eZG d#d
 d
eZG d$d deZdS )%z
    pygments.formatters.img
    ~~~~~~~~~~~~~~~~~~~~~~~

    Formatter for Pixmap output.

    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)	Formatter)get_bool_optget_int_optget_list_optget_choice_opt)Image	ImageDraw	ImageFontTFImageFormatterGifImageFormatterJpgImageFormatterBmpImageFormatter ZRomanZBookZNormalZRegularZMediumZObliqueZItalicZBoldzBold ObliquezBold Italic)NORMALITALICBOLD
BOLDITALICzDejaVu Sans MonozCourier NewZMenloc                   @   s   e Zd ZdZdS )PilNotAvailablez,When Python imaging library is not availableN__name__
__module____qualname____doc__ r   r   J/root/rtd-docs/venv/lib/python3.8/site-packages/pygments/formatters/img.pyr   4   s   r   c                   @   s   e Zd ZdZdS )FontNotFoundz(When there are no usable fonts specifiedNr   r   r   r   r   r   8   s   r   c                   @   sl   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dd Zdd Zdd Zdd ZdS )FontManagerz>
    Manages a set of fonts: normal, italic, bold, etc...
       c                 C   s   || _ || _i | _d | _d| _t|ds4tj|r`t	
|| j}d| _tD ]}|| j|< qLd S tjdr|svt| _ |   n2tjdr|st| _ |   n|st| _ |   d S )NFreadTwindarwin)	font_name	font_sizefontsencodingvariablehasattrospathisfiler	   truetypeSTYLESsysplatform
startswithDEFAULT_FONT_NAME_WIN_create_winDEFAULT_FONT_NAME_MAC_create_macDEFAULT_FONT_NAME_NIX_create_nix)selfr!   r"   fontstyler   r   r   __init__A   s,    

zFontManager.__init__c           	      C   s|   t jd| d| dgt jd d}| \}}|jdkrx| }|D ].}|drTqD|  d}|rD|  S qDd S d S )Nzfc-listz:style=file)stdoutstderrr   s   Fontconfig warning::)	
subprocessPopenPIPEcommunicate
returncode
splitlinesr.   decodestrip)	r5   namer7   procr:   _linesliner(   r   r   r   _get_nix_font_path\   s     


zFontManager._get_nix_font_pathc                 C   s   t d D ]2}| | j|}|d k	rt|| j| jd<  qNqtd| j ddD ]j}t | D ]2}| | j|}|d k	r^t|| j| j|<  qRq^|dkr| jd | j|< qR| jd | j|< qRd S )Nr   No usable fonts named: ""r   r   r   r   r   )r+   rJ   r!   r	   r*   r"   r#   r   )r5   rE   r(   r7   	stylenamer   r   r   r4   j   s    zFontManager._create_nixc                 C   s   | |d |   S )N )getrD   lower)r5   font_maprE   r7   r   r   r   _get_mac_font_path~   s    zFontManager._get_mac_font_pathc                    s  i }t jt ddddfD ]" | fddt  D  qtd D ]4}| || j|}|d k	rJt	
|| j| jd<  qqJtd| j d	d
D ]l}t| D ]4}| || j|}|d k	rt	
|| j| j|<  qq|dkr| jd | j|< q| jd | j|< qd S )NHOMEzLibrary/Fonts/z/Library/Fonts/z/System/Library/Fonts/c                 3   sN   | ]F\}}}|D ]6}|  d rtj|d   tj |fV  qqdS ))ZttfZttcr   N)rQ   endswithr'   r(   splitextjoin).0rG   filesfZfont_dirr   r   	<genexpr>   s
    z*FontManager._create_mac.<locals>.<genexpr>r   rK   rL   rM   r   r   )r'   r(   rW   getenvupdatewalkr+   rS   r!   r	   r*   r"   r#   r   )r5   rR   rE   r(   r7   rN   r   r[   r   r2      s.     
zFontManager._create_macFc           
   
   C   s   dD ]\}|D ]R}z4d ||o"d| |}t||\}}	|W     S  tk
r\   Y qY qX qq|rtd| d|d  dd S )N)r   z (TrueType)z{}{}{}rO   zFont z (r   z) not found in registry)format_winregQueryValueExOSErrorr   )
r5   keybasenamestylesZfailsuffixr7   ZvalnamevalrG   r   r   r   _lookup_win   s    zFontManager._lookup_winc                 C   sF  d }t jdft jdft jdft jdfg}|D ] }zt j| }zz| || jtd d}t	|| j
| jd< dD ]\}| || jt| }|rt	|| j
| j|< qp|dkr| jd | j|< qp| jd | j|< qpW W 4W  d S  tk
r } z|}W 5 d }~X Y nX W 5 t | X W q, tk
r,   Y q,X q,|r:|tdd S )	Nz2Software\Microsoft\Windows NT\CurrentVersion\Fontsz/Software\Microsoft\Windows\CurrentVersion\Fontsr   TrM   r   r   z$Can't open Windows font registry key)ra   HKEY_CURRENT_USERHKEY_LOCAL_MACHINEOpenKeyZCloseKeyri   r!   r+   r	   r*   r"   r#   r   rc   )r5   ZlookuperrorZkeynamesZkeynamerd   r(   r7   errr   r   r   r0      s8    

zFontManager._create_winc                 C   s
   |  dS )z)
        Get the character size.
        M)get_text_sizer5   r   r   r   get_char_size   s    zFontManager.get_char_sizec                 C   s4   | j d }t|dr&||dd S ||S dS )z4
        Get the text size (width, height).
        r   getbbox      N)r#   r&   rr   getsize)r5   textr6   r   r   r   ro      s    

zFontManager.get_text_sizec                 C   s|   |r"|r"| j r| dS | jd S |r@| j r6| dS | jd S |r^| j rT| dS | jd S | j rn| dS | jd S dS )z>
        Get the font based on bold and italic flags.
        r   r   r   r   N)r%   	get_styler#   )r5   boldZobliquer   r   r   get_font   s    






zFontManager.get_fontc              	   C   s`   | j | }t| D ]H}z|| |W   S  tk
r>   Y q tk
rX   | Y   S X q|S )z}
        Get the specified style of the font if it is a variable font.
        If not found, return the normal font.
        )r#   r+   Zset_variation_by_name
ValueErrorrc   )r5   r7   r6   
style_namer   r   r   rw      s    


zFontManager.get_styleN)r   )F)r   r   r   r   r8   rJ   r4   rS   r2   ri   r0   rq   ro   ry   rw   r   r   r   r   r   <   s   

'
r   c                   @   s   e Zd ZdZdZdddgZdgZdZdZdd Z	d-d
dZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,S ).r
   a;
  
    Create a PNG image from source code. This uses the Python Imaging Library to
    generate a pixmap from the source code.

    .. versionadded:: 0.10

    Additional options accepted:

    `image_format`
        An image format to output to that is recognised by PIL, these include:

        * "PNG" (default)
        * "JPEG"
        * "BMP"
        * "GIF"

    `line_pad`
        The extra spacing (in pixels) between each line of text.

        Default: 2

    `font_name`
        The font name to be used as the base font from which others, such as
        bold and italic fonts will be generated.  This really should be a
        monospace font to look sane.
        If a filename or a file-like object is specified, the user must
        provide different styles of the font.

        Default: "Courier New" on Windows, "Menlo" on Mac OS, and
                 "DejaVu Sans Mono" on \*nix

    `font_size`
        The font size in points to be used.

        Default: 14

    `image_pad`
        The padding, in pixels to be used at each edge of the resulting image.

        Default: 10

    `line_numbers`
        Whether line numbers should be shown: True/False

        Default: True

    `line_number_start`
        The line number of the first line.

        Default: 1

    `line_number_step`
        The step used when printing line numbers.

        Default: 1

    `line_number_bg`
        The background colour (in "#123456" format) of the line number bar, or
        None to use the style background color.

        Default: "#eed"

    `line_number_fg`
        The text color of the line numbers (in "#123456"-like format).

        Default: "#886"

    `line_number_chars`
        The number of columns of line numbers allowable in the line number
        margin.

        Default: 2

    `line_number_bold`
        Whether line numbers will be bold: True/False

        Default: False

    `line_number_italic`
        Whether line numbers will be italicized: True/False

        Default: False

    `line_number_separator`
        Whether a line will be drawn between the line number area and the
        source code area: True/False

        Default: True

    `line_number_pad`
        The horizontal padding (in pixels) between the line number margin, and
        the source code area.

        Default: 6

    `hl_lines`
        Specify a list of lines to be highlighted.

        .. versionadded:: 1.2

        Default: empty list

    `hl_color`
        Specify the color for highlighting lines.

        .. versionadded:: 1.2

        Default: highlight color of the selected style
    ZimgZIMGpngz*.pngFc              	   K   s  t stdtj| f| d| _t| j| _| jjdkr@d| _n
| jj| _t	|ddddd	g| j
d
d| _t|dd| _t|dd| _t|dd}t|dd|| _| j \| _| _|dd| _|dd| _t|dd| _t|dd| _t|dd| _t|dd| _t|dd
| _t|dd
| _t|d d!| _t|d"d!| _| jrd| j| j | jd  | _ nd#| _ g | _!t"|d$g }|D ]2}z| j!#t$| W n t%k
r   Y nX q|d%| jj&pd&| _'g | _(dS )'zE
        See the class docstring for explanation of options.
        z5Python Imaging Library is required for this formatterlatin1Nz#fffimage_formatr|   jpeggifbmpT)normcase	image_pad
   line_padrs   r"   r   r!   r   line_number_fgz#886line_number_bgz#eedline_number_charsline_number_boldFline_number_italicline_number_pad   line_numbersline_number_separatorline_number_step   line_number_startr   hl_lineshl_colorz#f90))pil_availabler   r   r8   r$   dictr7   rf   background_colorr   default_image_formatr~   r   r   r   r   rP   r#   rq   fontwfonthr   r   r   r   r   r   r   r   r   r   r   line_number_widthr   r   appendintrz   highlight_colorr   	drawables)r5   optionsZfontsizeZhl_lines_strrI   r   r   r   r8     s|    
  
     

zImageFormatter.__init__r   c                 C   s   t dd S )NzWThe -S option is meaningless for the image formatter. Use -O style=<stylename> instead.)NotImplementedError)r5   argr   r   r   get_style_defs  s    zImageFormatter.get_style_defsc                 C   s   | j | j S )z+
        Get the height of a line.
        )r   r   rp   r   r   r   _get_line_height  s    zImageFormatter._get_line_heightc                 C   s   ||    | j S )z8
        Get the Y coordinate of a line number.
        )r   r   r5   linenor   r   r   _get_line_y  s    zImageFormatter._get_line_yc                 C   s   | j S )z/
        Get the width of a character.
        )r   rp   r   r   r   _get_char_width  s    zImageFormatter._get_char_widthc                 C   s   || j  | j S )z?
        Get the X coordinate of a character position.
        )r   r   )r5   
linelengthr   r   r   _get_char_x  s    zImageFormatter._get_char_xc                 C   s   |  || |fS )zL
        Get the actual position for a character and line position.
        )r   r   )r5   r   r   r   r   r   _get_text_pos  s    zImageFormatter._get_text_posc                 C   s   | j | |fS )zI
        Get the actual position for the start of a line number.
        )r   r   r   r   r   r   _get_linenumber_pos  s    z"ImageFormatter._get_linenumber_posc                 C   s"   |d dk	rd|d  }nd}|S )zE
        Get the correct color for the token from the style.
        colorN#z#000r   )r5   r7   fillr   r   r   _get_text_color  s    zImageFormatter._get_text_colorc                 C   s"   |d dk	rd|d  }nd}|S )zP
        Get the correct background color for the token from the style.
        bgcolorNr   r   )r5   r7   Zbg_colorr   r   r   _get_text_bg_color  s    z!ImageFormatter._get_text_bg_colorc                 C   s   | j |d |d S )z5
        Get the correct font for the style.
        rx   italic)r#   ry   )r5   r7   r   r   r   _get_style_font  s    zImageFormatter._get_style_fontc                 C   s$   |  || j | |d | j fS )z.
        Get the required image size.
        r   )r   r   r   )r5   maxlinelength	maxlinenor   r   r   _get_image_size   s    zImageFormatter._get_image_sizec                 C   s:   | j | |t|| j| j| j| j| j	dd dS )zA
        Remember a line number drawable to paint later.
        Nr6   text_fgtext_bg)

_draw_textr   strrjustr   r#   ry   r   r   r   )r5   Zposnor   r   r   r   _draw_linenumber  s    
zImageFormatter._draw_linenumberc                 C   s   | j |||||f dS )zB
        Remember a single drawable tuple to paint later.
        N)r   r   )r5   posrv   r6   r   r   r   r   r   r     s    zImageFormatter._draw_textc              
   C   s  d } }}d }}|D ]\}}|| j kr2|j}q | j | }	|d}|d}
t|
D ]\}}|d}|r| j| |||| |	| 	|	| 
|	d | j|\}}||7 }t||}|t|7 }t||}|drXd}d}|d7 }qXq|| _|| _|| _dS )z9
        Create drawables for the token content.
        r   rt   T
r   r   N)rf   parent
expandtabsrB   	enumeraterstripr   r   r   r   r   r#   ro   maxlenrU   r   	maxcharnor   )r5   tokensourcer   Zcharnor   r   r   ttypevaluer7   rH   irI   tempZ
temp_widthrG   r   r   r   _create_drawables  s<    








z ImageFormatter._create_drawablesc                 C   sB   | j s
dS t| jD ](}|| j }|| j dkr| || qdS )z8
        Create drawables for the line numbers.
        Nr   )r   ranger   r   r   r   )r5   pnr   r   r   _draw_line_numbersB  s    
z!ImageFormatter._draw_line_numbersc                 C   s~   | j s
dS | jdkrdS t|}|jd }| j| j | j }|jd||fg| j	d | j
rx|j|df||fg| jd ~dS )z@
        Paint the line number background on the image.
        N)r   r   r   r   )r   r   r   Drawsizer   r   r   	rectangler   r   rI   )r5   imdrawrecthrectwr   r   r   _paint_line_number_bgM  s    


z$ImageFormatter._paint_line_number_bgc                 C   sX  |  | |   td| | j| j| j}| | t	
|}| jr| j| j | j d }|  }|jd | }| jD ]6}| |d }	|j||	f|| |	| fg| jd qz| jD ]\}
}}}}|r.t|dr|j||d}n||dd }|j|
d |
d |
d |d  |
d |d  g|d |j|
|||d	 q||| j  dS )
a   
        Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
        tuples and write it into ``outfile``.

        This implementation calculates where it should draw each token on the
        pixmap, then calculates the required pixmap size and draws the items.
        RGBr   r   r   textsize)rv   r6   rs   N)r6   r   )r   r   r   newr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r   rr   rv   saver~   upper)r5   r   outfiler   r   xr   r   Z
linenumberyr   r   r6   r   r   Z	text_sizer   r   r   r`   ^  s4    




6zImageFormatter.formatN)r   )r   r   r   r   rE   aliases	filenamesZunicodeoutputr   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r`   r   r   r   r   r
     s0   o
8


(c                   @   s$   e Zd ZdZdZdgZdgZdZdS )r   z
    Create a GIF image from source code. This uses the Python Imaging Library to
    generate a pixmap from the source code.

    .. versionadded:: 1.0
    Zimg_gifr   z*.gifNr   r   r   r   rE   r   r   r   r   r   r   r   r     s
   c                   @   s&   e Zd ZdZdZddgZdgZdZdS )r   z
    Create a JPEG image from source code. This uses the Python Imaging Library to
    generate a pixmap from the source code.

    .. versionadded:: 1.0
    Zimg_jpgZjpgr   z*.jpgNr   r   r   r   r   r     s
   c                   @   s&   e Zd ZdZdZddgZdgZdZdS )r   z
    Create a bitmap image from source code. This uses the Python Imaging Library to
    generate a pixmap from the source code.

    .. versionadded:: 1.0
    Zimg_bmpr   Zbitmapz*.bmpNr   r   r   r   r   r     s
   ) r   r'   r,   Zpygments.formatterr   Zpygments.utilr   r   r   r   r=   ZPILr   r   r	   r   ImportErrorra   winreg__all__r+   r3   r/   r1   r   	Exceptionr   r   r
   r   r   r   r   r   r   r   <module>   sL   	
 S  {