U
    Pe                     @   s   d Z d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	lmZ dd
lmZmZ ddlmZmZ ddlmZ ejZejZG dd dee	ZedkrddlmZ ddlm Z  G dd de Z!e! "  dS )a  
Code Input
==========

.. versionadded:: 1.5.0

.. image:: images/codeinput.jpg

.. note::

    This widget requires ``pygments`` package to run. Install it with ``pip``.

The :class:`CodeInput` provides a box of editable highlighted text like the one
shown in the image.

It supports all the features provided by the :class:`~kivy.uix.textinput` as
well as code highlighting for `languages supported by pygments
<http://pygments.org/docs/lexers/>`_ along with `KivyLexer` for
:mod:`kivy.lang` highlighting.

Usage example
-------------

To create a CodeInput with highlighting for `KV language`::

    from kivy.uix.codeinput import CodeInput
    from kivy.extras.highlight import KivyLexer
    codeinput = CodeInput(lexer=KivyLexer())

To create a CodeInput with highlighting for `Cython`::

    from kivy.uix.codeinput import CodeInput
    from pygments.lexers import CythonLexer
    codeinput = CodeInput(lexer=CythonLexer())

)	CodeInput    )	highlight)lexers)styles)BBCodeFormatter)	TextInput)MarkupLabel)Cache)ObjectPropertyOptionProperty)get_hex_from_colorget_color_from_hex)CodeNavigationBehaviorc                       s   e Zd ZdZedZedee	 dZ
edZ fddZdd Zd	d
 ZdddZ fddZdd Zdd Zdd Zdd Zdd Z  ZS )r   z;CodeInput class, used for displaying highlighted code.
    Ndefault)optionsc                    s   | dd}d|kr|d nt|}t|d| _t | _d| _t	 | _
d| _tt| jf | |   | _}t	f || _
| d}|rt|| _d| _d	d	d	d
g| _| dsdddd	g| _d S )N
style_namer   styler   z#000000Tforeground_colorF   +?background_colorg?gq=
ףp?)getr   get_style_by_namer   	formatterr   ZPythonLexerlexer
text_colorLabel_label_cacheduse_text_colorsuperr   __init___get_line_optionsZ_line_optionsr   r   r   )selfkwargsZ	stylenamer   kwr   	__class__ 6/tmp/pip-unpacked-wheel-xzebddm3/kivy/uix/codeinput.pyr!   [   s&    



zCodeInput.__init__c                 G   s(   t | j| _t| jj| _|   d S N)r   r   r   r   r   r   _trigger_refresh_textr#   argsr(   r(   r)   on_style_namet   s    zCodeInput.on_style_namec                 G   s   t | jd| _|   d S )Nr   )r   r   r   Z_trigger_update_graphicsr,   r(   r(   r)   on_styley   s    zCodeInput.on_styleFc                 C   s   | dd dd| j }| jr0|s0dt| }| |}|  }d|| j|}td|}|d krtf d|i|}|	dd	krd|_
n||_
|  |j}td|| d|_
|S )
N
 	 *{} {} {}ztextinput.labeltextr   )replace	tab_widthpasswordlen_get_bbcoder"   format	Cache_getr   findr6   ZrefreshtextureCache_append)r#   r6   hintntextr%   cidr?   labelr(   r(   r)   _create_line_label}   s"    


zCodeInput._create_line_labelc                    s0   t t|  }d|d< d|d< t| j|d< |S )NTZmarkuptopZvalignZ	codeinput)r    r   r"   reprr   )r#   r%   r&   r(   r)   r"      s
    zCodeInput._get_line_optionsc                 C   sJ   d || j|  }td|}|d k	r*|S | |}|j}td|| |S )Nr5   ztextinput.width)r<   r9   r"   r=   rE   widthr@   )r#   r6   r8   r   rC   rH   Zlblr(   r(   r)   _get_text_width   s    


zCodeInput._get_text_widthc                 C   s   z|d  | dd dd}t|| j| j}| dd dd}dd	t| jd|d
f}| dd}| dd dd}|W S  tk
r   Y dS X d S )Nr   []z&bl;z&br;r1   z[color=z[/color]r0   z[u]z[/u])r7   r   r   r   joinstrr   
IndexError)r#   rB   r(   r(   r)   r;      s     zCodeInput._get_bbcodec                 C   s\   d}dzFz4| j r:| | j| j d| j  }|W W   S W n   Y nX W 5 |  S X  )z4Get the cursor x offset on the current line
        r   N)Z
cursor_colrI   _linesZ
cursor_row)r#   offsetr(   r(   r)   _cursor_offset   s    
zCodeInput._cursor_offsetc                 C   s   |    d S r*   )r+   )r#   instancevaluer(   r(   r)   on_lexer   s    zCodeInput.on_lexerc                 C   s2   | j sd| _ d S t|| _d| _ d| _|   d S )NTF)r   r   r   r   )r   r   r   r   r+   )r#   rT   r   r(   r(   r)   on_foreground_color   s    
zCodeInput.on_foreground_color)F)__name__
__module____qualname____doc__r
   r   r   listr   Zget_all_stylesr   r   r!   r.   r/   rE   r"   rI   r;   rS   rV   rW   __classcell__r(   r(   r&   r)   r   :   s"    


r   __main__)	KivyLexer)Appc                   @   s   e Zd Zdd ZdS )CodeInputTestc                 C   s   t t dddS )N   z
#:kivy 1.0

<YourWidget>:
    canvas:
        Color:
            rgb: .5, .5, .5
        Rectangle:
            pos: self.pos
            size: self.size)r   Z	font_sizer6   )r   r_   )r#   r(   r(   r)   build   s    zCodeInputTest.buildN)rX   rY   rZ   rc   r(   r(   r(   r)   ra      s   ra   N)#r[   __all__Zpygmentsr   r   r   Zpygments.formattersr   Zkivy.uix.textinputr   Zkivy.core.text.markupr   r   Z
kivy.cacher	   Zkivy.propertiesr
   r   Z
kivy.utilsr   r   Zkivy.uix.behaviorsr   r   r=   appendr@   r   rX   Zkivy.extras.highlightr_   Zkivy.appr`   ra   runr(   r(   r(   r)   <module>   s(   % "