o
    Ê©Êh)  ã                   @   s�  d Z ddlmZ ddlmZ ddlZddlZddlZddlZddlm	Z	 ddl
mZ ddl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mZ ddlmZ zddlmZ W n eyo   ddlmZ Y nw ddl m!Z" ddl#m#Z# ddl$m	Z% ddgZ&ej'dd� e (e)¡Z*e* +d¡ ej,dd… dk r¤e* -d¡ dd„ Z.dd„ Z/dd„ Z0d d„ Z1G d!d„ deƒZ2G d"d#„ d#e2e"j3ƒZ4dS )$z 
TinyMCE 4 forms widget

This TinyMCE widget was copied and extended from this code by John D'Agostino:
http://code.djangoproject.com/wiki/CustomWidgetsTinyMCE
é    )Úunicode_literals)Úabsolute_importN)Úsettings)Úfinders)ÚTextareaÚMedia)Úflatatt)Ú	smart_str)Ú	mark_safe)Úescape)Úget_languageÚget_language_bidi)Úrender_to_string)Úreverse)Úwidgets)Újsminé   ÚTinyMCEÚrender_tinymce_init_jsz5[%(asctime)s] %(module)s: %(levelname)s - %(message)s)Úformaté   é   )é   r   zZDeprecation warning: Python 2 support will be removed in future releases of tinymce4-lite!c                 C   s,   d  | ¡}tj dddd|¡}t |¡duS )z»
    Check if TinyMCE has a language file for the specified lang code

    :param language_code: language code
    :type language_code: str
    :return: check result
    :rtype: bool
    z{0}.jsÚtinymceÚjsÚlangsN)r   ÚosÚpathÚjoinr   Úfind)Úlanguage_codeÚfilenamer   © r"   úA/var/www/html/env/lib/python3.10/site-packages/tinymce/widgets.pyÚlanguage_file_exists.   s   
	r$   c               
   C   s0  t tƒ ptjƒ} t| ƒs| dd… } t| ƒsd} d| i}tƒ r$d|d< nd|d< tjr–zdd	lm	} W n t
yG } zt
d
ƒ |j¡‚d}~ww |ƒ }tjrVt d |¡¡ g }tjD ]3\}}t |ƒ}||vrm|dd… }||vrzt d |¡¡ q[| d¡du r…||d< | d ||¡¡ q[d |¡|d< |S )z­
    Creates a language configuration for TinyMCE4 based on Django project settings

    :return: language- and locale-related parameters for TinyMCE 4
    :rtype: dict
    Nr   ÚenÚlanguageÚrtlÚdirectionalityÚltrr   )Úlist_languagesz8To use spellchecker you need to install pyenchant first!zEnchant languages: {0}z$Missing {0} spellchecker dictionary!Úspellchecker_languagez{0}={1}ú,Úspellchecker_languages)Úconvert_language_coder   r   ÚLANGUAGE_CODEr$   r   Úmce_settingsÚUSE_SPELLCHECKERÚenchantr*   ÚImportErrorÚwith_tracebackÚ__traceback__ÚDEBUGÚloggerÚinfor   Ú	LANGUAGESÚerrorÚgetÚappendr   )r    Úconfigr*   ÚexÚenchant_languagesÚ
lang_namesÚlangÚnamer"   r"   r#   Úget_language_config<   sH   
ÿþ€ÿrC   c                 C   sB   |   d¡}zd |d |d  ¡ f¡W S  ty    |d  Y S w )zÙ
    Converts Django language codes "ll-cc" into ISO codes "ll_CC" or "ll"

    :param django_lang: Django language code as ll-cc
    :type django_lang: str
    :return: ISO language code as ll_CC
    :rtype: str
    ú-Ú_r   r   )Úsplitr   ÚupperÚ
IndexError)Údjango_langÚlang_and_countryr"   r"   r#   r.   g   s   
	ÿr.   c                 C   sp   t jrd|vrd|d< t jrd|vrd|d< |r%|  dd¡d |¡ | d< td|t | ¡d	d
… d|v dœd�S )aA  
    Renders TinyMCE.init() JavaScript code

    :param mce_config: TinyMCE 4 configuration
    :type mce_config: dict
    :param callbacks: TinyMCE callbacks
    :type callbacks: dict
    :param id_: HTML element's ID to which TinyMCE is attached.
    :type id_: str
    :return: TinyMCE.init() code
    :rtype: str
    Úfile_browser_callbackÚdjangoFileBrowserÚspellchecker_callbackÚtinymce4_spellcheckÚselectorÚtextareaz#{0}ztinymce/tinymce_init.jsr   éÿÿÿÿÚ
