U
    [Sh                     @   sN   d Z dZddlmZmZmZ G dd deZG dd dZG dd	 d	eZd
S )a  
This package contains modules for standard tree transforms available
to Docutils components. Tree transforms serve a variety of purposes:

- To tie up certain syntax-specific "loose ends" that remain after the
  initial parsing of the input plaintext. These transforms are used to
  supplement a limited syntax.

- To automate the internal linking of the document tree (hyperlink
  references, footnote references, etc.).

- To extract useful information from the document tree. These
  transforms may be used to construct (for example) indexes and tables
  of contents.

Each transform is an optional step that a Docutils component may
choose to perform on the parsed document.
reStructuredText    )	languagesApplicationErrorTransformSpecc                   @   s   e Zd ZdS )TransformErrorN)__name__
__module____qualname__ r
   r
   O/root/rtd-docs/venv/lib/python3.8/site-packages/docutils/transforms/__init__.pyr      s   r   c                   @   s&   e Zd ZdZdZdddZdd ZdS )	Transformz1Docutils transform component abstract base class.Nc                 C   s$   || _ || _t|jj|j| _dS )zA
        Initial setup for in-place document transforms.
        N)document	startnoder   Zget_languagesettingsZlanguage_codereporterlanguage)selfr   r   r
   r
   r   __init__(   s     zTransform.__init__c                 K   s   t ddS )z5Override to apply the transform to the document tree.z"subclass must override this methodN)NotImplementedError)r   kwargsr
   r
   r   apply9   s    zTransform.apply)N)r   r   r	   __doc__default_priorityr   r   r
   r
   r
   r   r   "   s   
r   c                   @   sL   e Zd ZdZdd ZdddZdd Zdd	d
Zdd Zdd Z	dd Z
dS )Transformera  
    Store "transforms" and apply them to the document tree.

    Collect lists of `Transform` instances and "unknown_reference_resolvers"
    from Docutils components (`TransformSpec` instances).
    Apply collected "transforms" to the document tree.

    Also keeps track of components by component type name.

    https://docutils.sourceforge.io/docs/peps/pep-0258.html#transformer
    c                 C   s.   g | _ g | _|| _g | _d| _i | _d| _d S )NFr   )
transformsunknown_reference_resolversr   appliedsorted
componentsserialno)r   r   r
   r
   r   r   K   s    zTransformer.__init__Nc                 K   s6   |dkr|j }| |}| j||d|f d| _dS )a+  
        Store a single transform.  Use `priority` to override the default.
        `kwargs` is a dictionary whose contents are passed as keyword
        arguments to the `apply` method of the transform.  This can be used to
        pass application-specific data to the transform instance.
        NF)r   get_priority_stringr   appendr   )r   transform_classpriorityr   priority_stringr
   r
   r   add_transformg   s    

zTransformer.add_transformc                 C   s4   |D ]$}|  |j}| j||di f qd| _dS )z3Store multiple transforms, with default priorities.NF)r    r   r   r!   r   )r   Ztransform_listr"   r$   r
   r
   r   add_transformsu   s    
zTransformer.add_transformsc                 C   s<   |j }|dkr|j}| |}| j|||i f d| _dS )z4Store a transform with an associated `pending` node.NF)	transformr   r    r   r!   r   )r   pendingr#   r"   r$   r
   r
   r   add_pending~   s    

zTransformer.add_pendingc                 C   s   |  j d7  _ d|| j f S )z
        Return a string, `priority` combined with `self.serialno`.

        This ensures FIFO order on transforms with identical priority.
           z	%03d-%03d)r   )r   r#   r
   r
   r   r       s    zTransformer.get_priority_stringc                 C   sl   g }|D ]6}t |tsq| |  || j|j< ||j qd| _dd }|j	|d |  j|7  _dS )an  
        Store each component's default transforms and reference resolvers

        Transforms are stored with default priorities for later sorting.
        "Unknown reference resolvers" are sorted and stored.
        Components that don't inherit from `TransformSpec` are ignored.

        Also, store components by type name in a mapping for later lookup.
        Fc                 S   s   | j S )N)r#   )fr
   r
   r   keyfun   s    z4Transformer.populate_from_components.<locals>.keyfun)keyN)

isinstancer   r&   Zget_transformsr   Zcomponent_typeextendr   r   sort)r   r   	resolvers	componentr,   r
   r
   r   populate_from_components   s    

z$Transformer.populate_from_componentsc                 C   sx   | j j| j j | jrt| js2| jjdd d| _| j \}}}}|| j |d}|jf | | j	
||||f qdS )z6Apply all of the stored transforms, in priority order.T)reverse)r   N)r   r   Zattach_observerZnote_transform_messager   r   r0   popr   r   r!   )r   r#   r"   r(   r   r'   r
   r
   r   apply_transforms   s    zTransformer.apply_transforms)N)N)r   r   r	   r   r   r%   r&   r)   r    r3   r6   r
   r
   r
   r   r   >   s   
	

	r   N)	r   __docformat__Zdocutilsr   r   r   r   r   r   r
   r
   r
   r   <module>   s
   