o
    	'f}                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZ G dd deZG dd	 d	eZG d
d deZG dd deZdS )z5Custom element classes related to the numbering part.    )OxmlElement)CT_DecimalNumber)ST_DecimalNumber)BaseOxmlElementOneAndOnlyOneRequiredAttribute
ZeroOrMore	ZeroOrOnec                   @   s>   e Zd ZdZedZedZede	Z
dd Zedd Zd	S )
CT_Numz``<w:num>`` element, which represents a concrete list definition instance, having
    a required child <w:abstractNumId> that references an abstract numbering definition
    that defines most of the formatting details.w:abstractNumIdzw:lvlOverridew:numIdc                 C      | j |dS )zmReturn a newly added CT_NumLvl (<w:lvlOverride>) element having its ``ilvl``
        attribute set to `ilvl`.)ilvl)_add_lvlOverride)selfr    r   K/home/ubuntu/flask/venv/lib/python3.10/site-packages/docx/oxml/numbering.pyadd_lvlOverride      zCT_Num.add_lvlOverridec                 C   s(   t d}||_td|}|| |S )zReturn a new ``<w:num>`` element having numId of `num_id` and having a
        ``<w:abstractNumId>`` child with val attribute set to `abstractNum_id`.w:numr   )r   numIdr   newappend)clsnum_idabstractNum_idnumabstractNumIdr   r   r   r      s
   
z
CT_Num.newN)__name__
__module____qualname____doc__r   r   r   lvlOverrider   r   r   r   classmethodr   r   r   r   r   r
      s    
r
   c                   @   s.   e Zd ZdZedddZedeZdd Z	dS )		CT_NumLvlzu``<w:lvlOverride>`` element, which identifies a level in a list definition to
    override with settings it contains.zw:startOverride)zw:lvl
successorsw:ilvlc                 C   r   )z|Return a newly added CT_DecimalNumber element having tagname
        ``w:startOverride`` and ``val`` attribute set to `val`.)val)_add_startOverride)r   r(   r   r   r   add_startOverride/   r   zCT_NumLvl.add_startOverrideN)
r   r   r    r!   r	   startOverrider   r   r   r*   r   r   r   r   r$   (   s
    
r$   c                   @   s(   e Zd ZdZedddZedddZdS )CT_NumPrzYA ``<w:numPr>`` element, a container for numbering properties applied to a
    paragraph.r'   )r   w:numberingChangew:insr%   r   )r-   r.   N)r   r   r    r!   r	   r   r   r   r   r   r   r,   5   s    r,   c                   @   s8   e Zd ZdZedddZdd Zdd Zed	d
 Z	dS )CT_NumberingzX``<w:numbering>`` element, the root element of a numbering part, i.e.
    numbering.xml.r   )zw:numIdMacAtCleanupr%   c                 C   s   | j }t||}| |S )zReturn a newly added CT_Num (<w:num>) element referencing the abstract
        numbering definition identified by `abstractNum_id`.)_next_numIdr
   r   _insert_num)r   r   next_num_idr   r   r   r   add_numT   s   
zCT_Numbering.add_numc                 C   s4   d| }z|  |d W S  ty   td| w )zYReturn the ``<w:num>`` child element having ``numId`` attribute matching
        `numId`.z./w:num[@w:numId="%d"]r   z no <w:num> element with numId %d)xpath
IndexErrorKeyError)r   r   r4   r   r   r   num_having_numId[   s   zCT_Numbering.num_having_numIdc                 C   sB   |  d}dd |D }tdt|d D ]	}||vr |S q|S )zThe first ``numId`` unused by a ``<w:num>`` element, starting at 1 and
        filling any gaps in numbering between existing ``<w:num>`` elements.z./w:num/@w:numIdc                 S   s   g | ]}t |qS r   )int).0	numId_strr   r   r   
<listcomp>i   s    z,CT_Numbering._next_numId.<locals>.<listcomp>      )r4   rangelen)r   
numId_strsnum_idsr   r   r   r   r0   d   s   
zCT_Numbering._next_numIdN)
r   r   r    r!   r   r   r3   r7   propertyr0   r   r   r   r   r/   N   s    	r/   N)r!   docx.oxml.parserr   docx.oxml.sharedr   docx.oxml.simpletypesr   docx.oxml.xmlchemyr   r   r   r   r	   r
   r$   r,   r/   r   r   r   r   <module>   s    	