
    ]jQ                        d Z ddlmZmZmZmZmZmZmZ ddl	m
c mZ ddlmZ ddlmZ ddlmc mZ ddlmc mZ ddZd Zd Zd	 Zdd
Zdej:                  deeeeeef   ef      ddfdZdedeee e!ef   de!fdZ"d Z#ddeeeeeef   ef      dej:                  fdZ$d Z%ddZ&	 ddeeef   deeeef      deeeeeef   ef      fdZ'y)
    )DictOptionalListTupleAnyCallableUnionN)minidom)LabelStudioTagc                 "    ||t        | d      fS )z
    Converts labels to a tuple structure.
    
    Args:
        labels: The labels to be converted.
        tag_type: Tag type to assign to each label.
        
    Returns:
        A tuple containing labels as per the tag type.
    Labeltag_type_convert_to_tuple)labelsr   kwargss      Q/root/env/lib/python3.12/site-packages/label_studio_sdk/label_interface/create.pyr   r      s     f/IJJ    c                     g }| D ][  }t        |t              r3t        |      ^}}|d   |d   t        |      f}|j                  |       F|j                  dd|ii f       ] d|t        |      fS )z
    Constructs a taxonomy.
    
    Args:
        labels: The labels to construct the taxonomy.
        
    Returns:
        A tuple containing the taxonomy.
    r      ChoicevalueTaxonomy)
