
     Ic
                         d Z dZdZdZdZddlZ G d de          Z G d	 d
e          Z G d de          Z	 G d de          Z
dZd Z ej        dej                  Zd Z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__     4lib/python3.11/site-packages/docutils/utils/roman.pyr   r                r
   r   c                       e Zd ZdS )OutOfRangeErrorNr   r	   r
   r   r   r      r   r
   r   c                       e Zd ZdS )NotIntegerErrorNr   r	   r
   r   r   r      r   r
   r   c                       e Zd ZdS )InvalidRomanNumeralErrorNr   r	   r
   r   r   r      r   r
   r   ))Mi  )CMi  )Di  )CDi  )Cd   )XCZ   )L2   )XL(   )X
   )IX	   )V   )IV   )I   c                     d| cxk     rdk     sn t          d          t          |           | k    rt          d          d}t          D ]\  }}| |k    r||z  }| |z  } | |k    |S )z convert integer to Roman numeralr   i  z%number out of range (must be 1..4999)zdecimals can not be converted )r   intr   romanNumeralMap)nresultnumeralintegers       r   toRomanr1   (   s     G G G GD G G G GEFFF
1vv{ ?=>>>F+  7l 	gFLA 7l 	 Mr
   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                 H   | st          d          t                              |           st          d| z            d}d}t          D ]X\  }}| ||t	          |          z            |k    r5||z  }|t	          |          z  }| ||t	          |          z            |k    5Y|S )z convert Roman numeral to integerzInput can not be blankzInvalid Roman numeral: %sr   )r   romanNumeralPatternsearchr,   len)sr.   indexr/   r0   s        r   	fromRomanr8   C   s     A&'?@@@%%a(( H&'BQ'FGGGFE+ " "eCLL(()W4 	"gFS\\!E eCLL(()W4 	" Mr
   )__doc__
__author____version____date____copyright__re	Exceptionr   r   r   r   r,   r1   compileVERBOSEr3   r8   r	   r
   r   <module>rB      s    ( (5
	 
			 " ! ! ! ! ! ! ! ' ' ' ' 'j ' ' ' ' ' ' ' 'j ' ' ' 0 0 0 0 0z 0 0 0   !bj 
" 

 
     r
   