o
    Ni                     @   s   d Z dZ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d ZedejZdd Zdd Zdd Zedkr[ee  dS dS )z"Convert to and from Roman numeralsz&Mark Pilgrim (f8dy@diveintopython.org)z1.4z8 August 2001ag  Copyright (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.

This program is free software; you can redistribute it and/or modify
it under the terms of the Python 2.1.1 license, available at
http://www.python.org/2.1.1/license.html
    Nc                   @      e Zd ZdS )
RomanErrorN__name__
__module____qualname__ r   r   H/home/ubuntu/.local/lib/python3.10/site-packages/docutils/utils/roman.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   0   r
   r   ))Mi  )CMi  )Di  )CDi  )Cd   )XCZ   )L2   )XL(   )X
   )IX	   )V   )IV   )I   c                 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 can not be convertedi  z%number out of range (must be 0..4999)r   N )
isinstanceintr   r   romanNumeralMap)nresultnumeralintegerr   r   r	   toRomanD   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
    c                 C   s   | st d| dkrdS t| st d|  d}d}tD ]&\}}| ||t|  |krC||7 }|t|7 }| ||t|  |ks-q|S )z convert Roman numeral to integerzInput can not be blankr%   r   zInvalid Roman numeral: %s)r   romanNumeralPatternsearchr)   len)sr+   indexr,   r-   r   r   r	   	fromRomane   s   
r4   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defaultr9   )argparseArgumentParseradd_argument
parse_argsr8   )parserargsr   r   r	   r@   z   s   r@   c                  C   sH   t  } | jr| j }t|}t| dS t| j}t|}t| dS )Nr   )r@   reverser8   upperr4   printr(   r.   )rB   urir*   r   r   r	   main   s   

rI   __main__)__doc__
__author____version____date____copyright__r=   resys	Exceptionr   r   r   r   r)   r.   compileVERBOSEr/   r4   r@   rI   r   exitr   r   r   r	   <module>   s.   
