U
    nuf¿5  ã                   @   s–   d dl mZmZmZmZ d dlmZ ddd„Zdd„ Zddd	„Z	dd
d„Z
dd„ Zdd„ Zd dd„Zd!dd„Zd"dd„Zd#dd„Zdd„ Zdd„ ZdS )$é   )ÚAtRuleÚDeclarationÚ
ParseErrorÚQualifiedRule)Úparse_component_value_listFc                 C   s   t | tƒrt| |ƒ} t| ƒS )aq  Iterate component values out of string or component values iterable.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments: If the input is a string, ignore all CSS comments.
    :returns: An iterator yielding :term:`component values`.

    )Ú
isinstanceÚstrr   Úiter)ÚinputÚskip_comments© r   ú3/tmp/pip-unpacked-wheel-29zdolzj/tinycss2/parser.pyÚ_to_token_iterator   s    

r   c                 C   s    | D ]}|j dkr|  S qdS )zçReturn the next significant (neither whitespace or comment) token.

    :type tokens: :term:`iterator`
    :param tokens: An iterator yielding :term:`component values`.
    :returns: A :term:`component value`, or :obj:`None`.

    ©Ú
whitespaceÚcommentN)Útype)ÚtokensÚtokenr   r   r   Ú_next_significant   s    
r   c                 C   sR   t | |ƒ}t|ƒ}t|ƒ}|dkr0tddddƒS |dk	rJt|j|jddƒS |S dS )aú  Parse a single :diagram:`component value`.

    This is used e.g. for an attribute value
    referred to by ``attr(foo length)``.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments: If the input is a string, ignore all CSS comments.
    :returns:
        A :term:`component value` (that is neither whitespace or comment),
        or a :class:`~tinycss2.ast.ParseError`.

    Nr   ÚemptyúInput is emptyúextra-inputzGot more than one token)r   r   r   Úsource_lineÚsource_column)r
   r   r   ÚfirstÚsecondr   r   r   Úparse_one_component_value"   s    
  þr   c                 C   s2   t | |ƒ}t|ƒ}|dkr(tddddƒS t||ƒS )a?  Parse a single :diagram:`declaration`.

    This is used e.g. for a declaration in an `@supports
    <https://drafts.csswg.org/css-conditional/#at-supports>`_ test.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments: If the input is a string, ignore all CSS comments.
    :returns:
        A :class:`~tinycss2.ast.Declaration`
        or :class:`~tinycss2.ast.ParseError`.

    Any whitespace or comment before the ``:`` colon is dropped.

    Nr   r   r   )r   r   r   Ú_parse_declaration)r
   r   r   Úfirst_tokenr   r   r   Úparse_one_declaration>   s
    
r    c           	      C   s  | }|j dkr&t|j|jdd|j  ƒS t|ƒ}|dkrHt|j|jddƒS |dkrht|j|jdd|j  ƒS g }d}t|ƒD ]\\}}|dkrš|d	kršd
}|}n0|d
kr¼|j dkr¼|jdkr¼d}n|j dkrÊd}| |¡ qx|dkrè||d…= t|j|j|j	|j||dkƒS )a§  Parse a declaration.

    Consume :obj:`tokens` until the end of the declaration or the first error.

    :type first_token: :term:`component value`
    :param first_token: The first component value of the rule.
    :type tokens: :term:`iterator`
    :param tokens: An iterator yielding :term:`component values`.
    :returns:
        A :class:`~tinycss2.ast.Declaration`
        or :class:`~tinycss2.ast.ParseError`.

    ÚidentÚinvalidz.Expected <ident> for declaration name, got %s.Nz,Expected ':' after declaration name, got EOFú:z,Expected ':' after declaration name, got %s.Úvalueú!ZbangZ	importantr   )
