o
    wi                     @   s   d Z dZdZddlZddlZddl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ZdedefddZedejZddededefddZdejfddZdefddZedkrkee  dS dS )z"Convert to and from Roman numeralsz&Mark Pilgrim (f8dy@diveintopython.org)zCopyright (c) 2001 Mark Pilgrim

This program is part of "Dive Into Python", a free Python tutorial for
experienced programmers.  Visit http://diveintopython.org/ for the
latest version.
    Nc                   @      e Zd ZdS )
RomanErrorN__name__
__module____qualname__ r   r   Q/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/roman/__init__.pyr          r   c                   @   r   )OutOfRangeErrorNr   r   r   r   r	   r   "   r
   r   c                   @   r   )NotIntegerErrorNr   r   r   r   r	   r   &   r
   r   c                   @   r   )InvalidRomanNumeralErrorNr   r   r   r   r	   r   *   r
   r   ))Mi  )CMi  )Di  )CDi  )Cd   )XCZ   )L2   )XL(   )X
   )IX	   )V   )IV   )I   nreturnc                 C   sx   t | ts	tdd|   k rdk std td| dkr!dS d}tD ]\}}| |kr9||7 }| |8 } | |ks-q%|S )z convert integer to Roman numeralzdecimals cannot be convertedi  z%number out of range (must be 0..4999)r   N )
isinstanceintr   r   romanNumeralMap)r$   resultnumeralintegerr   r   r	   toRoman>   s    
r/   a8  
    ^                   # beginning of string
    M{0,4}              # thousands - 0 to 4 M's
    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
                        #            or 500-800 (D, followed by 0 to 3 C's)
    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
                        #        or 50-80 (L, followed by 0 to 3 X's)
    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
                        #        or 5-8 (V, followed by 0 to 3 I's)
    $                   # end of string
    Tsspecial_casec                 C   s   | st d|  } | dkr|rdS t| st d|  d}d}tD ]&\}}| ||t|  |krI||7 }|t|7 }| ||t|  |ks3q#|S )a  
    Convert Roman numeral to integer.

    Parameters:
        s (str): The Roman numeral string to convert.
        special_case (bool, optional): If True (default),
            interprets 'N' as 0 for the special case of zero.

    Returns:
        int: The integer value of the Roman numeral.

    Raises:
        InvalidRomanNumeralError: If the input is not a valid Roman numeral.
    zInput cannot be blankr'   r   zInvalid Roman numeral: %s)r   upperromanNumeralPatternsearchr+   len)r0   r1   r,   indexr-   r.   r   r   r	   	fromRoman_   s    
r7   c                  C   sD   t jddd} | jddd | jddd	d
dd |  }|j|_|S )Nromanz)convert between roman and arabic numerals)progdescriptionnumberzthe value to convert)helpz-rz	--reverse
store_trueFz<convert roman to numeral (case insensitive) [default: False])actiondefaultr<   )argparseArgumentParseradd_argument
parse_argsr;   )parserargsr   r   r	   rC      s   rC   c                  C   s@   t  } | jrt| j}t| dS t| j}t|}t| dS )Nr   )rC   reverser7   r;   printr*   r/   )rE   rir$   r   r   r	   main   s   

rJ   __main__)T)__doc__
__author____copyright__r@   resys	Exceptionr   r   r   r   r+   r*   strr/   compileVERBOSEr3   boolr7   	NamespacerC   rJ   r   exitr   r   r   r	   <module>   s*   
%