isinstancetupler   append)r   r   resultargparentchildrenparent_childrens          r   taxonomyr$      s     F :c5! 1# 6FX%ay&)U8_EOMM/*MM8gs^R89: f..r   c                     d|t        |       fS )z
    Constructs a choices tuple.
    
    Args:
        labels: The labels to be converted.
        
    Returns:
        A tuple containing the choices.
    Choicesr   )r   r   s     r   choicesr'   2   s     v0899r   c                 |    t        j                  | d      }t        j                  |      }|j	                  d      S )z>
    Returns a pretty-printed XML string for the Element.
    zutf-8z  )indent)ETtostringr   parseStringtoprettyxml)elementrough_stringreparseds      r   	_prettifyr1   ?   s8     ;;w0L""<0Ht,,r   c                 2    | syt        fd| D              S )z
    Converts arguments to a tuple structure of choices.

    Args:
        args: The labels to be converted.
        tag_type: Tag type to assign to each label.

    Returns:
        A tuple containing all labels in specified format.
    Nc              3   ,   K   | ]  }d |ii f  yw)r   N ).0r    r   s     r   	<genexpr>z$_convert_to_tuple.<locals>.<genexpr>V   s     Bc8gs^R0Bs   )r   )argsr   s    `r   r   r   H   s     BTBBBr   r!   elementsreturnc                 2   |D ]  }t        |t              rt        j                  | |       *t        |t              r+|j                         D ]  \  }}| j                  ||        et        |t              st        |t              st        ||         y)z
    Adds nested elements to the parent element in the Element Tree.

    Args:
        parent: The parent ET.Element object.
        elements: A list containing element definitions.
    )r!   N)
r   strr*   
SubElementdictitemssetlistr   create_element)r!   r8   r.   kvs        r   _create_nested_elementsrD   Y   sy      3gs#MM&'*& !1

1a !&*We*D7623r   nametagc           	      (   t        |t              r[|j                  xs | |_        |j                  dv rdnd}|j                  |j	                         t        t        |dd      |      f}nOt        |t        t        f      rt        |      dk  rg |dn|}n!t        |t              r|i df}nt        d	      |d
   j                  d|        |d   j                         t        j                  v r|d
   j!                  d      sd| z   |d
   d<   |S )aS  
    Converts tags from str, list, tuple, or class instance to a tuple format.

    Args:
        name: Name of the tag.
        tag: Tag in str, list, tuple or class instance format.

    Returns:
        A tuple version of the input tag.
    
    Raises:
        TypeError: If input tag is not a str, list, tuple, or LabelStudioTag.
    )r&   r   r   r   r   Nr      r4   z9Input tag must be one of str, list, tuple, LabelStudioTagr   rE   r   r   $)r   r   rE   rF   collect_attrsr   getattrr@   r   lenr;   	TypeError
setdefaultlowerOT_TAG_TO_CLASSget)rE   rF   child_tag_typeels       r   _convertrU   k   s     #~&88#t%(WW0G%GWWWc'')+<WS(TX=Ydr+ss	C$	's8a<ZsZBZS	C	"b[STTqEVT"	!u{{}(((A71Ct1gIr   c                     | j                         D ]:  \  }}t        ||      }|d   }|j                         t        j                  v s8|c S  y)z
    Finds the first object tag in the input tags dictionary.

    Args:
        tags: A dictionary of tags.

    Returns:
        The first object tag found, or None.
    r   N)r>   rU   rO   rP   rQ   )tagsrE   rF   	tag_tupletag_names        r   _find_first_object_tagrZ      sM     ZZ\ 	cT3'	Q<>>r///r   r.   c                     | \  }}}|t        j                  ||      nt        j                  |      }|j                         D ]  \  }}|j	                  ||        |rt        ||       |S )z
    Creates an XML element.
    
    Args:
        element: List of tag, attributes and children to feed into the element.
        parent: Parent element to append the new element to (Optional).
        
    Returns:
        An ElementTree element.
    )r*   r<   Elementr>   r?   rD   )r.   r!   rF   attrsr"   rT   rB   rC   s           r   rA   rA      si     #C'-'9vs	#rzz#B 1
q! H-Ir   c                  v    t        j                  d      }| D ]  }t        |      }|j                  |         |S )z
    Creates an ElementTree from the input element definitions, and return a string for it.

    Args:
        elements: Variable length argument list of elements to add to the ElementTree.

    Returns:
        XML configuration
    View)r*   r\   rA   r   )r8   viewr.   rT   s       r   tree_from_tuplesra      s=     ::fD G$B Kr   c                 n    |rt        |       }|j                  dd      S t        j                  | d      S )z
    z<?xml version="1.0" ?>
 unicode)encoding)r1   replacer*   r+   )treeprettypps      r   tree_to_stringrj      s3     t_zz4b99{{4)44r   rW   mappingc                 v   g }t        |       }| j                         D ]  \  }}t        ||      }|d   j                         t        j
                  v rSd|d   vs|d   d   D|r4|d   j                  d      |v r|j                  |d   d         |d   d<   n|d   d   |d   d<   |j                  |        |S )z
    Convert tags into a structured format.

    Args:
        tags: A dictionary of tags.
        mapping: Optional mapping of tag name transformations.

    Returns:
        A list of the structured tags.
    r   toNamer   rE   )rZ   r>   rU   rO   CTrQ   rR   r   )rW   rk   r8   first_object_tagrE   rF   rT   s          r   convert_tags_descriptionrp      s     H-d3ZZ\ 	cdC  a5;;=B,,,("Q%2G2a5QY?Kb2a599V,7")++beFm"<1h"21"5f"=1h  Or   )Labels)r   )N)T)(__doc__typingr   r   r   r   r   r	   r
   xml.etree.ElementTreeetreeElementTreer*   xml.domr   %label_studio_sdk.label_interface.baser   ,label_studio_sdk.label_interface.object_tagslabel_interfaceobject_tagsrP   -label_studio_sdk.label_interface.control_tagscontrol_tagsrn   r   r$   r'   r1   r   r\   r;   rD   r@   r   rU   rZ   rA   ra   rj   rp   r4   r   r   <module>r~      sC   D D D " "  @ 9 9 : :K/,
:-C"3BJJ 3$uS$sTWx.Z^E^?_:` 3ei 3$3 U3e^#CD  D$DsDcND'@!AB TVT^T^ .$5 @D4S> &.tCH~&>HLUSVX\]`be]eXfhlSlMmHnr   