r   r   r   r   r   Ú	enumerateÚlower_valueÚappendr   r$   )	r   r   ÚnameÚcolonr$   ÚstateÚir   Zbang_positionr   r   r   r   V   sL    
ÿÿÿÿÿÿ

  ÿr   c                 C   s2   g }|D ]}|dkr q$|  |¡ qt| t|ƒƒS )z=Like :func:`_parse_declaration`, but stop at the first ``;``.ú;)r(   r   r	   )r   r   Zother_declaration_tokensr   r   r   r   Ú_consume_declaration_in_list‡   s    r.   c                 C   s„   t | |ƒ}g }|D ]l}|jdkr0|s~| |¡ q|jdkrJ|s~| |¡ q|jdkrf| t||ƒ¡ q|dkr| t||ƒ¡ q|S )uM  Parse a :diagram:`declaration list` (which may also contain at-rules).

    This is used e.g. for the :attr:`~tinycss2.ast.QualifiedRule.content`
    of a style rule or ``@page`` rule,
    or for the ``style`` attribute of an HTML element.

    In contexts that donâ€™t expect any at-rule,
    all :class:`~tinycss2.ast.AtRule` objects
    should simply be rejected as invalid.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments:
        Ignore CSS comments at the top-level of the list.
        If the input is a string, ignore all comments.
    :type skip_whitespace: :obj:`bool`
    :param skip_whitespace:
        Ignore whitespace at the top-level of the list.
        Whitespace is still preserved
        in the :attr:`~tinycss2.ast.Declaration.value` of declarations
        and the :attr:`~tinycss2.ast.AtRule.prelude`
        and :attr:`~tinycss2.ast.AtRule.content` of at-rules.
    :returns:
        A list of
        :class:`~tinycss2.ast.Declaration`,
        :class:`~tinycss2.ast.AtRule`,
        :class:`~tinycss2.ast.Comment` (if ``skip_comments`` is false),
        :class:`~tinycss2.ast.WhitespaceToken`
        (if ``skip_whitespace`` is false),
        and :class:`~tinycss2.ast.ParseError` objects

    r   r   ú
