B
    \                 @   s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dd Zdd Zdd Zdd Zdd ZG dd de Z!edd Z"G dd deZ#G dd deeZ$dS )z
    sphinx.jinja2glue
    ~~~~~~~~~~~~~~~~~

    Glue code for the jinja2 templating engine.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )path)pformat)AnyCallableIteratorTuple)FileSystemLoader
BaseLoaderTemplateNotFoundcontextfunction)SandboxedEnvironment)open_if_exists)string_types)TemplateBridge)logging)mtimes_of_filesc             C   s   t | tr|  dkS t| S )N)true1ZyesZon)
isinstancer   lowerbool)val r   0lib/python3.7/site-packages/sphinx/jinja2glue.py_tobool"   s    
r   c             C   s"   yt | S  tk
r   dS X d S )Nr   )int
ValueError)r   r   r   r   _toint)   s    r   c             C   s4   | dkrdS t |  r0t| dkr(dS d|  S | S )a  
    Make val a css dimension. In particular the following transformations
    are performed:

    - None -> 'initial' (default CSS value)
    - 0 -> '0'
    - ints and string representations of ints are interpreted as pixels.

    Everything else is returned unchanged.
    Ninitialr   0z%spx)strisdigitr   )r   r   r   r   _todim1   s
    r"   c       
      c   s   t | }d}x$| D ]}|dt|d d  7 }qW || }d}x|t|D ]p}d}|}	||d krjt|}n@x>| |d  D ].}|dt|d d  7 }|d7 }||krxP qxW ||	| V  qHW d S )Nr      )listlenrange)
valuesZslicesseqlengthvalueZitems_per_sliceoffsetZslice_numbercountstartr   r   r   _slice_indexD   s"    

r.   c             C   s>   d| kri | j d< |r:|| j d kr:d| j d |< d| S dS )z+Helper to output each access key only once.Z_accesskeysr#   zaccesskey="%s" )vars)contextkeyr   r   r   	accesskeyZ   s    
r3   c               @   s(   e Zd Zdd Zdd Zdd ZeZdS )idgenc             C   s
   d| _ d S )Nr   )id)selfr   r   r   __init__f   s    zidgen.__init__c             C   s   | j S )N)r5   )r6   r   r   r   currentj   s    zidgen.currentc             C   s   |  j d7  _ | j S )Nr#   )r5   )r6   r   r   r   __next__n   s    zidgen.__next__N)__name__
__module____qualname__r7   r8   r9   nextr   r   r   r   r4   e   s   r4   c             O   sJ   d| kr*|  d|  dd }d||f }td}|j|f|| dS )NZpagenameZfile_suffixr/   zin rendering %s: %szsphinx.themes)getr   Z	getLoggerwarning)r1   messageargskwargsfilenameZloggerr   r   r   r?   u   s    
r?   c               @   s   e Zd ZdZdd ZdS )SphinxFileSystemLoaderzd
    FileSystemLoader subclass that is not so strict about '..'  entries in
    template names.
    c          
      sz   xl| j D ]b}t|| t }|d kr*q| | | j}W d Q R X t  fdd}| |fS W t|d S )Nc                  s(   yt  kS  tk
r"   dS X d S )NF)r   getmtimeOSErrorr   )rC   mtimer   r   uptodate   s    z3SphinxFileSystemLoader.get_source.<locals>.uptodate)	
searchpathr   joinr   readdecodeencodingrE   r
   )r6   environmenttemplaterI   fcontentsrH   r   )rC   rG   r   
get_source   s    
z!SphinxFileSystemLoader.get_sourceN)r:   r;   r<   __doc__rR   r   r   r   r   rD      s   rD   c               @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )BuiltinTemplateLoaderzK
    Interfaces the rendering environment of jinja2 for use in Sphinx.
    Nc       	         sB  |r |  }|dd |D  }n|r6t|}t|}ng }g }t jj| _ jjr fdd jjD }||dd< ||dd< || _dd |D | _ jj	d k	}|rdgpg }t
| |d| _t| jjd< t| jjd	< t| jjd
< t| jjd< tt| jjd< t| jjd< tt| jjd< t| jjd< |r>| j jj	 d S )Nc             S   s   g | ]}t |d qS )z..)r   rJ   ).0pr   r   r   
<listcomp>   s    z.BuiltinTemplateLoader.init.<locals>.<listcomp>c                s   g | ]}t  j|qS r   )r   rJ   Zconfdir)rU   tp)builderr   r   rW      s   r   c             S   s   g | ]}t |qS r   )rD   )rU   xr   r   r   rW      s    zjinja2.ext.i18n)loader
extensionsZtoboolZtointZtodimZslice_indexdebugr?   r3   r4   )Zget_theme_dirsr$   r%   ZconfigZtemplates_pathtemplatepathlen	pathchainloadersZappZ
translatorr   rN   r   filtersr   r"   r.   r   r   globalsr?   r3   r4   Zinstall_gettext_translations)	r6   rY   Zthemedirsr_   ZloaderchainZcfg_templates_pathZuse_i18nr\   r   )rY   r   init   s<    


zBuiltinTemplateLoader.initc             C   s   | j ||S )N)rN   Zget_templaterender)r6   rO   r1   r   r   r   re      s    zBuiltinTemplateLoader.renderc             C   s   | j ||S )N)rN   Zfrom_stringre   )r6   sourcer1   r   r   r   render_string   s    z#BuiltinTemplateLoader.render_stringc             C   s   t t| jdS )Nz.html)maxr   r_   )r6   r   r   r   newest_template_mtime   s    z+BuiltinTemplateLoader.newest_template_mtimec          	   C   sf   | j }|dr*|| jd  }|dd  }x.|D ]&}y|||S  tk
rT   Y q0X q0W t|d S )N!r#   )r`   
startswithr^   rR   r
   )r6   rN   rO   r`   r[   r   r   r   rR      s    


z BuiltinTemplateLoader.get_source)NN)	r:   r;   r<   rS   rd   re   rg   ri   rR   r   r   r   r   rT      s   
,rT   N)%rS   osr   Zpprintr   typingr   r   r   r   Zjinja2r   r	   r
   r   Zjinja2.sandboxr   Zjinja2.utilsr   Zsixr   Zsphinx.applicationr   Zsphinx.utilr   Zsphinx.util.osutilr   r   r   r"   r.   r3   objectr4   r?   rD   rT   r   r   r   r   <module>
   s&   
