o
    >e5                     @   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   P/var/www/html/humari/django-venv/lib/python3.10/site-packages/tinycss2/parser.py_to_token_iterator   s   

r   c                 C   s    | D ]}|j dvr|  S qdS )zReturn 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   sN   t | |}t|}t|}|du rtddddS |dur%t|j|jddS |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u 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u r$t|j|jddS |dkr4t|j|jdd|j  S g }d}t|D ].\}}|dkrM|d	krMd
}|}n|d
kr^|j dkr^|jdkr^d}n|j dvred}|| q<|dkrt||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!bang	importantr   )
r   r   r   r   r   	enumeratelower_valueappendr   r$   )	r   r   namecolonr$   stateir   bang_positionr   r   r   r   V   sF   



r   c                 C   s2   g }|D ]}|dkr n| | qt| t|S )z=Like :func:`_parse_declaration`, but stop at the first ``;``.;)r*   r   r	   )r   r   other_declaration_tokensr   r   r   r   _consume_declaration_in_list   s   r2   c                 C   s   t | |}g }|D ]6}|jdkr|s|| q	|jdkr%|s$|| q	|jdkr3|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-keywordr0   )r   r   r*   _consume_at_ruler2   r
   r   skip_whitespacer   resultr   r   r   r   parse_declaration_list   s"   
"




r8   c                 C   s^   t | |}t|}|du rtddddS t||}t|}|dur-t|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   rulenextr   r   r   parse_one_rule   s   


r<   c                 C   s`   t | |}g }|D ]$}|jdkr|s|| q	|jdkr%|s$|| 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*   r9   r5   r   r   r   parse_rule_list   s   




r>   c                 C   sh   t | |}g }|D ](}|jdkr|s|| q	|jdkr%|s$|| q	|dvr1|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-->r=   r5   r   r   r   parse_stylesheet  s   




r?   c                 C   s   | j dkr
t| |S | j dkrg }| }n#| g}|D ]}|j dkr$|} n|| qt|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`.

    r3   {} blockr"   z1EOF reached before {} block for a qualified rule.)r   r4   r*   r   r   r   r   content)r   r   preludeblockr   r   r   r   r9   >  s$   




r9   c                 C   sV   g }d}|D ]}|j dkr|j} n|dkr n|| 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@   r0   )r   rB   r*   r   r   r   r$   r)   )
at_keywordr   rC   rB   r   r   r   r   r4   a  s   

r4   N)F)FF)astr   r   r   r   	tokenizerr   r   r   r   r    r   r2   r8   r<   r>   r?   r9   r4   r   r   r   r   <module>   s    


1


2
"
,-#