at-keywordr-   )r   r   r(   Ú_consume_at_ruler.   ©r
   r   Zskip_whitespacer   Úresultr   r   r   r   Úparse_declaration_list‘   s    "



r3   c                 C   s^   t | |ƒ}t|ƒ}|dkr(tddddƒS t||ƒ}t|ƒ}|dk	rZt|j|jdd|j ƒS |S )a¬  Parse a single :diagram:`qualified rule` or :diagram:`at-rule`.

    This would be used e.g. by `insertRule()
    <https://drafts.csswg.org/cssom/#dom-cssstylesheet-insertrule>`_
    in an implementation of CSSOM.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments:
        If the input is a string, ignore all CSS comments.
    :returns:
        A :class:`~tinycss2.ast.QualifiedRule`,
        :class:`~tinycss2.ast.AtRule`,
        or :class:`~tinycss2.ast.ParseError` objects.

    Any whitespace or comment before or after the rule is dropped.

    Nr   r   r   r   z4Expected a single rule, got %s after the first rule.)r   r   r   Ú_consume_ruler   r   r   )r
   r   r   r   ZruleÚnextr   r   r   Úparse_one_ruleÃ   s    

  þr6   c                 C   s`   t | |ƒ}g }|D ]H}|jdkr0|sZ| |¡ q|jdkrJ|sZ| |¡ q| t||ƒ¡ q|S )a§  Parse a non-top-level :diagram:`rule list`.

    This is used for parsing the :attr:`~tinycss2.ast.AtRule.content`
    of nested rules like ``@media``.
    This differs from :func:`parse_stylesheet` in that
    top-level ``<!--`` and ``-->`` tokens are not ignored.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments:
        Ignore CSS comments at the top-level of the list.
        If the input is a string, ignore all comments.
    :type skip_whitespace: :obj:`bool`
    :param skip_whitespace:
        Ignore whitespace at the top-level of the list.
        Whitespace is still preserved
        in the :attr:`~tinycss2.ast.QualifiedRule.prelude`
        and the :attr:`~tinycss2.ast.QualifiedRule.content` of rules.
    :returns:
        A list of
        :class:`~tinycss2.ast.QualifiedRule`,
        :class:`~tinycss2.ast.AtRule`,
        :class:`~tinycss2.ast.Comment` (if ``skip_comments`` is false),
        :class:`~tinycss2.ast.WhitespaceToken`
        (if ``skip_whitespace`` is false),
        and :class:`~tinycss2.ast.ParseError` objects.

    r   r   ©r   r   r(   r4   r1   r   r   r   Úparse_rule_listå   s    


r8   c                 C   sh   t | |ƒ}g }|D ]P}|jdkr0|sb| |¡ q|jdkrJ|sb| |¡ q|dkr| t||ƒ¡ q|S )a²  Parse :diagram:`stylesheet` from text.

    This is used e.g. for a ``<style>`` HTML element.

    This differs from :func:`parse_rule_list` in that
    top-level ``<!--`` and ``-->`` tokens are ignored.
    This is a legacy quirk for the ``<style>`` HTML element.

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :type skip_comments: :obj:`bool`
    :param skip_comments:
        Ignore CSS comments at the top-level of the stylesheet.
        If the input is a string, ignore all comments.
    :type skip_whitespace: :obj:`bool`
    :param skip_whitespace:
        Ignore whitespace at the top-level of the stylesheet.
        Whitespace is still preserved
        in the :attr:`~tinycss2.ast.QualifiedRule.prelude`
        and the :attr:`~tinycss2.ast.QualifiedRule.content` of rules.
    :returns:
        A list of
        :class:`~tinycss2.ast.QualifiedRule`,
        :class:`~tinycss2.ast.AtRule`,
        :class:`~tinycss2.ast.Comment` (if ``skip_comments`` is false),
        :class:`~tinycss2.ast.WhitespaceToken`
        (if ``skip_whitespace`` is false),
        and :class:`~tinycss2.ast.ParseError` objects.

    r   r   )z<!--z-->r7   r1   r   r   r   Úparse_stylesheet  s    


r9   c                 C   s‚   | j dkrt| |ƒS | j dkr(g }| }nF| g}|D ] }|j dkrH|} qn| |¡ q2t|d j|d jddƒS t| j| j||jƒS )aÈ  Parse a qualified rule or at-rule.

    Consume just enough of :obj:`tokens` for this rule.

    :type first_token: :term:`component value`
    :param first_token: The first component value of the rule.
    :type tokens: :term:`iterator`
    :param tokens: An iterator yielding :term:`component values`.
    :returns:
        A :class:`~tinycss2.ast.QualifiedRule`,
        :class:`~tinycss2.ast.AtRule`,
        or :class:`~tinycss2.ast.ParseError`.

    r/   ú{} blockéÿÿÿÿr"   z1EOF reached before {} block for a qualified rule.)r   r0   r(   r   r   r   r   Úcontent)r   r   ÚpreludeÚblockr   r   r   r   r4   >  s*    



  þ
 ÿr4   c                 C   sX   g }d}|D ]0}|j dkr&|j} q>n|dkr2 q>| |¡ qt| j| j| j| j||ƒS )a•  Parse an at-rule.

    Consume just enough of :obj:`tokens` for this rule.

    :type at_keyword: :class:`AtKeywordToken`
    :param at_keyword: The at-rule keyword token starting this rule.
    :type tokens: :term:`iterator`
    :param tokens: An iterator yielding :term:`component values`.
    :returns:
        A :class:`~tinycss2.ast.QualifiedRule`,
        or :class:`~tinycss2.ast.ParseError`.

    Nr:   r-   )r   r<   r(   r   r   r   r$   r'   )Z
at_keywordr   r=   r<   r   r   r   r   r0   a  s    

   ÿr0   N)F)F)F)FF)F)FF)FF)Úastr   r   r   r   Ú	tokenizerr   r   r   r   r    r   r.   r3   r6   r8   r9   r4   r0   r   r   r   r   Ú<module>   s   


1

2
"
,
-#