jf dZdZdZdZdZddlZGddeZGd d eZGd d eZ Gd deZ dZ dZ ej dejZdZdS)z"Convert to and from Roman numeralsz&Mark Pilgrim (f8dy@diveintopython.org)z1.4z 8 August 2001agCopyright (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 NceZdZdS) RomanErrorN__name__ __module__ __qualname__t/builddir/build/BUILD/imunify360-venv-2.3.5/opt/imunify360/venv/lib/python3.11/site-packages/docutils/utils/roman.pyrrr rceZdZdS)OutOfRangeErrorNrr r r rrr r rceZdZdS)NotIntegerErrorNrr r r rrr r rceZdZdS)InvalidRomanNumeralErrorNrr r r rrr r r) )Mi)CMi)Di)CDi)Cd)XCZ)L2)XL()X )IX )V)IV)Icd|cxkrdksntdt||krtdd}tD]\}}||kr||z }||z}||k|S)z convert integer to Roman numeralriz%number out of range (must be 1..4999)zdecimals can not be converted)rintrromanNumeralMap)nresultnumeralintegers r toRomanr1+s LLLLDLLLLEFFF 1vv{{=>>> F+7ll g F LA7ll 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 cH|stdt|std|zd}d}tD]X\}}|||t |z|kr5||z }|t |z }|||t |z|k5Y|S)z convert Roman numeral to integerzInput can not be blankzInvalid Roman numeral: %sr)rromanNumeralPatternsearchr,len)sr.indexr/r0s r fromRomanr8Hs A&'?@@@  % %a ( (H&'BQ'FGGG F E+""eCLL(()W44 g F S\\ !EeCLL(()W44 Mr )__doc__ __author__ __version____date__ __copyright__re Exceptionrrrrr,r1compileVERBOSEr3r8r r r rBs(( 5     "!!!!!!!'''''j''''''''j'''00000z000     !bj "   r