)Ej) dZddlZddlmZddlmZddlmZmZm Z m Z m Z m Z m Z mZmZer ddlmZddlmZeeee d edfZeee d efZed d ee edfZe d d ZeeeejfZeeejfZe d eeZ Gdde Z!de"dedede"fdZ#ededefdZ$ededefdZ$de de fdZ$deeefdefdZ%dee ezdeeefdeeefdeee&edfffdZ'd edefd!Z(d"Z)d#edefd$Z*d#edefd%Z+defd&Z,d/d(ed)edefd*Z-d+ee eeze&eefzzde.efd,Z/Gd-d.Z0dS)0a Various utilities that could not be gathered logically in a specific module. The contents of this module are internal to fpdf2, and not part of the public API. They may change at any time without prior warning or any deprecation period, in non-backward-compatible ways. N) resources)Path) TYPE_CHECKINGAnyBinaryIOIterable NamedTupleSequenceTypeVarUnionoverload)Image) SVGObjectPILImager SVGObjectType)bound _StrBytesceZdZUdZeed<dZeed<dZeed<dZeed<e de e e e dfddfdZ d S) Paddingrtoprightbottomleftpaddingreturnc t|trFtt|t|t|t|St |dkr^tt|dt|dt|dt|dSt |dkr^tt|dt|dt|dt|dSt |dkr^tt|dt|dt|dt|dSt dt |)zbReturn a 4-tuple of padding values from a single value or a 2, 3 or 4-tuple according to CSS rulesrrzBpadding shall be a number or a sequence of 2, 3 or 4 numbers, got ) isinstance NumberClassrfloatlen ValueErrorstr)clsrs ;C:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/util.pynewz Padding.new.s g{ + + gggg  w<<1  gaj!!gaj!!gaj!!gaj!!   w<<1  gaj!!gaj!!gaj!!gaj!!   w<<1  gaj!!gaj!!gaj!!gaj!!   _QTU\Q]Q] _ _   N)__name__ __module__ __qualname__rr#__annotations__rrr classmethodr Numberr r)r*r(rr(sCNNNE5FED%OOO %(8) CD    [   r*rbuffer placeholdervaluerc$t|}t|t|ksJd|d||||d}t||ksJ|S)Nz placeholder=z value=r)r$replaceencode)r2r3r4 buffer_sizes r( buffer_substr9Psf++K {  s5zz ) ) )+U++U+Ue+U+U ) ) ) ^^K..00%,,..! D DF v;;+ % % % % Mr*scdSNr1r:s r( escape_parensr>Xs"%#r*cdSr<r1r=s r(r>r>\s&)cr*ctt|trR|ddddddddS|d d d d d dddS)z*Add a backslash character before , ( and )\z\\)z\)(z\( z\r\s\\)s\)(s\( s\r)r!r&r6r=s r(r>r>`s!S IIdF # # WS% WS% WT5 ! !   %!! v   v      r*unitct|trt|S|dkrdS|dkrdS|dkrdS|dkrdStd |) z Get how many pts are in a unit. (k) Args: unit (str, float, int): Any of "pt", "mm", "cm", "in", or a number. Returns: float: The number of points in that unit (assuming 72dpi) Raises: ValueError ptrmmgjZ@cmgbX<@ingR@zIncorrect unit: )r!r"r#r%)rIs r(get_scale_factorrOqsq$ $$T{{ t||q t||y t||y t||t ... / //r* to_convertold_unitnew_unit.ct|t|z t|trtfd|DSt |z S)a: Convert a number or sequence of numbers from one unit to another. If either unit is a number it will be treated as the number of points per unit. So 72 would mean 1 inch. Args: to_convert (float, int, Iterable): The number / list of numbers, or points, to convert old_unit (str, float, int): A unit accepted by `fpdf.fpdf.FPDF` or a number new_unit (str, float, int): A unit accepted by `fpdf.fpdf.FPDF` or a number Returns: (float, tuple): to_convert converted from old_unit to new_unit or a tuple of the same c3:K|]}t|dVdS)rN) convert_unit).0iunit_conversion_factors r( zconvert_unit..s0TTA\!Q(>??TTTTTTr*)rOr!rtupler#)rPrQrRrXs @r(rUrUsk".h77:J8:T:TT*h''UTTTTTTTTTT   5 55r*numbercV|dddS)z Convert a decimal number to a minimal string representation (no trailing 0 or .). Args: number (Number): the number to be converted to a string. Returns: The number's string representation. z.4f0.)rstrip)r[s r( number_to_strr`s*?? ! !# & & - -c 2 22r*) )Mi)CMi)Di)CDi)Cd)XCZ)L2)XL()X )IX )V)IVr )IrncXd}||StD]\}}||kr||z }||z}||k|S)z#Convert an integer to Roman numeral)ROMAN_NUMERAL_MAP)ruresultnumeralintegers r( int2romanr|sT Fy -7ll g F LA7ll Mr*c|dkr5tt|dz dz t|dzzSt|tdzS)zXConvert an integer to a letter value (A to Z for the first 26, then AA to ZZ, and so on)rA)int_to_lettersintchrord)rus r(rrsR2vvc1r6Q,//00>!b&3I3III q3s88|  r*cXd}tj|dz S)Nzfpdf.data.color_profilesz sRGB2014.icc)rfiles read_bytes)pkgs r(builtin_srgb2014_bytesrs( $C OC > 1 = = ? ??r*xdigitsc4t|dkrd}|d|d}d|vr(|dd}|dkrd}|drd|z}|dr|ddd }|S) Ng-q=gr^fr]z-0z-.z-0.r)absr_ startswithr6)rrr:s r( format_numberrs 1vv~~  vA axx HHSMM  % %Dyy ||C !G||D& IIdE1 % % Hr* unicode_rangec |"t|dkrtdt}t|trd|dD}|D]}t|t rt|dkrtd||\}}t|tr8t|dd d d d }t|tr8t|dd d d d }||krtd |d |d| t||dz!t|tri| d d}d|vr| ds|d}t|dkrtd|t|ddd d }t|ddd d }||kr0td t|d t|d| t||dzet|dd d }||t|tr0|dkrtd|d||tdt|j|S)a Parse unicode_range parameter into a set of codepoints. Supports CSS-style formats: - String with comma-separated ranges: "U+1F600-1F64F, U+2600-26FF, U+2615" - List of strings: ["U+1F600-1F64F", "U+2600", "U+26FF"] - List of tuples: [(0x1F600, 0x1F64F), (0x2600, 0x26FF)] - List of integers: [0x1F600, 0x2600, 128512] - Mixed formats: [(0x1F600, 0x1F64F), "U+2600", 128512] Returns a set of integer codepoints. Nrzunicode_range cannot be emptyc6g|]}|Sr1)strip)rVitems r( z,get_parsed_unicode_range..s KKK$KKKr*,rz$Tuple must have exactly 2 elements: zU+rwzu+zInvalid range: start (z ) > end (rBr-zInvalid range format: zInvalid codepoint: z (must be non-negative)z%Unsupported unicode_range item type: )r$r%setr!r&splitrZrr6updaterangerrhexaddtyper+)r codepointsrstartend item_strippedparts codepoints r(get_parsed_unicode_rangersf  S%7%71%<%<899955J-%%LKK-2E2Ec2J2JKKK -- dE " ", 4yyA~~ !N!N!NOOOJE3%%% KEMM$33;;D"EErJJ#s## G#++dB//77bAA2FFs{{ !P%!P!P#!P!P!PQQQ   eE3733 4 4 4 4 c " "  JJLL00t<abrc8t||z |jkS)zBCheck if two floats are almost equal within the defined tolerance.r TOLERANCEr'rrs r(equalzFloatTolerance.equal8s1q5zzS]**r*c0||| S)zFCheck if two floats are not almost equal within the defined tolerance.)rrs r( not_equalzFloatTolerance.not_equal=s99Q??""r*c2t||jkS)z=Check if a float is almost zero within the defined tolerance.r)r'rs r(is_zerozFloatTolerance.is_zeroBs1vv&&r*c||z |jkS)zrOrZrUr`rxr|rrrrrrr1r*r(rs                       ++++++ #uh D$> ? 5(J 5 +z5(D$F G {;;; sE7?* +E7?+ GKe , , % % % % % j% % % PSY %S%S%%% % )U)u))) )Y9"05f-0%000026#&6CK 6CK 6 5%S/ !" 6666. 3& 3S 3 3 3 3"      cc@@@@@   U  C       G#)eCHo"=>>GXGGGGT&9&9&9&9&9&9&9&9&9&9r*