B
    ë¹`#U  ã               @   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
yddlmZmZmZ dZW n ek
rt   dZY nX yddlZW n: ek
r¼   y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-2021 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   ú_/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/pygments/formatters/img.pyr   5   s   r   c               @   s   e Zd ZdZdS )ÚFontNotFoundz(When there are no usable fonts specifiedN)r   r   r   r   r   r   r   r   r   9   s   r   c               @   sd   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S )ÚFontManagerz>
    Manages a set of fonts: normal, italic, bold, etc...
    é   c             C   sn   || _ || _i | _d | _tj d¡r8|s.t| _ |  ¡  n2tj d¡rX|sNt	| _ |  
¡  n|sbt| _ |  ¡  d S )NÚwinÚdarwin)Ú	font_nameÚ	font_sizeÚfontsÚencodingÚsysÚplatformÚ
startswithÚDEFAULT_FONT_NAME_WINÚ_create_winÚDEFAULT_FONT_NAME_MACÚ_create_macÚDEFAULT_FONT_NAME_NIXÚ_create_nix)Úselfr   r    r   r   r   Ú__init__B   s    

zFontManager.__init__c       	      C   sz   t jdd||f dgt jd d}| ¡ \}}|jdkrv| ¡ }x2|D ]*}| d¡rTqD| ¡  ¡  d¡}|rD|S qDW d S d S )Nzfc-listz%s:style=%sÚfile)ÚstdoutÚstderrr   s   Fontconfig warning:ú:)	Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
returncodeÚ
splitlinesr%   ÚdecodeÚstrip)	r,   ÚnameÚstyleÚprocr/   Ú_ÚlinesÚlineÚpathr   r   r   Ú_get_nix_font_pathT   s    


zFontManager._get_nix_font_pathc             C   sÆ   xJt d D ]0}|  | j|¡}|d k	r
t || j¡| jd< P q
W td| j ƒ‚xtdD ]l}xft | D ]0}|  | j|¡}|d k	r`t || j¡| j|< P q`W |dkr®| jd | j|< qR| jd | j|< qRW d S )Nr   zNo usable fonts named: "%s")r   r   r   r   r   )ÚSTYLESrA   r   r	   Útruetyper    r!   r   )r,   r:   r@   r;   Ú	stylenamer   r   r   r+   b   s     

zFontManager._create_nixc             C   s   |  |d |  ¡  ¡ ¡S )Nú )Úgetr9   Úlower)r,   Úfont_mapr:   r;   r   r   r   Ú_get_mac_font_pathw   s    zFontManager._get_mac_font_pathc                s  i }x@t j t  d¡d¡ddfD ]"‰ | ‡ fdd„t  ˆ ¡D ƒ¡ q W xLtd D ]2}|  || j|¡}|d k	rPt	 
|| j¡| jd< P qPW td| j ƒ‚xvd	D ]n}xht| D ]2}|  || j|¡}|d k	r¨t	 
|| j¡| j|< P q¨W |d
krø| jd | j|< qš| jd | j|< qšW d S )NÚHOMEzLibrary/Fonts/z/Library/Fonts/z/System/Library/Fonts/c             3   s>   | ]6}|  ¡  d ¡rtj |¡d   ¡ tj ˆ |¡fV  qdS ))ZttfZttcr   N)rG   ÚendswithÚosr@   ÚsplitextÚjoin)Ú.0Úf)Úfont_dirr   r   ú	<genexpr>   s   z*FontManager._create_mac.<locals>.<genexpr>r   zNo usable fonts named: "%s")r   r   r   r   r   )rL   r@   rN   ÚgetenvÚupdateÚlistdirrB   rI   r   r	   rC   r    r!   r   )r,   rH   r:   r@   r;   rD   r   )rQ   r   r)   z   s,    


zFontManager._create_macFc       
   
   C   s~   xxdD ]T}xN|D ]F}y*d||o$d| |f }t  ||¡\}}	|S  tk
rT   wY qX qW qW |rvtd||d f ƒ‚d S d S )N)r   z (TrueType)z%s%s%srE   z"Font %s (%s) not found in registryr   )Ú_winregÚQueryValueExÚOSErrorr   )
r,   ÚkeyÚbasenameÚstylesZfailÚsuffixr;   ZvalnameÚvalr=   r   r   r   Ú_lookup_win—   s    

zFontManager._lookup_winc             C   sD  d }t jdft jdft jdft jdfg}x|D ]ú}yÞt j|Ž }zÂy”|  || jtd d¡}t || j	¡| j
d< xddD ]\}|  || jt| ¡}|r¦t || j	¡| j
|< qt|dkrÀ| j
d | j
|< qt| j
d | j
|< qtW d S  tk
 rþ } z|}W d d }~X Y nX W d t  |¡ X W q0 tk
r(   Y q0X q0W |r8|‚tdƒ‚d S )	Nz2Software\Microsoft\Windows NT\CurrentVersion\Fontsz/Software\Microsoft\Windows\CurrentVersion\Fontsr   T)r   r   r   r   r   z$Can't open Windows font registry key)rV   ÚHKEY_CURRENT_USERÚHKEY_LOCAL_MACHINEÚOpenKeyr^   r   rB   r	   rC   r    r!   r   ÚCloseKeyrX   )r,   ZlookuperrorZkeynamesÚkeynamerY   r@   r;   Úerrr   r   r   r'   ¦   s6    


zFontManager._create_winc             C   s   | j d  d¡S )z)
        Get the character size.
        r   ÚM)r!   Úgetsize)r,   r   r   r   Úget_char_sizeÍ   s    zFontManager.get_char_sizec             C   s   | j d  |¡S )z3
        Get the text size(width, height).
        r   )r!   rf   )r,   Útextr   r   r   Úget_text_sizeÓ   s    zFontManager.get_text_sizec             C   s<   |r|r| j d S |r | j d S |r.| j d S | j d S dS )z>
        Get the font based on bold and italic flags.
        r   r   r   r   N)r!   )r,   ÚboldZobliquer   r   r   Úget_fontÙ   s    


zFontManager.get_fontN)r   )F)r   r   r   r   r-   rA   r+   rI   r)   r^   r'   rg   ri   rk   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.

        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
    Ú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 ƒ}x:|D ]2}y| j! #t$|ƒ¡ W n t%k
r°   Y nX q‚W | d%| jj&¡pÌd&| _'g | _(dS )'zE
        See the class docstring for explanation of options.
        z5Python Imaging Library is required for this formatterÚlatin1Nz#fffÚimage_formatrm   ÚjpegÚgifÚbmpT)ÚnormcaseÚ	image_padé
   Úline_padé   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   r-   r"   Údictr;   r[   Úbackground_colorr   Údefault_image_formatro   r   rt   rv   r   rF   r!   rg   ÚfontwÚfonthrx   ry   rz   r   r{   r|   r}   r   r€   r   rƒ   Úline_number_widthr„   r   ÚappendÚintÚ
ValueErrorZhighlight_colorr…   Ú	drawables)r,   ÚoptionsZfontsizeZhl_lines_strr?   r   r   r   r-   ]  sZ    






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)r,   Ú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‹   rv   )r,   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•   rt   )r,   Úlinenor   r   r   Ú_get_line_yŸ  s    zImageFormatter._get_line_yc             C   s   | j S )z/
        Get the width of a character.
        )rŠ   )r,   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.
        )rt   rŒ   )r,   Ú
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—   )r,   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.
        )rt   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   )r,   r;   Ú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.
        ZbgcolorNrž   r   )r,   r;   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.
        rj   Zitalic)r!   rk   )r,   r;   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š   rt   r—   )r,   Ú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)ÚfontÚtext_fgÚtext_bg)
Ú
_draw_textrœ   ÚstrÚrjustrz   r!   rk   r{   r|   rx   )r,   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   )r,   Úposrh   r¦   r§   r¨   r   r   r   r©   ë  s    zImageFormatter._draw_textc          
   C   s  d } }}d }}xè|D ]à\}}x|| j kr6|j}q$W | j | }	| d¡}| d¡}
x¢t|
ƒD ]–\}}| d¡}|rÜ| j|  ||¡||  |	¡|  	|	¡|  
|	¡d | j |¡\}}||7 }t||ƒ}|t|ƒ7 }t||ƒ}| d¡r`d}d}|d7 }q`W qW || _|| _|| _dS )z9
        Create drawables for the token content.
        r   é   TÚ
)r¦   r§   r¨   r‚   N)r[   ÚparentÚ
expandtabsr7   Ú	enumerateÚrstripr©   r›   r¢   r    r¡   r!   ri   ÚmaxÚlenrK   r£   Ú	maxcharnor¤   )r,   Útokensourcer–   Zcharnor¶   r£   r™   ZttypeÚvaluer;   r>   Úir?   ÚtempZ
temp_widthZ
temp_hightr   r   r   Ú_create_drawablesñ  s:    








z ImageFormatter._create_drawablesc             C   sF   | j s
dS x6t| jƒD ](}|| j }|| j dkr|  ||¡ qW dS )z8
        Create drawables for the line numbers.
        Nr   )r   Úranger¤   rƒ   r   r¬   )r,   ÚpÚnr   r   r   Ú_draw_line_numbers  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   rx   r   ÚDrawÚsizert   rŒ   r}   Ú	rectanglery   r€   r?   )r,   ÚimÚdrawÚrecthÚrectwr   r   r   Ú_paint_line_number_bg$  s    



z$ImageFormatter._paint_line_number_bgc             C   sB  |   |¡ |  ¡  t d|  | j| j¡| j¡}|  |¡ t	 
|¡}| jr¶| j| j | j d }|  ¡ }|jd | }x@| jD ]6}|  |d ¡}	|j||	f|| |	| fg| jd q|W xt| jD ]j\}
}}}}|r|j||d}|j|
d |
d |
d |d  |
d |d  g|d |j|
|||d q¾W | || 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.
        ZRGBr‚   r   )rŸ   )rh   r¦   )r¦   rŸ   N)r»   r¿   r   Únewr¥   r£   r¤   rˆ   rÈ   r   rÁ   r„   rt   rŒ   r}   r•   rÂ   r—   rÃ   r…   r   Ztextsizerh   Úsavero   Úupper)r,   r·   ÚoutfilerÄ   rÅ   ÚxrÆ   rÇ   Z
linenumberÚyr­   r¸   r¦   r§   r¨   Z	text_sizer   r   r   Úformat5  s,    


6zImageFormatter.formatN)r   )r   r   r   r   r:   ÚaliasesÚ	filenamesZunicodeoutputr‰   r-   r”   r•   r—   r˜   rš   r›   rœ   r    r¡   r¢   r¥   r¬   r©   r»   r¿   rÈ   rÏ   r   r   r   r   r
   ç   s0   k
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_gifrq   z*.gifN)r   r   r   r   r:   rÐ   rÑ   r‰   r   r   r   r   r   Z  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jpgrp   z*.jpgN)r   r   r   r   r:   rÐ   rÑ   r‰   r   r   r   r   r   h  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_bmprr   Zbitmapz*.bmpN)r   r   r   r   r:   rÐ   rÑ   r‰   r   r   r   r   r   v  s
   ) r   rL   r#   Zpygments.formatterr   Zpygments.utilr   r   r   r   r2   ZPILr   r   r	   r†   ÚImportErrorrV   ÚwinregÚ__all__rB   r*   r&   r(   r   Ú	Exceptionr   r   r
   r   r   r   r   r   r   r   Ú<module>	   sH   
 +  u