o
    ^i                     @  s|   d Z ddlmZ ddlZddl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 G d
d deZdS )z+Tornado handlers for dynamic theme loading.    )annotationsN)	Generator)glob)Any)urlparse)FileFindHandler)url_path_joinc                   @  sF   e Zd ZdZ				dd ddZ	d!d"ddZd#ddZd$ddZdS )%ThemesHandlerz4A file handler that mangles local urls in CSS files.Npathstr | list[str]default_filename
str | Noneno_cache_pathslist[str] | None
themes_urllabextensions_pathkwargsr   returnNonec           
      K  sn   |pg }g }|D ]}|d }	| dd t|	ddD  qt|ts%|g}|| }tj| |||d || _dS )zInitialize the handler.z
/**/themesc                 s  s    | ]}|V  qd S N ).0r
   r   r   [/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyterlab_server/themes_handler.py	<genexpr>$   s    z+ThemesHandler.initialize.<locals>.<genexpr>T)	recursive)r   r   N)extendr   
isinstancelistr   
initializer   )
selfr
   r   r   r   r   r   	ext_pathsext_dirtheme_patternr   r   r   r      s   

zThemesHandler.initializeabspathstrstart
int | Noneend$bytes | Generator[bytes, None, None]c                 C  s.   t j|\}}|dkrt|||S |  S )zRetrieve the content of the requested resource which is located
        at the given absolute path.

        This method should either return a byte string or an iterator
        of byte strings.
        .css)osr
   splitextr   get_content_get_css)r   r#   r%   r'   baseextr   r   r   r,   0   s   	zThemesHandler.get_contentintc                 C  s>   | j dusJ tj| j \}}|dkrt| S t|  S )z:Retrieve the total size of the resource at the given path.Nr)   )absolute_pathr*   r
   r+   r   get_content_sizelenr-   )r   r.   r/   r   r   r   r2   ?   s
   
zThemesHandler.get_content_sizebytesc                   s   | j dusJ t| j d}| d}W d   n1 sw   Y  | js)dS tj| jtj	d}t
| j| d}d fd
d}t|||dS )z"Get the mangled css file contents.Nrbzutf-8    /zurl\('(.*)'\)|url\('(.*)'\)mr   r   c                   sL   |   }tdd |  D }t|}|ds|jr|S ||t |S )z6Replace the matched relative url with the mangled url.c                 s  s    | ]}|r|V  qd S r   r   )r   gr   r   r   r   \   s    z;ThemesHandler._get_css.<locals>.replacer.<locals>.<genexpr>r7   )groupnextgroupsr   
startswithschemereplaceujoin)r8   r:   partparsedbasepathr   r   replacerX   s   z(ThemesHandler._get_css.<locals>.replacer)r8   r   r   r   )r1   openreaddecoder   r*   r
   dirnamer?   sepr@   resubencode)r   fiddatabasedirpatternrE   r   rC   r   r-   G   s   zThemesHandler._get_css)NNNN)r
   r   r   r   r   r   r   r   r   r   r   r   r   r   )NN)r#   r$   r%   r&   r'   r&   r   r(   )r   r0   )r   r4   )__name__
__module____qualname____doc__r   r,   r2   r-   r   r   r   r   r	      s    
r	   )rU   
__future__r   r*   rK   collections.abcr   r   typingr   urllib.parser   jupyter_server.base.handlersr   jupyter_server.utilsr   r@   r	   r   r   r   r   <module>   s    