L i~ vUdZddlmZddlZddlmZmZddlmZddl m cm Z ddl mZmZmZmZddlmZddlmZeeeeeeeed ffeffZdFd ZdGd ZdHd ZdFd ZdFdZ dIdZ!dFdZ"dFdZ#dFdZ$dFdZ%dFdZ&dFdZ'dJdZ(dJdZ)dJdZ*dJdZ+dJdZ,dJdZ-dFdZ.dFdZ/dFdZ0dFd Z1dFd!Z2dFd"Z3dFd#Z4dFd$Z5dFd%Z6dFd&Z7dFd'Z8dFd(Z9dFd)Z:dFd*Z;dFd+Ze?fd-fe>e?fd-fe>e?fd-fed-fed-fed-f.Z@deAd/<dFd0ZBdKdLd1ZCee>e?fd-fe>e?fd-fed-fed-fed-f2ZDdeAd3<dFd4ZEdFd5ZFdFd6ZGd7ZHd8eAd9<eed:fe>e?fd-fe>e?fd-fe>e?fd-fe>e?fd-fe>e?fd-fe>e?fd-fed-f;ZIdeAd<<d=ZJ dM dNd>ZK dOd?ZLdPd@ZMdQdAZNdBZOdPdCZPdPdDZQeRdEk(rddlSZSeSjyy)Rz"Various low level data validators.) annotationsN)MappingSequence)open)AnyTypeOptionalUnion)IntFloat) numberTypes.cPt|trydD]}t||ryy)zY Some objects will likely come in that aren't dicts but are dict-ish enough. T)keysvaluesitemsF) isinstancerhasattr)valueattrs a/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/ufoLib/validators.py isDictEnoughrs2 %!+ud# ct||S)( Generic. (Added at version 2.) )r)rtyps rgenericTypeValidatorr#s eS !!rct|ttfsyt|}t|}||z ry|D]}t|tryy)rFT)rlisttuplesetint)r validValues valuesSetvalidValuesSetrs rgenericIntListValidatorr$*sT ftUm ,F I%N>!%% rc2t|tsy|dkryy( Generic. (Added at version 3.) FrTrr rs rgenericNonNegativeIntValidatorr*: eS ! qy rc2t|tsy|dkryyr&)rr r)s r!genericNonNegativeNumberValidatorr-Es e[ ) qy r GenericDictc t|tsy|jD]\}\}}|s ||vsy|jD]}||vsy|jD] \}}||\}}||st||r yy)r'FT)rrrr)r prototypekeyrrequiredv prototypeTypes rgenericDictValidatorr5Ps eW % ) 1_c8  e   zz| i ++-Q"+C. x 9X !]+  rcgd}||vS) Version 2+. )regularitalicboldz bold italic)roptionss r"fontInfoStyleMapStyleNameValidatorr=rs;G G rc>t|tsyt|dk(rygd}ttdftdf}g}|D]J}t ||sy|d}|d}t |}|syt||}|sy|j|L|t|k7ryy) Version 3+. FrT)r) rangeMaxPPEMrangeGaspBehaviorrCrD) rrlendictr r5r*r$appendsorted) rvalidBehaviors dictPrototype ppemOrder rangeRecordppembehavior ppemValiditybehaviorValiditys r)fontInfoOpenTypeGaspRangeRecordsValidatorrQzs eT " 5zQ!N!%4[T4L"MI  #K?>*235d; 28^L F9%% rcVt|tsyt|dk(sy|jddk7ry|j d\}}|jddk7ry|jddk7ry|j d\}}}t|dk7ryt|dk7ryt|dk7ry t |}t |}t |}|dks|d kDrytj||d} |dks|| kDry|j d\} } } t| dk7ryt| dk7ryt| dk7ry t | } t | }t | }| d ks| d kDry|d ks|d kDry|d ks|d kDryy #t $rYywxYw#t $rYywxYw)r7F r@/rA: r;T) rstrrEcountsplitr ValueErrorcalendar monthrange)rstrDatestrTimestrYearstrMonthstrDayintYearintMonthintDay monthMaxDaystrHour strMinute strSecondintHour intMinute intSeconds r$fontInfoOpenTypeHeadCreatedValidatorrps eS ! u:  {{31{{3'GW}}SQ}}SQ ' c 2GXv 7|q 8} 6{ag,x=V!|x"}%%gx8;K zVk)$+MM#$6!GY  7|q 9~ 9~g, N  N {gl1} B1} B 9 & s$7!F !F FF F('F(ct|tsyttdftdftdftdftdf}|D]}t ||ryy)r?FT)nameID platformID encodingID languageIDstring)rrrFr r[r5)rrJ nameRecords r$fontInfoOpenTypeNameRecordsValidatorrxsa eT "!%T{;;;T{ "M #J > rc2t|tsy|dkryy)r7FrTr(r)s r'fontInfoOpenTypeOS2WeightClassValidatorrzr+rc>t|tsy|dkry|dkDryy)r7Fr@ Tr(r)s r&fontInfoOpenTypeOS2WidthClassValidatorr}s( eS ! qy qy rct|ttfsyt|dk7ry|D]}t|tryy)z Version 2. F TrrrrEr rrs r*fontInfoVersion2OpenTypeOS2PanoseValidatorrsE ftUm , 6{b%% rct|ttfsyt|dk7ry|D]}t|tsy|dksyy)r?FrrTrrs r*fontInfoVersion3OpenTypeOS2PanoseValidatorrsO ftUm , 6{b%% 19  rct|ttfsyt|dk7ry|D]}t|try|\}}|dks|dkDry|dks|dkDryy)r7FrArTr)rrclassID subclassIDs r'fontInfoOpenTypeOS2FamilyClassValidatorrso ftUm , 6{a%%!GZ{glA~b rct|ttfsyt|dkDryt|dzry|D]}t|tryy)r7FrrATrrrrEr rs r fontInfoPostscriptBluesValidatorr2S ftUm , 6{R 6{Q%- rct|ttfsyt|dkDryt|dzry|D]}t|tryy)r7FrrATrrs r%fontInfoPostscriptOtherBluesValidatorrBrrct|ttfsyt|dkDry|D]}t|tryy)r7FrXTrrs r fontInfoPostscriptStemsValidatorrRsE ftUm , 6{R%- rc8ttdd}||vryy)r7r@FT)rrange)rr!s r.fontInfoPostscriptWindowsCharacterSetValidatorr`s"uQ|$K K rcBttdf}t||syy)r?T)idF)rFr[r5rrJs r%fontInfoWOFFMetadataUniqueIDValidatorrjs""&#t!5M } 5 rctdftdftdftdfd}t||syd|vr|jddvryy)r?TF)nameurldirclassrltrrtlr[r5getrs r#fontInfoWOFFMetadataVendorValidatorrtsS d U|U|u "M } 5 ~%))E*.@ rcttdf}t||syt|dsytdftdftdftdftdfd}|dD]*}t||syd|vs|j ddvs*yy)r?T)creditsFr)rrrolerrrr)rFrr5rEr[r)rrJcredits r$fontInfoWOFFMetadataCreditsValidatorrs"&tTl!;M } 5 uY d U|e U|u M "#FM: F?vzz%0F  rc~ttdftdf}t||sy|dD]}t |ryy)r?FT)rtextrrFr[rr5fontInfoWOFFMetadataTextValuerrJrs r(fontInfoWOFFMetadataDescriptionValidatorrsH"&3,dD\!JM } 5f ,T2 rcttdftdftdf}t||syd|vr|dD]}t |ryy)r?F)rrrrTrrs r$fontInfoWOFFMetadataLicenseValidatorrsZ"& %Le}#u"M } 5 &M D06  rcpttdf}t||sy|dD]}t|ryyr?T)rFrrFrr5rrs r&fontInfoWOFFMetadataTrademarkValidatorrB"&D$ ? #A #A IIg EyQYyAI  }5=  19 3;<(J&9*&E IIg E !6 rct|tsy| t}|D]:}t|sy|j d}|$||vry|j |<yr)rrranchorValidatorrr)rranchorrs ranchorsValidatorrsh eT "e (v&ZZ -  ![( OOJ '( r)rrrrr_anchorDictPrototypect|tsy|jd}|jd}||y|jd}| t|sy|jd}| t |syy)r?FrrrrT)r5rrrr)rrrrrs rrrsx '; < #A #AyAI<(J&9*&E IIg E !6 rcd}d}t|tsy|syt|dkDry|D]}t|}||ks||kDsyy)z Version 3+. >>> identifierValidator("a") True >>> identifierValidator("") False >>> identifierValidator("a" * 101) False ~FdT)rr[rEord)rvalidCharactersMinvalidCharactersMaxcis rrrsc eS !  5zC  F ! !Q);%; rc8t|tsy|jd}t|dk7ry|D]F}|j }d} t |}d}|s t|}d}|sydcxkrdkrCyyy#t $rY2wxYw#t $rY1wxYw)a Version 3+. >>> colorValidator("0,0,0,0") True >>> colorValidator(".5,.5,.5,.5") True >>> colorValidator("0.5,0.5,0.5,0.5") True >>> colorValidator("1,1,1,1") True >>> colorValidator("2,0,0,0") False >>> colorValidator("0,2,0,0") False >>> colorValidator("0,0,2,0") False >>> colorValidator("0,0,0,2") False >>> colorValidator("1r,1,1,1") False >>> colorValidator("1,1g,1,1") False >>> colorValidator("1,1,1b,1") False >>> colorValidator("1,1,1,1a") False >>> colorValidator("1 1 1 1") False >>> colorValidator("1 1,1,1") False >>> colorValidator("1,1 1,1") False >>> colorValidator("1,1,1 1") False >>> colorValidator("1, 1, 1, 1") True F,rWTrr@)rr[r]rEstripr r^float)rpartspart convertednumbers rrrsV eS ! KK E 5zQzz|  YFI t Fa %&       s$ A> B > B  B  BBsPNG  bytes pngSignatureT)fileNamexScalexyScaleyxScaleyScalexOffsetyOffsetr_imageDictPrototypecpt|tsy|dsy|jd}| t|syy)r?FrrT)r5rrr)rrs rimageValidatorrCs> ': ;   IIg E !6 rc |||J|'t|d5}|jd}dddn<||dd}n4|2|j}|jd}|j|tk7ryy#1swYxYw)zG Version 3+. This checks the signature of the image data. Nrb)Fz,Image does not begin with the PNG signature.TN)rreadtellseekr)pathdatafileObjf signatureposs r pngValidatorrSs  t/73FF F  $  "q I " " !H  llnLLO  SL D  " "s A99Bct|tjjr|}ntjj |}d}t|t sd|fSt}t}i}|D]}t|t sd|fcSt|dk(sd|fcS|D]}t|trd|fccS|\} } | dk7r| jds dd| zfcSt| dk(ry|j| s dd | zfcS| d k(r| dk7ry | |vr dd | zfcS|j| | |vr dd | zfcS|j| | || <d|jv} | syy)zD Check the validity of layercontents.plist. Version 3+. z1layercontents.plist in not in the correct format.FrAglyphszglyphs.z3Invalid directory name (%s) in layercontents.plist.r)Fz(Empty layer name in layercontents.plist.z A glyphset does not exist at %s.zpublic.default)FzIThe name public.default is being used by a layer that is not the default.z1The layer name %s is used by more than one layer.z0The directory %s is used by more than one layer.)Fz1The required default glyph set is not in the UFO.r)rfsbaseFSosfsOSFSrrrEr[ startswithexistsrr) rufoPathOrFileSystem fileSystembogusFileMessageusedLayerNamesusedDirectoriescontentsentryr layerName directoryName foundDefaults rlayerContentsValidatorr"qs%rwwzz2( WW\\"56 J eT "&&&UNeOH+,%&** *5zQ** * /Aa%... /$) = H $ ++I6I#$ y>Q D  /<}LL L ( (]h-F  &CiO  9% O +B]R  M*+W+,Zx00L I rcd}t|sd|fSi}i}|jD]\}}t|tsd|fcSt|tt fsd|fcS|sy|j dsN|j ds|j dsqtdt|k(ry|j dr|}n|}|D]1}t|ts dd |zfccS||vr dd |zfccS|||<3y ) a Check the validity of the groups. Version 3+ (though it's backwards compatible with UFO 1 and UFO 2). >>> groups = {"A" : ["A", "A"], "A2" : ["A"]} >>> groupsValidator(groups) (True, None) >>> groups = {"" : ["A"]} >>> valid, msg = groupsValidator(groups) >>> valid False >>> print(msg) A group has an empty name. >>> groups = {"public.awesome" : ["A"]} >>> groupsValidator(groups) (True, None) >>> groups = {"public.kern1." : ["A"]} >>> valid, msg = groupsValidator(groups) >>> valid False >>> print(msg) The group data contains a kerning group with an incomplete name. >>> groups = {"public.kern2." : ["A"]} >>> valid, msg = groupsValidator(groups) >>> valid False >>> print(msg) The group data contains a kerning group with an incomplete name. >>> groups = {"public.kern1.A" : ["A"], "public.kern2.A" : ["A"]} >>> groupsValidator(groups) (True, None) >>> groups = {"public.kern1.A1" : ["A"], "public.kern1.A2" : ["A"]} >>> valid, msg = groupsValidator(groups) >>> valid False >>> print(msg) The glyph "A" occurs in too many kerning groups. z,The group data is not in the correct format.F)FzA group has an empty name.zpublic.z public.kern1.z public.kern2.z public.kernN.)Fz@The group data contains a kerning group with an incomplete name.z-The group data %s contains an invalid member.z1The glyph "%s" occurs in too many kerning groups.r)rrrr[rrrrE)rbogusFormatMessagefirstSideMappingsecondSideMapping groupName glyphListd glyphNames rgroupsValidatorr+s;XH  (((')(* % ") 9)c+,, ,)dE]3,, ,6    *''8AUAUB'3y>9##O4$%& ) !)S1G)S>KiW ))  )/")F rcHd}t|tsd|fS|jD]y\}}t|tsd|fcSt|tsd|fcS|jD]5\}}t|tsd|fccSt|tr/d|fccS{y)aA Check the validity of the kerning data structure. Version 3+ (though it's backwards compatible with UFO 1 and UFO 2). >>> kerning = {"A" : {"B" : 100}} >>> kerningValidator(kerning) (True, None) >>> kerning = {"A" : ["B"]} >>> valid, msg = kerningValidator(kerning) >>> valid False >>> print(msg) The kerning data is not in the correct format. >>> kerning = {"A" : {"B" : "100"}} >>> valid, msg = kerningValidator(kerning) >>> valid False >>> print(msg) The kerning data is not in the correct format. z.The kerning data is not in the correct format.Fr)rrrr[r )r r$first secondDictsecondrs rkerningValidatorr0s.J dG $(((!ZZ\ 1z%%,, ,J0,, ,'--/ 1MFEfc*000{3000  1 1 rz-The lib data is not in the correct format: %sct|s#dt|jz}dt|zfS|j D]\}}t |t sddt|jd|fcS|dk(s;d}t |ttfs!dt|jz}d||zfcS|D]5}t |t rdt|jz}d||zfccSy ) a Check the validity of the lib. Version 3+ (though it's backwards compatible with UFO 1 and UFO 2). >>> lib = {"foo" : "bar"} >>> fontLibValidator(lib) (True, None) >>> lib = {"public.awesome" : "hello"} >>> fontLibValidator(lib) (True, None) >>> lib = {"public.glyphOrder" : ["A", "C", "B"]} >>> fontLibValidator(lib) (True, None) >>> lib = "hello" >>> valid, msg = fontLibValidator(lib) >>> valid False >>> print(msg) # doctest: +ELLIPSIS The lib data is not in the correct format: expected a dictionary, ... >>> lib = {1: "hello"} >>> valid, msg = fontLibValidator(lib) >>> valid False >>> print(msg) The lib key is not properly formatted: expected str, found int: 1 >>> lib = {"public.glyphOrder" : "hello"} >>> valid, msg = fontLibValidator(lib) >>> valid False >>> print(msg) # doctest: +ELLIPSIS public.glyphOrder is not properly formatted: expected list or tuple,... >>> lib = {"public.glyphOrder" : ["A", 1, "B"]} >>> valid, msg = fontLibValidator(lib) >>> valid False >>> print(msg) # doctest: +ELLIPSIS public.glyphOrder is not properly formatted: expected str,... expected a dictionary, found %sFz;The lib key is not properly formatted: expected str, found z: zpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %sr) rtype__name___bogusLibFormatMessagerrr[rr)rreasonr1bogusGlyphOrderMessager*s rfontLibValidatorr8GsZ  2T%[5I5II,v555kkmB U#s#9%%s,  % %%V "edE]3;d5k>R>RR4v===" B !)S15Y8P8PPF "86"AAA BB rct|s#dt|jz}dt|zfS|j D]:\}}t |t sd|z}dt|zfcS|dk(s.t|r:yy)a, Check the validity of the lib. Version 3+ (though it's backwards compatible with UFO 1 and UFO 2). >>> lib = {"foo" : "bar"} >>> glyphLibValidator(lib) (True, None) >>> lib = {"public.awesome" : "hello"} >>> glyphLibValidator(lib) (True, None) >>> lib = {"public.markColor" : "1,0,0,0.5"} >>> glyphLibValidator(lib) (True, None) >>> lib = {"public.markColor" : 1} >>> valid, msg = glyphLibValidator(lib) >>> valid False >>> print(msg) public.markColor is not properly formatted. r2Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r)rr3r4r5rrr[r)rr6r1s rglyphLibValidatorr:s0  2T%[5I5II,v555kkmL U#s#2S8F0699 9 $ $!%(KL r__main__)rrreturnbool)rrrz Type[Any]r<r=)rrr!z Sequence[int]r<r=)rrr0r.r<r=)rrr<r=)N)rrrzOptional[set[str]]r<r=)NNN)rz Optional[str]r zOptional[bytes]r z Optional[Any]r<ztuple[bool, Any])rrrzUnion[str, fs.base.FS]r<tuple[bool, Optional[str]])rrr<r>)r rr<r>)U__doc__ __future__rr_collections.abcrriorfontTools.misc.filesystemmisc filesystemrtypingrrr r fontTools.annotationsr fontTools.ufoLib.utilsr rFr[rr3r=r.rrr$r*r-r5r=rQrprxrzr}rrrrrrrrrrrrrrrrrrrrrrr rr__annotations__rrrrrrrrrrr"r+r0r5r8r:r4doctesttestmodr;rrrLs("-&&--*.3eD%S 3*?$?@$FGGH  "  D<9x&  "&   "0      " &$",&(, U|U U|U <  u ,U| (!R&%) U|U U|U u ,U| %k6>CT+ e*#'4[ %L% 5\5 !5\5 ! %L% 5\5 !5\5 ! , $[  " !