o
    ;/b&                     @   s   d Z ddlmZ ddlmZ zddlZW n ey   edw ejZej	Z	ej
Z
g dZG dd	 d	ejZG d
d deejZdd ZedZde_eed< G dd dejZdS )zCSS Selectors based on XPath.

This module supports selecting XML/HTML tags based on CSS selectors.
See the `CSSSelector` class for details.

This is a thin wrapper around cssselect 0.7 or later.
    )absolute_import   )etreeNzRcssselect does not seem to be installed. See http://packages.python.org/cssselect/)SelectorSyntaxErrorExpressionErrorSelectorErrorCSSSelectorc                   @   s   e Zd ZdZdd ZdS )LxmlTranslatorzR
    A custom CSS selector to XPath translator with lxml-specific extensions.
    c                 C   sF   |  dgdgfvrtd|j |jd j}|d| |  S )NSTRINGZIDENTz9Expected a single string or ident for :contains(), got %rr   z7contains(__lxml_internal_css:lower-case(string(.)), %s))Zargument_typesr   Z	argumentsvalueZadd_conditionZxpath_literallower)selfZxpathfunctionr    r   0/usr/lib/python3/dist-packages/lxml/cssselect.pyxpath_contains_function!   s   z&LxmlTranslator.xpath_contains_functionN)__name__
__module____qualname____doc__r   r   r   r   r   r	      s    r	   c                   @   s   e Zd ZdZdS )LxmlHTMLTranslatorz)
    lxml extensions + HTML support.
    N)r   r   r   r   r   r   r   r   r   .   s    r   c                 C   s   |  S )N)r   )contextsr   r   r   _make_lower_case4   s   r   zhttp://codespeak.net/lxml/css/Z__lxml_internal_cssz
lower-casec                   @   s"   e Zd ZdZdddZdd ZdS )	r   a  A CSS selector.

    Usage::

        >>> from lxml import etree, cssselect
        >>> select = cssselect.CSSSelector("a tag > child")

        >>> root = etree.XML("<a><b><c/><tag><child>TEXT</child></tag></b></a>")
        >>> [ el.tag for el in select(root) ]
        ['child']

    To use CSS namespaces, you need to pass a prefix-to-namespace
    mapping as ``namespaces`` keyword argument::

        >>> rdfns = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
        >>> select_ns = cssselect.CSSSelector('root > rdf|Description',
        ...                                   namespaces={'rdf': rdfns})

        >>> rdf = etree.XML((
        ...     '<root xmlns:rdf="%s">'
        ...       '<rdf:Description>blah</rdf:Description>'
        ...     '</root>') % rdfns)
        >>> [(el.tag, el.text) for el in select_ns(rdf)]
        [('{http://www.w3.org/1999/02/22-rdf-syntax-ns#}Description', 'blah')]

    Nxmlc                 C   sX   |dkrt  }n|dkrt }n	|dkrtdd}||}tjj| ||d || _d S )Nr   ZhtmlxhtmlT)r   )
namespaces)r	   r   Zcss_to_xpathr   XPath__init__css)r   r   r   Z
translatorpathr   r   r   r   W   s   


zCSSSelector.__init__c                 C   s(   d| j jttt| dd  | jf S )Nz<%s %s for %r>   )	__class__r   hexabsidr   )r   r   r   r   __repr__b   s
   zCSSSelector.__repr__)Nr   )r   r   r   r   r   r&   r   r   r   r   r   <   s    
r   )r   Z
__future__r    r   Z	cssselectZexternal_cssselectImportErrorr   r   r   __all__ZGenericTranslatorr	   ZHTMLTranslatorr   r   ZFunctionNamespacensprefixr   r   r   r   r   r   <module>   s*    
