From 0d78b7ab91833d5b48a62bc170cf77a4260904f5 Mon Sep 17 00:00:00 2001 From: reimannsum Date: Sun, 8 Nov 2015 20:16:29 -0500 Subject: [PATCH] updating to the newest version of mtgencode and finishing html support --- Icons/0-mana.png | Bin 410 -> 0 bytes Icons/1-mana.png | Bin 334 -> 0 bytes Icons/10-mana.png | Bin 424 -> 0 bytes Icons/11-mana.png | Bin 351 -> 0 bytes Icons/12-mana.png | Bin 413 -> 0 bytes Icons/13-mana.png | Bin 416 -> 0 bytes Icons/14-mana.png | Bin 409 -> 0 bytes Icons/15-mana.png | Bin 413 -> 0 bytes Icons/16-mana.png | Bin 422 -> 0 bytes Icons/17-mana.png | Bin 405 -> 0 bytes Icons/18-mana.png | Bin 429 -> 0 bytes Icons/19-mana.png | Bin 423 -> 0 bytes Icons/2-mana.png | Bin 442 -> 0 bytes Icons/20-mana.png | Bin 462 -> 0 bytes Icons/3-mana.png | Bin 447 -> 0 bytes Icons/4-mana.png | Bin 418 -> 0 bytes Icons/5-mana.png | Bin 404 -> 0 bytes Icons/6-mana.png | Bin 459 -> 0 bytes Icons/7-mana.png | Bin 384 -> 0 bytes Icons/8-mana.png | Bin 470 -> 0 bytes Icons/9-mana.png | Bin 457 -> 0 bytes Icons/B-2-mana.png | Bin 487 -> 0 bytes Icons/B-G-mana.png | Bin 498 -> 0 bytes Icons/B-P-mana.png | Bin 476 -> 0 bytes Icons/B-R-mana.png | Bin 501 -> 0 bytes Icons/B-mana.png | Bin 506 -> 0 bytes Icons/G-2-mana.png | Bin 487 -> 0 bytes Icons/G-P-mana.png | Bin 483 -> 0 bytes Icons/G-U-mana.png | Bin 485 -> 0 bytes Icons/G-W-mana.png | Bin 491 -> 0 bytes Icons/G-mana.png | Bin 486 -> 0 bytes Icons/I-mana.png | Bin 424 -> 0 bytes Icons/Q-symbol.png | Bin 378 -> 0 bytes Icons/R-2-mana.png | Bin 481 -> 0 bytes Icons/R-G-mana.png | Bin 492 -> 0 bytes Icons/R-P-mana.png | Bin 478 -> 0 bytes Icons/R-W-mana.png | Bin 494 -> 0 bytes Icons/R-mana.png | Bin 507 -> 0 bytes Icons/S-mana.png | Bin 419 -> 0 bytes Icons/T-symbol.png | Bin 413 -> 0 bytes Icons/Thumbs.db | Bin 55296 -> 0 bytes Icons/U-2-mana.png | Bin 465 -> 0 bytes Icons/U-B-mana.png | Bin 494 -> 0 bytes Icons/U-P-mana.png | Bin 485 -> 0 bytes Icons/U-R-mana.png | Bin 482 -> 0 bytes Icons/U-mana.png | Bin 415 -> 0 bytes Icons/W-2-mana.png | Bin 488 -> 0 bytes Icons/W-B-mana.png | Bin 488 -> 0 bytes Icons/W-P-mana.png | Bin 468 -> 0 bytes Icons/W-U-mana.png | Bin 475 -> 0 bytes Icons/W-mana.png | Bin 502 -> 0 bytes Icons/X-mana.png | Bin 456 -> 0 bytes Icons/Y-mana.png | Bin 419 -> 0 bytes Icons/chaos-symbol.png | Bin 574 -> 0 bytes decode.py | 140 +++++++++++-------------------------- encode.py | 154 +++++++++++------------------------------ lib/cardlib.py | 118 +++++++++++++++++++++---------- lib/jdecode.py | 113 +++++++++++++++++++++++++++++- lib/manalib.py | 9 +-- lib/transforms.py | 48 ++++++++++++- lib/utils.py | 44 ++++++++++-- 61 files changed, 365 insertions(+), 261 deletions(-) delete mode 100755 Icons/0-mana.png delete mode 100755 Icons/1-mana.png delete mode 100755 Icons/10-mana.png delete mode 100755 Icons/11-mana.png delete mode 100755 Icons/12-mana.png delete mode 100755 Icons/13-mana.png delete mode 100755 Icons/14-mana.png delete mode 100755 Icons/15-mana.png delete mode 100755 Icons/16-mana.png delete mode 100755 Icons/17-mana.png delete mode 100755 Icons/18-mana.png delete mode 100755 Icons/19-mana.png delete mode 100755 Icons/2-mana.png delete mode 100755 Icons/20-mana.png delete mode 100755 Icons/3-mana.png delete mode 100755 Icons/4-mana.png delete mode 100755 Icons/5-mana.png delete mode 100755 Icons/6-mana.png delete mode 100755 Icons/7-mana.png delete mode 100755 Icons/8-mana.png delete mode 100755 Icons/9-mana.png delete mode 100755 Icons/B-2-mana.png delete mode 100755 Icons/B-G-mana.png delete mode 100755 Icons/B-P-mana.png delete mode 100755 Icons/B-R-mana.png delete mode 100755 Icons/B-mana.png delete mode 100755 Icons/G-2-mana.png delete mode 100755 Icons/G-P-mana.png delete mode 100755 Icons/G-U-mana.png delete mode 100755 Icons/G-W-mana.png delete mode 100755 Icons/G-mana.png delete mode 100755 Icons/I-mana.png delete mode 100755 Icons/Q-symbol.png delete mode 100755 Icons/R-2-mana.png delete mode 100755 Icons/R-G-mana.png delete mode 100755 Icons/R-P-mana.png delete mode 100755 Icons/R-W-mana.png delete mode 100755 Icons/R-mana.png delete mode 100755 Icons/S-mana.png delete mode 100755 Icons/T-symbol.png delete mode 100755 Icons/Thumbs.db delete mode 100755 Icons/U-2-mana.png delete mode 100755 Icons/U-B-mana.png delete mode 100755 Icons/U-P-mana.png delete mode 100755 Icons/U-R-mana.png delete mode 100755 Icons/U-mana.png delete mode 100755 Icons/W-2-mana.png delete mode 100755 Icons/W-B-mana.png delete mode 100755 Icons/W-P-mana.png delete mode 100755 Icons/W-U-mana.png delete mode 100755 Icons/W-mana.png delete mode 100755 Icons/X-mana.png delete mode 100755 Icons/Y-mana.png delete mode 100755 Icons/chaos-symbol.png diff --git a/Icons/0-mana.png b/Icons/0-mana.png deleted file mode 100755 index 9dda72d62913f894fed0abed03ffcd706696173b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZ7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@8uUF~978mMlYj8D)&Kuj`SZ=k-qY#&^X!;h z9M~psi?p0*68Zb%sPJNx1-?oBTD}h0Z`w7Fuy?bM$i)~xxPMo%A)vB_8PZSlTS2QqY*iI-- zxzA^3*O5=7qzDPw&rsTLhMU;iHiK@lRwyphDEv9L5RO_1{c@;tZ=ePOx{a zi`yo!DC6y^qYm#LRT?ksQn;2Ix1CADsWqy9IqXeUAJ=O)VVYH z5}9igl5=?zn`QX;n>cM{KXG+A$j`AZym0RvUy`^9#{}lhtM}f#e%x9~r{vZWyAH05 x1SUfPhN;ZGtWo?WY66Us4tfCsD&POxGhCi*(AX9ibru+&44$rjF6*2UngCMzoVNe~ diff --git a/Icons/1-mana.png b/Icons/1-mana.png deleted file mode 100755 index 12b0d643c86d48ec436892926a1c08ea59219d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZ7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@f{#62978mMdnaz>V{{a8JubXidz+xs6sfar zew30G(4Fl&*ZS`kLDra zke{v$9F;5dCi%QmW@tHLcRC?@+vdBGjz c?`z$tzV}r91?AKkpm1XFboFyt=akR{05Qsgy#N3J diff --git a/Icons/10-mana.png b/Icons/10-mana.png deleted file mode 100755 index 3254473ce576973d54ca3264d2c8cd842877a228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmV;Z0ayNsP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X<1XK~yMHWBmXB zKLZ29zkh$)WhEgIaVDTUfXZ#G%%vqIfQ-XOPsqv2Ff%jr@NjFWsqEUb zAEfBztCHa0ePc6K0x3Frlg z5Cka5%RYVf0>b|C<%_C{5>NpXFgzeapFVy5^5v_mll`qbcRzjp{O|w&d-osO+gbq? zF#i4f=hoE=6DCbNdFGs$s7PvJ?8i@^cJDhVz{dyljfsgdFbIeWOd_I%fdK%4m8pgF S`1UIR0000k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@f?qsc978mMlmGnxZ_mtpcz=EU{XI4R{=Hp2 z-+mwS&Nni1nhqr?J(}d>bH+i>(-k$GCmH*4O()xRa**A zf7`Z>(_!cG^YhlnY)<^O=BGohgXRJzwFSBke9Fp?r>-{7yStM+{{Q#)_v`EV0%ie>#p&VSkAKf!AG>>F+2LpN_t(|_{Pgwvd;8mE@BV)Js?BZO oy>4CKnnhZHjh-%B3=9|;X7f((k7;X=0s5c8)78&qol`;+01O6=DgXcg diff --git a/Icons/12-mana.png b/Icons/12-mana.png deleted file mode 100755 index 6300ebb5ea82707e9cf79a139744e3ceae0fb4b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>4%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0WwKMK~yMHWBmXB zKLZ29zkh$XI^m?PztDk1?Uc-$<~%;(o&K@#>vy?%8POZ1o#ydIv(46A!;Q~|vWZbxUOIJsWkCzvyfC(ap2A({9zH;rx#+ot+mkHPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X0cPK~yMHWBmXB zKLZ29zkh$W-dCfB*gkS`Add1eHVrOpJ`4?#}C0E_nF($(HTAKq5ddK;)2t zh_DbV3yYkrG|=xr1xfJl7%_U-Mv_rHJt23i5+o<4j2?!5Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0WL{IK~yMHWBmXB zKLZ29zkh$Po6$oxOC;qSFa%|?%ch< zdF#$=H*Nu?fC`v^?f{CK8XIb9s6kZx{{4H+`psd%{tzxu0TbLQ%*-G+0>R>CtAQ$5 zSXdxjpaLcc3l6ScyYct$UolaU?>~P0`SSUE$BAmirkdq4$51tt;E!oUCk4#=?Ghq@K?00000NkvXXu0mjf DZUM0o diff --git a/Icons/15-mana.png b/Icons/15-mana.png deleted file mode 100755 index 6c496eda40dbea1e689fd7b9add5a0d26e910487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>4%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0WwKMK~yMHWBmXB zKLZ29zkh$Do*btjFE@GmoM+Ep02O`w_-SHqhmpB83(%I|zkaf_u^l;f zGASQK0X_cj|39DtCSZ5~h5r8i`|J1b?>~M(Q~;$HFI#16ZNbOO3se9Kf-C1wclJ)W zcKxQbl%$EF{)?BdUcGrMBPAIV8Oq1cucmE4TwoH876t|YPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Xs=VK~yMHWBmXB zKLZ29zkh$!_3IZ<1gL-s%_%$g z><7wSxpw2w(G!JbwICP&_|62Cgn`#@-U3Yx^z$mnPP=yf=Dqt5fr3mxFF>RrKvYEd z`*)DpY;0`YJluc&`~fOp0)_`r==YyLK=SjKFCMN=$4{OCa$mfB#lg<5q@(~;!1(v? zpYx}VO`J0Q^404KaDO-DJaOvW-@kuDgM8K1)z!2Ohzd+1qJ@D00C=Fn;P2$V Q?EnA(07*qoM6N<$f|>)tMF0Q* diff --git a/Icons/17-mana.png b/Icons/17-mana.png deleted file mode 100755 index 06ead76fc547232d04b0bc6dd710284805cfb0fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmV;G0c!qPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0V+vEK~yMHWBmXB zKLZ29zkh$o>P--}U$J z-xH_L8tUuX*;oS6+jsBSSeStd7;juY3sm&)-#g>S5$;AY53KJ6(*mwqr3ZO$*uiNBcZv$il6+q?C!0EFWBqhaJSy&)kCZHD}EM%~8 z%XU*E0|*Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0YXVcK~yMHWBmXB zKLZ29zkh$6WhBde*EwrsDKIR4xn-iGZPhMMIhtdyZ6tZzXXyT9PB(i+zgD2 zKm{ylPO-5vKXK|zNOZD-oNP{JG6y?5PyrKE5(Ykg`t<$B&!*aPAtAx8zR5p+{sam# z0lff`hJf{(wrOjs1I_DhtCy0LxOnLbPyrJ#JRs8FzJ34s^Ov}o*v(safLumKMiv$p z8EGk?0>;08|J=HIVb1^|Y-lEr3BlRA3SjEes3* X;83r&kBd6g00000NkvXXu0mjf>~6TC diff --git a/Icons/19-mana.png b/Icons/19-mana.png deleted file mode 100755 index d00dd7753091240eeb2a2823683bcb90d9fb1296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmV;Y0a*TtP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X#`WK~yMHWBmXB zKLZ29zkh$AW)DA=mm&0 z1hBHO%%0Y#p{{D6r^CX+Y-eK$RKNrb4~X=SA3whT_yJ__aC2K)n6BTnEh9BSOjHD@ zfCU(0@7}!Jw0Y~N&tJZM|8eHrh0mYAT)T10+tU^36`(Od1w;iV5z)fH002Uaqek1J Rv^)R+002ovPDHLkV1o60xwilS diff --git a/Icons/2-mana.png b/Icons/2-mana.png deleted file mode 100755 index 5846b44b4699699aedaeba140f23092181fadebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmV;r0Y(0aP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Z&OpK~yMHWBmXB zKLZ29zkh$+RtJG2`5YOAjAC0WyFJ82|qLbL;Ab zAK$Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0b@x-K~yMHWBmXB zKLZ29zkh$I@)O>khq zzMY$!>Z(OV#W$>8>g(-w;nd+3i{}{_7yuP80p0QV$+N=T3?V@QH&@3WKYnc3yj?>> z4QQRZn#!wJZ_b`Q%>;CcnTa6}4>wR0Xp6gxk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@8bUl>978mMlmGnxZ_mtpcz=EU{XI4R{=Hp2 z-+mwS&Nni1nhqr?J(}d>bH+i>8{=I!*&5Vbc7coiR+5bNvz`?;Sit7ZMRsvI- zM1byvW6$;DoI>VUl&0NV^z`aeRvjH3kRLJ<;`Uag{pzutzrW_^r?1lT`uQml3+Alh j31C$*=k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@8q7Ui978mMlmGnxZ_mtpcz=EU{XI4R{=Hp2 z-+mwS&Nni1nhqr?J(}d>bH+i>>&yCZ<0!b7Fe*=iAo( zdvfr2|NMQm?YE-uUt(2}&OW80dZdxZQ<7CJp@Z>o^Zfbz8Z0hCkCN=`{`~mz(s%-6 z2;&qcc1>YpjUyHoj%@}8TS~q$w^~@-XmsS_^jW~9w5YX_k)fb$`MFm&j~oYvD}$%2 KpUXO@geCw!HLk?~ diff --git a/Icons/5-mana.png b/Icons/5-mana.png deleted file mode 100755 index b1651c9754ce4bcb0739478398d3bbb2c708f856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZ7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@8ZbH+i>DMn z-2eXl78e&~6JgOx*i-R~<4E&~1)J7Az115n9j?o?sqvX1V=ebY2ev4wSMv6CO&c1y zW;8rxe5lZzZJw94Vx_|k2Ued00?uY{zR$Pkp1#he{9jO9nAQaDDNI@pENRu@|F^%t ve{cVP1#M+nIUxm2MZOS5P9LR3t&NNf^M&Ux-I;t66#fjJu6{1-oD!MPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0bof)K~yMHWBmXB zKLZ29zkh$`)^_$;+ z_!t)*uB@!2sHV-%&cXQi@1I*&FF;frId*dH!lk8!Ia(TOKrRpfja1V%V0`)P@$)AS zfc$&+A7T!%0saq`TKTX$rnC4>CESFYLEH*q@190mrU0wxIS-MjZdbtwta7G@@T zI$DALUfXu=`Sa%wM3xEYG$6&r2_hL789^iigMysw-@kv~z5f7Y0~IggUP zR=jcZHdqbAm#^QrxwwRd1c7Xz0w!RHK@7`CiQlvD(3`jK{{8#6Yw!N3@E~SpW}p;M z0ZL#VJ8^2u_T7w(jM|#&kzqkVe?bG2aI`Qm001JorYV^c4)_27002ovPDHLkV1kj~ B$$J0* diff --git a/Icons/7-mana.png b/Icons/7-mana.png deleted file mode 100755 index fd406d710d34ada50b67ca849501ec1b1b2bbcad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZ7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@8bm!^978mMlmGnxZ_mtpcz=EU{XI4R{=Hp2 z-+mwS&Nni1nhqr?J(}d>bH+i>z9=f}zEXU_OI1afF-p4eDckeL2F zfoT?F2&2h^0}B_+$h;AHlq68{`~ zW@wm;iwAJ6X!v;S>1O+V_01<756ri(58A}F-1o(!M~_&FEG>4@(fZ}QPn(;YIVI!*&1$7(#sC~0)`rcr>mdKI;Vst0Fl3zv;Y7A diff --git a/Icons/8-mana.png b/Icons/8-mana.png deleted file mode 100755 index d35d0bbb87f22c18fdd506c2169fe11b253f45c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmV;{0V)28P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0c%M_K~yMHWBmXB zKLZ29zkh$I>>P}L|Ngmk^#agkp1uP-`8`M@w_-_TBRqErUt`)!n#!_Q&^cfByUl3{U86snya{2Z{o{Idkr!9h+8i0R6_v z#RLowpy;PhpWlD@ASNaX*2xea8VK~`x3AxTY@h-rV2A+~3keD8YHP0Fv<;%@#L3eJ z`no_tpcGI6A~4^*d%I}qsyA=n@o;l-aB##$hY1M@Lj#j=v@kFL0H`3n#^7ok`2YX_ M07*qoM6N<$f=U|KQUCw| diff --git a/Icons/9-mana.png b/Icons/9-mana.png deleted file mode 100755 index 57d83870b6a8edf81238fd93ce32d9755e61c069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmV;)0XF`LP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0bWT&K~yMHWBmXB zKLZ29zkh$PrKi4mvxp3-mQ9-VirRCY<2X<^;D|(29Tm{sE0~b8!S3BOxy4>TEw_&H|uCKq;UCCZIcjoHuXZeg6D~kCz9?1_CV& zwOhCEe*N|h$ObB4g1A&jPylGg!^cm+YJg5<1QK7rf)oK2FoDGwSXfxR++8+o-hTb& z?bBz^&zZjjC?dem2a#ni$jkoo=QogLZf5-Z*YAUekFm0{{{Qz+OjOj<-5Ds(!O6w= z^4a6(Pac3ZK*8%bZ{t$3Cw8~0sVW1xk}?WRzz_q52SgeOZr!Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eneBK~yMHWBmXB zKLZ29zkh$O&A5N->iUhFeLUT!&tCBR_iv~Ypz(kIUOjW{@87>nKwE%TM280p z3h;}IiL$V;Kvb}@vb}x&^!wK@&mP=m0=fez#K_3FYVF3t+>C$!{=rp%6*Ihk{+J2k z($3yVKY#t2yI|?7*KdF-RxDq+V%_E&x9{K4j{X1u002ovPDHLkV1lcB)Cm9p diff --git a/Icons/B-G-mana.png b/Icons/B-G-mana.png deleted file mode 100755 index f2c0d5b85eec895d5239b748cc8244a00b4c5bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0f$LMK~yMHWBmXB zKLZ29-@kt!+`j(q<@2B4zX7>iJUpV3vQi4l%*@O{E)x)c|Ms=MveeMr);%b4^~SCL z|Nr~?`O|}2SI-~a_xamLkRqTN3ujN?vF88>I~yYdx0J;>S2?&5@bkCf&Z_Obfo0)|veCcPY?)sSWXBvZAbP zECRy(w$4`ClDeP}|MKnAj+`^$$flHyW+Mge>r{Lp9thS=5Tmw~Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0dYx0K~yMHWBmXB zKLZ29-@kvKJ-GY&`QtC2K3%wS-NwpXR8m$-L7ADE87K=<^!?k{t7ndV|M~^UzxVL* z^_zFR-5h~zPHrA;6Dv+GZYH1^a23CQ|2c5v#EVyNAjSg)fl@#PjF0Zzd~oY3Q0VUc zM-yf);N)O`_2w-HJ4bPLvZ|6iP+UPxn+fO+AnV`1f4$S@W+p}jc)MDe8dVo%PMWpw z$IqWYDWC$TZ(l$bUA}fpLQGUkU4@O6_07BYveJ_JIvO`_-vdek6)*uQAo%m=4+{&( zBcDHi6%`f&GJvXo|Nae@WMJar;Q>;b>MFPIKDhVb5f2YH(A6J5eLj2Pin4+nPztC3 z;qaSx?)OcbD*6Jx>x>?}=z;y{Np0xdd!bRQ%LzW?~KX44K}5TwS23Gnj) zMSwwNXzj!V3{y~uaf2-7hN}Qd0TrM}3(zl@uHLXPH$g-T0|Nl@j=(>) SX63U00000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0g6dPK~yMHWBmXB zKLZ29-@kt!+`j(q<@2B4zX7>iJUpV3vQi4l%*@O{E)x)c|Ms=MveeMr);%b4^~SCL z|Nr~?`O|}2SI-~a_xsa3kRqTN3ujN?vF88>I~yYdd|_l{RFIRAk&={?k&>5{k>X_dbaLCaOAkJN{{>X^ z|I=&6!`n9iT?)|z1VA(H?_K-x+pj%WA3b^hr6IsVM^20h=v$~fSOw4)TQzAT1+g$Q zH8vLJxreVZ@`*A5!vk3bkTLhrRlS-e?ORXZe)+*jPLx^EfC(64oZLLfE`9wO6rPtJ zztNNw)KpPo*0ctN`0vl}|L>ji|I-_YqF;ahZoY7ziIKt5KwB;(pOIG>8ZE#O`+NN; r(6>Op0C_-n0Br%9!N9`Cz`y_i7$&QG1Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0gp*UK~yMHWBmXB zKLZ29-@kvKJ-GY&`QsNaUNAE=ivoe9tdxQ>kPVb&04n@y zQ9-dVEB*ArT|g^h`OscZUd2yhMKsvJQL6zdk-Bo)YFcO2o@C)hNut|70yhI zF*VfNwtGKN0n@iHUx0?!6yl~quIMhgQ20C#k|GoH#6Pyhe`07*qoM6N<$g5Is#l>h($ diff --git a/Icons/G-2-mana.png b/Icons/G-2-mana.png deleted file mode 100755 index c7940563ca31321e468671c5a3d9491e86f190d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eneBK~yMHWBmXB zKLZ29zkh$iUhFeLUT!&tCBR_iv~Y28Pd!-*(*C^5^d#CZH`qE26`L z1qJxU#Y9FUStAFn>Y%mj1?P>7L{an;(5g}E93{{4fi04rv=`{p(i z#HF3RlYajCHFv?%SFhiEWBI*e@47AXcRafF1Ss|K`v=C0r;h;Le*4ZnAfJheNmg6F zrLTM6nnOS?GYfNmU#5b(923wBK)$Mq5)c7Z0Bt$3<1|p3n~xhPzJKi@eog@nn?>G66#jXc*k3Kp&(w#EZ#_va+!V2=m)ITWL$` zf&%mFk1yM=ZwC4nVk8j!`uY3IhcA-iQhr7Od>s7HXaR;8Fg$?11^NZZ1-b)h3(yP} dW)=np1^}}-wh+r^lraDR002ovPDHLkV1kYW(gFYg diff --git a/Icons/G-P-mana.png b/Icons/G-P-mana.png deleted file mode 100755 index e66eb3b6fde784eff11e147eeb383e1fa869577f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmV<90UZ8`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eDG7K~yMHWBmXB zKLZ29pTB>uKEHhT&F%MJ-`%=!*WB7vSwvM^QkR991t<$r^y$aPUDvmL{QeQhe|qov zgKLkheawMueolTjO)owUekPz9a20=k|2en+;@cPRA;tp*fl@#Pj29lCJM-uyQ0U3s zXDj;GvvaV$fAxW#lP#(wL{?QAC~hKW&g>fJ^yByUfB*i?tX>e3?I)!q!OF(!o8qyo zcddz&0W%Bp_ut={K7RiIRDSo;17S%aMQwQ&R+f)%K8eeUs_H8}xbYZl=?5kt1q6Tp z{9$Hh1~R^V{w5&C4`i^ivHbb<2Q10J#Lp=Jq!hH|AKiZP^zL&mUe5pj{(t%K^~Rao zGAdF)DWC#`!ynyzvb1Ln(4tpQ-T5c#Z002ovPDHLkV1hpU)kXjS diff --git a/Icons/G-U-mana.png b/Icons/G-U-mana.png deleted file mode 100755 index a6060551c728141e03eabf313b9467394550d098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eVS9K~yMHWBmXB zKLZ29pTB>uKEHhT&FzohKLEM>oC3-ss@jseEX*uGE=bX*A0O8oTe)`r23a*3Ju4k{ zPBx$fSSi1|ravzS7vt|gzZV}`kmp|lkuY^JiY^I*uw?|b`M7k=WcitZw(Q!ln~{-` znT45)m+SPNb06P+f~a6&(fao5@8b_Yn1Jr!72vh>H09>w(lS+#EDT{`WrnDLnD_GY zPbQ#C&D~9G{j52-IM_JY^sKej<;_066*{tOD@4)P-+!6?lYRd){O1+m(YMi6)>Twj zFlS^?t<8w}_xG=fts_toBO?P7(6+`0}F=VoPQ z0)_`f5!@XYPaXl164G*)&zt}<#Ch47fFTA94`i20$jSrBrw{MFdHI}+jagQJ0~DB_ ze}232;up}j5Jf+KeBZWe36K#I6K}30#>vVIjh4Uv{sY4U=v$y)fLx$EfVKe5U}j=u bU|;|MnQx30(-(h-00000NkvXXu0mjfV}aK( diff --git a/Icons/G-W-mana.png b/Icons/G-W-mana.png deleted file mode 100755 index 56f748de88a5f855da6787aae0c5e756bd86ed83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0f0$FK~yMHEs?=X z!cZK?-}W}0o75ge)TI z+#!Qzg`!*Qw_fk`9={LY-}n1{lx0~6A;UBtUhiMpExr2zPub-O4u>MX7=syj+EAyb zm+EJw(@QNBh%H7OoC5}bsJs@MnvP6#?#=+QFa(v2b;JxB;xpKwxoLBKklADIK zL{=V>GSOsM896*Usn_qC&FAw{Sri3|Vrl4uK*R^fIa8^)qR39CLsR{Y#v_eI1{!O< zJwaOHlx3OiLay8GsjA;JjBGZIv22&w8+=0_V30_{>2$upieXSLUW0Z2-(n{@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eeYAK~yMHWBmXB zKLZ29pTB>uKEHhH#f{6Cu82qo%Sg#6i>PW#>asAi0A)dnKK=N(;mo>^-#*N1Tzu#9 zJvMe$D{pflaUt(e4-Xx0J`R3{-+zA3KQKpBQbIsTn1`1i8AarUtvK{GFFCTmdRzy7}Vz+Uc91!VC;TVuC-n_fD06=)vNzjEp__JKA)*Pq#UUP(!b@xtSCyU*-oWMUK$ z;lF$N{^Zh`K;6}IOGKqbASRi}nKJ=HOhH~Ar~>G_pWlB%B>w*S3t{kc@&gqx01f~6 z{lns;3qrF)^sNj;#KnX}L_{RSO&m-X9i9i20xCd>mP_|9Jbm_*SCEI{2a~m-wT_fN cC|Vd80I_hWSr3hNSpWb407*qoM6N<$f^pT>fB*mh diff --git a/Icons/I-mana.png b/Icons/I-mana.png deleted file mode 100755 index 77a65cf8853cfc94688eeb51a362875599e31dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmV;Z0ayNsP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X<1XK~yMHWBmXB zKLZ29zkh$oj~qL>d+&kIpT9t)KYskQYwrP|;O9>tfeM(D<74uQ zD*pZZ_vi25Nz-O4%F91__N=MBM_Nkq{=-L0SFCY$vSYb*`<94^aAs-(&;U<2=aPzg zMkdAyT`d9v{6LY~rVgM2CPoHE2CxS~0L)-wWQ6d5fRT}rnTd%-RaN!PyLYqZF5=_k z-M({gQGVv%zkl;ftAVC|`t%uyl$BK&Up{;M=)s*+r_X)+_RZ4Vl!u2KXuzk>pMfHr zoSbH+Msf-&jDP?Bxpnmd)*t`^U{I-P8!!RG6cl0{oKRsT00~T>0wSV?fdK%&N2xb6 SV6pZ90000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0S`$;K~yMHWB3mS zU%!6s>FG5yw-6K(0U{s+$OQ^QWI>AV-o0yJXw1XQkA{GPKq;UCMxb(Q8@oGq?l6FX ztBZ@hgFTRY|Ni~Um#+v32^~Fhh*?NTc-{K-5EVe+>ET{eUFGHJ`TEV9g9i`2c=3XV zo11CX>eWzrQ~)&W%a<=e22cUh?b}d`;Gm_o?c4Y7nHd=nE=U2;FF-e%TUh4i0LXc5r85|YwDHc$Zr(6<7D!Z&Z;1d8t5wJR_%80aaWlmGquCoUlcR0LGO01OWx zOHEy4+qUgMb#SnC>o%Y`5CIjS1c8yEp|7uxl(aO^;2G0r09~e{q5=#8q5_kMX!-vi Y0R9cTZ!Hw`-2eap07*qoM6N<$g4)uU1ONa4 diff --git a/Icons/R-2-mana.png b/Icons/R-2-mana.png deleted file mode 100755 index f69a07dc477aebf8828d5267b2ecda65d8520ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmV<70UrK|P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0d`45K~yMHWBmXB zKLZ29zkh$iUhFeLUT!&tCBR_iv~Y1_s{m@BZzX&G6?J6VMi*7180r zf&%>FVxlZ8ED#kU|G$ge*z^C>o4?nOG6CHI6k=p#T(x#%VQ$91fB)brz=|3E-oL;E zacO7oq@TZj&0Vnc)$2DR|GvH2w`$v^2Oq!x0!sb=^qTSF=_5e5-@bDX$Y)|=GFKG8 zzG>m7@4t3mdGzG{mxcff9XT<^8<)@i`2G!KE|M+JK74)f`qPxX7sdIxCS-;&0mB1L z#oR+z^=g*1Z#{kcziW0M?H7GFueEs-u z_bi}qA&P$e`MdeTeI`Z*O9O4WkbFj7VQ91fLkt)mK;HuW0^~9BfouVq!N9`Cz`y_i Xq+`Ui9n%l900000NkvXXu0mjfcXHit diff --git a/Icons/R-G-mana.png b/Icons/R-G-mana.png deleted file mode 100755 index 0c36f7973eaf78b88f4e6a0ffb5365402f3d7665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0f9+GK~yMHWBmXB zKLZf_`Sthu(ZBaE{QvYC$YbOaWmYs`*0g3|VFPi2ivE9oyQR14#q;ME9=$GbGn5nN z1!)5*75VFu#K|Mf1T^FK-g%CT)K5{tHCWb3Xp9w|D*d`-cf=%l}Vr ze*FG(_}0^VuRby{GQRlm6{zBcjPf3ie;>bpy!!ky6VM$%p@ccR+BTnl@aEIsfB!{! zIUy>*#xdM|bDIg`Qd>1?Ao={`*NM^gOgeg#E??g=f5)R+Pk@3Szkgu-vAB}q-(Mi- z-~az0yJVE}mTcL#<`7VXnT0vOFH=EXjtS^nARh=IDuA|}*l`*t&CSOR6x_e|5I?5? z6EHj=iXbY00V1y{XX0e|Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0dq-2K~yMHWBmXB zKLZf_`Sthu(ZBaE{Q2(Adcr|&#``}rT(c%UFq3aEhb&!v5T&hG#UU3&61 zf9YXvc9tjazHqa%PK~uUkP`ulvlx0X0o?&){r&epYtg}uP|Hk59dCVw1u4#j%a45f z^#>$%{{qwhPp^TjV|Sh_i13;#iL zFDKX-5jLNECSaI?LW~dOTOM}S2y<0AAzru&pcGI6db9xja^%)CTN8amv@kFL0PPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0fR|IK~yMHWBmXB zKLZf_`Sthu(ZBaE{QvYC$YbOaWmYs`*0g3|VFPi2ivE9oyQR14#q;ME9=$GbGn5nN z1!)5*6=C&AXXM~x0-EuA?>tfF-Oe|NsB~`}ZRg&>cXbggLv~HlKd*=F{JQ|3!H@ zAu7P8G5q`cnF-=jTQzAQ`TXP8iP84*w$865WcTks@$1)bpdipN#vh9-fr>#o{{IKs z^;g6AF`sB@dFR`=AJS68?QG4Yr6rhvz6GiP0-y?@E#H;Y%gVcsA3uNP%B?kPckuFZ zGcvL=0mB2L2;vS74t8^MeL+Efc6K&7S*Z&bt}!w5vH(Nu@7*&%-$Go<%E}TQ<@f#j z4_R5MzkmMN+gmd;^MeEP$LBvx?|=@37zqTQK7HZin+a07*qoM6N<$g57@Us{jB1 diff --git a/Icons/R-mana.png b/Icons/R-mana.png deleted file mode 100755 index fbb499da9eb224d4ad73f146cf5b8638339d0dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0gy>VK~yMHWBmXB zKLZf_`Sthu(Z^>Gy?yb7la)nTMU_R#kXh53frSky2~za`^V>I@r**B|Wvn2^%)~Td z*ZG&9zE%2|#=6_EIwvvm3Nr!C_`P>t&4Mit-+nfb69wwCQIlGn=H9jS%*;&(&d+ZL zDqyY+b^7=4l7ohfkAad1FXx7HcbA{IWuYv2|IMe3=kD<^{k73jWc<0Y@BfDvAZNkA zzyJS#{QjFfZ}*<7k64+Qu1_mr`TyxPMDG6Uk2jvbmlou?`}*UCvv(uS)n9)6cIok( zU+-VBKvXP0akF6A!N32&K4oC2_BHF@dH(W~H$Zzu`M8)E`9%Nx`&YB}7+ghxo1w3P zB2a~t0C%;o>6`zYOw5V~-+%r2`280|1rThxc;9EjCLn{4lMQH|xPdhjFvR%8q_m`j zAS!_1&dU$-!n~0d>d}@O3koAxG;NrGVG0bfSves-(+2sHL002ovPDHLkV1f!c_9*}W diff --git a/Icons/S-mana.png b/Icons/S-mana.png deleted file mode 100755 index 681003b50a830e18cec00e02e18b7d33f4176b28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmV;U0bKrxP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0XRuSK~yMHWBmXB zKLZ29uV23&-oNwb*N@$M_5!)CF3v1$9P)}PY;0^mE=bYOAKy=(JlfpeCo07M@yj=$ zC_fL^>vtb(D~n9ct=Ty^8UOzMbLGP6-Fx=E|MdOovuClfF+fF&7A=;MmKNmWbaipk zF)(F%_T*7mbkgg0pYPng8yXU_f8Tx}3JVPda)E;3G08v$OrJl#x3xC6va(vdXyN9~ zo28_sC8eZ*3?LUMXk%ptRKVC+U-Rtc+i%~#2?z)x2m>gob|=fj5&TwGjI z;=)WoAv}PQ5vY-YDKt3n@9*y+!NI*f-N1m@w0ScS0U1CpQ1H*MZ$Jf1y!?Vkj-5Jo z>{x7EysxkCv!_pi2*?0(fr3COpaSecuz2wjX(=gq5D*ubgrkLl0Ra5|$Uu+BGy?zt N002ovPDHLkV1hd$wyyvH diff --git a/Icons/T-symbol.png b/Icons/T-symbol.png deleted file mode 100755 index 0ad0e82b05e313dd552f0a873205ea61fb8aad87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>4%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0WwKMK~yMHWBmXB zKLZ29zkh$-Jr+5ezIWEY6O0Cr_W5VIe`F0w!R1068+!l6pE?m#$npd;XH7gg6|rv9SRaFabjhs1~R$Gc6Hl zeQQ_$uU}BRfB+~3RDcqga~CX?m6djLc7UsZ1SS#D!oUCkeq5^pFy`Ts00000NkvXX Hu0mjfAdRH( diff --git a/Icons/Thumbs.db b/Icons/Thumbs.db deleted file mode 100755 index 2f803fbfcad245aa422dba20837400b684ce060a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55296 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 J|9|{D{|^Wpi@E>+ diff --git a/Icons/U-2-mana.png b/Icons/U-2-mana.png deleted file mode 100755 index cde17569a103a86374081350e13676c5e7cb1e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0cJ@=K~yMHWBmXB zKLZ29zkh$M(&A5N->iUhFeLUT!&tCBR_iv~Y28KUud>3AP`}^-d6VMi*7180r zf&%>FVxlZ8ED#mUeBv*egueay`}o5TCZIcjLX3=ztJZET%+2`s?;l(RSTV!P&p(+U zF751{^z+xRxeJ!Qdi@5d;@az9M|N$6DEj*QFVygmKtCYK#Ka_{ruXzOZ%bj2x~`#( zn>R$33FrkNrK+L?L}~`+KwI`~Tz&uMwLKeGJ-BrpD8!W0n=*00rjvpTB_N0rV|I5zs5!RxJTC zLSo|0mBct%nW51F3^8DM0DTMe3y=$R2hbLv8O%(K3=9ka^PQg*Baat#00000NkvXX Hu0mjf_{zyI diff --git a/Icons/U-B-mana.png b/Icons/U-B-mana.png deleted file mode 100755 index 8e4ad19cb250b36cf9f520aeb3a9cc8826eec3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 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 diff --git a/Icons/W-P-mana.png b/Icons/W-P-mana.png deleted file mode 100755 index c0ef45c1f6cab7fc465dcb71bc114f09aaa2bf59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 468 zcmV;_0W1EAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0clA@K~yMHWB3mR zfB*b>_v`1wZ(nci*uDhF0CItX5IH6W2B5m%zkfac`{(Wd|G%zZzjOb=V;}>_1quSC zfC_+${{8v=48r;K>-Us;{CfzKq;UCCWtY|j-69b zkTy5hXXjvh_WYHas)C)Z$(b`(Aclb)4g|k`|7Kxj0Wv{q z?xVkd|5jF{2L`wT#hF=z8G#`N505WjzD=I8_~FB+%}oWOqCya3SlMKOZen6#m4aBx z!^0IB;Ugm>30DD>0xAGG9HJa#EF+tOf{cT`8IS?w0tG>u85jWbB-V{qTY_T%0000< KMNUMnLSTY9XUvNL diff --git a/Icons/W-U-mana.png b/Icons/W-U-mana.png deleted file mode 100755 index 5d18cf26eed862af50aadedf38c4c6af7e226060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMv3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0dPq~K~yMHMNv&l z0#Ouw?@g0^nXXc@A#4)_5w^%pi&hb|GFnzftNuViyXq&{FG$){D>toNv`8pO%7nBU zwNi@#zf!B2(V6K?6L#S}?z!)9?!D(x!!U>$x~6^TTEj3}0F?5KvvZt-5C&)-JTw~_ z@#*$3e5|UfSuj+sU2ds)wcQ4x3mWx$wvf-SZ)^h>i_+R^z~gZtugbPewK*d=7`kvw z-`xv|;!8T6jm6^D05xSGDe+&bmaoYSb5Ke>BW|x(a5@M5{;5i(W-&lTNDYN5vWOu7 zLI>e#-$bcgom&W;-<4B|`0V^5>Xedy61qSV8aD;96OrhS-a}0i1q|O|Ps|(z&VIg^aX(o0XgJTfuFc5BG6!+U}t|Yzpb#sEV z$8;RV#S2YrYmpTB`|RWh$?{6jKQ`3MbAR8W=?473wx2DNiaF2)8XTj9kRLyIyt@UQ RoWTG9002ovPDHLkV1j^I$i)Bv diff --git a/Icons/W-mana.png b/Icons/W-mana.png deleted file mode 100755 index d5344420a675cb6429b13a24f2b3c76353e4593e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0gFjQK~yMHWB3mR zfB*b>_v`1wPoJ)BSU(5I0CItX5IH6W2B5m%w{IQ)`{(VCpI-t4Gv0sr`2YVeAousL z$3Q8d0-&OQe||rkFmcYM%QwG${qgJf@4o)|uV23_E@|uNoO<)d37`T-ps_$rcJ`51 zuidt>G2!Oo{QUW=o}R{xnaj3rnPXvYz|11d^zZLypn)6K&xnZd`SkJg&RvI(9X|&| z%F1#)JX~MDegi6C+__^3BO_y5$8;_(&O?Vz0X0B?lcVLW+xJC9g|=>)%Vcbk|F^H-fp(dh>jR~M7O}7}PoJ?YIi(V4Bv1hpGc*6ad(Y=DSmWVt zS6QC%_U-%Euiq}5-?e|=QYk4hMn+bk0#Jzm`}gbD&j&w$+y(|Zx{_Pe@wEX`M0ASey%ctV(wg3PC07*qoM6N<$f@MnT%m4rY diff --git a/Icons/X-mana.png b/Icons/X-mana.png deleted file mode 100755 index 6882f4997c0254a7076de45443d7b15fd67fe4d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XP1MP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0bNN%K~yMHWBmXB zKLZ29zkh$*dQ=KsFZ_x4Df2J39x%-@kv(o;;iwAIrnbucV~BY~h^K$M$=Bd5VaLRh5@qzjOwu zfCXp^Gb2NOcAA8^*zEaBI5|04Sy<#`rGxyvjScmIwu2O;B*gsr^BZWmj+Vyr7cUnr zTgAf6EG{N$V`Tvp1cE=me=$K^3IRp=nL>gBE7ojqw6}o@F)#oXFhQAM@b2AvB}Mt) zzkg4hHXAAg224QTLReqEex18uXZr-^E yQ~(N0U@+dlbrsnM5CGJysHP1JOd_I%fdK%2uA@Lr(i5)$0000k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@8Z10r978mMlmGnxZ_mtpcz=C;{Qin>@7}(i zZ@-Um=Np+Ar$dVt2?hE1oN>_exOiUvzWzMxpP!HOPcX5T*4BP~J^%i{|G&>4Jh(DF z<=DA{CqI0DKYz8jzq@PO=MSHxB_wp>ZQkEG>Adr%q(h!dg+>6^iUvz<+oy+jn}>;| zou9wI=G&iCryLb-?#&w}Jea-xeU`TOzkfdupE+`drG)*0n8Jzkp1;4ozJA7%``_RH z`x8EX+O#O9!y)Mt%tg%LImy11voJ8vH!-_E-G;Bzk4409eE@z@y>dGF@vG z)gwobx|rwQWfWxeVia{?{`_w3Y6l@DMs^3$Q(3nhCUs;aCNMDEQtE4NSTh$CuneBA KelF{r5}E+(F0DKO diff --git a/Icons/chaos-symbol.png b/Icons/chaos-symbol.png deleted file mode 100755 index 7fc2f3cd2cb30a9d417d80695f7d2fb2c8ea2969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nQq*p`!;Y()HZwbUs8b(!hxgw1eR;pfPuMcyKiD3a)HG&4Wbyk{ zg1dHdbMO|~>n9gL9^A~yv1Ol~zyTik{Ws%lHaofcr)pL$=x$I=n)ZEO-=p$Um zJ30nF&dqS7J>j%!{u*x0Dzs+5g^GpA1?%d#V_v9z?zv7_xo zqY>)sBQ!Kb8F}y!u~;misw&lLmB&w>lAm9&opQNPyqkW{v>Am$k;LIP)+_6XdP%n( zS653k?%Ru|O>zCkAnE>#Bob|WUi@M{)^BT6RY9^=(I%&ChhVS{MNtq0!CX<|Ky1Gq z7KUNq^ZO7_Bs&=zxOWs&bMu#Z zjS5y--r+`)B&Snjd%zNY|GG@^$2Tf#hTU{4Ds{U<> 0: - jcards = json_srcs[json_cardname] - - # look for a normal rarity version, in a set we can use - idx = 0 - card = cardlib.Card(jcards[idx], fmt_ordered = decode_fields) - while (idx < len(jcards) - and (card.rarity == utils.rarity_special_marker - or exclude_sets(jcards[idx][utils.json_field_set_name]))): - idx += 1 - if idx < len(jcards): - card = cardlib.Card(jcards[idx], fmt_ordered = decode_fields) - # if there isn't one, settle with index 0 - if idx >= len(jcards): - idx = 0 - card = cardlib.Card(jcards[idx], fmt_ordered = decode_fields) - # we could go back and look for a card satisfying one of the criteria, - # but eh - - if card.valid: - valid += 1 - elif card.parsed: - invalid += 1 - else: - unparsed += 1 - cards += [card] - - # fall back to opening a normal encoded file - else: - if verbose: - print 'Opening encoded card file: ' + fname - with open(fname, 'rt') as f: - text = f.read() - for card_src in text.split(utils.cardsep): - if card_src: - card = cardlib.Card(card_src, fmt_ordered = decode_fields) - if card.valid: - valid += 1 - elif card.parsed: - invalid += 1 - else: - unparsed += 1 - cards += [card] - - if verbose: - print (str(valid) + ' valid, ' + str(invalid) + ' invalid, ' - + str(unparsed) + ' failed to parse.') - - good_count = 0 - bad_count = 0 - for card in cards: - if not card.parsed and not card.text.text: - bad_count += 1 - else: - good_count += 1 - if good_count + bad_count > 15: - break - # random heuristic - if bad_count > 10: - print 'Saw a bunch of unparsed cards with no text:' - print 'If this is a legacy format, try rerunning with --norarity' + cards = jdecode.mtg_open_file(fname, verbose=verbose, fmt_ordered=fmt_ordered) if creativity: cbow = CBOW() @@ -113,11 +53,11 @@ def main(fname, oname = None, verbose = True, if for_mse: # have to prepend a massive chunk of formatting info writer.write(utils.mse_prepend) - + if for_html: # have to preapend html info - writer.write(utils.html_preapend) - + writer.write(utils.html_prepend) + for card in cards: if for_mse: writer.write(card.to_mse().encode('utf-8')) @@ -128,7 +68,7 @@ def main(fname, oname = None, verbose = True, fstring += 'raw:\n' + card.raw + '\n' fstring += '\n' fstring += card.format(gatherer = gatherer, for_forum = for_forum, - vdump = vdump, for_html = for_html) + vdump = vdump) fstring = fstring.replace('<', '(').replace('>', ')') writer.write(('\n' + fstring[:-1]).replace('\n', '\n\t\t')) else: @@ -160,12 +100,15 @@ def main(fname, oname = None, verbose = True, if for_mse: # more formatting info writer.write('version control:\n\ttype: none\napprentice code: ') - if for_html: # closing the html file - writer.write(utils.html_postapend) + writer.write(utils.html_append) if oname: + if for_html: + print oname + # if ('.html' != oname[-]) + # oname += '.html' if verbose: print 'Writing output to: ' + oname with open(oname, 'w') as ofile: @@ -186,8 +129,6 @@ def main(fname, oname = None, verbose = True, print 'Made an MSE set file called ' + oname + '.mse-set.' # The set file is useless outside the .mse-set, delete it. os.remove('set') - if for_html: - ## not sure what to put here else: writecards(sys.stdout) sys.stdout.flush() @@ -201,6 +142,10 @@ if __name__ == '__main__': help='encoded card file or json corpus to encode') parser.add_argument('outfile', nargs='?', default=None, help='output file, defaults to stdout') + parser.add_argument('-e', '--encoding', default='std', choices=utils.formats, + #help='{' + ','.join(formats) + '}', + help='encoding format to use', + ) parser.add_argument('-g', '--gatherer', action='store_true', help='emulate Gatherer visual spoiler') parser.add_argument('-f', '--forum', action='store_true', @@ -209,16 +154,13 @@ if __name__ == '__main__': help='use CBOW fuzzy matching to check creativity of cards') parser.add_argument('-d', '--dump', action='store_true', help='dump out lots of information about invalid cards') - parser.add_argument('--norarity', action='store_true', - help='the card format has no rarity field; use for legacy input') parser.add_argument('-v', '--verbose', action='store_true', help='verbose output') - parser.add_argument('-mse', '--mse', action='store_true', + parser.add_argument('-mse', '--mse', action='store_true', help='use Magic Set Editor 2 encoding; will output as .mse-set file') parser.add_argument('-html', '--html', action='store_true', help='create a .html file with pretty forum formatting') - args = parser.parse_args() - main(args.infile, args.outfile, verbose = args.verbose, + main(args.infile, args.outfile, verbose = args.verbose, encoding = args.encoding, gatherer = args.gatherer, for_forum = args.forum, for_mse = args.mse, - creativity = args.creativity, norarity = args.norarity, vdump = args.dump, for_html = args.for_html) + creativity = args.creativity, vdump = args.dump, for_html = args.html) exit(0) diff --git a/encode.py b/encode.py index da8520f..e2996f8 100755 --- a/encode.py +++ b/encode.py @@ -10,131 +10,55 @@ import utils import jdecode import cardlib -def exclude_sets(cardset): - return cardset == 'Unglued' or cardset == 'Unhinged' or cardset == 'Celebration' - -def exclude_types(cardtype): - return cardtype in ['conspiracy'] - -def exclude_layouts(layout): - return layout in ['token', 'plane', 'scheme', 'phenomenon', 'vanguard'] - -def main(fname, oname = None, verbose = True, dupes = 0, encoding = 'std', stable = False): +def main(fname, oname = None, verbose = True, encoding = 'std', + nolinetrans = False, randomize = False, nolabel = False, stable = False): fmt_ordered = cardlib.fmt_ordered_default - fmt_labeled = None + fmt_labeled = None if nolabel else cardlib.fmt_labeled_default fieldsep = utils.fieldsep + line_transformations = not nolinetrans randomize_fields = False - randomize_mana = False + randomize_mana = randomize initial_sep = True final_sep = True # set the properties of the encoding - if encoding in ['vec']: + + if encoding in ['std']: pass - elif encoding in ['std']: - if dupes == 0: - dupes = 1 - elif encoding in ['rmana']: - if dupes == 0: - dupes = 1 - randomize_mana = True - elif encoding in ['rmana_dual']: - if dupes == 0: - dupes = 1 - fmt_ordered = fmt_ordered + [cardlib.field_cost] - randomize_mana = True + elif encoding in ['named']: + fmt_ordered = cardlib.fmt_ordered_named + elif encoding in ['noname']: + fmt_ordered = cardlib.fmt_ordered_noname elif encoding in ['rfields']: - if dupes == 0: - dupes = 1 - fmt_labeled = cardlib.fmt_labeled_default randomize_fields = True - #randomize_mana = True final_sep = False + elif encoding in ['old']: + fmt_ordered = cardlib.fmt_ordered_old + elif encoding in ['norarity']: + fmt_ordered = cardlib.fmt_ordered_norarity + elif encoding in ['vec']: + pass + elif encoding in ['custom']: + ## put custom format decisions here ########################## + + ## end of custom format ###################################### + pass else: raise ValueError('encode.py: unknown encoding: ' + encoding) - if dupes <= 0: - dupes = 1 - if verbose: print 'Preparing to encode:' print ' Using encoding ' + repr(encoding) - if dupes > 1: - print ' Duplicating each card ' + str(dupes) + ' times.' if stable: print ' NOT randomizing order of cards.' - + if randomize_mana: + print ' Randomizing order of symobls in manacosts.' + if not fmt_labeled: + print ' NOT labeling fields for this run (may be harder to decode).' + if not line_transformations: + print ' NOT using line reordering transformations' - cards = [] - valid = 0 - skipped = 0 - invalid = 0 - unparsed = 0 - - if fname[-5:] == '.json': - if verbose: - print 'This looks like a json file: ' + fname - json_srcs = jdecode.mtg_open_json(fname, verbose) - # don't worry we randomize later - for json_cardname in sorted(json_srcs): - if len(json_srcs[json_cardname]) > 0: - jcards = json_srcs[json_cardname] - - # look for a normal rarity version, in a set we can use - idx = 0 - card = cardlib.Card(jcards[idx]) - while (idx < len(jcards) - and (card.rarity == utils.rarity_special_marker - or exclude_sets(jcards[idx][utils.json_field_set_name]))): - idx += 1 - if idx < len(jcards): - card = cardlib.Card(jcards[idx]) - # if there isn't one, settle with index 0 - if idx >= len(jcards): - idx = 0 - card = cardlib.Card(jcards[idx]) - # we could go back and look for a card satisfying one of the criteria, - # but eh - - skip = False - if (exclude_sets(jcards[idx][utils.json_field_set_name]) - or exclude_layouts(jcards[idx]['layout'])): - skip = True - for cardtype in card.types: - if exclude_types(cardtype): - skip = True - if skip: - skipped += 1 - continue - - if card.valid: - valid += 1 - cards += [card] * dupes - elif card.parsed: - invalid += 1 - else: - unparsed += 1 - - # fall back to opening a normal encoded file - else: - if verbose: - print 'Opening encoded card file: ' + fname - with open(fname, 'rt') as f: - text = f.read() - for card_src in text.split(utils.cardsep): - if card_src: - card = cardlib.Card(card_src) - if card.valid: - valid += 1 - cards += [card] * dupes - elif card.parsed: - invalid += 1 - else: - unparsed += 1 - - if verbose: - print (str(valid) + ' valid, ' + str(skipped) + ' skipped, ' - + str(invalid) + ' invalid, ' + str(unparsed) + ' failed to parse.') + cards = jdecode.mtg_open_file(fname, verbose=verbose, linetrans=line_transformations) # This should give a random but consistent ordering, to make comparing changes # between the output of different versions easier. @@ -174,17 +98,23 @@ if __name__ == '__main__': help='encoded card file or json corpus to encode') parser.add_argument('outfile', nargs='?', default=None, help='output file, defaults to stdout') - parser.add_argument('-d', '--duplicate', metavar='N', type=int, default=0, - help='number of times to duplicate each card') - parser.add_argument('-e', '--encoding', default='std', - choices=['std', 'rmana', 'rmana_dual', 'rfields', 'vec']) + parser.add_argument('-e', '--encoding', default='std', choices=utils.formats, + #help='{' + ','.join(formats) + '}', + help='encoding format to use', + ) + parser.add_argument('-r', '--randomize', action='store_true', + help='randomize the order of symbols in mana costs') + parser.add_argument('--nolinetrans', action='store_true', + help="don't reorder lines of card text") + parser.add_argument('--nolabel', action='store_true', + help="don't label fields") parser.add_argument('-s', '--stable', action='store_true', help="don't randomize the order of the cards") parser.add_argument('-v', '--verbose', action='store_true', help='verbose output') args = parser.parse_args() - main(args.infile, args.outfile, verbose = args.verbose, dupes = args.duplicate, - encoding = args.encoding, stable = args.stable) + main(args.infile, args.outfile, verbose = args.verbose, encoding = args.encoding, + nolinetrans = args.nolinetrans, randomize = args.randomize, nolabel = args.nolabel, + stable = args.stable) exit(0) - diff --git a/lib/cardlib.py b/lib/cardlib.py index 75dca7f..c452285 100644 --- a/lib/cardlib.py +++ b/lib/cardlib.py @@ -88,7 +88,8 @@ fieldnames = [ field_text, ] -fmt_ordered_default = [ +# legacy +fmt_ordered_old = [ field_name, field_supertypes, field_types, @@ -99,6 +100,52 @@ fmt_ordered_default = [ field_cost, field_text, ] +fmt_ordered_norarity = [ + field_name, + field_supertypes, + field_types, + field_loyalty, + field_subtypes, + field_pt, + field_cost, + field_text, +] + +# standard +fmt_ordered_default = [ + field_types, + field_supertypes, + field_subtypes, + field_loyalty, + field_pt, + field_text, + field_cost, + field_rarity, + field_name, +] + +# minor variations +fmt_ordered_noname = [ + field_types, + field_supertypes, + field_subtypes, + field_loyalty, + field_pt, + field_text, + field_cost, + field_rarity, +] +fmt_ordered_named = [ + field_name, + field_types, + field_supertypes, + field_subtypes, + field_loyalty, + field_pt, + field_text, + field_cost, + field_rarity, +] fmt_labeled_default = { field_name : field_label_name, @@ -176,7 +223,7 @@ def fields_check_valid(fields): # releaseDate - string # starter - boolean -def fields_from_json(src_json): +def fields_from_json(src_json, linetrans = True): parsed = True valid = True fields = {} @@ -254,6 +301,8 @@ def fields_from_json(src_json): text_val = transforms.text_pass_8_equip(text_val) text_val = transforms.text_pass_9_newlines(text_val) text_val = transforms.text_pass_10_symbols(text_val) + if linetrans: + text_val = transforms.text_pass_11_linetrans(text_val) text_val = utils.to_ascii(text_val) text_val = text_val.strip() mtext = Manatext(text_val, fmt = 'json') @@ -340,9 +389,7 @@ def fields_from_format(src_text, fmt_ordered, fmt_labeled, fieldsep): class Card: '''card representation with data''' - def __init__(self, src, fmt_ordered = fmt_ordered_default, - fmt_labeled = fmt_labeled_default, - fieldsep = utils.fieldsep): + def __init__(self, src, fmt_ordered = fmt_ordered_default, fmt_labeled = fmt_labeled_default, fieldsep = utils.fieldsep, linetrans = True): # source fields, exactly one will be set self.json = None self.raw = None @@ -378,8 +425,9 @@ class Card: self.bside = Card(src[utils.json_field_bside], fmt_ordered = fmt_ordered, fmt_labeled = fmt_labeled, - fieldsep = fieldsep) - p_success, v_success, parsed_fields = fields_from_json(src) + fieldsep = fieldsep, + linetrans = linetrans) + p_success, v_success, parsed_fields = fields_from_json(src, linetrans = linetrans) self.parsed = p_success self.valid = v_success self.fields = parsed_fields @@ -391,7 +439,8 @@ class Card: self.bside = Card(utils.bsidesep.join(sides[1:]), fmt_ordered = fmt_ordered, fmt_labeled = fmt_labeled, - fieldsep = fieldsep) + fieldsep = fieldsep, + linetrans = linetrans) p_success, v_success, parsed_fields = fields_from_format(sides[0], fmt_ordered, fmt_labeled, fieldsep) self.parsed = p_success @@ -503,10 +552,7 @@ class Card: # the NN representation, use str() or format() for output intended for human # readers. - def encode(self, fmt_ordered = fmt_ordered_default, - fmt_labeled = None, fieldsep = utils.fieldsep, - randomize_fields = False, randomize_mana = False, - initial_sep = True, final_sep = True): + def encode(self, fmt_ordered = fmt_ordered_default, fmt_labeled = None, fieldsep = utils.fieldsep, randomize_fields = False, randomize_mana = False, initial_sep = True, final_sep = True): outfields = [] for field in fmt_ordered: @@ -608,7 +654,7 @@ class Card: mtext = transforms.text_unpass_2_counters(mtext) #mtext = transforms.text_unpass_3_uncast(mtext) mtext = transforms.text_unpass_4_unary(mtext) - mtext = transforms.text_unpass_5_symbols(mtext, for_forum) + mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html) mtext = sentencecase(mtext) mtext = transforms.text_unpass_6_cardname(mtext, cardname) mtext = transforms.text_unpass_7_newlines(mtext) @@ -638,25 +684,27 @@ class Card: outstr += '
' cardname = self.__dict__[field_name] #cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name]) - outstr += "
" + cardname + "
" + if vdump and not cardname: + cardname = '_NONAME_' + outstr += cardname + ' ' + + coststr = self.__dict__[field_cost].format(for_html = for_html) + if vdump or not coststr == '_NOCOST_': + outstr += coststr + outstr += '
' + if self.__dict__[field_rarity]: if self.__dict__[field_rarity] in utils.json_rarity_unmap: rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]] else: rarity = self.__dict__[field_rarity] - outstr += ' (' + rarity.lower() + ')' - outstr += '\n' - - # I need the simple formatting with '{' - coststr = self.__dict__[field_cost].format() - if vdump or not coststr == '_NOCOST_': - outstr += coststr.replace("/","-").replace("{",'') - outstr += '\n' + outstr += ' (' + rarity.lower() + ') ' + outstr += '\n
' - outstr += ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types]) + outstr += ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types]) if self.__dict__[field_subtypes]: outstr += ' ' + utils.dash_marker + ' ' + ' '.join(self.__dict__[field_subtypes]) - outstr += '\n' + outstr += '
\n' if self.__dict__[field_text].text: mtext = self.__dict__[field_text].text @@ -664,17 +712,17 @@ class Card: #mtext = transforms.text_unpass_2_counters(mtext) #mtext = transforms.text_unpass_3_uncast(mtext) mtext = transforms.text_unpass_4_unary(mtext) - mtext = transforms.text_unpass_5_symbols(mtext, for_forum) + mtext = transforms.text_unpass_5_symbols(mtext,for_forum, for_html) #mtext = transforms.text_unpass_6_cardname(mtext, cardname) - mtext = transforms.text_unpass_7_newlines(mtext) + mtext = transforms.text_unpass_7_newlines(mtext).replace("\n", "
") #mtext = transforms.text_unpass_8_unicode(mtext) newtext = Manatext('') newtext.text = mtext newtext.costs = self.__dict__[field_text].costs - outstr += newtext.format().replace("/","-").replace("{",'') + '\n' + outstr += newtext.format(for_html = for_html) + '\n' if self.__dict__[field_pt]: - outstr += '(' + utils.from_unary(self.__dict__[field_pt]) + ')' + outstr += '
(' + utils.from_unary(self.__dict__[field_pt]) + ')
' outstr += '\n' if self.__dict__[field_loyalty]: @@ -687,7 +735,6 @@ class Card: for idx, value in self.__dict__[field_other]: outstr += '<' + str(idx) + '> ' + str(value) outstr += '\n' - else: cardname = self.__dict__[field_name] #cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name]) @@ -723,7 +770,7 @@ class Card: #mtext = transforms.text_unpass_2_counters(mtext) #mtext = transforms.text_unpass_3_uncast(mtext) mtext = transforms.text_unpass_4_unary(mtext) - mtext = transforms.text_unpass_5_symbols(mtext, for_forum) + mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html) #mtext = transforms.text_unpass_6_cardname(mtext, cardname) mtext = transforms.text_unpass_7_newlines(mtext) #mtext = transforms.text_unpass_8_unicode(mtext) @@ -749,11 +796,12 @@ class Card: if self.bside: if for_html: - outstr += "
\n" + outstr += "

\n" else: outstr += utils.dash_marker * 8 + '\n' - outstr += self.bside.format(gatherer = gatherer, for_forum = for_forum) - + outstr += self.bside.format(gatherer = gatherer, for_forum = for_forum, for_html = for_html) + if for_html: + outstr += "
" return outstr def to_mse(self, print_raw = False, vdump = False): @@ -794,7 +842,7 @@ class Card: mtext = transforms.text_unpass_2_counters(mtext) mtext = transforms.text_unpass_3_uncast(mtext) mtext = transforms.text_unpass_4_unary(mtext) - mtext = transforms.text_unpass_5_symbols(mtext, False) + mtext = transforms.text_unpass_5_symbols(mtext, False, False) mtext = sentencecase(mtext) # I don't really want these MSE specific passes in transforms, # but they could be pulled out separately somewhere else in here. @@ -861,7 +909,7 @@ class Card: mtext2 = transforms.text_unpass_2_counters(mtext2) mtext2 = transforms.text_unpass_3_uncast(mtext2) mtext2 = transforms.text_unpass_4_unary(mtext2) - mtext2 = transforms.text_unpass_5_symbols(mtext2, False) + mtext2 = transforms.text_unpass_5_symbols(mtext2, False, False) mtext2 = sentencecase(mtext2) mtext2 = mtext2.replace(utils.this_marker, '' + utils.this_marker + '') diff --git a/lib/jdecode.py b/lib/jdecode.py index ca66f86..fa2d3f7 100644 --- a/lib/jdecode.py +++ b/lib/jdecode.py @@ -1,6 +1,7 @@ import json -import config +import utils +import cardlib def mtg_open_json(fname, verbose = False): @@ -16,7 +17,7 @@ def mtg_open_json(fname, verbose = False): setname = set['name'] for card in set['cards']: - card[config.json_field_set_name] = setname + card[utils.json_field_set_name] = setname cardnumber = None if 'number' in card: @@ -48,7 +49,7 @@ def mtg_open_json(fname, verbose = False): if aside_uid in asides: # the second check handles the brothers yamazaki edge case if not asides[aside_uid]['name'] == bsides[uid]['name']: - asides[aside_uid][config.json_field_bside] = bsides[uid] + asides[aside_uid][utils.json_field_bside] = bsides[uid] else: pass # this exposes some coldsnap theme deck bsides that aren't @@ -59,3 +60,109 @@ def mtg_open_json(fname, verbose = False): if verbose: print 'Opened ' + str(len(allcards)) + ' uniquely named cards.' return allcards + +# filters to ignore some undesirable cards, only used when opening json +def default_exclude_sets(cardset): + return cardset == 'Unglued' or cardset == 'Unhinged' or cardset == 'Celebration' + +def default_exclude_types(cardtype): + return cardtype in ['conspiracy'] + +def default_exclude_layouts(layout): + return layout in ['token', 'plane', 'scheme', 'phenomenon', 'vanguard'] + +# centralized logic for opening files of cards, either encoded or json +def mtg_open_file(fname, verbose = False, + linetrans = True, fmt_ordered = cardlib.fmt_ordered_default, + exclude_sets = default_exclude_sets, + exclude_types = default_exclude_types, + exclude_layouts = default_exclude_layouts): + + cards = [] + valid = 0 + skipped = 0 + invalid = 0 + unparsed = 0 + + if fname[-5:] == '.json': + if verbose: + print 'This looks like a json file: ' + fname + json_srcs = mtg_open_json(fname, verbose) + # sorted for stability + for json_cardname in sorted(json_srcs): + if len(json_srcs[json_cardname]) > 0: + jcards = json_srcs[json_cardname] + + # look for a normal rarity version, in a set we can use + idx = 0 + card = cardlib.Card(jcards[idx], linetrans=linetrans) + while (idx < len(jcards) + and (card.rarity == utils.rarity_special_marker + or exclude_sets(jcards[idx][utils.json_field_set_name]))): + idx += 1 + if idx < len(jcards): + card = cardlib.Card(jcards[idx], linetrans=linetrans) + # if there isn't one, settle with index 0 + if idx >= len(jcards): + idx = 0 + card = cardlib.Card(jcards[idx], linetrans=linetrans) + # we could go back and look for a card satisfying one of the criteria, + # but eh + + skip = False + if (exclude_sets(jcards[idx][utils.json_field_set_name]) + or exclude_layouts(jcards[idx]['layout'])): + skip = True + for cardtype in card.types: + if exclude_types(cardtype): + skip = True + if skip: + skipped += 1 + continue + + if card.valid: + valid += 1 + cards += [card] + elif card.parsed: + invalid += 1 + else: + unparsed += 1 + + # fall back to opening a normal encoded file + else: + if verbose: + print 'Opening encoded card file: ' + fname + with open(fname, 'rt') as f: + text = f.read() + for card_src in text.split(utils.cardsep): + if card_src: + card = cardlib.Card(card_src, fmt_ordered=fmt_ordered) + if card.valid: + valid += 1 + cards += [card] + elif card.parsed: + invalid += 1 + else: + unparsed += 1 + + if verbose: + print (str(valid) + ' valid, ' + str(skipped) + ' skipped, ' + + str(invalid) + ' invalid, ' + str(unparsed) + ' failed to parse.') + + good_count = 0 + bad_count = 0 + for card in cards: + if not card.parsed and not card.text.text: + bad_count += 1 + elif len(card.name) > 50 or len(card.rarity) > 3: + bad_count += 1 + else: + good_count += 1 + if good_count + bad_count > 15: + break + # random heuristic + if bad_count > 10: + print 'WARNING: Saw a bunch of unparsed cards:' + print ' Is this a legacy format, you may need to specify the field order.' + + return cards diff --git a/lib/manalib.py b/lib/manalib.py index 688f3f2..7875b33 100644 --- a/lib/manalib.py +++ b/lib/manalib.py @@ -108,12 +108,13 @@ class Manacost: return utils.mana_untranslate(utils.mana_open_delimiter + ''.join(self.sequence) + utils.mana_close_delimiter) - def format(self, for_forum = False): + def format(self, for_forum = False, for_html = False): if self.none: return '_NOCOST_' + else: return utils.mana_untranslate(utils.mana_open_delimiter + ''.join(self.sequence) - + utils.mana_close_delimiter, for_forum) + + utils.mana_close_delimiter, for_forum, for_html) def encode(self, randomize = False): if self.none: @@ -177,10 +178,10 @@ class Manatext: text = text.replace(utils.reserved_mana_marker, str(cost), 1) return text - def format(self, for_forum = False): + def format(self, for_forum = False, for_html = False): text = self.text for cost in self.costs: - text = text.replace(utils.reserved_mana_marker, cost.format(for_forum = for_forum), 1) + text = text.replace(utils.reserved_mana_marker, cost.format(for_forum = for_forum, for_html = for_html), 1) return text def encode(self, randomize = False): diff --git a/lib/transforms.py b/lib/transforms.py index f696150..319955c 100644 --- a/lib/transforms.py +++ b/lib/transforms.py @@ -399,13 +399,55 @@ def text_pass_8_equip(s): def text_pass_9_newlines(s): - return s.replace('\n', '\\') + return s.replace('\n', utils.newline) def text_pass_10_symbols(s): return utils.to_symbols(s) +# reorder the lines of text into a canonical form: +# first enchant and equip +# then other keywords, one per line (things with no period on the end) +# then other abilities +# then kicker and countertype last of all +def text_pass_11_linetrans(s): + # let's just not deal with level up + if 'level up' in s: + return s + + prelines = [] + keylines = [] + mainlines = [] + postlines = [] + + lines = s.split(utils.newline) + for line in lines: + if not '.' in line: + # because this is inconsistent + line = line.replace(';', ',') + sublines = line.split(',') + for subline in sublines: + if 'equip' in subline or 'enchant' in subline: + prelines += [subline.strip()] + elif 'countertype' in subline or 'kicker' in subline: + postlines += [subline.strip()] + else: + keylines += [subline.strip()] + elif u'\u2014' in line and not u' \u2014 ' in line: + if 'equip' in line or 'enchant' in line: + prelines += [line.strip()] + elif 'countertype' in line or 'kicker' in line: + postlines += [line.strip()] + else: + keylines += [line.strip()] + else: + mainlines += [line.strip()] + + alllines = prelines + keylines + mainlines + postlines + return utils.newline.join(alllines) + + # Text unpasses, for decoding. All assume the text inside a Manatext, so don't do anything # weird with the mana cost symbol. @@ -473,8 +515,8 @@ def text_unpass_4_unary(s): return utils.from_unary(s) -def text_unpass_5_symbols(s, for_forum): - return utils.from_symbols(s, for_forum = for_forum) +def text_unpass_5_symbols(s, for_forum, for_html): + return utils.from_symbols(s, for_forum = for_forum, for_html = for_html) def text_unpass_6_cardname(s, name): diff --git a/lib/utils.py b/lib/utils.py index f0063c7..81e9bb9 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -10,9 +10,20 @@ import config mse_prepend = 'mse version: 0.3.8\ngame: magic\nstylesheet: m15\nset info:\n\tsymbol:\nstyling:\n\tmagic-m15:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay:\n\tmagic-m15-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-extra-improved:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\tpt box symbols: magic-pt-symbols-extra.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-planeswalker:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-planeswalker-promo-black:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-promo-dka:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-token-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-4abil:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-promo-black:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n' # special chunk of text to start an HTML document. -box_height = 400 -html_preapend = "\n\n\n" -html_postapend = "" +box_height = 350 +html_prepend = "\n\n\n" +html_append = "\n/body>\n" +# encoding formats we know about +formats = [ + 'std', + 'named', + 'noname', + 'rfields', + 'old', + 'norarity', + 'vec', + 'custom', +] # separators cardsep = config.cardsep @@ -129,6 +140,9 @@ mana_json_close_delimiter = mana_close_delimiter mana_json_hybrid_delimiter = '/' mana_forum_open_delimiter = '[mana]' mana_forum_close_delimiter = '[/mana]' +mana_html_open_delimiter = "" +mana_html_hybrid_delimiter = '-' mana_unary_marker = '' # if the same as unary_marker, from_unary WILL replace numbers in mana costs mana_unary_counter = unary_counter @@ -379,7 +393,7 @@ def mana_translate(jmanastr): # convert an encoded mana string back to json mana_symlen_min = min([len(sym) for sym in mana_symall_decode]) mana_symlen_max = max([len(sym) for sym in mana_symall_decode]) -def mana_untranslate(manastr, for_forum = False): +def mana_untranslate(manastr, for_forum = False, for_html = False): inner = manastr[1:-1] jmanastr = '' colorless_total = 0 @@ -399,6 +413,12 @@ def mana_untranslate(manastr, for_forum = False): idx += symlen if for_forum: jmanastr = jmanastr + mana_decode_direct_forum(sym) + if for_html: + jmanastr = jmanastr + mana_decode_direct(sym) + jmanastr = jmanastr.replace(mana_open_delimiter, mana_html_open_delimiter) + jmanastr = jmanastr.replace(mana_close_delimiter, mana_html_close_delimiter) + jmanastr = jmanastr.replace(mana_open_delimiter, mana_html_open_delimiter) + jmanastr = jmanastr.replace(mana_json_hybrid_delimiter, mana_html_hybrid_delimiter) else: jmanastr = jmanastr + mana_decode_direct(sym) break @@ -412,6 +432,13 @@ def mana_untranslate(manastr, for_forum = False): return (mana_forum_open_delimiter + ('' if colorless_total == 0 else str(colorless_total)) + jmanastr + mana_forum_close_delimiter) + if for_html: + if jmanastr == '': + return mana_html_open_delimiter + str(colorless_total) + mana_html_close_delimiter + else: + return (mana_html_open_delimiter + ('' if colorless_total == 0 + else str(colorless_total)) + + mana_html_close_delimiter + jmanastr) else: if jmanastr == '': return mana_json_open_delimiter + str(colorless_total) + mana_json_close_delimiter @@ -457,6 +484,11 @@ symbol_forum_trans = { tap_marker : mana_forum_open_delimiter + json_symbol_tap + mana_forum_close_delimiter, untap_marker : mana_forum_open_delimiter + json_symbol_untap + mana_forum_close_delimiter, } +symbol_html_trans = { + tap_marker : mana_html_open_delimiter + json_symbol_tap + mana_html_close_delimiter, + untap_marker : mana_html_open_delimiter + json_symbol_untap + mana_html_close_delimiter, +} + json_symbol_regex = (re.escape(mana_json_open_delimiter) + '[' + json_symbol_tap + json_symbol_tap.lower() + json_symbol_untap + json_symbol_untap.lower() @@ -469,7 +501,7 @@ def to_symbols(s): s = s.replace(jsymstr, json_symbol_trans[jsymstr]) return s -def from_symbols(s, for_forum = False): +def from_symbols(s, for_forum = False, for_html = False): symstrs = re.findall(symbol_regex, s) #for symstr in sorted(symstrs, lambda x,y: cmp(len(x), len(y)), reverse = True): # We have to do the right thing here, because the thing we replace exists in the thing @@ -477,6 +509,8 @@ def from_symbols(s, for_forum = False): for symstr in set(symstrs): if for_forum: s = s.replace(symstr, symbol_forum_trans[symstr]) + elif for_html: + s = s.replace(symstr, symbol_html_trans[symstr]) else: s = s.replace(symstr, symbol_trans[symstr]) return s