__prefix__)Ú	callbacksÚtinymce_configÚis_admin_inline)Úcontext)r0   ÚUSE_FILEBROWSERr1   r;   r   r   ÚjsonÚdumps)Ú
mce_configrS   Úid_r"   r"   r#   r   w   s   þÿc                       sB   e Zd ZdZd‡ fdd„	Zddd„Zddd„Zed	d
„ ƒZ‡  Z	S )r   a  
    TinyMCE 4 widget

    It replaces a textarea form widget with a rich-text WYSIWYG `TinyMCE 4`_ editor widget.

    :param attrs: General Django widget attributes.
    :type attrs: dict
    :param mce_attrs: Additional configuration parameters for TinyMCE 4.
        They *amend* the existing configuration.
    :type mce_attrs: dict
    :param profile: TinyMCE 4 configuration parameters.
        They *replace* the existing configuration.
    :type profile: dict

    .. _TinyMCE 4: https://www.tinymce.com/
    Nc                    s@   t t| ƒ |¡ |pi | _tƒ | _|ptj ¡ }| j 	|¡ d S ©N)
Úsuperr   Ú__init__Ú	mce_attrsrC   Úprofiler0   ÚCONFIGÚcopyÚupdate)ÚselfÚattrsr_   r`   Údefault_profile©Ú	__class__r"   r#   r^   ¡   s
   
zTinyMCE.__init__c                 K   s"   t |fi |¤Ž}|r| |¡ |S r\   )Údictrc   )rd   Ú
base_attrsÚextra_attrsÚkwargsÚ
attributesr"   r"   r#   Úbuild_attrs¨   s   
zTinyMCE.build_attrsc              	   C   s¸   |d u rd}t |ƒ}|  | j|¡}||d< | dd¡d  ¡ |d< | j ¡ }| | j¡ | d¡r<d 	t
|ƒt|ƒ¡}n
d 	t
|ƒt|ƒ¡}|d 	tt|tj ¡ |d	 ƒƒ¡7 }t|ƒS )
NÚ rB   Úclassz tinymce4-editorÚinlinez<div{0}>{1}</div>
z<textarea{0}>{1}</textarea>
z+<script type="text/javascript">{0}</script>Úid)r	   rn   re   r;   Úlstripr`   rb   rc   r_   r   r   r   r   r   r0   Ú	CALLBACKSr
   )rd   rB   Úvaluere   ÚrendererÚfinal_attrsrZ   Úhtmlr"   r"   r#   Úrender®   s$   

þÿzTinyMCE.renderc                 C   sp   t jg}t jr| tdƒ¡ t jr|t j7 }t jr | tdƒ¡ dtdƒgi}t jr2|d  t j¡ t||d�S )Nztinymce-filebrowserztinymce-spellcheck-callbackÚallztinymce-css)r   Úcss)	r0   ÚJS_URLrW   r<   r   ÚADDIONAL_JS_URLSr1   ÚCSS_URLr   )rd   r   r{   r"   r"   r#   ÚmediaÃ   s   
zTinyMCE.media)NNNr\   )NN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r^   rn   ry   Úpropertyr   Ú__classcell__r"   r"   rg   r#   r   �   s    

c                   @   s   e Zd ZdZdS )ÚAdminTinyMCEz+TinyMCE 4 widget for Django Admin interfaceN)r€   r�   r‚   rƒ   r"   r"   r"   r#   r†   Ò   s    r†   )5rƒ   Ú
__future__r   r   rX   Úloggingr   ÚsysÚdjango.confr   Údjango.contrib.staticfilesr   Údjango.formsr   r   Údjango.forms.utilsr   Údjango.utils.encodingr	   Údjango.utils.safestringr
   Údjango.utils.htmlr   Údjango.utils.translationr   r   Údjango.template.loaderr   Údjango.urlsr   r3   Údjango.core.urlresolversÚdjango.contrib.adminr   Úadmin_widgetsr   ro   r0   Ú__all__ÚbasicConfigÚ	getLoggerr€   r7   ÚsetLevelÚversion_infoÚwarningr$   rC   r.   r   r   ÚAdminTextareaWidgetr†   r"   r"   r"   r#   Ú<module>   sL   ÿ

ÿ+B