From a64b6b0e9ac52e9f2dfb8533b900c11cecd337a3 Mon Sep 17 00:00:00 2001 From: Sergey Kalinin Date: Tue, 13 Feb 2018 13:23:40 +0300 Subject: [PATCH] Added gray theme Fixed work with file from directory but not project. --- img/.xvpics/caml.gif | Bin 211 -> 0 bytes img/.xvpics/fortran.gif | Bin 211 -> 0 bytes img/.xvpics/perl.gif | Bin 211 -> 0 bytes img/.xvpics/tcl.gif | 5 - img/.xvpics/tk.gif | Bin 212 -> 0 bytes img/archive.png | Bin 1534 -> 820 bytes img/close.png | Bin 1657 -> 911 bytes img/{ => color}/archive.gif | Bin img/color/archive.png | Bin 0 -> 1534 bytes img/color/back.gif | Bin 0 -> 613 bytes img/color/books.gif | Bin 0 -> 113 bytes img/color/c.gif | Bin 0 -> 69 bytes img/color/caml.gif | Bin 0 -> 80 bytes img/color/class.gif | Bin 0 -> 79 bytes img/{ => color}/close.gif | Bin img/color/close.png | Bin 0 -> 1657 bytes img/color/color_selector.gif | Bin 0 -> 617 bytes img/{ => color}/copy.gif | Bin img/color/copy.png | Bin 0 -> 1623 bytes img/color/cpp.gif | Bin 0 -> 83 bytes img/{ => color}/cut.gif | Bin img/color/cut.png | Bin 0 -> 1895 bytes img/color/cvs_in.gif | Bin 0 -> 1179 bytes img/color/cvs_out.gif | Bin 0 -> 1180 bytes img/{ => color}/doit.gif | Bin img/color/doit.png | Bin 0 -> 1764 bytes img/{ => color}/doit_file.gif | Bin img/color/doit_file.png | Bin 0 -> 1764 bytes img/color/file.gif | Bin 0 -> 860 bytes img/color/folder.gif | Bin 0 -> 139 bytes img/color/font_selector.gif | Bin 0 -> 95 bytes img/color/fortran.gif | Bin 0 -> 80 bytes img/color/forward.gif | Bin 0 -> 625 bytes img/color/gtk-floppy.png | Bin 0 -> 1497 bytes img/color/gtk-revert-to-saved.png | Bin 0 -> 1799 bytes img/{ => color}/help.gif | Bin img/color/help.png | Bin 0 -> 1882 bytes img/color/html.gif | Bin 0 -> 543 bytes img/color/img.gif | Bin 0 -> 538 bytes img/color/java.gif | Bin 0 -> 67 bytes img/color/mytcladmin.gif | Bin 0 -> 5182 bytes img/{ => color}/new.gif | Bin img/color/new.png | Bin 0 -> 1594 bytes img/color/new_html.gif | Bin 0 -> 1788 bytes img/color/new_tcl.gif | Bin 0 -> 1844 bytes img/color/new_text.gif | Bin 0 -> 733 bytes img/color/new_tk.gif | Bin 0 -> 1643 bytes img/color/newfolder.gif | Bin 0 -> 685 bytes img/color/open.png | Bin 0 -> 1640 bytes img/color/openfold.gif | Bin 0 -> 146 bytes img/{ => color}/paste.gif | Bin img/color/paste.png | Bin 0 -> 1747 bytes img/color/perl.gif | Bin 0 -> 76 bytes img/color/php.gif | Bin 0 -> 568 bytes img/{ => color}/printer.gif | Bin img/color/printer.png | Bin 0 -> 1876 bytes img/color/proc.gif | Bin 0 -> 104 bytes img/color/projman.gif | Bin 0 -> 7122 bytes img/color/projman.png | Bin 0 -> 18193 bytes img/color/redo.png | Bin 0 -> 1884 bytes img/color/refresh.gif | Bin 0 -> 1106 bytes img/color/refresh.png | Bin 0 -> 1997 bytes img/color/rpm.gif | Bin 0 -> 317 bytes img/color/ruby.gif | Bin 0 -> 66 bytes img/color/rvt.gif | Bin 0 -> 536 bytes img/{ => color}/save.gif | Bin img/color/save.png | Bin 0 -> 1497 bytes img/{ => color}/save_all.gif | Bin img/color/save_all.png | Bin 0 -> 1543 bytes img/{ => color}/save_as.gif | Bin img/color/save_as.png | Bin 0 -> 1798 bytes img/color/tcl.gif | Bin 0 -> 70 bytes img/color/tcl_file.gif | Bin 0 -> 104 bytes img/color/tclhtml.gif | Bin 0 -> 561 bytes img/color/tex.gif | Bin 0 -> 66 bytes img/color/text.gif | Bin 0 -> 860 bytes img/color/tk.gif | Bin 0 -> 106 bytes img/color/tk_file.gif | Bin 0 -> 106 bytes img/color/top.gif | Bin 0 -> 1060 bytes img/color/undo.png | Bin 0 -> 1405 bytes img/color/xml.gif | Bin 0 -> 69 bytes img/copy.png | Bin 1623 -> 789 bytes img/cut.png | Bin 1895 -> 946 bytes img/doit.png | Bin 1764 -> 945 bytes img/doit_file.png | Bin 1764 -> 945 bytes img/folder.gif | Bin 139 -> 139 bytes img/gtk-floppy.png | Bin 1497 -> 791 bytes img/help.png | Bin 1882 -> 943 bytes img/new.png | Bin 1594 -> 784 bytes img/open.png | Bin 1640 -> 880 bytes img/openfold.gif | Bin 146 -> 109 bytes img/paste.png | Bin 1747 -> 891 bytes img/perl.gif | Bin 76 -> 855 bytes img/printer.png | Bin 1876 -> 952 bytes img/redo.png | Bin 1884 -> 1006 bytes img/refresh.png | Bin 1997 -> 976 bytes img/save.png | Bin 1497 -> 791 bytes img/save_all.png | Bin 1543 -> 834 bytes img/save_as.png | Bin 1798 -> 933 bytes img/tcl.gif | Bin 70 -> 64 bytes img/undo.png | Bin 1405 -> 835 bytes install.tcl | 3 + lib/editor.tcl | 25 +- lib/filedialog.tcl | 302 +++++ lib/main.tcl | 10 +- lib/pane.tcl | 1 + lib/procedure.tcl | 1 + lib/projects.tcl | 9 +- lib/tree.tcl | 18 +- projman.tcl | 10 +- tkregexp.tcl | 1951 +++++++++++++++-------------- 111 files changed, 1324 insertions(+), 1011 deletions(-) delete mode 100644 img/.xvpics/caml.gif delete mode 100644 img/.xvpics/fortran.gif delete mode 100644 img/.xvpics/perl.gif delete mode 100644 img/.xvpics/tcl.gif delete mode 100644 img/.xvpics/tk.gif rename img/{ => color}/archive.gif (100%) create mode 100644 img/color/archive.png create mode 100644 img/color/back.gif create mode 100644 img/color/books.gif create mode 100644 img/color/c.gif create mode 100644 img/color/caml.gif create mode 100644 img/color/class.gif rename img/{ => color}/close.gif (100%) create mode 100644 img/color/close.png create mode 100644 img/color/color_selector.gif rename img/{ => color}/copy.gif (100%) create mode 100644 img/color/copy.png create mode 100644 img/color/cpp.gif rename img/{ => color}/cut.gif (100%) create mode 100644 img/color/cut.png create mode 100644 img/color/cvs_in.gif create mode 100644 img/color/cvs_out.gif rename img/{ => color}/doit.gif (100%) create mode 100644 img/color/doit.png rename img/{ => color}/doit_file.gif (100%) create mode 100644 img/color/doit_file.png create mode 100644 img/color/file.gif create mode 100644 img/color/folder.gif create mode 100644 img/color/font_selector.gif create mode 100644 img/color/fortran.gif create mode 100644 img/color/forward.gif create mode 100644 img/color/gtk-floppy.png create mode 100644 img/color/gtk-revert-to-saved.png rename img/{ => color}/help.gif (100%) create mode 100644 img/color/help.png create mode 100644 img/color/html.gif create mode 100644 img/color/img.gif create mode 100644 img/color/java.gif create mode 100644 img/color/mytcladmin.gif rename img/{ => color}/new.gif (100%) create mode 100644 img/color/new.png create mode 100644 img/color/new_html.gif create mode 100644 img/color/new_tcl.gif create mode 100644 img/color/new_text.gif create mode 100644 img/color/new_tk.gif create mode 100644 img/color/newfolder.gif create mode 100644 img/color/open.png create mode 100644 img/color/openfold.gif rename img/{ => color}/paste.gif (100%) create mode 100644 img/color/paste.png create mode 100644 img/color/perl.gif create mode 100644 img/color/php.gif rename img/{ => color}/printer.gif (100%) create mode 100644 img/color/printer.png create mode 100644 img/color/proc.gif create mode 100644 img/color/projman.gif create mode 100644 img/color/projman.png create mode 100644 img/color/redo.png create mode 100644 img/color/refresh.gif create mode 100644 img/color/refresh.png create mode 100644 img/color/rpm.gif create mode 100644 img/color/ruby.gif create mode 100644 img/color/rvt.gif rename img/{ => color}/save.gif (100%) create mode 100644 img/color/save.png rename img/{ => color}/save_all.gif (100%) create mode 100644 img/color/save_all.png rename img/{ => color}/save_as.gif (100%) create mode 100644 img/color/save_as.png create mode 100644 img/color/tcl.gif create mode 100644 img/color/tcl_file.gif create mode 100644 img/color/tclhtml.gif create mode 100644 img/color/tex.gif create mode 100644 img/color/text.gif create mode 100644 img/color/tk.gif create mode 100644 img/color/tk_file.gif create mode 100644 img/color/top.gif create mode 100644 img/color/undo.png create mode 100644 img/color/xml.gif create mode 100644 lib/filedialog.tcl diff --git a/img/.xvpics/caml.gif b/img/.xvpics/caml.gif deleted file mode 100644 index f82dfa739aea0dafc1dc798cbeca63284258252b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmWGAS1>j<;!^hXb@%jh^S3fItS~fI@XSj|tw>E#(6BI2NUAJJE!N~xcJ*_K_jikT z_V@L5^$Q8+GBi{Gsx&e+YVJaAz5fdxR?Q{@2z!vP@D1T$|hU;rXy=Iw1j{s9oW zjl$f<;Hkpkc^fQxTgB5w^Y*rDAj58N+r7;NY8Wc>fTjyj!GZ%I2-LZ48v_K~1^|&a BP+9;0 diff --git a/img/.xvpics/fortran.gif b/img/.xvpics/fortran.gif deleted file mode 100644 index 6a87c1f0b99df856bb27aefa1ab40abb72bf6b1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmYMsF%H5Y6vlC8PC-%z*`!UQah2A*0cxUq6I0eMI@H^63Kkbm;lgG7s4)_TKQF(> zc_*5t<`vl!xqdikz34{JJo&{>Vzb|h+weD E4@#g^xc~qF diff --git a/img/.xvpics/perl.gif b/img/.xvpics/perl.gif deleted file mode 100644 index 7d57307e692fccec4c281a8d38427fdfd9e12c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmYk0F%H5o3`H~N6p=V^KaI@lt{VDgIQ4B?clVpLR~%$^b+mq9EiWBX>gLJ5QRBCHog`ZXE!cNa!y2(g_W5sdu}S&s FA3u2rQXl{T diff --git a/img/.xvpics/tcl.gif b/img/.xvpics/tcl.gif deleted file mode 100644 index 6b88597..0000000 --- a/img/.xvpics/tcl.gif +++ /dev/null @@ -1,5 +0,0 @@ -P7 332 -#IMGINFO:11x13 Indexed (70 bytes) -#END_OF_COMMENTS -11 13 255 -I$IIÛ¶¶¶IH%I$IIÛ¶¶¶IH%À À)Ö»Ö¶$IIIÀ)D»Ö»¶D)IÛ »Ö ÀÀ)Ö»¶Û »Ö I$IÛ¶¶Û¶¶¶À)DIÀ»¶Û¶¶¶ÀÀ )໶I$IIÛ¶¶¶À)HI$IIÛ¶¶¶À)HI$IIÛ¶¶¶ÀÀ I$IIÛ¶¶¶IH%Û¶¶¶I$IIÛ¶¶ \ No newline at end of file diff --git a/img/.xvpics/tk.gif b/img/.xvpics/tk.gif deleted file mode 100644 index 0dc4fbad3a262d36c689e0da6b5c09ce1e6c4d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmWGAS1>j<;!^hXb@%jh^S3fItS~fI@XSj|tw>E#&@ePGQ%I^TNiEjoQg-!oiT8Jl zclP)7b@dAg<}x%?04g;yHRWP}0Z$c%{}8}{#01LzKd|5cSOUoW4`Ka>G8X{(XiT8W b0}K9xMM2E}3t&u;5g@ftfWm~ifq?-4U0ZDW diff --git a/img/archive.png b/img/archive.png index da8371faa4de423e1df088581f68afb923bea040..3865f340bf340dfe74d527f6a22884816748a03d 100644 GIT binary patch delta 808 zcmV+@1K0fi3$zB18Gi%-002sU^>Y9K00Lr5M??VshmXv^00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-*n4F@AMg`f__0008TNkl5wr`vDQXaUm4Y{=7wU!oK}x_2>wiBGw7qB}mQoNDR4^Z6 zV>Fu;4N;T*a6cwHJG(Qp^Lk;mlmto7xj7v89nQt`Jn%nDU%NVcXxI7P`A7K;0jCqm zv&k{_S@_*Y1Ka)Xx& zjV!BdrXNYbB7X~5e(i4QO63og9#`*xeSfv>?-5%>oER~huz5%LxD<}!pYO@{bh!CL#pEfL7j3+Wy zITcOF2s$QJ+R>;}%Azz_vY%ZohVV1|FXr-T5c3=}qfWl%u z5E6RG5HLd*0RaxTnP(7_qYRK?rbrduyi}|gLf&*MdswB8$2dA?IDvslgBryg-akO- zr60b;!6!h_ppSqWN%kZ0s3P&HkbU|NfNRO$&VSv@We6|`@Bj}BA0Gz~L76hoQ`G+T zgPXfEcco3>&ZFN&!%71ZzevJ3~T85#xv007{3J@^0s00v@9M??Vs0RI60puMM)kuM&9)&c|rs1Oz6q6K;fNC*LykPsq8+*Bx45h#i(ls3@fCXr(&c7B@JYdh=MS=;OV z|CybCE<&P~A~hiTULGBPeb0H{Px`(CAF`CYxitRF)`t#_#eT4_uX^o7j*b5t;Ll&8 z``Jf!J-7YI=Uy~ic74@{o{YP854+Qk;$j={8x8Ik48F)06-uz^$H#;iJ z3LEQrI`snm{exsSe;iq8xUNMZKg~k!9ARV7X?LtM)!N#zTC?$50J(1*CwL#=nNNw6 z*@Sv9yXhV&vuQ}`GP*FL26{A#9*I(Klv!DrARddcx|&Dp8f0YKCy8hgIvtZ{t43v` z5LBw`vu3OM)=H^=bn4|x*16Yn?yLgvz)<}0h~Bkzwc3>CSMroL3P`vpUW2ve844>` z5#a=p?kqyl7|0BhOl6RShAcFcP!uhil0-D!Q*1~N_{rE86Mbs>jSJP|0>E~I86%o_ zI2;NiguwAUHr8fYx&hHxU$A3rpOoxQqG=)2fe}jOboK&DhFz>NJe+0X>XJ0~*W=!fE!!BmcbgK9 z7?`fWjtp~U{++;UPe_@#&dw(uWq9u=kn1;DIeU>}%~=P00dRS}Gx-_Uw^gBPx~>z6 z8Z_G};!(kW$96tQxwN57&CNI$7v{~)nUPT4ESlMSRrTPPw}%FIJtDpR^J5GQ#gJP| z(CFa%KBbzy3Iqb6M^_rd(OO+o`+J0@5!N(inj$y7H{!@x)+)w%hckh=@br;hB^ z)t-JqSb*?R!ZL2lg1$H?9+vG;tlH~9AOoB)c=hRj8Wd`dNw|FNafTgzn*6#G)r;C0a zn=V-bSs;XpB2)rokYo_rt%5>B=n?FuNoo2WR!^N_b$-JtH@xDVhybn? zYB}(K>FFQE*s_aSWf^}nFtrH#Uidb9jyyp~RZ+q!xHhh7QLLIpzy`SEzzwi3E!?;qju`2IfeeZk z#&tbpNy71bQrX>1)m4(#BnO{*h*+i{6d5cNuW2D^3Ro_kMw69dYw)br!#CW?i%B9;q671*wa?KpU-ECo6-BLbEKwu9T~;CE~UGC`?9t6Czr+?)kE z?{NU&1(Z+DHhwz3F!A!C`Q>N#Zt8sXBW6{vTTMKlTM*v|&jZ^7OQKzABY@e{Q|9Rl zi!+yU#q;Oq+JAdrMDLPox-1-gMsIe<=LA+Vm~~^?xn3~d&r-9x zI6HN%^ullc{}&m zVW8(fZN~pq`gad+dhyfuC%zAi0-+D%C!zty-M;#tI>e355fiY#00000NkvXXu0mjf D%HG;J diff --git a/img/close.png b/img/close.png index 2db97f5c0a747391002304bfa4dc55cf4faedcdd..d1111eb9627b99b3a53ed525c96d45cf715e5fa8 100644 GIT binary patch delta 880 zcmV-$1CRXq437tp85RTp002sU^>Y9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Ww zCr)44+yDRrAW1|)R5;6RluKxwRTRg6_ulU@^R;F=6O*PBV>E`QNn5p2#8Qz$EJY9m z7pbVA6dw!0g+*~A2(G({h`10Hu?Ss=Rdk^=L}{HQn}%v%No{Z@O>HyDWM1F>=6hTh z8B$w4yL0&e&I`_e5fU&M_RNscEFd;D*p#RWQukYJ0a#yT*O8iaS79xqMdA!#!*vWHWD)L!#*6AqLq>g+)|Gb_J7WMOmp=k3F(I5e{j(+06jkcmlbx zmAkQ-gB+>@j)AxV+L;lDP? z1R56umX#-Kbq=jM3!GpdhuOjA+p+_k;sOqa1cR`+PvxJ_?^t$=oMjTt0Nx$Q03DR6 z5@9e6J)tsBXGbb-jfgta6xl<^Z9oTmIY5>oHIiC?^IKWDb|b120|JnA-qDgG#r?d( zr@TfKo3d=o+|!`pQr2`+#=^qJ=MqKYlKvw6oUjep&ER5^R`;q+vG|kUs4;=WY9m4i^ZsYSM^pin zL?DqBe=4YoF6j!prp~U%Fhsh!Tt8DE55Htjt$ou9u#m)ri0$r}d(i3=mQco+B-Y`a z{vrB~zy9?E6ksEXX`zI)T8_xlCv(P_GD~JfY7-lC3-||c#81(%bSL@%0000RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z1>H$RK~#9!jh5SQRM!=UzjK?rJ>#**_`=v=upQT;GHqxAaiq{R3W`#zFHI?Fqo_h8 zc_4|Jmq<~P{sA;nqc(j)P&HJFl048-5CRK1fy!XjCfJN|@eOxu&x}1Yo^#I3oSAd$ zg9i#CY4ek|w)U3x`qtiSZLKBv*pyX&8%MjlF*QvH%d!*-hkd_KBs%wt;!_=>*cWh| zaLKmKBrMOs*bH3z9^|rMErQbm*gzgA)a=T&8Rss@G$}hyi&d?@@O&)xvmZbAT)U*} zK6P!)Q_NMEpMLt4{wJS*d?IYy z(Q+aoug=U+(KJfy>zIy%-S%-Z7TvDnK;jvjq$ z@4_hcOd>%#kwDdTglLo^9I^a!>s;PW8`0t8!IX?*liBE7xT#pARdIDjCE4`oT9xf#Rn zXL@3S)#+*KHshkKK{*S5SH!p|cDDBSZxIs-(Q#b}h3*|zfC+PEzvw3DngQjKz>W9=?sP4-fOtix;6( zBFtuFU67;DCP0JO9S--(nT%(BZjP&Oyus+Z?~)uFqoS%fuKRy~0TbuXlfQnQs3>9q zmD(+QAPcZf`bj8ssHeI45jCCmYKx03U%STag$tAngGg^LzF_bhp9i3A=T2HeAxfDH z>0*(R7m0i$AQ*|z zv2P#U2M!QuY-DYJX$f6bF&#&ng45z+vA9xNS+Pu2#j$Mwe6CBqWf68=g0a~Dd?Hbj zQ2c(Hy1RMm_1Agj(@*)~n{Sc_y8>Bp%5laDnT%oUI<{qDyDk+V6pPU|Fn|&We5+uK zl7z3m9!F7_oSr5HrUR?uwCi47&gTtFRdK6T%o?EK@yCgO4-GwF#C2UNhQXCjKB17w zJOo)?TH@@fQ(XPxi%Jo016fgn{FrHuS*21@vMj2A;_=YDdpF@-yB;uLRjXV(eVUIy z_<)ZOA7<*z84OJWz%UH1T)fD+lP3{0EtiBd4j8fk<~jIXzvJwVLyrL1fm^nL>f}Y!+`YNF*M|&~+|<{yCRUoM5|Q5CT?~mzkTIBDt`@&Ea8^Uw%my zX0OAC23!G@o}$(Te*o0GaTDs|r zs1Oz6q6K;fNC*LykPsq8+*Bx45h#i(ls3@fCXr(&c7B@JYdh=MS=;OV|CybCE<&P~ zA~hiTULGBN&w1ZZ`o04nvXr~IH2%!ihYpR!ez32vdhJAxjsF|q&tIbZ*++IgxBbcI zUNl^Ggv=l$0{#7i zWHx^sS!lSfMIk@ULhc-4W6)`LtTWZx+Ob-*@mc`6ZyYChAK;l!iIdrcdN8}`9x1bF zNa`}WFro%}G>RUHQg4)5S(qRmi?O~@rd5Fb+y`*=2!BRHVR0%C|-lL5JT}&5 zS-JtySYNPXY@d|uPNHcc)PWI7<#ooK&DhFz>NJe+0X>XJ0~*W=!fE!!BmcbgK97?`fWjtp~U{++;U zPe_@#&dw(uWq9u=kn1;DIeU>}%~=P00dRS}Gx-_Uw^gBPx~>z68Z_G};!(lJc0NeC zw4qGR%{Uhq=FQESkx<<%n%R3*_28GchX!{&BE9|dV+;(%kXuX8=-~T4rJB781OlK( zR~p07T3u87dxWMD)--}d8k{o8R5ww>z(^$3x%r%sy9>>yj_lRdo_;}CfbdbmGH%O) zzBnizmhDii+Ur0d1Dr2-_30axSER}evHCP2se>L%Vw(*jAr&LmMR&3XBbAY2@pw#? ze1TPizyqP8B@BGW11$uaM!RJO>lL?nCnA8Qw*J=c^xmh7ejVlN8+6CIa08nzSpr!g zgo+|m0%VY65ZbMRLPO{g?50U+`W;qJondu;!zwqt;+=>9t`%xI@agFv#n`foT4fn~ zWf1)RS4>(EcEr(9CP5#scmM-Us?YNI165*qdA0{z2Ot4ho z?F$PPpba432COxybZooq`2nsU;QQeDKHc$dGJC$la!Y2gIZmosVf>}nFtrH#Uidb9 zjyyp~RZ+q!xHhh7QLLIpzy`SEzzwi3E!?;qju`2IfeeZk#&tbpNy71bQrX>1)m4(# zBnO{*h*+i{6d5cNuW2D^3Ro_kMw69dYwU{MhW>v3SO+24l5Z?#S1KR^jqFretfZ5Yi=IINIGnaD3^XKQZXU?CwpadQIyld+yItv${Atb*=QmZ~p$X-=A*(xMK&? zKoziV7yoZ0g=PA_zJJTBzj}I0aOIC*@PBe-$D2KIdBCaM*=!`x>qgE+4(bV{i}o}cVg#X4WD)@plhdZ%Oji0NlSCLHu@-R#}4#=Ux}OX)nvg6VeI6RguZVi#PGntdU#dzVM` zQrEJ1)@hxV$!+1&PJ;bCC7*MQ=Lf&EZJeN%HwYg>CqXIFPmZ!be% z2g8JktqhElXU>}0Ih~P-nT3^&or9B$n`cVfJjR8*OE~zr_yq(Rgw`K}JRfkO4=EKUo+V7+4r|Kq^3L8JNvHcHQAKIK|ey zcjDFTg$$>URR(By#(Oe2z20_l`G)o0O`j#5569fzbMF;9Gf#`---MRt9ST$bc4w literal 0 HcmV?d00001 diff --git a/img/color/class.gif b/img/color/class.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f716e33c0ccd54d35f655c5f24c45890dd509c8 GIT binary patch literal 79 zcmZ?wbhEHbxia%KxxfqxkbU>mYc?KqhmVU9*YZQ}Wverei b9%gtYmXdHIQm!)YmU86zjzcMvL>R0A7OWQK literal 0 HcmV?d00001 diff --git a/img/close.gif b/img/color/close.gif similarity index 100% rename from img/close.gif rename to img/color/close.gif diff --git a/img/color/close.png b/img/color/close.png new file mode 100644 index 0000000000000000000000000000000000000000..2db97f5c0a747391002304bfa4dc55cf4faedcdd GIT binary patch literal 1657 zcmV-<28Q{GP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00rGiL_t(|+KramZ&cS6 zhre^1yFKHv$N0k7V6Yw6qB3o00&%3!GzyARt1nF{X``q@BzYi-nwLmXlKufSQlmC~ zLQpkSijq9gQV;?QIf2Sx)h5`Caq$gzY|o56GoEwK%$%8X>w^ahB5CuJwzl?`_WIV| zYi+G1_}G+H8%MjlF*QvH%d!*-hkd_KBs%wt;!_=>*cWh|aLKmKBrMOs*bH3z9^|rM zErQbm*gzgA)a=T&8Rss@G$}hyi&d?@@O&)xvmZbAT)U*}K6P!)Q_NMEpMLt4{wJS&B5d2yav~wG&dgBJG)n91n2v+w zy7+(&AO=la;rkchFA4agA5!jp07(GM+T!Q2*vm(b9(`-?!GljkOf!-j9~b|9;|AH= zx2ZS|9Y>B}$}*{R8r`-p~c z@8gZd5JVACk_ff8)3Rp|jeUIt+uFz#3Z#=sf)MsVY#v5T$Vq-#_8mKP=(jz4_Vft0 zE#UJZ1p)+HTWNgsQ6jy))Wzep9yov?iVtN;pt%{t?`L{qg4OA1>New|tU);oSH!p| zcDDBSZxIs-(Q#b}h3*|zfC+PEzvw3DngQjKz>W9=?sP4-fOtix;6(BFtuFU67;DCP0JO9S--(nT%(B zZjP&Oyus+Z?~)uFqoS%fuKRxh6X(y9zkZ#lC}IJX+AVw_3$RW4Nhoxvr@8qNHJ$cq zi;FB@yTo~5#~#BMiF_j<7>UraZy((U4iIQ;WNm2)T~#q1N1KAv z;$pG5Qd(KDOjX6PZ2)|(OTA?gc3pz8*#CSYQIb&neww&V2hH3uf85fQJ9>bCIzMgtKzilUR}=T z4NFyVt5wVzpyBbyi4P4uV8nG@Du%(8Pd=fL$vgyEU0UMosZ(72;)_ZVZUb3SgZ!9j zj#;HrQL-$mfa3Acyn8p{UArDIU{$MJJAImuKlp%;4m^nL>f}Y!+`YNF*M|&~+|< z{yCRUoM5|Q5CT?~mzkTIBDt`@&Ea8^Uw%myX0OAC23!G z@o}NjIdrTk~n{!Cff!@!Sr}QQSi$$9@jP2Yt}7X?i@d6C^n-Px{!A}}JmFlI;3 z3@^fnV3GL`6iWy%CImr4x{RQU#2RCSDcR38+Q-Xvo zV9#=|$-i%NPZ)9xXmb-ad+Dub`3=7O1S8Z5tAt4c80s&4J9njD1<(el1tL@k(^IjX zQs8AjmNZP zdeC%iFtm(V0ZpUD@V#Q%T(&oU;P4gLRgmF%V(+chTUgX} za7Rq$qZVtiz;_9@Zn4{D@6jdM(c9+~oqfHIV++SmoRnRHTXYL9+2hsv6`x-Y*hE`E z_WOd`Kxj}2%YrD#VP!C)of;aBh7?(pl~8o}v^H{P_xIlJh;}v>A5A1vVk(&!ji1xf ziA*wk=it`*r{Ysr<{`gdZ&)SwrNxBgs9IM1mo3g%zVX>UAg&yw^Fh@gnkXe^zJ64n WhbMixXK`J4JTz6lxP2oc;ru_)X)quF literal 0 HcmV?d00001 diff --git a/img/copy.gif b/img/color/copy.gif similarity index 100% rename from img/copy.gif rename to img/color/copy.gif diff --git a/img/color/copy.png b/img/color/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..15bcb5468445e1b2708e071850c6dd63a38f2f76 GIT binary patch literal 1623 zcmV-d2B`UoP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00p~AL_t(|+I5yok6lL* z$A8t;ea^Y(K4QfbGnMf9R&%6lDgF`mFizzRsFA$`Rsrg10W#KG)B&b z1_?2SC_%*Cot20Hmfg+VvXkB2Ll6Mmoz>~^4#QCEqd{rnog{ljfu zcxLe2>)$;4`sSIFN1yC1rtY9oBnBxyeEZJcJAc~#^V@g#fB$fi?_E4zWA5B~H05Y5 z)GCN7A3Sb}AKksd{_Y0NvgTkSy!v97t*w?@Ti4H3srvTC%SSer`p5eB;r9-+NrbS_ztj8xI}5aISpi!iCe{bB{02=J_j~ zI=y)Mslk_?y?o@Wmp1xesCTXMETw5vmZg-csm!9)B>1qG7soCQM`xb9{F!Giof$qq z-P_Z@{(JU*zrZg~VK3l%FHtf~8C8NTXOT#SY_5R)6xP4>7IM&ps#>@v3 zd@Yk>%|VsfDt35yd#kum4mQ7ac6{oyU%PnzQ|0xuzr6O~rzbT}0Q7|`gV$dA@>5sF zqt2)1-e(yO z2wjIGM_7!;?940f#ezjF=zVVU#1F^*gS*xoy!r0^p9GDi$D&Uv2NczSqBEqbhje=* zx}5=aF~A4w{Ieg}y8RD)GG#pLa^|DVXzM<`vf|+UCO1#j+$bj89Xh?|&mMc}<#XRr zl}-$y5REl4bpatIMazgGNU3OQNhvcK9^s~JbF$mVH#X>mV{AU!LdeLe5yjeop%|ln ziMg?#Y6a;;v_MjgrY?e@g(5}75xfXU*$@k((;wpJ&+*~$E<5#t&@VW8`V{Hj6RHsT z^oiqi)zK*IAIwmX8OSk664eS#6+r|^5mG{ekZPqKWQL8<>2wGuHrQ3CDkA+V5!ION zEJ?9L-5XLxhup&430ew3l#meZ5VV5?L1KhhAQ~vT1%t7oMNMupQJjtj${-{SEax*~ z*d-MmV%5QM$PGdZVZ}dDLPSD=glfe!Awo!qDrHr%9x8g>7PCxrqcDhOm>HO$S|Fal z3S0~akOD#}AQA})qy$M2bhRV_5eQI#qp20HGG_Yu~rp2^f88gMR;vrz}IEf%B zAV>rimjaW5fB+Fl2oXe)LzcxeNQ<`tmw+Ka0YtI|EDON{ZFaI1ATao)81Eh_(tSNcb;+ zf#-mk(z?-F#6032Y1+ViDYy%58)z*ek^mt(QL;s8^D00h0ul%k5W*_)?yD5ELfa}$ zHX4KM2_v#>ocX-PveM>EvvkaY02)Cti?kNN!4V80A_S8|{{_!0@0!MF+CYKi=lF|D3@K;HoHKl1+70@CiARDMU$f^~ZJ8dhpjnK40n`IRuDVXg0 z{`SLmUKFJSjk;V~Y;u@5q==|y7g`g{1Q!7WN5~)dSI10fGUU86o^znA3Z}E=;;rAj z^~dS#ckc}Py+So4QHmQM+}O@JPhwT~s!n%9>fQizCj=p?5;P#fs!RcMC+1AfM$Q?_ zMz7lixjwsk^)J7A_r1UWf=`f`UH5kPd)sLDz&+dH@PH%Wa;SDVR7gC8%YZOjcEh5r zmqBC8{}Jib^~QL8{n?yzYTMiZ?jLXeqa7gl3Q&SdRaezwKI6&G&b7s2x%Ei^{{c*! VpwY?{y2$_l002ovPDHLkV1k!q0Hy!{ literal 0 HcmV?d00001 diff --git a/img/color/cpp.gif b/img/color/cpp.gif new file mode 100644 index 0000000000000000000000000000000000000000..49b75c8fe4b8f390a57695237ac955c4d7888df7 GIT binary patch literal 83 zcmZ?wbhEHb6ky004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00zrRL_t(|+J%*UY~58E z$3M?G=lA>FdwcKg%k6E~cI{reG3eOFX4%Hpm2Kh#La}q7pQUZzQ4;mA9pvGcdRLGP-tMUAuNKbY0uq`~Lf#;~#B;Ge$qjH+i0uC+GX* zob%-9Jr8}Jty_B7z2}nY2GIdn~53b+VY@YtcHgor#_hdi&*w1cD)wlGV85=+G zrF&M|?aiWeWH~zj#D=S5=4le;Hfbc|_cj+q2_(L)$e=a=p8zl6Q?y2WMVB zbnK;H9O!?+I!={C&>EbZGf-g^wXEyC@wu90?X$DFsWpj2oO0B_)C^W!M5W@JlFi0_ zdtNe$F_N5=V#!P78WT;nF1P$W&AR8)AKdtv$M42yS)VwjjI<6S6F>!-2pi%7TDrMg=5vcH|492=V~_3P=G+?$)W zY}s+;<(*d@-1o}<$%%=+rCqBtbW9;VuZC_lqLsg%?x7#!%QB^ zWiZMo%G7Zo6QfkC$aZE@<-+X3Hx8fsiEi&$S{Xb!bo81{n{QdRsC{E5Q2!hoIrXZl zX{u}P=<1!ict)S#>Z<+Q)vhY6GE&$j!MPU!0DON zEBl6@Q^sf)3;Yv5eE#Q;hAJ60wk`hR*;B(CDNK)K7jKvvo?gk|pk=yzj<0>;esWVo zn0PaZbcTj(0}I-+v@B_5$Qy?c6lHs9O5 zX5HW4PSO(_?ff zhs+BMP83cQA_^y($Z0B7N40EeZdu5l`){U{pI}klG%0(YZ$I%P9^d;@28O5cQuSyP z5IHl~JD?EZ5}|;(*r5ompRPuzVQ*~SKP(-YjaYdhO}yLkC`ukqEdJj;Ro z#|h#|lnxN_071=tHvcB(O`Kq@Pzi-n*-pO;M4^c({r9>Gnk!VC|L}_J=uYEs(A0#ne9EXqbe0J}-kE^a)&AvDG zlP@avJoo^QJaQlD+BAPUI6yVj1n~rbF?w#|F2P0?&+}EHCavom7ZOE|C<@U^BNEWs z(aEk|xAWq!e$BwZ2+NkQst$=a?-N3Zvr_ z!~6RFeymcCqG}X60hB2GSlp#*lQy!d{>?X!>R2q1Lu^GGlu?=^M~C&X{!?Stx==bh zJNX~PMWkWg*D^mwbFnLD>YKJJrD|q!Q-3K}O5-50`C7wVqvMj#=lMU#e_M3UIT6uw hPtQg3`G3~Be*s>=)m*ikyQ2UA002ovPDHLkV1lwBm_h&m literal 0 HcmV?d00001 diff --git a/img/color/cvs_in.gif b/img/color/cvs_in.gif new file mode 100644 index 0000000000000000000000000000000000000000..32148e83ca3f54495773a24d819257c7d5333c4b GIT binary patch literal 1179 zcmeH`+fUO697n$(IM5)Kbc8`?F9H0uj!-rzm5UTwq?Cd!wlFT%Qrppr6J%WFQlM7u zSb=fX4Ms(D58^IliE(41=oTI};sX!p2BM;Ij$}S)V)%^xA3HgJ!AVY9`a$Xbq96*Q zr$mQu;?VUss>xTWqkqd>&(q!iD287q^*oDrtjUM|O6ppVYkm|{^-w_cV~;!YyG07|8@^9GzVuur4*Dn7e}PrpR*FpB!Iw-CBkkc2`)Lz=GR^w+4E z#K|#OM_~FKh3Amd4xs^+mr*(n+bE6=;D`&k9nd`HYOcUCgrmL4>%!qyDC>|?g@iIljzesL=qUCX(RCBe-=Jy= zB^RM@gQ^kv-O#lms|D%xkXM79sE;i{)F%kb2Um}d8&K9Gu^hyuLk_4Kps2xta`18x ztN~kvhHEGuLADcIE|z*HZ}<^g!c4YAqto2+f038c z*J$KhP%Qp;s{nuVU3s~ssKR3ARog18Je}3TOH0qx5dV#r#|{F0KwJDb3;Apkd^yVL zv1G@4(blEuq7|8w6~nndJML)p=cTkQZIsUW1ca$C$j14p$$p}oY3s_WcURD!tU{ zYrg$Vuv=*j<=z>Ae)%(H&sHDr91@%6T|(`=y3nuqH@EiNvzZ~W#)q@* zbDn9e@VvE!_KeFt7vpPQ$`&Sy{kgjvYF?kZbtiM#Zs#o$duoO!c0{v8=Jnfr1;>9g z!)^UtaIl+`*y85*x+iXVXMLD;Wl@kZC>AcT8^*#PjRqP|J->fM`a1QCU$+rUHcOtK z-TQXv8jT*?-eKL2HQ0@w-aEw`{>*&y;vY$V(hc(3{q~~=g1%RKfA(Vg=$ak#PJyZ+ guu#m}KH)MgS1!NLXoQpQp;ck{%(|)C!-L}g1vsJ!C;$Ke literal 0 HcmV?d00001 diff --git a/img/color/cvs_out.gif b/img/color/cvs_out.gif new file mode 100644 index 0000000000000000000000000000000000000000..22928ee61f5f4197ecdc391ba8fbbce39e561766 GIT binary patch literal 1180 zcmeH`{ZrEg9LGP_hN!7?Eh6C9fT3f>!K{q|F&N|FyB(_y8K~f7bBm3s5Kcfq9yWO% zAYk$!9N|LAqEzuk5azc~(1qMqL>X~%93^A0U%-*`ICK_yZO}I&s}9*su$)KfMHCOg(g$NV z_O~Om3d)m6EP>RHfmw8Z1ow4RUV*hAhkJ0qgMH0ls*zfbS4$x)MywU$!+5a}o?B>m z7v(-UhGA%drWOY~kkf+KTu|3QRRLa-A_+hUd=7_VVu+n+AP41lLgz;MDa2SHJOH_zTU||cbtIF?l9Od3 z(MDU^!YBDrM4MqS5RXT8JLTn3bTsMpdXY%P=X1qk(r8F57D^-%0A@3lms4061q6`8 zK@6kP=~Np~9R4?K{W(>c)#S8V1Qm9tO^{==3NqDN9fkeH+O(BGFVP17%|ia`ge@V= zlcxEUMvk;J);H#E-YH0J3A{G{z>gc5HI&kw>TYud7ucS_y^5xg z0kdC65c}BNbhm0|M`%*b(f-zj&8jArbdtDfcR1nco)Ep9JL?x9cL~2-*3EKvYlj5! zD=ZB!D(JHAika=#6<)wDo^nOD2W-!ua;~hhvjQbY?wpgDe$1My3%cvozt^MG#b)lBm?uk*v6$c(;NYqn4Q_q28<-X!_?@$5g#%O1r*@)x%5 z(FS_z8D8PKJiMn5SM~|~ literal 0 HcmV?d00001 diff --git a/img/doit.gif b/img/color/doit.gif similarity index 100% rename from img/doit.gif rename to img/color/doit.gif diff --git a/img/color/doit.png b/img/color/doit.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee5d6811936c2a32e70fea34e218b727999649d GIT binary patch literal 1764 zcmV004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 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 literal 0 HcmV?d00001 diff --git a/img/color/folder.gif b/img/color/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..262aed56c0e7155ac05d0303014ddc8dcb5cf345 GIT binary patch literal 139 zcmZ?wbhEHb6ky+bzOi4FKt!8(;tc literal 0 HcmV?d00001 diff --git a/img/color/fortran.gif b/img/color/fortran.gif new file mode 100644 index 0000000000000000000000000000000000000000..111dec476c9cda47473eaf5ec554b931a3d9336a GIT binary patch literal 80 zcmZ?wbhEHbu1)sFBzNOr>=XMyy{8fviot1ZpO^J5;g05 z-rj#XJAYUFzDG$t#~EEWH;s>slcAH2D_3MnzP|kPXzVu3+UY8*Sgue zab5O~@0nXZrEhqfvgUcxibn}c?#3;+5k2=($izcIy?cFIH+eU%^{idtR=GHR!<&R9 zcVZV@kDhZWa>kjkDaS)5917~$8_==cvv#>#<)Yl&+_VjEQr0|6TJbP`$(`sq7egi- z4C>kA-?81dWs`Tq8jqUgZWW7CRzFKx{xE*=?b!L(qGw->m<}}RSRhE*Hs6+wULa-5 z+$t6(E`Ja;`$EL@(_xd31@|BDZ{OzIywR(EwQKnTaQIO~DE?$&>Qk2+;iLJGx6~9 z@e2qFtrQj!UDGn3M@*bwLQ+UdT1Hk*USW3=gQAkMiiE0~l)8qdoR+qZ?imI>eFH-y zV-wRGX6D)!mR8og8T4(Q*xK1UI667IymfVB=o4XTQ0bhcYB%Fa_M<19Q#68>vE;Ze z?V73`u_+^SQ>(YQe*6KS9MNZsW*DZNsxc^L^F1+ft;tCrX5otyXIm7830Y(YoSo;; L%q1$t!C(ylk}3hA literal 0 HcmV?d00001 diff --git a/img/color/gtk-floppy.png b/img/color/gtk-floppy.png new file mode 100644 index 0000000000000000000000000000000000000000..2e26b567b38decd3715bab53be5fea650ba28e98 GIT binary patch literal 1497 zcmV;~1t$85P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00lisL_t(|+U=D~Y+QF0 z#()3E+&km(j6E}U{E$m1c10SbBtUowfvPr2N&27_2#`=q1&gv^mkn$XyKdO9VnG(5 z6jdxLwE`qc5FoXpq!hP_?by!4vB&S&^YD0l=g!>6|FCd~5D3AhJ3i?w&f=W!=zK@# zQzF6#3H^a~|3AV10vpE>zx?@+87?}eZ|t+a)1^PB{7ONWhYEJ|NGUT~8OW5iRw@Y7 zsMd;V^Q+zY=7H=!dTJmQam+4p^`ikKBU^3to2w)A6 zAf3)5t(^mTZ?Q2uywI2)8{MBf(wE$6HoLde*t@N?>D^zEQs`2@_sJ)}cK)fcCm%c4JIQ{?%I)UvYj3vx*z$Qj=ycx! zmI18M%AWbu;Q7Ja%`!`?M9WQ7UgPCK`3AHH#(>d?R^S{c1qj4NlqwJo8~mf`@C(mW zzW$|!`0NkAcj*@peIE#|QmBz~cEW3{`G`-a)+22h@_F$4J#^MX8I2eXO5;+CQvG1Y zQA{CTk!iWYE4AOyU(fUW(C5qN&YyVvoy9+20^YX(PSC`$!uP;41gk0GMnL~@Oa640 zOtFBXgkyq~F&v{f8N?)6>YcZES$@Su|80s}n#RprJnDZaXJHDsY6T>Wq@5a4JcIT; zoJr`c^k`SN$Rz~^pZFYEHHAw(;@FYI5lLLf#13cnkZ>Q_3+Zo{sdyeri!qu!psWb8 zSatRIm9YZS&R@F3m}=}gxMPexQq39j2FNg`6`KtQL4j4kmk`v@O18L}0R&kP*r zuh+JS916gusid#H)p&JyVE4%{pPd}aW%J~WCiE=IDO|P2{*CMSpD3fF1ec_T0xNJB zT$Ev4o#N@jC{}}O`E(k)2&4d7z=geZ;iZc!FaGG_^_SPS8qH!Kc9^l)@YU5_-%VZ#YB2NOgskGR{D!zsWjppY~1wT*cCr>}3lw6z(nedp7Y z-*_ln`EaBy-83QTbcuRx`m}#oCLjVz1aX2(AxTn{6I^lt5}^J;fC6h3TEliTS$yTq zyFV#ry!>}Rp8IwwXAAqG#u<%79h7w_Q8)oD0!~nAigsW`FiNnxgH~M!^Z>B{N~!zb zF9_Lq_3F;0V?zT+pBor|)(bpTHbW*3G2+lD#2xNdi=f4!U5b(vB&N~W9bJf)R&HV|v{#&HXkz^}S?$yWVeKt+{Sl`Bu)s!Q100000NkvXXu0mjfuGH5` literal 0 HcmV?d00001 diff --git a/img/color/gtk-revert-to-saved.png b/img/color/gtk-revert-to-saved.png new file mode 100644 index 0000000000000000000000000000000000000000..3295025d71bf812e3120153de2cbd6aa94dfae4e GIT binary patch literal 1799 zcmV+i2l)7jP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00wJGL_t(|+Fg~~kKI)j z$3Oe>yPq?2=FCi|v>jnGfTdCt@PdkB0!7g%iAXdi5aNRmBqqj$Kfotr!lTbV8KVXg zR4OUTC4iKhg#v{_r=6L0rZer#nVvcK-(~OR!>QNr(|%YhpOw8XUo{%`t+m>K0zkO> zQXnFDC*FB+B6tP*YK(x02v{}FbByDaQiupzYvMRYJ^IKkKm7g!pS#}#33={H5T&eE zNos@scCUQ%8P4;|iQ}T)VKq z(W6JP-7Bki9GG4B+HA8?uSy(NDK#16bfx-lv}OOs<~>K2HXl0QE(YB=iq7SQ{(Has z%#!#gT5w`LO@{;LIFsj$_>Yt^hzJ&}lA;WKktc{IuEq3MciDboiSXD8pV$~?X}g&H zl!y04F*Om&!Km5T$*Zq+ytH$xR-bpnKNj#j(B=PRg|P50l*)(bFl1+S$VX2uvvTYL zRpBxFGwe)Euv^gI9x}>eb@0a7xjn<--0SaM+AiAF;ctcE=MTo}__2KShgIRP{{v7u z#DsOCXaW@m3_T&o>>-(|)80FwpM2rWEBV&2 zb4wI{;XxbTaa~Hc@y3(g_M%=!w zIWT_!_D*x}C$DLCX5;4Le|qotr&b5gekTlmdbhQYtyR^>zzG1Yt^%x0F*YTxPcqq< zqETxw5!Fd-My3;*He+`GJo+=&v$B7Z57Ua)z6l=q!R>b*xpU$0Y5Y@9m*p=&>BI07 zART{^3eYA&+XRI|84ETB8{)k~VvWrpashTRW8u4(3*Vv0;A23@xwN;_tafUU_4rl*VyHb(ZJ$I z4J2uh`ayQ&*4p$$Eb&vv+MQMS8?Xt81q(VvsTi>lWoI23l*EN#`at0FbDyn zLY&i-ofgtML$T9hcg@mW18+lQGDhkK$pT0x@%5XaaUaY+!e;Z!>Q`wi_;L7J^7i$; z>+b!=p>Hb1&49Kjql7>?0xHos=Mc$JHl^r7@3jGgi<<22I_duFQL+ywb2#6iDr?jV z&D;44JY|madUu1)`E9(jld}j1}6cfGgMd{0iqnn3ffxo_K^PCHap2I)AxUx zNSai+rz%Ta)u!|?CmFZ)r?9;)cO?ffE;W^qji*R7l{ZuspkoHXJcF&%Objj)sToXQ z7p>$e6qugZ}8&oJGim6U_}|_uL4AS%qh4F&%oCpUwKh)D^ro^XBImpl z8FwGRi!Rbg2lpM$j{N+=Lq8i`yEo}}s=T$+8=YHgRqrott$%Q~b^grS;MA3#KMuSD zv;Y3002ovPDHLkV1ivPXCwds literal 0 HcmV?d00001 diff --git a/img/help.gif b/img/color/help.gif similarity index 100% rename from img/help.gif rename to img/color/help.gif diff --git a/img/color/help.png b/img/color/help.png new file mode 100644 index 0000000000000000000000000000000000000000..6092c21f2ffae51a69cd3cb002aa2b39b3d99585 GIT binary patch literal 1882 zcmV-g2c`IlP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00zEEL_t(|+GUnoj9q0F zfWQCW`|N%8K65$eFgH51ozjt(wpwVRL91d>B!+rH4Hsinq6QJ8CN=tGA}_{7eUJxz z@j<+hV2nHv3`(NVwB<5j%d|i{o$0ilOF1)hu5&JX@Bik*P{g>h{+E@k^<`bM)-MVH z0B8-Vg&%!$A1-N$VqeaS2TJ*0{`QrvcYm<|W7l6B-dKnj?DVXyXz|te(IsgeR~fM zd98A;R`V0HpLn9kAR#JUr&qr~eQ63$%rH8T8`?HDwEwANttU>+c7IcdytmzZ2%ZO| zW`p|m&rg2s8xQ^9$iCa}K6p*kEBe`>bVG-c*Bl@mzL{ubFVXN`qS5^fY`FtNf%e)= zFc`GT6PpHiXPVO4h2*TUG*Y!e@er_gd%(wU9lq<^-~Hi{1BX6+AjsxJ*HJKdJFV*z_dKxc!2P%7qh6HG|DE+}okm)q*-m)-$^vJO z{gL#-lMIPB37W@QJn?h7)j0r$uH8=G$ouK(kTgvhDSDef@`1va`y#mm5Pp>Na}Rv= zzAuf8#iOqB9G%J=)Yb!9l?>&N(pz68TYi>3yUOI_emc!6-CiARf^#4Q7#EOpXWlPtPSk_1`xZY%OiwJu1W{*;_b8w^66ttk7*8qmvkR=%eHc!)RkU`Qo!I&KxHnIE0tOBo1fshl~Cu0VRLu zw(^dgTne(Ki*(yfl(kqZan@l0>kKAK5HezH|99B5?^}4e0$G}J;rwa-{oG@i+DXR7 zhG?e(Z7kL~qCoi46BGVmEQ_+TAlr=|cmq~4a(hg%cR)ZA6ivw|uY_vL=tz9AOHZfXZjm5Z))nT+oYfHYo zi%qvYg7hP-F-#qOn&+Q5LfO5==4(qEPz~CEHUj4a)`2!?e{Qk0tU7C2XBp~haO<#6 zptVBa5e{CD%*6n-yD3x8{ESWUMTUoqC>N4uj!Zc+z2PUML}_PI<<{h@=hmkh%|>E$ z7i%rrfUyqaHekkiXe(&9JJhOG=Fd$Li&X{(V-O*!67K|uObeWo2q&nmo6I_Q#XmWl zyu46pCKIC(&RLAz=z()!kvOBM%pK$6(j#o5EBuawt@O)TnWYyF2$uq{1NP$y-e!l*zbBoE6lnyBbT069{q?tx(K~$b(`@VbF zaqAbDxcQ4T(|}edqmvjq3G`BlHXflbNK=))KG&IEZJMV6BLiR9vzL<>AOA<~$)z>5 z66V0UjfP!)N*RoUOgn1z2F;G4ojBS(=p+)QJ#xOpIm7HyXa2RB?(c!ifb*hIf^#fa z)fu2XQp`;jVi{|*F&WxGW+b&%#)Y?DWoG)HtX?{abAnXo(AFaiBtjTwm)eU*r(2IN zSM~1z1t3a&5@j4?cz%eG zKAse0N+)wmor}lMwEuK|Df=~0d-tM6fdB-9{T>66*LZEF`|`{}+VUmCo+mr7H@rfaXfxqjk>>Gj7J*YqEN=6g=^Mh3>hbt3_BC|PT2u2dC) zFK(C|5AMC;y711?Vs3LjFMKJ4XPt9O3tL||$-+u{{`7qBZz~P+^gA{GKlv|UG@vi^ zsJAqWYZ-m96otI>FIQ9`B_%1v<~S5(ZJf&#RqNapYpI2SNQ`wRQ#ir@{wM(c1N2ns UGELFI761SM07*qoM6N<$f;3oy00000 literal 0 HcmV?d00001 diff --git a/img/color/html.gif b/img/color/html.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a7cd9a25762ff104ee952554cb814eed1a700d7 GIT binary patch literal 543 zcmZ?wbhEHbE4M#eLZ#S7d?D@ z|KY=v+1c6u|Ib-+c&6+0*|z1Ac#13eJL2ZATkzpSPEk>j!;+4}m#=uVE#P$N<8keG z_ig|1VM1YHp~I3X2Tq(Unp`AU63!rdTR>pWhYwr+|L>Zyv`|*=rKrh90k2L5wzX1H zogY4g+`W6&)N~;;^Kxe9Y;|>yg9rD1_;BFTrSj6!(mi_$e*b>*;X}*f#fxu(K=;j? z({J89d-?KZRaI3T9i9J!1}OeyVdP?{XV75)0#KYVu-7!yH#N7kFfcMQbuhEEGP1I< zb8vET^RzIs@$&Ht2nq>{G&72diAzXINz2GCmXlXdR8m$^Ra?xduA!-=t)r{Am_y&d z(8$=tbbAw{nYo3fm9>rS!82@j_709t&Mv3x``KLG+}u4puhn~bd;7fg_49ua5cuu; Kw?*}h4AuZ-C_`fa literal 0 HcmV?d00001 diff --git a/img/color/img.gif b/img/color/img.gif new file mode 100644 index 0000000000000000000000000000000000000000..b6c4d8c98db92ad3c841b896b08d2542705ea773 GIT binary patch literal 538 zcmZ?wbhEHb+8$Q%QG`GV`D32VEE6# zu<+cu$;Xec-LN70$dM&`_jY)Ac&u2lqM%?tBja5LhLhK?pRlvD&==w|78Xbd;4(Jm z-oE_-C+ANFhSSH7Ptw;H|G>xyH07u(gO86Q2gg!I#=XqU$!E_lGc;7#D=qyXF>!NA z;LMpVN=oY9-t}BuT$eBJHZjpWCL%H?G&If0$=23(*|KF*rc60H8eO%OG{t9dNpa%q?}M@L0P z1?aUw2o!&^Fmf@}Gw3h?0Vqxw*vlL0o0?mi85lb{nV4HxSo8arg1?^6?7@ z3JHsd*7u2tOGrvd%gD+#^~ozJDk-a|s;RGI)zH+^*3s3|H`r-tWNcz;W^QqKF{`DO uwT-Qv{h6H(j!w=luGh}?F}gi|?0&u8!}HZ^Pp{|RJ|91Q^gY|iU=0Ax_$K85 literal 0 HcmV?d00001 diff --git a/img/color/java.gif b/img/color/java.gif new file mode 100644 index 0000000000000000000000000000000000000000..9afd868eb2e9274863da4f3469f17f7b861b24ac GIT binary patch literal 67 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 SzwX~pQ4;-l_E?Jm?EOEMoV)Y@ literal 0 HcmV?d00001 diff --git a/img/new.gif b/img/color/new.gif similarity index 100% rename from img/new.gif rename to img/color/new.gif diff --git a/img/color/new.png b/img/color/new.png new file mode 100644 index 0000000000000000000000000000000000000000..33a93be1fff75e1d06cfbf9cfe89109904c664f7 GIT binary patch literal 1594 zcmV-A2F3Y_P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00o{&L_t(|+I5yqY+P3v zhM(`8bMM^i@p#5RV~>;Au~R!XG^$i5ZIehvg;rFw5l~eXLabO&34~O{f)xwIo-SA* z0qO=Jv1(9N9R5;N7Ln2)A)LQDb`ra>FM2o@^a<$*yw}Trk*Z#CoK{HG$Pt!+fK&2^6|@`b$olHJz2fFvVMK~ z)6dRcxwi6wP2y^)<&#>?;zDz)OlzETy8*3O`)M=opxNkjF^CehRY)Qvi9>obL}RYE zSgDPCGv7b?%(3CAZ{7O*d%vCj*Y7Ip)jt*j)!?zU3xIe@nra)jHF2_~BWR2$ly$@@ ztkPyt>N2!i?Ks-iKQS>`nivVEM&7@0dGfuPl|KO2{x3k3!Sg!t!!9HStrec9@r@?6 zjwp!;46J88F3S@B)hmpbhB#j8JKA&l*qa7(u=(-rcdl=6VSj)alnyao2TnjMh36TJ zuMr12qcJ8WqZRji`nWy6N~spp-JfM-e4zi$!Qvaa{70R?_}h(5U}hhQ49aBCCd2_o zYqW2`H#p}YROl{;Za|pL(daEw?k`g9&60L#iU$vLe!cIxug*53_4C(x3uryoffl6$ zF{WcH%SNHREr2MSg~WO7*wDD+cfEM+{>pn*}2R*<7`w3I)3V(jGkxuq^(br-;4 z5EY_yh!Rk~hKvWkhf)SVj;Z}=7QXZZ1H&cMA&0Rk8G(!u@|^*#D54g*t$>3()`1ey zK9~SOP@xY&01_Z=gST*pjdySJFk?9NgGut)0MlyWr70vS8Bg$_GVN0Rv2}XICFpKB_rTlGx+ifx$L_;>m z=AAN^e)&F&XFsAi*iHB3C{Lbx9a}5o=F2Sp^!L<^;l{NE;;F+-{pbu|I5~mnCR%4? zUx`pkoERa3+~{G3&OFcZ#d$uTSzzPlJ<_XHYV)%kj9Sz`xy>ExakEP^@yrC>PYgq> z5%EyQ2ar86btoJLn+Q%R4!wAiXB+VEpZtoTQs>_66_Pkc1Dn|nD!yj?yU%m#J1^4P zohNO#an9TJfIS`v3WrB(HL2AYUo(8-7^i>u7RBQyh|&}bSYY#hh3d)@{R0IK92y1} z5+@q#JVY5l_Uk}P>NKg!U}H-&WA67-rYXeEjoY<3Byl z)Yo3%$nX$RyUv64D$z!rX1z_4{5PC?B@%74GJ#S$K-)IPYWxVCYeF_;@YRC&b6KR1_9@T?K@>i_@%07*qoM6N<$f)se~MF0Q* literal 0 HcmV?d00001 diff --git a/img/color/new_html.gif b/img/color/new_html.gif new file mode 100644 index 0000000000000000000000000000000000000000..49a32811dfeeb258da63594800133f348bd5a6f7 GIT binary patch literal 1788 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 G8~+Q*1UX&+ literal 0 HcmV?d00001 diff --git a/img/color/new_text.gif b/img/color/new_text.gif new file mode 100644 index 0000000000000000000000000000000000000000..e28f263210752dcf215581828a0df696c16d0269 GIT binary patch literal 733 zcmV<30wVoKNk%w1VK4wN0E7Sl0094Ta&iI!0ssI2{{H^@`ug_v_VV)b?(XjD>gwj^ z=HlYw-rnBY+S=CE*3#0_&d$!t%F4#Z#=^qFzP`S?y1KTuwz9IauCA`Cs;Z`@rlO*v zo}QkXnwkIr{{R60A^sIZa%Ew3Wn>_CX>@2HRA^-&M@dak03rDV0SW*g04x9i001xm zFaQ7r{@^E$WNDsgs;+G7zA!AzbZy^sd4~mR0j&x^scxw!Y4v2~m5D=Oz0z-wagqf$P5D}^?tdU3yX=|Io4Iyr zp`*YLva}Hq5)#8M0%ot)1Iwt+&d}1Ub$7j$zkJ!++!N{EECR;7$mFK8+tASJGFI36 zgXt9Ox8c+zD>v(0JqZ&iDEy~Fz%fb#mu1`b%$`Dp6&R)vuwnN+ET z3ruDF@~IDN)=lLkov0}i`^hwx)6)jdpyL9c^wj=~B<9ZE4h75Q|=$%JT zibjMM7{yMHxk24l;AkRH zH$r*lQP*1u4mwfc2Nyo*+=L`#2*ZWVVd&g-AUfAYiNZw}p@|K$sDpPTcqiir+l^48 Pjpn_fC>kVA3g{K0+C3xv$ON{>(`BqjW1umtgNhj z{`~pl$B#mxaDIM%c6PSBynJhGYkhrvd3kwpadBZ`VQy}2W@ct;YUwY90Ksj;z<&*vWkKtn^r>({S!4}t0FX)c#LIyyQu zG{j&q-n@BJS65eEUER~u!)CKs4Mk_8Zrc$Xb zEiL)^`Gtjrd3kx++1VKx8I_flFJHbaDk{p!$;r&jOixcwNl7UvC`e07OHNKsOiYZ6 zi%UvMijR+vjg5_tj?T@^O-)UWiHRW+i8vfCJUkqa$45p+VzF2uB5P$(!ADmXYeC@3f(Ai&ShFDol6At8Z4AcTg71_lQD`uci#c{w^d9;yA$fAYY= zNh^Ps$0(PluorG9SD1sV3(V$*ojsr{mIf&Rhrs!xHjYxc2mo>iz@fYrvWCLO$*G)E zWz|sIi3)IARU>C05)3&8LsFbUI0)1**20LzmXbT6f0JU*Zj*t6O)c`|{q%nYK@gru z78NI}c*YX11pCXH6Q^-GNTNPsz>z{|q$t_9b;yGZ|ETg5o6>;NLuuqZYve3M)!3G< zM1gS>)WAWz5)G8=aJAXgzNdYrwc@GoiU#uT?zr=10A-Wkp>Sfn2Ev`o(2ZD`s`r>? za?Ec5Lw(;m%y(0t$R1bG3lWKQVU_?j3^b~03?RwVjDSTo(~>|yj}?Om(+W0SB!Oeq zjs2wMq1s7yNM^EikFo*ND(OP#Pdn~&$}$HfLj}b#Zif8u8nh`mcAc{U+JGcUkiPQ> zp-H0f@8IpF@dq|@R|nF~q})^gan@F`e+uKMGPAp+Ldwg!3NTd!C%%HpZEB9vN`gJ% zq?2zy9He-a!#yPKnj zYGw5{43s1E;zY!=*nb@NSBh>m(K_1#5E9=G6(0+-hsEB^_wb)_=S_RUvf}IdAY;y&DgZW;59YS84vl~b%=V)84wQ%?=k%m!Vhlvq5^ z#!!2nG~21sboNDG{vHo&f^X!;%3NT~;ZJ#^=P;#}B4POD3wtw9td5xpGYjp+d@_7l MZzdyJM+q?h7m5WXbN~PV literal 0 HcmV?d00001 diff --git a/img/color/newfolder.gif b/img/color/newfolder.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a914b46650c652950c4e7c57cc42532fcc6d43c GIT binary patch literal 685 zcmZ?wbhEHblwgoxIL5&6pMjz0|Nn|d|H~i#FT3}@^v?g1TmOr1{4cupzwq+^{EPqd z&i!|7T$jB2U-GWMNjrWeZu=g;`E%_0x6x}}Mz4Mmweo4?vWF2%?}snG6SnYH==>Yv zI@Td`uLjS)B%xy)H1k5>^s^GWwgFR5`At44sqaw!;J@#rV?GlOOBy(q-2U&=f5^Lc zzm%bqXV-4ejvZ1)E(I6=d$etLZ`mSk#zgyEr*M{}d#;(~X|GU($ajsn@ZS0nL z2!dWt=9@hCYtn#MXmClzkbe1vk5Yx0^ zU|>ky^M4Q`#h)yUTnzOLIzSf!V?=_1f&E`YeN%HwYg>CqJ40trcT->e1mDS1rZzKl z&z$5pXYM@T{uztNURuUO8^%)-jXzIYN7@0Klm`~reP!W%c%`)=O0W0$aqsF=9K zzNQ1b+js6hc0xjO?-HiN7muHml#-dDz@R+ijOvj~ckanDC@4Kv*O<6p^XTm>ujJn< ztEn?+>om_&*l@kqxxMDykChP@4;}4pFt{Y?vg7@cLv4mBXE;0-KX9z&lH7G7;_$KF z1`D;OEgF-S^vYP3u{?1!RB@A3P5k!Zqq4$;7M=WOS2h}VOqh43?S@R}XVpM?w@wj5 zA%R1#%bdHpCRVX|AM2I2F8lLiW6Iiz+qvCl7|inCzAkomBLjmq05YIo Ao&W#< literal 0 HcmV?d00001 diff --git a/img/color/open.png b/img/color/open.png new file mode 100644 index 0000000000000000000000000000000000000000..66c7c8012caf8dc0cba84680bbf8074304a14adc GIT binary patch literal 1640 zcmV-u2ABDXP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00qoRL_t(|+Le_{j9f<< zg}-|Az5Sd=d!~Cb4?7uRCyoJ;#7GDsi%1p%!2+>m0gE7o1!4tD*s^DVSY%@Xa{P>A zVgn)xk%{AHh=7Uh%=9?p>3Ow1Gu_kEuX}IR&!T50AV7g5m8wpa>YUPFs#7Wej*;Rv z30Z`vP%I$a2Q>_O2($)W0Szd?D#)T#8nE=|5s?Jw0bQUg-~_rBKz5o35(M8Lm)daD z!gB@q>}QmEDi?;CbS9&WF-lvjlrc)Y$2&*jJxP*?I43Si)Mlr1{~mnP3XtFtgbp05 z!#5`3xx?99saP7#jf{;I%9E41!r)+Luvk>NLV>8)!=?fR=ytm}??{q_PPa#=xkYv6 z18%=}8wEw{Ak)Qv=L^{5qx*^nM@pj;<%#jZk#gDQ3VAZw9AP$tcMfAMR)olTAjXTJ zq6p_b&U>s<7=cWyO#p2mvH=V|ZBpNT=2K4|EggE&WQ)UuxjbPegHiN1MKL}}P`w^n zX>=5!w8n`?_xc8ja~ME1x5?J)k%CnPO$$T?k!(4e)}_%AQn?)3d2F|fQIOJ_FbL3E zW3(n^3^AaT!g)^=CnU}hdr!|fy6rX_^{ps|Wr5hnu>FybuRXuIb|6!441{4wN-IKR zNNG)AEop19-eW{CKBPE&Cf0ZVm%}?@XFWL*I!6) zYzz#RM@id&K!i|)lyjuCMzltS0c5i1p&`g*a6y0x0@9fbJ{_X6S)|?JzNq%f{Omms z-hT1eG56k$8*k2cyYtVl)uxM6Q#w5yVo;bML=_77Vi7kqh%Xk=g?!(nP{3p}q>aHS zg%-i&^0XRTbl$$weh7B}Z-4pn%e?gBi*obo)yv11)($^&aC<7)e}H6Ugx>f#GBt^M zY>ZSsM>+_x2&xyMdOhg%kaiooT~wz7!^5H-e{v5k!le(>WT*`NL7r+=HO_~|MC^{=9zm?o3Y6No^o1@$^?w;*;9_3#KvK)gcjE_h0(f=O3RQ8#s6fo6kYJ4fFGTQ2?#_p`jF{EUKRm-~cZ`3bdiM-P~TN z)fVWlV7+s><6nN^hlPCZOJ;S=aPwwIL^5iu+!s>{wAtx*xZ4dE`Wz1_3rf*iUvDlx zdN{`p^is9jdsJJyW3)acVfqhoqq#1PEf7JBLG+IBuJ|5y#zNmP48Ul%)@qGvee=$q zfpgB?pP#REJDp}YR$4au_BDL$pcjGGsJ#$X|Dr7b-lO6e(jiPv&`O6aELNKd%mNs# z(OPR?tJSVAt*peccP(8mub^~?dZSg~;>FL#AbYzvy&HZY-g%ksn z_uzMqpUa_2lQ1wq^=~u0cK-bPr+<6#%sK#bx_k2M+1GEaEMMp# z9|AG|1y*alM-u0%3zf>>(=c)zx$|iw&UC_ zpu;D?dhb6b#?WdsX0BYjW~$xz=(D3^pX2VVo_piX+R3wLZ=IOCd!j4yC!qOB!h4zn z0|R?RYfUPh=Je^)e|>dk=I3A8Ki#w|tEJ1!3%_54%M;VnYac)1{|zdR|Gj)kk|5q| mqqRjuIq#h)<^ErBfPVn(s^Mg?`TlSK0000hHJ-%|Ay-`{thqV2!EH*eG($!o-}i6-%pLQ?7C+20nzc#%wn+4j8E-6i Rd6rr=Y+3NOYOf%JH2@XDO%nhB literal 0 HcmV?d00001 diff --git a/img/paste.gif b/img/color/paste.gif similarity index 100% rename from img/paste.gif rename to img/color/paste.gif diff --git a/img/color/paste.png b/img/color/paste.png new file mode 100644 index 0000000000000000000000000000000000000000..99dabecda328a2401f5756753a5bf1b8513715f4 GIT binary patch literal 1747 zcmV;^1}yoBP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00uWnL_t(|+KraWk5tDQ z#eY?GZ{L11k8YTrR}ahsW)Q|OKrj{o^ANER861x+W646^Ws%6+1R_O3N)##oK$gie z$|?(#jY$FlSu(^KGr@R(a0>^?v4Xkeg90RTc zhozJjAcG+Afkog?z;6LcDuuHfU||wZRxL#$XWN2@nFV_xJaoxOVNDlS-wyckdpPlar*=X{3~DZf-8) zgyis%H=Dd5FzcmKy^=3_PuBD0FROLE=xd{&^D(bcvw(w2se?z49t{r;4l+MK4?t^c zE9rC^AtbI_66MmfCV{xxnT=IieweNAPscYd=MF6{6#e=8-;DqD@1t|KfOStpU|wP< zU??7spB)$&h#6y;n3$kcDv?YkNhA`4LLpqY#KOXg&{~JD4)?}8I+Ht8RJC+QoZjPY zI}dhuwGPB%s2q00nOg;8Y@!IGIc)qps`X`##}t7{_r4hr`&mMebRi zi6^s2skwT&pF}Libiw24>Kb}!UG7cBb{^?Uz0vLj-T9nb8DH~e5Y$Wl)_@;ZDitrE z&r>d!34#DA<%B$E6GV`2G(LQ!Wcu zR%?_z!Lve%csU>$Z>E%KBef^pxId%z-=0_-TQ7Q(YTHDX>$>}EwOT{DTo(C!p5^6b zCMG5r8TpEtnQ2-x8P1bN_y z`bP`!f!}GZ+vn%!hnJR?T7{5K5NKsgARQ;n-o5*{aN%9*qK(;=45{=^(sr3#ZiBha zQM}kRR*OTrX$Q%Ojc2qhIq@h0`?-@1@JryP*7^$Q!FMd= zv(Ij^vh;-hy{*JLTFK>NtgWr_cx;mFPQmFTZ6G8Yxx68e0R}C@cI@M~8 z=2R*lkH>4x%_%1ujS!7S85kH~_wGHUQq62^tn>NjUvTI4ZB|znxp;nneZ5)G0T>%0 zLlT6vzW(}~7az$0CNR`IkHD{N&P+a9#mJ7{zFwM|8gQI2p-{ls*ccBU{FA$P?=m_% z%HW|MhK5elluA)Ac?5xlkoFdXqk}!KOxYNNuQd%x$Frqd{qn&b{&DXfjg5`imcn%l zEH5uJKK_LD^)(J2=;qU(e#Dt`Z&9fk>XiUrON6wf0Aam#tnXET7cA;BnT*Noo*KXZ z!%c48TB7cG07Swz+0G0nPn_iAk1ule>~SnhQOFels0UIYtgRvEi{5{2p}-g_<*MxN z>rt03ouaR=mz#gN!|dz|mL=)x>fprjL%j3OAT4cayh;r>?^4$iODT|`tdK$oWrf0t z*RD6)GASu#RK?<1hJMt=(0folJgtf+2Hl=cnNHpO9wx#{o zcd1}&v8!jrqIfzr<)U>(zYHA$sBC*uKNs~y3n6fezA9CM1waVfw!b3}7$v1lDP^U= p)PUgs2oVC1#$aph2cB0S{}0?Z!yp9ue((SQ002ovPDHLkV1ia6F<$@x literal 0 HcmV?d00001 diff --git a/img/color/perl.gif b/img/color/perl.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0ae951ea38d7f491046d6b77b45dcaf7b63d869 GIT binary patch literal 76 zcmZ?wbhEHb7n? UoCT&*i`}M5Jf0ETEy7?80Qn6OvH$=8 literal 0 HcmV?d00001 diff --git a/img/color/php.gif b/img/color/php.gif new file mode 100644 index 0000000000000000000000000000000000000000..6af3cfe131fb74a503813264f8d6f35ac465e97e GIT binary patch literal 568 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 KiHgSn7XJqv1q~Dc literal 0 HcmV?d00001 diff --git a/img/color/projman.png b/img/color/projman.png new file mode 100644 index 0000000000000000000000000000000000000000..f04e4b4d0af9674d470610952051bccc1d5b836a GIT binary patch literal 18193 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 literal 0 HcmV?d00001 diff --git a/img/color/refresh.png b/img/color/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..d79912607a46742416f8280698a5592c759b8bad GIT binary patch literal 1997 zcmV;;2Qv7HP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00%KiL_t(|+HKZZY+QF0 z$MNs|-)-j3*fZl<9NY1hIBlGCp-G%pN((7%6c&j}MO~;0q5@jr0ac0+6;JS5(Mqj^ z5S4&bs8CgOgDxRbN-0g6#?E5LX%g?A*dBX4GoHmWbLVb<9zto6I66<~<@0ck^gBw# z007T}RscWy!5*YtRpL=iwb~P*XMQ)@|Fzq#gM(>?Eu$6Nw57Y4XZhlyKRUVSpE+<- zTWPKAdDGWg!Pc~aA4rN-k7CsaKm(9KAU}mXoTj_QcijiSad_85_uc)?9?MWds zAT3HAES}X$>qQ!JJDq!Ur-$cV=RenxT zRiNcxSHE}v_V0fGiJunvDj2b=pcqy`hGqTUW2yrvr)oDWDAZ1eqs~ zJo$@#2OqstSBnOoi;V82*s_=$JI*Jkj*_7P}t0<)Kn=yLBDZ?+y?%)9SyHiIcOYHFcppZ?J^ z+lFttLGi1Ks|+x8d6w~GzryJ#lZ?tc7WY zaD~s*M@KQrAF#bIL4Zz6A0#>Qb9#plqbLeq5a4$%G4YSz5-$9Ogjquf1Gm+pEgZqj z?BbJ;-_SBK(XA*X#PC4kM#G&mAj<6QHSG2Cq}yFWA(Ktd!cX5rX6IK>00qz#h1-UE z>Dv7OId2!0h6L&0xh;%PltkwcJ_e>9XhJX`Vqqn&u3QsT9oFZ^FoRXBu!-kG%Qwi^ z+9;H+-?WqxDZzDplF1Z~=w#DYaa&D<8X}tL#t64#w_JpxsFo>`qFk#xetC^%c@4X= zfT6jlx``)s@N8;pSD2fd$Mz(S7qD4xuu*NWx|X9}ULx>p?50h$V~|Am7bq2qxK0C! zzz^`W+2z`b)2w)Yc^Zud2o=v41d2gOs}pIQs882?8IaB;t7VvW%A6&qk$!E2c0*O@tKm?t6e+4;>-D;c)82 ztBBS*;dH8%&DW-+q@l}Oi1*Xov%ht{qmAWjB&)aYN0k)ri}uV8%t#7Q z5JJ#1bO-HQ@1SN2E}s7v$6tSe%OAfuC;$F?3JarjC3O;sDAP;! z(m%(mFRm25qks#bTBZUDq+?p+O15>S(p18USh!C%mm|wlA1Z6PMOrP7M!mvDVTJRj z-s0q6pQEraN+KfZ+LAy~b^FRXgPZLc^L9-R9V}SltmiW{OZ-7rNO_qmo6HbreOjH)=t7e5QWx+)U$-#cJ?2Q2SgY ze+F#L7+9vDQ1QqWT?~yIcJvqz?&vWNrQ3sEUG+5Sd#WD@i5?EBP1Rn?yVDovoA2bW zFEq>lsn38;gQ%&pQT13VI7BU>L_$K#uDON~BvggokU@tpk&a6-kmQ1Zl4%Ir52Ww7 fQY!rKM*;9}8L*WLasKNw00000NkvXXu0mjf)`7*e literal 0 HcmV?d00001 diff --git a/img/color/rpm.gif b/img/color/rpm.gif new file mode 100644 index 0000000000000000000000000000000000000000..521b4684c6f017f1ab1dcfc24293d3fb32861d14 GIT binary patch literal 317 zcmZ?wbhEHb6ky}1}SFNx#AMn6cqYJMLU$_&ueO2 zRZ==9C%0HaJeiNjn2oJeK;VMB{1I8%i}JEtY;7+pDqfVA+a)c%M@IUJg8V)kOFMS% zO_I_#bak&ODP2=gyr!twt)jF>Q}dXP_60?S>x#-(6_rk^s2(*o`i}|}f3h%gG1xQc zFaQC_PYi5P2j&-e=t%XSkXKNU5a9AW%s5dZLi7ad;Zw2-(tYepq!qo`guRXy9ZXp> z>+FQfk`;CfCS;_jPPKAYQxDV7)Y6V+)^XO=(>Lg3HZ*cKHZe6bx3IMGoHyUak--`O DJU3!p literal 0 HcmV?d00001 diff --git a/img/color/ruby.gif b/img/color/ruby.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fc6d3a614c22a3d871fbd9d5a5c4e94361727de GIT binary patch literal 66 zcmZ?wbhEHb|8M{Qf77W`d-m?# z`~Uy@|Nm3||9}1e|NZ~}Yl4ET?CtGkWo3W<{J3z>hKG;uKYVyHJ3D*H;hC<}XY&+S z@^{3|U$@}Hhn%9KB8Md%hc92@bm`-9?RWQWFDxu{STg0niIV~XbN>JDnz6J{R_>*! z$wmRMP6oEMQc|7&|KGlQ_pGVuLT2XW%*@&9>K+FV0v)jK(xvj!($YP93V#27vUu_0 zn;_7A^XBxMH_u+ad|6dhRYynX{}2R8MEhCA#3dH7N=mUx%gD;fFXB*8WK~jDVO3qk zuBN_BgLO+2qo$U&j;@~m-bDt6M#d(lW=9v98(3IcT3Ih^vaz+bdus3Cc&y&Z`Td9Y J3+o#htO14ZP#gdN literal 0 HcmV?d00001 diff --git a/img/save.gif b/img/color/save.gif similarity index 100% rename from img/save.gif rename to img/color/save.gif diff --git a/img/color/save.png b/img/color/save.png new file mode 100644 index 0000000000000000000000000000000000000000..2e26b567b38decd3715bab53be5fea650ba28e98 GIT binary patch literal 1497 zcmV;~1t$85P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00lisL_t(|+U=D~Y+QF0 z#()3E+&km(j6E}U{E$m1c10SbBtUowfvPr2N&27_2#`=q1&gv^mkn$XyKdO9VnG(5 z6jdxLwE`qc5FoXpq!hP_?by!4vB&S&^YD0l=g!>6|FCd~5D3AhJ3i?w&f=W!=zK@# zQzF6#3H^a~|3AV10vpE>zx?@+87?}eZ|t+a)1^PB{7ONWhYEJ|NGUT~8OW5iRw@Y7 zsMd;V^Q+zY=7H=!dTJmQam+4p^`ikKBU^3to2w)A6 zAf3)5t(^mTZ?Q2uywI2)8{MBf(wE$6HoLde*t@N?>D^zEQs`2@_sJ)}cK)fcCm%c4JIQ{?%I)UvYj3vx*z$Qj=ycx! zmI18M%AWbu;Q7Ja%`!`?M9WQ7UgPCK`3AHH#(>d?R^S{c1qj4NlqwJo8~mf`@C(mW zzW$|!`0NkAcj*@peIE#|QmBz~cEW3{`G`-a)+22h@_F$4J#^MX8I2eXO5;+CQvG1Y zQA{CTk!iWYE4AOyU(fUW(C5qN&YyVvoy9+20^YX(PSC`$!uP;41gk0GMnL~@Oa640 zOtFBXgkyq~F&v{f8N?)6>YcZES$@Su|80s}n#RprJnDZaXJHDsY6T>Wq@5a4JcIT; zoJr`c^k`SN$Rz~^pZFYEHHAw(;@FYI5lLLf#13cnkZ>Q_3+Zo{sdyeri!qu!psWb8 zSatRIm9YZS&R@F3m}=}gxMPexQq39j2FNg`6`KtQL4j4kmk`v@O18L}0R&kP*r zuh+JS916gusid#H)p&JyVE4%{pPd}aW%J~WCiE=IDO|P2{*CMSpD3fF1ec_T0xNJB zT$Ev4o#N@jC{}}O`E(k)2&4d7z=geZ;iZc!FaGG_^_SPS8qH!Kc9^l)@YU5_-%VZ#YB2NOgskGR{D!zsWjppY~1wT*cCr>}3lw6z(nedp7Y z-*_ln`EaBy-83QTbcuRx`m}#oCLjVz1aX2(AxTn{6I^lt5}^J;fC6h3TEliTS$yTq zyFV#ry!>}Rp8IwwXAAqG#u<%79h7w_Q8)oD0!~nAigsW`FiNnxgH~M!^Z>B{N~!zb zF9_Lq_3F;0V?zT+pBor|)(bpTHbW*3G2+lD#2xNdi=f4!U5b(vB&N~W9bJf)R&HV|v{#&HXkz^}S?$yWVeKt+{Sl`Bu)s!Q100000NkvXXu0mjfuGH5` literal 0 HcmV?d00001 diff --git a/img/save_all.gif b/img/color/save_all.gif similarity index 100% rename from img/save_all.gif rename to img/color/save_all.gif diff --git a/img/color/save_all.png b/img/color/save_all.png new file mode 100644 index 0000000000000000000000000000000000000000..0447fb18e273ccd6383139d11686b899ea4b6a95 GIT binary patch literal 1543 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 o3yrSm05{MmQxXUW9%j1uHw*MTM9jDKPx# literal 0 HcmV?d00001 diff --git a/img/color/tcl.gif b/img/color/tcl.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f8196212548171d426f5b6638240e5e0aefbfc8 GIT binary patch literal 70 zcmZ?wbhEHb1pDc`A z49pBVAhjTk3``0={c5Lk7;XnSoKw(RWBz-Y&K&Wyz)&-dw6)V_dYzOJVXy`Osd*rp literal 0 HcmV?d00001 diff --git a/img/color/tclhtml.gif b/img/color/tclhtml.gif new file mode 100644 index 0000000000000000000000000000000000000000..a578d9b2e24b7ef514204989fb6abda1aaac2d81 GIT binary patch literal 561 zcmZ?wbhEHbFfiEL+Y5Mgnwl;Q3bJzdZRaVjV{}-kg5<^5vU1&)&Rw^X}cV4rr~Ln4^Z$R>|Nl$=|6lk2|EB-{ zxBvY4@%Qg1|Nme5|Nr*?|3Edb|Nnpge+UA_f1=Jssfi`2DGKG8B^e4K8L0~Hp1uJL zia%KxxftphbQpjD6j==Hr498>%`Gi5%F2ozO0uoI{g(DN*4pYV%Dm2IPLAe+e9X-= zY*qSsO^rnt@v2Gk3X3S1h%d5{(&6Ri5#kkFWG}6`jD>egld^>zCl@~x+ulVEMgois m>>5WGSvhD)NT}K^YmzrK)P1UFpnt5MmE-+~_Y3PA8LR=yNLg?I literal 0 HcmV?d00001 diff --git a/img/color/tex.gif b/img/color/tex.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a2e79456da7fd4ef1f69b9ac974b56997c7a1c9 GIT binary patch literal 66 zcmZ?wbhEHb6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW00620EC2ui01E&O000O%096SbNKhbvg9r}}1n{q+Lxu(&K2*ps m;X_pnC0?v}P$B?~8aMt+nDJxAkS0f390@WcOOhl50suRdCzdh* literal 0 HcmV?d00001 diff --git a/img/color/tk.gif b/img/color/tk.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7ce73b262a7d2d84b6610285c169a681bf02a7a GIT binary patch literal 106 zcmZ?wbhEHb1pDc`A z49pBVAhjTk3`|Nr^~Q>Cg+!`(IU81HHXOPc`$(-z_GOCv)wz?mA2RH@;?Brm4FK<) BBFq2) literal 0 HcmV?d00001 diff --git a/img/color/tk_file.gif b/img/color/tk_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7ce73b262a7d2d84b6610285c169a681bf02a7a GIT binary patch literal 106 zcmZ?wbhEHb1pDc`A z49pBVAhjTk3`|Nr^~Q>Cg+!`(IU81HHXOPc`$(-z_GOCv)wz?mA2RH@;?Brm4FK<) BBFq2) literal 0 HcmV?d00001 diff --git a/img/color/top.gif b/img/color/top.gif new file mode 100644 index 0000000000000000000000000000000000000000..76b4cab29f8e11e0be332cb88ef653aef0bdbd64 GIT binary patch literal 1060 zcmZ?wbhEHblwgoxc+S93eDi=dH27_6;D0dw)El>y=|M6p>z6y|GpEBcy{jcXxr}Avcejr;rE$G; z-D+uLH_wh8Zq1urf!z8vj#W!N+P1khZ*gf@>sYaS3JVW6GIEF*6g)^g)WIR75pm#v(!mZXX^RR5#irx+j4D10 z0uCNx<&iYW*)U@gQ#+rWT?2<=5=*BLpRa~Rqta1UQSFE=1s|E*cqH0nPR(#!+}0~? zQS{=*!NU{6+ii_nK73^M5KwgP5b6ANp`%0DW0FSXp%$0PTgB!YT>Z%6C88O;A|&zk zg;P^yBQ|B+JhZfXx_*mrlc)4DPI1HJ6H{JhUF7LB4!*D?aC4ilwE0BApc#jr_DWe4 zKFOKUd`qcaujG}%hRe_R=GjyQ$=^A=ynnt~y%z(QipGwkj)oiuXZXpwDL!Q1n|1%+ Q*CpTIKRC?9&ca{~0P5IKasU7T literal 0 HcmV?d00001 diff --git a/img/color/undo.png b/img/color/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..75ad305738def6c4f6dcd42afbb10880ac11a891 GIT binary patch literal 1405 zcmV-@1%mpCP)dfLjSr%r zMil+WgrJF$NK7;#ThIW52qsPfWWp9Fud$7cb{%8gqurw|eZTMZ51rXcM+h-~|2yY* zzUPyi^ZlKJ;65rUDk2bqd;&w}JcUHdQb_6Xr7j~3Zr6|SF+wzm9Y5>1`p4DjUxQKMfi}+xSYl$Bhmh3 zAQZlRdpdf)bGWznPUK891%3B}{R?=eLiNJ#U1c9WRb#eN1Pc%q0YnT0K#)!+L86lb z;#D9<0H($x(9=IO`TN-$*N&eVIMwe8{{jG`^BgxoWeHdP@jIoTKV54qmjD8YB>)Hv zfa4*<@-XC>2pu_krPbx~UeYPBDRlu)7nMDhZ!IaZ7*yoqfY&b_^F$^xB23-`*jjHj zyjnvalpA>N%AXS*UG2l2*RQ*~!-3#Uy%xEEkxIq`B=O$Y<>_t}ml}@; z!+u(0RF|!`nk;&{#53xaI)=mjB7lDmVOxW>{y^ixV>{NVcN8db)$E$sZq+4w>zka{ zn%WNRUeTuF$%2`h@4^~>>Qck|aqqXcMB#Y4r*zDTa`Pv3Ca=0rKJSv_%RPR(s@om}R$tk0TMhG!dmSuGu$1Rjf zr3Qi^@&JI&-axpseuJ3$?uN_$jrjIUMHc};J?E0MRaU+X6LD52mC~E4YwGr|T3y*> zDlFa%2$ja7(PT22oC1K@%=%Bi8gRV1kqT)Sl{}}E68O;*-R@LI>;nKHCxB(xvX!e= ze6;VAeeX7Gsy9_sEK{voxm;6SUA1I^Ucb>{w`W43&;S60XFN?Ch$(MKOmGIPZRq-C z(moP7A&QW`2cRh^(5+ zGfnp8j}zftTMCh!W1l6(G);ssH&=pHyTZ=Wt?0$+bbud17y_MT3V{7F%0P;I}rc?Mx)WR$ZR&@I1Us=0Zr4u zFbwcK4>FkyNRkANMgv-{)}Yhr=0x&`W4GKV+ism@H~}XycqAu)rfGquX#oHL$8o?g z3@{7>f*^opS>QMhD2f766e2<6Zyl@add1SArPu8xk5Q%E# zeJUPC)#WnQ<4>z&Nx?fdowi5f;{2cf!-yg=KuDY#7)eaS|Ea$K+`0OTfgnY>00000 LNkvXXu0mjfQdxro literal 0 HcmV?d00001 diff --git a/img/color/xml.gif b/img/color/xml.gif new file mode 100644 index 0000000000000000000000000000000000000000..b76c0257a1db98cd8db37652e7e72e16b347958e GIT binary patch literal 69 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 delta 1871 zcmV-V2eA0E2j>ou8CC`W007{3J@^0s00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k= zfP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z2FpoAK~#9!g_V75-BlUKKhHVm_xs&@d++Vb?QPd~?OwVu=-9?)*~ZqDZQ=w(2ZDx4 zl(#_G5H+IUADF1o$fAEpf`SI35;Tf$B%%_Px22miFt_Y2GIdn~53b+VY@YtcHgor# z_hdi&*w1cD)wlGV85=+GrF&M|?aiWeWH~z&P>D_V@h5QJ82M(qdWLUFyRqF?aCRbI5`hOW)+j&IXlH0T6 zdPCbaOLD!trjmD!PX}jSK6LD*UmWOv!8%TrL(m$Wn=?>h6t%4Dz45u4WbL!Fxv4dY zM4WQez|;&@Ttubfo084OeS2PiGKn#goRnh8OXM08O|~w#{5{RO=hGkD_?gG=-TKrG zS7z^+EJ8Va*FZn8=i$AB$B%W^H#T*5Z``mkRTH$m_12-YCr8FEu33?~dV5c2?`+sX z6s2iOj^MmyoH|`a>9f2Om6#cOM_Nne)T)+-B`dPAHPLJ?wSTPmXYGi8Du90Qp@+Zw z(hJZ0@zCKTFZS%Xse8lv_3xjZo(fJ54vZ{nGi^6r*RjL%;)L-{h?nJ^!a_>9Q8LLK zc@tyw%p~5))3n+^wJ%$mxvVLD#l^`fbLf2G0N`{}^Md9T%UUn*d;Jg3|D*rJTMHL= zwya)zbx#zQnv>qS#%-H_7OacK46`hU#%nk~0X6Or>2yS)VwjjI<6S6F>!-2pi%7TD zrMg=5vcH|492=V~_3P=G+?$)WY}s+;<(*d@-1o}<$%%=+rCqBtbW9;VuZC_lqLsg%?x7#!%QB^WiZMo%G7Zo6QfkC$aZE@<-+WL!Z!||`-yJvSXvo8 zIdt@zO`C67wy1q$CQ$zz8#(o=s%ffg?&#{Bx_CyexU3HAV*KXiv!wVdmv<$IR6wC< z(Z+i!ji#7>NawUid_$aAC>l&0vAUX#4SOOr1Q@$V~2GJl2Q5xd~ z969_tanI6!v9LkoVkVZT<=Xc)@l=h+H=hjX*>W4PSO(_?ffQcW-9r4Ofx~45A{!$YEUsVr1?Pl!wd<3{DhI6e0>In#gG?RY$dKX>M7_p8Id6 zl%HTx-83nCo^L<#BOc%TQwD~o@ly3@6A(Ew*E^sP;S!;Mx!9oyt)X0nVll!unorz) z8`;Kx26EFA+_h^v+k3ls`FF4J)vr9uf&Iq`;z^Va5b*#(&3!iiCgx3?V69LIg;Lp3 zEJl>_d0N_9`RJ`XczbXZ?fdNBeFq=^*!2wd53zUekLl|>hG-8_MgXNm87`4%L}^56 zWsI+VKY<@4F>W!N? zJu-&qT9U~+5fR^9xHx^u<^nk9m@O0vqvI39`}+QVtWu7mY7{yFlqmdI+@)%hHnOU2 z{>?X!>R2q1Lu^GGlu?=^M~C&X{!?Stx==bhJNX~PMWkWg*D^mwbFnLD>YKJJrD|q! zQ-3K}O5-50`C7wVqvMj#=lMU#e_M3UIT6uwPtQg3`G3~Be*s>=)m*ikyQ2UA002ov JPDHLkV1gEwoO%EN diff --git a/img/doit.png b/img/doit.png index 3ee5d6811936c2a32e70fea34e218b727999649d..4c2521d949dd55a307be2171264462211949f12c 100644 GIT binary patch delta 914 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 diff --git a/img/doit_file.png b/img/doit_file.png index 3ee5d6811936c2a32e70fea34e218b727999649d..4d93ad663bf4c7b270955d690d72a0a2cb86aff9 100644 GIT binary patch delta 914 zcmV;D18w}|4Y3E185RTp002sU^>Y9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Wv zD3PI3iU0ruLPWqM~UH3BjZq zjhAZDvzYi7c=6yLpeGZ(>BX23>yMM3Ok-8lngWSYx)lpzfyISom)(Jxc|AZ;-~01E z@8?b4S8O2SEHwgu$=hOA3NOBLrQjcY`NRANk8Upq_xZQ_SVU|TrHuwbf9{38S*ve9 zHRHUlhs}-ZJMVt_;qK=D0m}diz2k2^^Tz1q&VgEHC9&ajIfGu;nX%D|r+2K~1`z-m z=8l1gXWzVbjohu&shd2oRJ2Wrh}Qh$ZJ*tMR3~we?d&3J;6IQ8rZMq>Hl0 zHUiXDn7uUp9Nq(isZqnrUM&>UhT};E;gEYoVri3x=DkZ#bvIP2e$q#yBD*AR?ebcw!6GrRQwN#1UW~ zDP~hPN<@=kUeZqLGzf4>BY+4RB0StaG@*b!R7|>pYQ!N4osy(3P$i+gTqGrR1SKNk zO!~sWx}c_e$aVxkBk{%4qF&Y>jY(M+WD`dn6(GP#Jd`5|w%Z~`5fD^3kPSAe@;y~a zYMz&WWtf;M0Rc_|mzw!?Nqt4d!iYPf_+hz11I*W-++Jw} z1`)wXli&G~+xQ4cpu`Sf#PDbN+wZgvR&~n@wbgBp$1RCTOv>C~n*hb7mCF<*CBClg zee~5A?`JmWu&ikE=j%)BPH6jw%_vTnq-7UzBQ6~}9nBnh2Y*$5T77T+<{9 delta 1739 zcmV;+1~mDx2jmTq8CC`W007{3J@^0s00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k= zfP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z21rRnK~#9!eU@8n9A_DZpMPd{c4v2Xz3cUQ>$pyQh@IH3>qNv(b22HUq@fLIQ7@3H zwh|XDLELazxZ#3Zq#{v}KwLnDP*p{UiXcE70#y!G2x*-}c5Nqh5{G)d&f2r5+1Z)- ze=c?%4ypL0xf^}Y|Gxh>?>C|oP=E)29ErzS@O?Dj7q6r`jB+GuysNE^p8j&@i&HP0 z7!4cE`d@x`?(&b{aen@}$D76T*9kseeboSYvdi zjG?cJWaemMY_enb^3pEsi+9|3m7|@+}HWON2_HfEZvl zCB->c`E`ewehHcZ`R!BLS6-a{+Wg|m%F|A3V}pmL>2BP)K^tzxG#SA*vOH`dpP(IV7&y61JCc}#O?!w z1DR*WF?OYBpdO5`01P012$fj9*sb^3B)38z-TXG zd>cCkCKF?ZZCSByTjlq6sd#T3uMP0qDpaUgzf~ouHCvu(qUB+K;3(o2J0^Av9~|L$ z6R3D?z=wA*p4rc-TwhlgVH9LY{!ka$Lpjw1B!Xb;9;9O9lRD*M1E~N_2!y6^>(JB~ z-jV5l>Hsse4+NlT0{siq9Lw0*488$wgVe61%1vZ3fDrZI9wG|Lm4LN^i?38mfe;Y- z&^|AfjOWEL}NO3 zM+9Ant^NXmA`C!8$n|Br4vaA++wou=925JkL@I`efkYvHB{U>jGNOi_?iD99rs}@9 z#%9^WvJBNXl4ktKqnN3P!0}oZDIg3X&`GD0sfl4mF8;GM7sl>B#!NkKwkDlcG)X0> z2UxbL#*gI5TLFdh4sNk2jHNOge_X*joWtslDFNVytxwVqu_Myz@1Yk+09C_|k`$V+ zp;{7KM?#^031rn3+7je$jH2D%Wbxbuij|_ck-Mw((F{*~eYY6co5hIgicp8ZMfWR2 zO{{iCR*k=Zq^?bB)kATd1VjaTM4_Z0t}Ab$LiN{DXzP2}xLLxvU8e3gxL*jwjq46x zI!bDrt@7JD1eFjdQTNxvd-vIBZveDk{*7OKc%`;~=rukGFiN0#0wF=ygzpMgmWo{d z$9vqEJ%n?~UL^cGG0xS2N^|Keaq!cv(}cS#TGBH5vdH7CG}C?S&p z(d{)g`CL*Sd@ki1DZhU2Ubu1PqFjFCP3O!H-Y&fXT;JMg!ZhIfr*+O>4>@}osx|ue z4s&37jD3TB#=yWpESt`nsj?#zYsFA+21>+g61o?+^h&iVO4n}cci+3xoSk2)U2r{r z4ygavUxg5@yof~wLMY-fZujI^xp9XxKYTY35u>UJfr%oj6ovvJ1R>Bs;RTW~-)YH? hq%K|WKi7V%{sp+r%mv12e`){#002ovPDHLkV1n6}La6`% diff --git a/img/folder.gif b/img/folder.gif index 262aed56c0e7155ac05d0303014ddc8dcb5cf345..2013d99069667fc46b5c0cade6e019c64707e2a4 100644 GIT binary patch literal 139 zcmZ?wbhEHb6ky>F)>+LS=H6m&CShiZEXt|E?lu<#fA+Vwr}75 z9|(atQR3E)O%3c@j#B%%*LC{4r`;<3Nly&0C3tm8vpY9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Wz zE*!2hy8r+Js7XXYR5;7klS^+~RTM_oIrsQpJB|an2I9~H6$vUqNEPBCkPsc9l2$4c z7$7lVm@(oPFoAynqexURMJR{?sNx|-LWD<2XrjbX94E$kxVDoJJC1#Q?>V~zEGm^z zhuxDs`M$~CYboJ>-bQo(7fj4G9-v5_Oppsl3ZsPwL#4X?<7Q>`r16{;%8V1TOP(4Z zpiY@)^l9~Sk{{0H$MR!gVI1P|z4Y|7g5+KsW5;qpJFq@*JNqjc{1x2{g*%fvW;`e-y72l(nSb?(BY3mwXh z`5(<(_gA(+YxCljbXaANQ@|&Mk3ZNR7LQS0dicY4KKdl{J{izTg=bqqizDiE(4+|n z2=EEWGRi~1Du0j*r{7S|pbdyll#iiCgD06Hi$bGNfY4%#IxWhWjGAQ0ApN$o1|Q8n zd-QpY6pomGm;{TZO#{mq*3(&(5ozAieS?RG;eb`1B2PquLl87)Q5eR#j#Z$oo&WOt zzgq;PNFmfH(<7o!g2fTz^8}BRa10hSE?S$Nnf+q_Xb2xgml_cQ2!dcqu=F`05(Eqk z#mhJ5KCV?SzB_!*!_gxmHHZrii$h3oAfOcNsGlEmg$a0eA1u;t&SZ7+70*x=wlfdof_L*WQy|Cg^md-QUpQdz05bXH`OBkWzub(jRy pfE}g0tSRW6=Rab+|LHqHhueP`I>j-@nSuZS002ovPDHLkV1gEhTfP7Q delta 1470 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 b|A)gLjCWVAWinoM00000NkvXXu0mjf@qLRZ delta 1614 zcmV-U2C@0@2Ivfs8CC`W007{3J@^0s00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k= zfP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z1WN9S%jxhEFj!}2Q>_O2($)W0Szd?D#)T#8nE=|5s?Jw0bQUg z-~_rBKz5o35(M8Lm)daD!gB@q>}QmEDi?;CbS9&WF-lvjlrc)Y$2&*jJxP*?I43Si z)Mlr1{~mnP3XtFtgbp05!#5`3xx?99saP7#jf{;I%9E41!r)+Luvk>NLV>7%*Tbd) z1n73VIPXZ3gig0dr@2LS<^yiOcN+yo>mbv`f9DI>hE2S-Yy6Xl8V!I5&=<_dW- z*&JaugLe*NEmnlcc_7A%prQ!pJN!x%xgiwT(bELFJv_^#iWU}a?A;@HKL4XMY z(wPiC9ip;Xq}}1ZsP@YI>^%?Oe(~5b_uh>gZ_anS^UtrP?#V@6$aHSg%-i&^0XRTbl$$weh7B}Z-4pn%e?gBi*obo)yv11 z)($^&aC<7)e}H6Ugx>f#GBt^MY>ZSsM>+_x2&xyMdOhg%kaiooT~wz7!^5H-e{v5k!le(>WT*`NL7r+=HO_~|MC^{=9zm?o3Y6No^6s|EEsY_}kG5cTi~ zNzKy-uGYn*5@Ce9ve7#2%FDAyAAX6eNh0d z`k|o|q%5kR58wbVKnk>>wcXrasMQweuVB4%x#M4c;fIBM?n`EM&2aN(M?^AetlSq< z3bfhjcevXP7y2B34=D>u(OO?`E?7`u-lPwU#J~mMfJ?rCcsQKK#Ui2Qq*E z5S#V=lt&>5klk{N-ziA~`--S?3A#Prxp1-en^(`j^~SY#Pv2XrzP)=vvh!hJjPYx$ zt2b8GR?GQ+>FL#AbYzvy&HZY-g%ksn_uzMqpUa_2lQ1wq^=~u0cK-bPr+<6#%&uSAxJ^7 z2)P__;{43J*Xvg=UAlYn?Ah0Ett?;YARhuT{{>cSy+;z~stc9M-_tO1D3^UU9}U68 zIB_bF>fL*to3CG*J9+NhTfh6La<=2#Euh0EzC=CGb!O)0U)ew1v@5Hn z%gYPDUxdpO)6;7oKjHrkDvtlXd`XfZ-fN?^MMOF8ohar0UvYqc0PU*bWU%@EZ~y=R M07*qoM6N<$g5bgml>h($ diff --git a/img/openfold.gif b/img/openfold.gif index fc8adc589411454188baeb08e3a1635a121d7043..b535aee9b3db4c13f45ca8bf352191a6d59663bd 100644 GIT binary patch literal 109 zcmZ?wbhEHb6ky!aW>fKrQ5?DPFIZHC!867#dt=WChQ9Jlx#(m4c`xdUb9y)dmCzcq^WMHrc0L~X8 Ap#T5? literal 146 zcmZ?wbhEHb6kyhHJ-%|Ay-`{thqV2!EH*eG($!o-}i6-%pLQ?7C+20nzc#%wn+4j8E-6i Rd6rr=Y+3NOYOf%JH2@XDO%nhB diff --git a/img/paste.png b/img/paste.png index 99dabecda328a2401f5756753a5bf1b8513715f4..7d2d9bf78965e7c378e47c0dc19fa088a1e54d3f 100644 GIT binary patch delta 860 zcmV-i1Ec)Y4f_U=85RTp002sU^>Y9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Wu zI(q{Wg8%>n3`s;mR5;6Jl*?~aWf;bP-(}`Z&s^!uK&R>S0*p;dXpI%(B}M{OL=6zq zg$on^0^?Tc&cv1ffLqxZW8AyJM1wJrsx=J~Xf2Fwr!CC1bLi<@&-Wb{j%3tl`6j=- zdGox_qX3XZnBfY4^JJ;f#b)@LNgO0T$H`G6L6!(DGyrE=*SGYqYzz~>DX$cd9dpJ z(ybUn-!9FpnmrSnV-pxAkH8m)gW|nn^Nnty=2g7SJKrvU-=u1=gn;5o;=*)1WQ{{o zB#Gj)B}{A~F_In_N|wfFC#K!edebXA7}_XaO}>(HeF9=Q#E4L54arp!?6XZ(W{;kn ziJz!9cgnKcL36j+@yOyLkw^p<$x((#<1)x5JDeOicRn}%MP~H|ZN*;qEmep~g+Oq~ z16FAAI`cGtcuX6QE=dL{9vL}x_ui9rMHlU#YG)e4V}~`CDN|sc1Z65bAs|Brh;uyI zD*pPVCg3wOvbnH5EF7ys=`hJf6pzW{uumOLnn7Hw)UJpq0KR7_G&YnRb1$juyvZ(A zrYI0+n^lhSJSmL5y|whY1R&riKH{~>#Sb5ROc9rVQEEISN}LQE{6$`cdjj%7OhAjAmuP1l7nf-!$Wh}*zGIhpp1}fA zBK7Zoy(26gg1z-e6iW=^5ak|A++u}ixlEQO7AX*Vt_Oq!q&l*7n_C<~jR8bD#8}JO mb1Fw0`@gaf$S`7T=l);xwjNdRI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z1~*AWK~#9!jh4%gRL2>`e^qsF-+nWXZkV1|56lB*5XLY-Fctyx5U~&$9FHtx$wJ;` zk;vNwB1J+<6e<5emdP^8Dhrg2Ndf^`GQ=4(!FYyY-tSk_-M3%2Z{5mb1~5cc@=0GU z>(n`49eqdfvLs*wZvaEUIiMNX0O~-0(AePcw?DtfncYdcun|JCUiLVWP14aAW(a0>^?v4Xkeg90RTchozJjAcG+Afkog?z;6LcDuuHfU||wZRxL#$XWN2@nFV_xJaoxOVM-nv+VU zxOeX!larIA(`lrXYHn^W_L7#N5dW0;tjpj0Z6OeRSr5`;n_T(`u+!ivyZ zhp!Iz#ydKbJ5*G)bVi)s<83<+c6YT7#AB+nkSkP{3-y_V4PF2RZwug5B9S*D)9;cytoaR`UQ*tSLPS)Pd}vq-7AdbyuOEXH)ffFD;X6)&I9Q!bYYf&eMyixxr<1OZAJGP@!)wKWlINU$Ru!{3$W z-{l;$_y0x1dO7m`+i#w^ary9XzSr6Ckz2(v+Y)Wo>-CFDsZ2N=mP#pv5C|bCl}b!a zO))z9kXj|jr3?G`{tpg+Q!WcuR%?_z!Lve%csU>$Z>E%KBef^pxId%z-=0_-TQ7Q( zYTHDX>$>}EwOT{DTo(C!p5^6bCMG5r8TpEtnQ2-x8P1bN_y`bP`!f!}GZ+vn%!hnJR?T7{5*P7r8iOduU6%-+5G zxNzZJ>Y|O=l?d5oEIIKg0{gj>4e(3grq=oj z=);y0?K^ihWlo(wV}J6=kLl^@;j_K>`uYyBW)lg z8@aq8kO2lQzhydqANT_JIdHyzZ`<`>{Ol)FH*Wlz_KtR<(FmQL?QCqUF+Dv)C}a_f zIW#rKn4T^0U}O;wh1J-I2t|dIwm=BvtH#C$-2VQ7@`ZOlunrEMZEkICBhWt6(=%i; z863yq(W6nS)hdxllw=}GAz$SFgQq+m&w;fAWCW=~;<=N5U)1pMFxhMttu?z^TGPIk z&BdY%!0PHM)oO*Mr6ppq7=aFuAwi{5rdloHm5Quv)PM*=I4Bj8fUrLN@CwElf@cI@M~8=2R*lkH>4x%_%1ujS!7S85kH~_wGHUQq62^ ztn>NjUvTI4ZB|znxp;nneZ5)G0T>%0LlT6vzW(}~7az$0CNR`IkHD{N&P+a9#mJ7{ zzFwM|8gQI2p-{ls*ccBU{FA$P?=m_%%HW|MhK5dm)09e4FL?xkg^>0ZgQJ5zuT0q( zgReCWNyoFLTmACE9sY6e9*vES*p|X|3oI`$Gd})=_4PFl9_Z%NpMJ!db8k_p8S0e) zUrU6vqyS;Pb*%4IfEO(4GMS9Y?4BCG|HDmg-CCmVc>qMhHrdV$Cr_N@FVm>#PLJC z^UfeGZE3tp4L9#n*Ah!9kf5xPLI`Dr!im?eH`_8PDP>f};#r1%)Wy(ySHM(3NDz_j zd{75d#j##T0^a*aqd;Q+R!{nvL{sbFidt7pZccse!ZqIE^T3>^ZfYfZ+cK5dx6LU~BCMo>w3L58OAyAO!k; Q@Bjb+07*qoM6N<$g6WMlHUIzs diff --git a/img/perl.gif b/img/perl.gif index b0ae951ea38d7f491046d6b77b45dcaf7b63d869..44058c0e3d625099797c907a0443a1ebc503385c 100644 GIT binary patch literal 855 zcmV-d1E~B*Nk%w1VG95a0Ou+I000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP8AEC2ui01E&O000Oy0RIUbNKl}ngNh0o1OPx00EG_!MJ$ML hB0+}?8&Z6@@FGWv9|eB22r(o@gbGDwOi3^x06P;@lu`fy literal 76 zcmZ?wbhEHb7n? UoCT&*i`}M5Jf0ETEy7?80Qn6OvH$=8 diff --git a/img/printer.png b/img/printer.png index 57f212d853122d6f7935458b11373810f055573c..e9e9c45cbd6763f949f7b73b9130d376474c896c 100644 GIT binary patch delta 921 zcmV;K17`fx4!8%985RTp002sU^>Y9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Wz zB>a2Zr2qf}Nl8ROR5;5`lS^n^br{8e|Hqws=XGZ?Gl@ybt9h7KvyhesDpd-7APA+4 zE(EO`p}2D6%9Wryw=LqPi!KC3iy(p`TG47Xrj$Zc8=GVr+krefdCkn7%;Wz5*Tp2E z=WM?N-*?XW#A`r*gkTSrw$x)&?@r&ieXCv{4hKvzdW68G3k!$|A^-#s0TB%^ck0^J zqzQH&uU`3lEq|mxGEA#9!TX!o8v3xU{T@$paUFyBmo}%bYs|mc2c=CF(eYjMCR2~jntiF z@tY8dKuf>^&?JeZ#PeF^<3b}*NTA@pe&T5StN85K@s>pM3=-6tCFL9~I706_7iSz# zy2tc;A3gMMt35%-A45cqd$BV;Mkpi#@bQ5iGI5bL&=GV-8+xmdIdIq?9Pb`l7Lpha zE*=h&N8yiu4>xBvI|55cRd)6F9_~4DDQB?$3G!6o=_!QWo!a70b zxr50kD`6dl>OT3&$5WG5Y>Em32bb7BJ6HIO^miS9npvtAEz0pOUpxMilx3<&Ts-0= zNZ{e(;-Jw;T#@f%XyyhLb^6Uq7xI3Y3IdlTJ{}5zrA-@)gNMeTBvi?nD- z(9_?4p1pV|Cuq^cP-TY+Ucp1{25MMkj(bFGZU6JDZL003^{)OGvI&VHLXlyNLH3Ff zA#o|Qz<-s$f0+N26(vpSZpE`*PFgx4mMnuLkci#3S_ErmdhyRM7O!%LNO@#-?*IH? zbwjQyIFE^W&RwE3JwM0T_ z<$F12KfY4IK;~djBTZEz5J?KGQ`-$o v#g%Is+34-490gchhQwd|<_TeH7!dpqS&To+>xniJ00000NkvXXu0mjfjl-%Q delta 1852 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 Uwq79!egFUf07*qoM6N<$f&d(@ga7~l delta 1974 zcmV;n2TAzQ2h9(V8CC`W007{3J@^0s00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k= zfP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z2Qf)RK~#9!ZPr?Eu$6N zw57Y4XZhlyKRUVSpE+<-TWPKAdDGWg!Pc~aA4rN-k7CsaKm(9KAU}mXoTj_QcijiS zad_85_uc)?9?MWdsDJH;Sdh-+An-PYmtZcOWfF9W0*JO6x@$ayy-SpCG9Q1nwr~#Se*J_%oe}bE$!} zvG=V}<4@;i?B7JgVpV=lP*tGiUsu0(|Mu^G|B0U-*>mvg2aL~fb8JI@Yfg7;?eKO7n2F2RT37sla?8E0s3>sjc7uCH(uaTi zlc$dCzx&XBBPf{C))4UnXqnsbtO0WQ0_C+?Vu>vXRYlc97?BK-)GnHh27YzgN<_V( zhND|oui2*qiTx>{4EF??CyzY&i+u+ly;E0<2A+$I?xonWm>fIKC#Q~ovO4h&RxE`U z?PhU$l)1_GS(zC_Dj~G?L8{dXer?u@M~t3a$#1S#{L=uMDugz&clWn;?SJHsP`DDt z3213IGdG=O`t(uk>@hTZhPFroXD!LunK5elalHBx1U@UVKH7Tr5omD&vzLzOa_<*! zwjN!~yYFr`gDEv?YN2O;pZ?J^+lFttLGi1Ks|+x8d6w~Gzr4zrg?O$nMzCCeo*sO(VhH!^1E5^Q7Bd zLLrk)&%#gNLuTiHS5N>2&=iH+hI{GS{Qx;{7nOzt>EO97j8K$B=MX*yrXFZQFd$-K zC9bYq6I316=f^OERjjay=R?ak$k*B^l&;^jloBbyb$yb_6prX*(^hd?O@taEn&`#| zw_~?lgrcaHDUzaGt2=&qjb?cbyRv|xxv08{Cw1^_YHL@2n46o&_9TuMuvu@gQEjlg zmZM%?BJgbNrcJbCkVN+vC>4shP6LU+5Ad|v<=TqVtayHT8jS`B70(w0ia|)L6KR~} z>PIi)x(~A@lf-jfa=BH`oOltVejYQni6;e}LwBOJZR66|vk0l+1*&g5vY?G!-5jlM zHXjQYCI}mU+o&r#w%tGvX`txDjScMbOMLRyN1Rhq_`;-7&JuMl(;X|}*)0Y~9^vLM zJs882?8IaB;t7VvW%A6 z&qk$!E2c0*O@tKm?t6e+4;>-D;c)82tBBS*;dH8hmCe_tq@<*k>%qnc6ZO%D57MdF z7b9lsUb=>#!l}$sT>KCj1VlUfNcQfd>R7!0@>6t}HmTkbx^H=i{#);(V(T1x{RO7Z zzRT9m7?rv#j?dd~`vJD5Al+Bq-*|4%j?is=N&ALc{w#9v9(wlukkpRD1inkCt&>o! zA7^oYj-3Y{r>iSXa_cQ5dq-HvE^++L7r1!xRXQvi&4@bZFI6TAW&dx0uZ9gp=1SgD z%OkV1uWi`$bCKeD7GZUh9=MD4%nr;*3Q!P2&@*%g?OX4lW(zK!{};z!e}T&%zezk) zBb99DYPLD^-i6xpwj)mhs9{rpl&qB8Nd={UqbqFn#S}l)8y~0Leh4ZK0;^beSqp&baA|mP9l0Z>)`^sW{=7WiU z+8<_CoL>XgPZLc^L9-R9V}SltmiW{OZ-7rNO_ zqmo6HbreOjH)=t7e5QWx+)U$-#cJ?2Q2SgYe+F#L7+9vDQ1QqWT?~yIcJvqz?&vWN zrQ3sEUG+5Sd#WD@i5?EBP1Rn?yVDm{=bP{3uP-#q|EbS_PJ^havQhO|DmX+fp+rJL z%dWYG5F}KE-jG3uFOiN*F_7effRbql+YhAgxKb+o??(afZyB(a3vvGIGXMYp07*qo IM6N<$f>_teR{#J2 diff --git a/img/save.png b/img/save.png index 2e26b567b38decd3715bab53be5fea650ba28e98..5a3c750af904fbb6f7f954f1e79734bcf54bec6c 100644 GIT binary patch delta 759 zcmVY9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Wz z5Z%u&5C8xIs7XXYR5;7klS^+~RTM_oIrsQpJB|an2I9~H6$vUqNEPBCkPsc9l2$4c z7$7lVm@(oPFoAynqexURMJR{?sNx|-LWD<2XrjbX94E$kxVDoJJC1#Q?>V~zEGm^z zhuxDs`M$~CYboJ>-bQo(7fj4G9-v5_Oppsl3ZsPwL#4X?<7Q>`r16{;%8V1TOP(4Z zpiY@)^l9~Sk{{0H$MR!gVI1P|z4Y|7g5+KsW5;qpJFq@*JNqjc{1x2{g*%fvW;`e-y72l(nSb?(BY3mwXh z`5(<(_gA(+YxCljbXaANQ@|&Mk3ZNR7LQS0dicY4KKdl{J{izTg=bqqizDiE(4+|n z2=EEWGRi~1Du0j*r{7S|pbdyll#iiCgD06Hi$bGNfY4%#IxWhWjGAQ0ApN$o1|Q8n zd-QpY6pomGm;{TZO#{mq*3(&(5ozAieS?RG;eb`1B2PquLl87)Q5eR#j#Z$oo&WOt zzgq;PNFmfH(<7o!g2fTz^8}BRa10hSE?S$Nnf+q_Xb2xgml_cQ2!dcqu=F`05(Eqk z#mhJ5KCV?SzB_!*!_gxmHHZrii$h3oAfOcNsGlEmg$a0eA1u;t&SZ7+70*x=wlfdof_L*WQy|Cg^md-QUpQdz05bXH`OBkWzub(jRy pfE}g0tSRW6=Rab+|LHqHhueP`I>j-@nSuZS002ovPDHLkV1iYZThssm delta 1470 zcmV;v1ws0k2H6Xc8CC`W007{3J@^0s00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k= zfP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z1wBbbK~#9!?UhSxTz3`5fB(naJLB<;Ju`OvkV`0bMH-|eKzIm&sy0eV`k)mEkWfnn zi?U#s4Qvp*ZrHG5K^CACRV*sC0whWhAhn{T6t{`(*v`YT$M4wl@OXUZ&fLfUuyBYF z2*IX1KItsZ;+*g3d`IU~BEkm={egCW|3AV10vpE>zx?@+87?}eZ|t+a)1^PB{7ONW zhYEJ|NGUT~8OW5iRw@Y7sMd;V^Q+zY=7H=!dTJmQam+4u zvKtj#7y63e`Cu~O6bN7qkRYATBdwhSd2g{XJG{`C9vj`CJJOfjX*RpJ)7ZPMwCUYn zky7YVzxT-}zjpqqvE!o^xA;4MRJ4ssvfwhHEf@{jKwu+|{&bd1v4En4V}g`19HTfH#3Whjows;de#J%qZHil(#?4zi z>VGI_VG6iv1tg55of=YqJcIT;oJr`c^k`SN$Rz~^pZFYEHHAw(;@FYI5lLLf#13cn zkZ>Q_3+Zo{sdyeri!qu!psWb8SatRIm9YZS&R@F3m}=}gxMPexQq39j2FNg`6` zKtQL4j4kmk`v@O18L}0R&kP*ruh+JS916gusid#H)p&JyVE4&?FQ1(p%4PH9j3)Ff z$|+p6#{P}#_@5}FqXd_vhXN~b7+jQLT%F?S!YEdQYx#5&LG=)Ni1cuDNL`OK%3;F^G6xexEswa{lfx;% zDxi=v@wJV3`lqjdZ@sj&8LfTi)05wLC|mh(q%GYvA?b99dTsi&e^@3U0!jpNf=eMu zQj`;1asU#b{y~5OYZY3xVu)2d*T?h04u>eY```<4J*?9Hp&ZT2R14o~K8yJ7q3p`XdLnaO};?O9> z9qv|(pv9qGijov0rqS5s=JIY^gthww{EKZ?H+t{=;m+=F&zu-IQ!We^nmJ1@4#`P^ zQ5q$J5r<1-dfhI~{Wd%Gy<~m6-geKt+{Sl`Bu)s!Q1Y9K00Lr5M??VshmXv^00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-*n4F@L(&ZDmbV}19 zL(>fJr7!Py(Sq}EH}_sRhjT~x58JV<0@+Nbs&8mDsYZ{TA~x3}GD z8Q1cZRc4~#{)NyM*?PQj@0ec25E@b;fcT@r>4xSL(N>S1$7UWqfCT>(;nyCF%||!9 zuG^Q>`w>(SVt)qUqWFHJpnF#xh#iSVdJ*V!(M$l7T2hq3`!hjl**mi>GFRas2Q%Wst&flnMXvyqy~)=0*5>a`t!+WW48<4 zyhk84IJdL$qT~0VQRX}abQD}%ToUx*m$BE{-47jaUVX77AnJ^(y({ZG(eYzY$BgBM(&lUY8w@@a=V zs!U{UyMRQJ}NMYEE06Gm@p4;s`Us$P2150#uB0CDN-OsiggH@SqRwJ zOfbSdGDOhJ&##r=snB`j*&TFszA$WThG-y)AAgC1g9CU75++EY(0!SH4JZvfY=06u z(|T^!I*Fiw7m39sD4T+H&6)3ZalAEwjaJI+Mu66CdIO=|OjtIB_iT!}BOB*3La@DXByvo*d2( z$uCjH$&sT(d3u*p{Pb@cm1x+w$SD8-a@qr50rayViJeYNuK)l507*qoM6N<$g2@(g A7ytkO delta 1510 zcmVe|Mkpof+FRV_V~8Y7dER>NX?VR3#))3PGs~F-l!U zsze_UDm)-Xh$2LUSR_k*AYu^+5uku7q!wPtLzMR>Ng%d!U;bYWCzHvc6DLmm zGLcBU?z--AV0`Df`e6;9JbChtqeqWUpFe+ovQnw2mSy32o&rR+J}y2K!SwWW>d28J z-yRRAu@8AF3(b3U=&l`rJS(b(Cx(p8w zGe18MfbaVN-8%_BNDlPFhYvq?=+L3J2L=YdP_Ngu<)tMgNg@yk(A(QfC=>!f2!Sli z;Sc12rfD5}_wIc(olbu>old6~78Z~s2~E?u_~MJ~J8*zlJdSCaBoYZqr4pX!0d%|{ zfjl`m`A8%ZnNFpDQn$&n%-Y%-rfHH)CJBebbVsASe(4hT?%T)g>@1frUq%Rl>$(8J z_f*l;)Koeai=9>!WnZOIVR3Pha5zjb7^Kx|k7iP! zqU$=cEXRcq+a4%4CkGE6yie1#nS4HDEy_-XuJws z-BOY-0nGd~{otMBgTGOmo83l0Lsc}ILgDLA6e+ZSN9gK|U>F9fs-mhYLI`rX4OSMf za9dZ&A4_n_l)bafx!Sqw|ERz9q=Vyb1xDI6pz9Z(o?3|C`{g0~+z*fp8LcOPY#3}h zK41BM2CZWdUDwex4M~z%T)0YKB+tVS46|o%J27~v09WKv&8s?Y(`{OHd|yKND%B0a#!QXe@3MsZ zMtNxJ5cPVUjt+@0J$j4>j~^%2J4nN^sjshpQaXE%(TNFe9~k7d3x6fj@S@!kDL_&- z%5C@V-GSW!-J8&TMG+NfT0Tun(A;QJE7TbJ)P5vM;=qADjE;@q6@Wj!P(1gyH;T_GI9eF7%k*^Jvn9NSpt-V1V^4yA zv9XU3i-z$17GBH2Yi~jF&E0>0P zGe17{Q0ixU)uB�@|{KYgvSYRS*hoyMen|#M#K;7IL`d5>B;>?RvC=K|~}@&Tcs^ zu(oCT?qb&$ReOK?#XJ5ynu(@wgf#en?A=&bFH>4sMpiX6GlCrILKq>MvPR1j)T{=D zV#UrE>l@EsoPYN1#nMlJdFef>wfyOOA|L(UJ)<*jw5wMnJEj?x?ia^>~huK zESBwDq3mQYh z`HJObh0hJ30@SzA1iYd5AyVd~w3n!nJTfzC*v;Y7A M07*qoM6N<$g7a7IBme*a diff --git a/img/save_as.png b/img/save_as.png index fae921de074e96161869c8bdde1b116c8c423a08..44e498f2c432fac91465b9d34377e8ef58bbb6cf 100644 GIT binary patch delta 902 zcmV;119|+04y6Z>85RTp002sU^>Y9K00Lr5M??VshmXv^k#84&00(qQO+^Rd0u2Wy zG7+?2wEzGEHc3Q5R5;6Zlgm$BWf;bP-??zknKLj`E<*va)JmHmv_>SEgsM%krfD=W zrki%*WoP{tni%88uH5KW7cN{h(Wo(LtliXFH7czRI0zJ&f#Kr7Fu>ek&iTI21y~`* zck$-EJ$c^6^Oy~PXfzQ#45Iz+$?at;G*KAXXm%q>5=|0G4r6bIWShRTXRewun(OpCtw#`Ol&j7EGFbkl=#UaDxT^y% zIqh>eC+w?@vqv6r6Kg^7nw;&VjM~R!1v&Q}udBWuDHY;>W2_SCIP_XWsk^miuY958 zDdMEj`v7K;krijaI&8#??g|@dBjL5i9NX5t*>3xIyddVPiO^@2X4bfZa8P3CjyqhY z3|N>XXeMNs)4EccoF2bFnQE9?pUy7y2h*gmj#5cn_T&7*Z{*p*p+XIxXXzI8rlW%+ zgGDAXcW*?0Z`FQf9;{BwKR?pqF^_@3pvEQ=hcUXbk(jj8(evV!2N&P|n0Kif)Bcmg zrKS(~lsP0Z5-2nku93o{g;oSp{7y^Tg_p%C3_~O%&%YPD!8R7qK#T|xJj#5?5-tIY ztdiy?wr}=fSVcb1ob5R0*0@cY5{ezo}Y8@;_-K$#l$ zo>CQm3WWp$Bxo=MCW81}{-e?Ba`gmJAV48eNF)jc2n1+d2V=L%v6dhGB>jz#heb%Z z2T>1wu|c+^GiVDyFoU2z^~cT5bFp?8iNxG{X@@Ne;mYQC_U^ZK3TY|8z`_7BcmDir zk07*qoM6N<$f<~FFumAu6 delta 1774 zcmVRI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)kuMj2 z25Lz}K~#9!jh0(%Tt^+oe>3Oo+4b7HUT1xc9p~apaN;;2QE;M!B&10jk$|976{RR` z5lAFb-vA*hBrXyK2_X0U8kN>*?V*pB}D91z`>!?8Q?t(&;pkb!b2dK`jVatyVeI-+%lo!^1DcV1HF9 zJl{vJ-_txi!s>ndhar;{sIRSmDJ32R z0317b@YwO)yN@;%3XvWdY%z@HXX9~9pbEGU@xcf_Nbn(S=3aQ}V?ylDODV!i&GkX% z$iTp-BH?gbacqpOu>BF!d|`ViH1*YnSXbPtYaK5XYL|lQ4~sCht;3>dD}vy|)tDJb ze+0hMtLa=2A~y)7-l?g?vTc)p&1C2{&5ogX{23XJls?+t)m-qZp*L3Zuebr~<3kO! zB@C|JwF$IF>;I)N9zZG&cCXgE+M&G;5;~KKl;-Ct<@1q3P>CWFpo(3S<^FiVj-YVk%26c{*_Fu#1P=X9l9J#zbgZrp0j-HO(i?lhRSu}sz* zx9#wpQbFxMU$lLjB<}>RL+6jy?=%ijyfVV#+i#LzUZzs1P&G~bav67a8ZYTEbn*z% zEgM9GSBW3*@7#C%QFmW|EmLOnZa(#=tE;aCaediw+;>3C0+_=|%d|GfPwhPQTr$aa zisP#|w=6u<#MhdN<5DS3QUvUn#q2vdHf-%AY*|pQ2N6MaL3^LS<@wJi&t*qzPkj4Z zzx@?>-vb<(8fmIOJn-b9@N!4|#`k~9-+q0O+36YZ6-F|N+O!FOXT5Wsa+TkG^D@)d zSMck0LGrWE{5ZE`n|N{cEhy_Z$I+*EL|i9~{f7yh>sjno2fKX(U0*v(|A|jfp3Sm6o}xIr z%*^y8k@_fxmBB7A;TB75$j50kB+^ty$RGv?Go+2Hxn^GKdum&MZ%1pVKObUZ%4Ot! znOru9)01H5{sH#x-H*S^!?7LgRU5RRQY#Umo+rcs8a)SpD{Ass`yNIovZAu?KjvJ_ zFQ-QRS8rTdc(&_wq%#(3qPe$~@YW^D@6HkOY#Q7wWj6~Ih4vMZus|sv-?wpGlg(lu z&$P5*7$BV}|5$lTE4^l0rV63GO0e*Q3)APX-7bFV{PDie4YanjxAe3SpDwV$2w^TP zu(G;H)VI)oL9pJj8UhHE#0ct$=*@(HQn5tUt7riMfEkhk8J59V+Pm2~QOaL%@6SIu zSbMH_drMy>2OtQF4z61uBBP)MT7yO-f;AGQG}>SDBULLy;2_tnNlGCw4S^8QlCY*z zS?A&(M`m8i%4%j$e>=%&l$sEznghy3C=U_1NaZ4beHTMHn93%k9YVsz6fP1^t2N`r z1dsxRfU$WGt@VTZ^V#2QjK(*g>+1euL&RdmGBIl&rWOb!pphD+(nuX3g8-?01d3u| ziOHD$Y{1>7|G?AHqE7fL7j=hvA+Ue!IeQzqeGCG;NH!|(s zTy=t5z!H)wjQUdGsf{CQ@g|)6T-!OzF<_LiL}k9wRDX za=oC>|AC1R|8*b)NWhd3iS7QUCw| diff --git a/img/tcl.gif b/img/tcl.gif index 5f8196212548171d426f5b6638240e5e0aefbfc8..40bb4169ded732918f5b6697f925c136f42f8d58 100644 GIT binary patch literal 64 zcmZ?wbhEHbFWCb|G(l-7Dg@xMg|=QAOOiQFp2l{uVmcICfCB}s`k-G Q_uhBig_ly(0vH&q0VygHJ^%m! literal 70 zcmZ?wbhEHbY9K00Lr5M??VshmXv^00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-*n4F@JD?AE5w0008iNklK;^34} zBoyyIwI@X_b&>5opI@*2WxD`KK6LnEL3T0O23@mY=?sm!*^v z;NbL*&W{f{SARy>r?1cd$;w^cW1?eZ9ZT(PLED zlDM|9MQ9x=*s2Pd4x~ToIKE_b@DFWtMW8?e#SkPd(=rLPPOJhI*kC)d z+Be9Te}Hl`>436GkyduBusXLg`2>-%=JCv79RTiIOP#4lBSg=qy(ahs=O<^LdHiVNh4-3Of2?jpoe0pKuMOu>vKU}49U zadJGcGVGi5c$Wl#+h}OEO$T43ov&}RcC0T4{0Z;aqGwpphY?rOjML?lvyp^&k?S3+ zf8S6u+aIXAie!?R^u8y)jgWRBrWW@`Wd002ovPDHLkV1l!T BgNOhC delta 1371 zcmV-h1*H1J2K@?<85#xv007{3J@^0s00v@9M??Vs0RI60puMM)kuM&9)&c?m7zAAm zk~shX1qw+-K~zY`y_I`xQ&k+tf9KxY`)cp)YwK!hY3EjovaJ)w%Ms@`W(^O=Bx+DJ z2>dfLjSr%rMil+WgrJF$NK7;#ThIW52qsPfWWp9Fud$7cb{%8gqurw|eZTMZ51rXc zM+h-~|2yY*zUPyi^ZlKFgWx_YDk>rnf_wr)<~)T&%Th?`@ue;!3~t`&9Z0|fh{!dG z1E>}+q->j>6ke=cs(&<3!!bfMh#f!cxcbM{>0g6U;ej^K30Puc*1lphY+qYbyxdT% z(Q6ojj=0^amY+u*r#tULmglP#3?LF9m4R3= zlId|prtKrq{$wB&zI}T-dcJeGxA#uuOf&_3_k;Zlc&0-2!tPyVA3jxMwo(KO5ETJL z3LK;~~THFyxpB9XWcX)#dVD(kZYhbpcNol|7bkEh(}XROI4-*DoFO zL?$vKOx^?7T5mPHT024L58jlCVep+Kxm#wy%EPA@cGwPN)hQs|LfPW5uVOxW>{y^ixV>{NVcN8db z)$E$sZq+4w>zka{n%WNRUeTuF$%2`h@4^~>>Qck|aqqXcMB#Y4r*zDTa`Pv3Ca=0rKJSv_%RPR(s@om}R$tk0T zMhG!dmSuH+9LFt`N~H#ZAo2i!&fY+{vwnk^`tF9y{*CzdOGOs}Kt1P@vsG5U3=?ry zCzaBhs%z@@uUcK%WGXD)3<#CRqS0hBnVbTE*v$G*zZ!77xseKK7nMAxloI&S6W#7q zM(hIsAt!)k*s_(YR(!PYlYQ?tY^pa^R4h}iTDe?*Q(axPWPx74(P6h|LZQ$A0EA~e zO&f?QZ%9mV2CHr8`eo8S5;-A?kiG|?DJambt*vd`yJydKv)N2bBodq?C747)U=&3W z7K?>aDwP!uhr=ES1ROI>_T`Tg;ayt_k(^_nCB-y%y8X_vOhyc0*#LuHU%77mx;l%+ zLeeyU4IIaTLZJYj=Rqo!0>dz6Zyl@add1SArPu8xk5 zQ%;V8_ws%1ui791xp_;=i7kh$71OZa> zwsd1-BR4oWSZTA_o>wZB`EIv6WVhS9T3cIN!r}1UT%M(7CQro^b%KCYoi{^=<4G|M z|D_7Gl)0{gdtE8R3>pQF=6xz2M%CpuGS=fyt7A#QJ2suRN8;lApZ>#$A~8TnoEjKO dOvC@FzX061`ip@eMY#X~002ovPDHLkV1k^Ygcbk* diff --git a/install.tcl b/install.tcl index d9e6502..6e5f7d4 100755 --- a/install.tcl +++ b/install.tcl @@ -7,6 +7,7 @@ # Author: Sergey Kalinin banzaj28@yandex.ru # ########################################################### + ## SETTING VARIABLES AND DIRECTORYES ## set ver "0.4.5" set imgDir img @@ -398,4 +399,6 @@ proc SetVarLang {lang} { + + diff --git a/lib/editor.tcl b/lib/editor.tcl index 1318914..a517b07 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -388,15 +388,15 @@ proc FileDialog {tree operation} { if {$operation == "open"} { set dir $projDir - set fullPath [tk_getOpenFile -initialdir $dir -filetypes \ - $types -parent $noteBook] + set fullPath [tk_getOpenFile -initialdir $dir -filetypes $types -parent $noteBook] + set file [string range $fullPath [expr [string last "/" $fullPath]+1] end] regsub -all "." $file "_" node set dir [file dirname $fullPath] set file [file tail $fullPath] set name [file rootname $file] set ext [string range [file extension $file] 1 end] set node "$name$dot$ext" - EditFile $node $fullPath + EditFile $tree $node $fullPath return 1 } elseif {$operation == "delete"} { set node [$tree selection get] @@ -447,9 +447,10 @@ proc FileDialog {tree operation} { set img [GetImage $file] if {$operation == "open"} { - set fullPath [tk_getOpenFile -initialdir $dir -filetypes \ - $types -parent $noteBook] + set fullPath [tk_getOpenFile -initialdir $dir -filetypes $types -parent $noteBook] + puts $fullPath set file [string range $fullPath [expr [string last "/" $fullPath]+1] end] + regsub -all "." $file "_" node $noteBook insert end $node -text "$file" EditFile $node $fullPath @@ -511,6 +512,7 @@ proc FileDialog {tree operation} { set node [$noteBook raise] return } + set tree [GetTreeForNode $node] set editFlag [lindex $fileList($node) 1] set closedFile [file tail [lindex $fileList($node) 0]] if {$editFlag == 1} { @@ -525,6 +527,7 @@ proc FileDialog {tree operation} { } no { set index 0 + set nl [$tree nodes $node 0 end] if {$nl != ""} { foreach n $nl { @@ -571,6 +574,7 @@ proc FileDialog {tree operation} { set nodeList [$noteBook pages 0 end] $noteBook raise [$noteBook page 0] set nbNode [$noteBook raise] + set tree [GetTreeForNode $nbNode] while {$nbNode != ""} { if {$nbNode == "newproj" || $nbNode == "settings" || $nbNode == "about" || $nbNode == "debug"} { $noteBook delete $nbNode @@ -726,6 +730,8 @@ proc PageRaise {tree node} { global noteBook fileList editor nodeEdit #puts $node $noteBook raise $node + set tree [GetTreeForNode $node] + set nodeEdit [$noteBook raise] #set nodeEdit $node puts $node @@ -748,7 +754,8 @@ proc PageRaise {tree node} { LabelUpdate .frmStatus.frmFile.lblFile "[file size $item] b." if {[lindex $fileList($node) 1] == 0} { LabelUpdate .frmStatus.frmProgress.lblProgress "" - $noteBook itemconfigure $node -foreground $editor(nbNormal) + $noteBook itemconfigure $node + #-foreground $editor(nbNormal) } else { LabelUpdate .frmStatus.frmProgress.lblProgress [::msgcat::mc "File modify"] $noteBook itemconfigure $node -foreground $editor(nbModify) @@ -1231,3 +1238,9 @@ GetOp + + + + + + diff --git a/lib/filedialog.tcl b/lib/filedialog.tcl new file mode 100644 index 0000000..a8b1eb8 --- /dev/null +++ b/lib/filedialog.tcl @@ -0,0 +1,302 @@ +#! +###################################################### +# projman +# Distributed under GNU Public License +# Author: Sergey Kalinin s.v.kalinin28@gmail.com +# Copyright (c) "https://nuk-svk.ru", 2018, https://bitbucket.org/svk28/projman +###################################################### +namespace eval FileOperation { + global noteBook fontNormal fontBold fileList noteBook projDir activeProject imgDir editor +} +proc FileOperation::Open {} { + set dir $projDir + set fullPath [tk_getOpenFile -initialdir $dir -filetypes $types -parent $noteBook] + set file [string range $fullPath [expr [string last "/" $fullPath]+1] end] + regsub -all "." $file "_" node + set dir [file dirname $fullPath] + set file [file tail $fullPath] + set name [file rootname $file] + set ext [string range [file extension $file] 1 end] + set node "$name$dot$ext" + EditFile $node $fullPath + return 1 +} +proc FileOperation::Close {} { + set node [$noteBook raise] + if {$node == "newproj" || $node == "settings" || $node == "about" || $node == "debug"} { + $noteBook delete $node + set node [$noteBook raise] + return + } else { + if {$node == ""} {return} + if {[info exists fileList($node)] == 0} {return} + set fullPath [lindex $fileList($node) 0] + set dir [file dirname $fullPath] + set file [file tail $fullPath] + set text "$noteBook.f$node.text" + } +} +proc FileOperation::Save {} { + +} +proc FileOperation::SaveAll {} { + +} +proc FileOperation::Delete {} { + set node [$tree selection get] + set fullPath [$tree itemcget $node -data] + set dir [file dirname $fullPath] + set file [file tail $fullPath] + set answer [tk_messageBox -message "[::msgcat::mc "Delete file"] \"$file\"?"\ + -type yesno -icon question -default yes] + case $answer { + yes { + FileDialog $tree close + file delete -force "$fullPath" + $tree delete $node + $tree configure -redraw 1 + return 0 + } + } +} +## FILE OPERATION ## +proc FileOperation::FileDialog {tree operation} { + global noteBook fontNormal fontBold fileList noteBook projDir activeProject imgDir editor + set dot "_" + set types { + {"Tcl files" {.tcl}} + {"Tk files" {.tk}} + {"Rivet files" {.rvt}} + {"TclHttpd Template" {.tml}} + {"Sql files" {.sql}} + {"Html files" {.html}} + {"Text files" {.txt}} + {"JAVA files" {.java}} + {"PERL files" {.pl}} + {"PHP files" {.php}} + {"FORTRAN files" {.for}} + {"CAML or ML files" {.ml}} + {"CAML or ML interface files" {.mli}} + {"Ruby files" {.rb}} + {"Text files" {} TEXT} + {"All files" *} + } + + if {$operation == "open"} { + FileOperation::Open + } elseif {$operation == "delete"} { + FileOperation::Delete + } elseif {$operation == "close"} { + FileOperation::Close + } elseif {$operation == "close" && [info exists files] == 0} { + return + } else { + set node [$noteBook raise] + puts $node + if {$node == ""} {return} + if {[info exists fileList($node)] == 0} {return} + set fullPath [lindex $fileList($node) 0] + set dir [file dirname $fullPath] + set file [file tail $fullPath] + set text "$noteBook.f$node.text" + } + set name [file rootname $file] + set ext [string range [file extension $file] 1 end] + set treeSubNode "$name$dot$ext" + + set img [GetImage $file] + + if {$operation == "open"} { + set fullPath [tk_getOpenFile -initialdir $dir -filetypes $types -parent $noteBook] + puts $fullPath + set file [string range $fullPath [expr [string last "/" $fullPath]+1] end] + + regsub -all "." $file "_" node + $noteBook insert end $node -text "$file" + EditFile $node $fullPath + } elseif {$operation == "save"} { + if {$name == "untitled"} { + set file [tk_getSaveFile -initialdir $dir -filetypes \ + $types -parent $text -initialfile $file \ + -defaultextension .$ext] + set contents [$text get 0.0 end] + set fhandle [open "$file" "w"] + puts $fhandle $contents nonewline + close $fhandle + file delete [file join $dir $name.$ext] + #$tree delete $treeSubNode + unset fileList($node) + # change data into tree and notebook + set dir [file dirname $file] + set file [file tail $file] + set name [file rootname $file] + set ext [string range [file extension $file] 1 end] + $tree itemconfigure $treeSubNode -text $name + set treeSubNode "$activeProject$dot$name$dot$ext" + + #$tree insert end $activeProject $treeSubNode -text "$file" \ + #-data "[file join $dir $file]" -open 1\ + #-image [Bitmap::get [file join $imgDir $img.gif]]\ + #-font $fontNormal + set nbNode [$noteBook raise] + $noteBook itemconfigure $nbNode -text $file + set fileList($nbNode) [list $file 0] + } else { + set contents [$text get 0.0 end] + set fhandle [open [file join $dir $file] "w"] + puts $fhandle $contents nonewline + close $fhandle + EditFlag $node [file join $dir $file] 0 + } + } elseif {$operation == "save_all"} { + set i 0 + set nodeList [$noteBook pages 0 end] + set length [llength $nodeList] + while {$i < $length} { + set nbNode [lindex $nodeList $i] + if {[info exists fileList($nbNode)] == 1} { + set text "$noteBook.f$nbNode.text" + set savedFile [lindex $fileList($nbNode) 0] + set contents [$text get 0.0 end] + set fhandle [open [file join $dir $savedFile] "w"] + puts $fhandle $contents nonewline + close $fhandle + EditFlag $nbNode [file join $dir $savedFile] 0 + } + incr i + } + } elseif {$operation == "close"} { + # delete file name from fileList array # + if {$node == "newproj" || $node == "settings" || $node == "about" || $node == "debug"} { + $noteBook delete $node + set node [$noteBook raise] + return + } + set editFlag [lindex $fileList($node) 1] + set closedFile [file tail [lindex $fileList($node) 0]] + if {$editFlag == 1} { + set answer [tk_messageBox\ + -message "$closedFile [::msgcat::mc "File was modifyed. Save?"]"\ + -type yesnocancel -icon warning\ + -title [::msgcat::mc "Warning"]] + case $answer { + yes { + FileDialog $tree save + # FileDialog close + } + no { + set index 0 + set nl [$tree nodes $node 0 end] + if {$nl != ""} { + foreach n $nl { + $tree delete $n + } + } + $noteBook delete $node + unset fileList($node) + $noteBook raise [$noteBook page $index] + set node [$noteBook raise] + } + cancel { + return 0 + } + } + } else { + set index 0 + set nl [$tree nodes $node 0 end] + if {$nl != ""} { + foreach n $nl { + $tree delete $n + } + } + #puts $node + $noteBook delete $node + unset fileList($node) + $noteBook raise [$noteBook page $index] + set node [$noteBook raise] + } + if {$node != ""} { + if {$node == "newproj" || $node == "settings" || $node == "about" || $node == "debug"} { + $noteBook delete $node + } else { + focus -force $noteBook.f$node + } + $tree selection set $node + } else { + LabelUpdate .frmStatus.frmLine.lblLine "" + LabelUpdate .frmStatus.frmFile.lblFile "" + LabelUpdate .frmStatus.frmOvwrt.lblOvwrt "" + LabelUpdate .frmStatus.frmProgress.lblProgress "" + } + } elseif {$operation == "close_all"} { + set nodeList [$noteBook pages 0 end] + $noteBook raise [$noteBook page 0] + set nbNode [$noteBook raise] + while {$nbNode != ""} { + if {$nbNode == "newproj" || $nbNode == "settings" || $nbNode == "about" || $nbNode == "debug"} { + $noteBook delete $nbNode + $noteBook raise [$noteBook page 0] + set nbNode [$noteBook raise] + } + if {[info exists fileList($nbNode)] == 1} { + set editFlag [lindex $fileList($nbNode) 1] + if {$editFlag == 1} { + set f [lindex $fileList($nbNode) 0] + set f [file tail $f] + set answer [tk_messageBox\ + -message "$f [::msgcat::mc "File was modifyed. Save?"]"\ + -type yesnocancel -icon warning\ + -title [::msgcat::mc "Warning"]] + case $answer { + yes { + FileDialog $tree save + } + no {} + cancel {return cancel} + } + } + set nl [$tree nodes $nbNode 0 end] + if {$nl != ""} { + foreach n $nl { + $tree delete $n + } + } + $noteBook delete $nbNode + $noteBook raise [$noteBook page 0] + unset fileList($nbNode) + set nbNode [$noteBook raise] + } + } + LabelUpdate .frmStatus.frmLine.lblLine "" + LabelUpdate .frmStatus.frmFile.lblFile "" + LabelUpdate .frmStatus.frmOvwrt.lblOvwrt "" + + } elseif {$operation == "save_as"} { + set file [tk_getSaveFile -initialdir $dir -filetypes \ + $types -parent $text -initialfile $file] + if {$file != ""} { + set contents [$text get 0.0 end] + set fhandle [open $file "w"] + puts $fhandle $contents nonewline + close $fhandle + set dir [file dirname $file] + set file [file tail $file] + set name [string range $file 0 [expr [string last "." $file]-1]] + if {[string last "." $file] == -1} { + set ext [string range [file extension $file] 1 end] + } else { + set ext "" + } + set treeSubNode "$activeProject$dot$name$dot$ext" + $tree insert end $activeProject $treeSubNode -text "$file" \ + -data "[file join $dir $file]" -open 1\ + -image [Bitmap::get [file join $imgDir $img.gif]]\ + -font $fontNormal + set nbNode [$noteBook raise] + $noteBook itemconfigure $nbNode -text $file + set fileList($nbNode) [list $file 0] + } + return 0 + } +} + diff --git a/lib/main.tcl b/lib/main.tcl index 5f5a1af..70a7e54 100644 --- a/lib/main.tcl +++ b/lib/main.tcl @@ -7,7 +7,7 @@ Modules ## MAIN INTERFACE ## -wm geometry . 1024x768+0+0 +wm geometry . 1200x1024+0+0 wm title . "Tcl/Tk Project Manager $ver" wm iconname . "Tcl/Tk Project Manager $ver" wm protocol . WM_DELETE_WINDOW Quit @@ -35,7 +35,7 @@ $mn add command -label [::msgcat::mc "New directory"] -command {AddToProjDialog -font $fontNormal -accelerator "Ctrl+N" $mn add command -label [::msgcat::mc "New project"] -command {NewProjDialog "new"}\ -font $fontNormal -#$m add command -label [::msgcat::mc "Open"] -command {FileDialog open}\ +#$m add command -label [::msgcat::mc "Open"] -command {FileDialog $tree open}\ #-font $fontNormal -accelerator "Ctrl+O" -state disable $m add command -label [::msgcat::mc "Save"] -command {FileDialog $tree save}\ -font $fontNormal -accelerator "Ctrl+S" @@ -219,6 +219,7 @@ proc CreateToolBar {} { if {$toolBar == "Yes"} { set bboxFile [ButtonBox .frmTool.bboxFile -spacing 0 -padx 1 -pady 1 -bg $editor(bg)] add_toolbar_button $bboxFile new.png {AddToProjDialog file} [::msgcat::mc "Create new file"] + #add_toolbar_button $bboxFile open.png {FileDialog $tree open} [::msgcat::mc "Open file"] add_toolbar_button $bboxFile save.png {FileDialog $tree save} [::msgcat::mc "Save file"] add_toolbar_button $bboxFile save_as.png {FileDialog $tree save_as} [::msgcat::mc "Save file as"] add_toolbar_button $bboxFile save_all.png {FileDialog $tree save_all} [::msgcat::mc "Save all"] @@ -390,3 +391,8 @@ focus -force $tree + + + + + diff --git a/lib/pane.tcl b/lib/pane.tcl index 98a9c26..f0d81bb 100644 --- a/lib/pane.tcl +++ b/lib/pane.tcl @@ -98,3 +98,4 @@ namespace eval pane { + diff --git a/lib/procedure.tcl b/lib/procedure.tcl index 2894562..94979da 100644 --- a/lib/procedure.tcl +++ b/lib/procedure.tcl @@ -748,3 +748,4 @@ proc GetExtention {node} { + diff --git a/lib/projects.tcl b/lib/projects.tcl index 84bf5e4..9758482 100644 --- a/lib/projects.tcl +++ b/lib/projects.tcl @@ -677,7 +677,7 @@ proc MakeProj {action t} { ok {return 0} } } - FileDialog save_all + FileDialog $tree save_all set file [open [file join $workDir $activeProject.proj] r] while {[gets $file line]>=0} { scan $line "%s" keyWord @@ -795,8 +795,6 @@ proc MakeProj {action t} { fileevent $pipe readable [list DebugInfo $w.frame.text $pipe $f] fconfigure $pipe -buffering none -blocking no - #fileevent $f readable [list DebugInfo $w.frame.text $f] - #fconfigure $f -buffering none -blocking no } ## INSERT DEBUG INFORMATION INTO TEXT WIDGET ## proc DebugInfo {widget file f} { @@ -908,8 +906,3 @@ proc InsertTitle {newFile type} { - - - - - diff --git a/lib/tree.tcl b/lib/tree.tcl index 583faf7..4bd0569 100644 --- a/lib/tree.tcl +++ b/lib/tree.tcl @@ -30,6 +30,7 @@ proc FileTree::create {nb} { } -opencmd {FileTree::select tree 1 $treeFiles} \ -closecmd {FileTree::select tree 1 $treeFiles} ] + puts $treeFiles $frmTreeFiles setwidget $treeFiles pack $frmTreeFiles -side top -fill both -expand true $treeFiles bindText "TreeOneClick $treeFiles [$treeFiles selection get]" @@ -555,12 +556,11 @@ proc UpdateTree {} { GetProj $tree } - - - - - - - - - +proc GetTreeForNode {node} { + if {[.frmBody.frmCat.noteBook.ffiles.frmTreeFiles.treeFiles exists $node] ==1} { + return .frmBody.frmCat.noteBook.ffiles.frmTreeFiles.treeFiles + } elseif {[.frmBody.frmCat.noteBook.fprojects.frmTree.tree exists $node] ==1} { + return .frmBody.frmCat.noteBook.fprojects.frmTree.tree + } + +} diff --git a/projman.tcl b/projman.tcl index 7669c47..2249038 100755 --- a/projman.tcl +++ b/projman.tcl @@ -1,4 +1,7 @@ -#!/usr/bin/wish +#!/bin/sh +# Tcl ignores the next line -*- tcl -*- \ +exec wish "$0" -- "$@" + ########################################################### # Tcl/Tk Project Manager # # Distrubuted under GPL # @@ -118,8 +121,3 @@ option add *Listbox.background $editor(bg) startupFile option add *Scrollbar.background $editor(bg) startupFile - - - - - diff --git a/tkregexp.tcl b/tkregexp.tcl index b625f38..cf7ba52 100755 --- a/tkregexp.tcl +++ b/tkregexp.tcl @@ -45,46 +45,46 @@ set version 3.0 set geometry 800x600+0+0 # main font used to display the text if {$tcl_platform(platform) == "windows"} { - set font_regexp {Courier 10} - set font_replace {Courier 10} - set font_sample {Courier 10} + set font_regexp {Courier 10} + set font_replace {Courier 10} + set font_sample {Courier 10} } else { - set font_regexp 9x15 - set font_replace 9x15 - set font_sample 9x15 + set font_regexp 9x15 + set font_replace 9x15 + set font_sample 9x15 } # the font used in the popup menu (use ---- to get a separator, else format is {font size ?bold?} -set fonts {{Courier 8} {Courier 9} {Courier 10} {Courier 11} {Courier 12} - ---- - {Arial 8} {Arial 9} {Arial 10} {Arial 11} {Arial 12} - ---- - 8x13 8x13bold 9x15 9x15bold 10x20} +set fonts {{Courier 8} {Courier 9} {Courier 10} {Courier 11} {Courier 12} + ---- + {Arial 8} {Arial 9} {Arial 10} {Arial 11} {Arial 12} + ---- + 8x13 8x13bold 9x15 9x15bold 10x20} # the colors for the different matching groups set colors {#ff0000 #0000ff darkgreen violetred #ff9000 #537db9 #e4c500 firebrick darkgoldenrod hotpink} set bgcolors {#ffe6e6 #e6e6ff #e6ffe6 #efd5e1 #fef3e5 #d6dce5 lightyellow white white white} # use background color in sample by default ? (1 use, 0 do not use) -set background 0 +set background 0 # background color to visualize the non-reporting group (?:...) set color_noreport #fffdc4 # background color to visualize the lookhead group (?=...) and (?!...) set color_lookahead wheat # show/hide help about control characters in regexp -set show_help 0 +set show_help 0 # show/hide history windows on startup -set history 0 +set history 0 # mode to use on startup (select/concat = raw, select/insert new lines = nl, replace = replace) -set mode replace +set mode replace # database of some regexp to appear in the "Insert regexp" menu set regexp_db { - "URL" {(?:^|")(http|ftp|mailto):(?://)?(\w+(?:[\.:@]\w+)*?)(?:/|@)([^"\?]*?)(?:\?([^\?"]*?))?(?:$|")} - "IP numbers" {[12]?[0-9]?[0-9](\.[12]?[0-9]?[0-9]){3}} - "HTML tags" {<[^<>]+>} - "HTML tag content" {<(\w+)[^>]*?>(.*?)} - "vars and arrays (PHP)" {\$[^0-9 ]{1}[a-zA-Z0-9_]*((?:\[[a-zA-Z0-9_'\"]+\])*)} - "dd/mm/yyyy" {(0[1-9]|[12][0-9]|3[01])(/|-)(0[1-9]|1[12])(/|-)[12][0-9]{3}} - "mm/dd/yyyy" {(0[1-9]|1[12])(/|-)(0[1-9]|[12][0-9]|3[01])(/|-)[12][0-9]{3}} - "hh:mm" {([01][0-9]|2[0-3]):[0-5][0-9]} - "user@domain.net" {[A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,4}} + "URL" {(?:^|")(http|ftp|mailto):(?://)?(\w+(?:[\.:@]\w+)*?)(?:/|@)([^"\?]*?)(?:\?([^\?"]*?))?(?:$|")} + "IP numbers" {[12]?[0-9]?[0-9](\.[12]?[0-9]?[0-9]){3}} + "HTML tags" {<[^<>]+>} + "HTML tag content" {<(\w+)[^>]*?>(.*?)} + "vars and arrays (PHP)" {\$[^0-9 ]{1}[a-zA-Z0-9_]*((?:\[[a-zA-Z0-9_'\"]+\])*)} + "dd/mm/yyyy" {(0[1-9]|[12][0-9]|3[01])(/|-)(0[1-9]|1[12])(/|-)[12][0-9]{3}} + "mm/dd/yyyy" {(0[1-9]|1[12])(/|-)(0[1-9]|[12][0-9]|3[01])(/|-)[12][0-9]{3}} + "hh:mm" {([01][0-9]|2[0-3]):[0-5][0-9]} + "user@domain.net" {[A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,4}} } @@ -93,14 +93,14 @@ set regexp_db { #---------------------------------------------------------------------------------------------- namespace eval regexp {} { - set data(v:undo:index) 0 - set data(v:undo:sample) "" - set data(v:dir) "." - set data(v:file) "untitled.txt" + set data(v:undo:index) 0 + set data(v:undo:sample) "" + set data(v:dir) "." + set data(v:file) "untitled.txt" } #---------------------------------------------------------------------------------------------- -# Main GUI +# Main GUI #---------------------------------------------------------------------------------------------- proc regexp::gui {} { @@ -109,398 +109,398 @@ global colors bgcolors color_noreport color_lookahead geometry show_help regexp_ global tcl_platform - set top "" + set top "" - # frame for regexp - set w [frame $top.regexp -bd 2 -relief groove] - # options - set fo [frame $w.options] - set sep 0 - foreach option {nocase all - line lineanchor linestop - inline} \ - label {nocase all - line "lineanchor (k)" "linestop (m)" - inline} \ - underline {0 0 - 0 12 10 - 0} { - if {$option != "-"} { - checkbutton $fo.$option -text $label -bd 1 -underline $underline \ - -variable regexp::data(v:$option) \ - -offvalue "" -onvalue "-$option" - set data(v:$option) "" - pack $fo.$option -side left - } else { - pack [frame $fo.[incr sep] -width 40] -side left - } - } - # text for regexp entry - set data(w:regexp) [text $w.regexp -wrap char -bg white -font $::font_regexp \ - -selectbackground lightblue -selectborderwidth 0 \ - -width 1 -height 3 -bd 1] - if {$tcl_platform(platform) == "windows"} { - set sfont {Courier 8} - set sbfont {Courier 8 bold} - } else { - set sfont 6x13 - set sbfont 6x13bold - } - set data(w:help) [text $w.help -font $sfont -bd 0 -height 9 -wrap none -bg [$w cget -bg]] - $w.help insert 1.0 "\n\n\n\n\n\n\n\n" - $w.help insert 1.0 {\a alert \n newline \0 char 0 \d [[:digit:]] \A beginning of the string } - $w.help insert 2.0 {\b backspace \r carriage \xyz octal code \D [^[:digit:]] \Z end of string } - $w.help insert 3.0 {\B synomyn for \ \t tab \s [[:space:]] \m beginning of a word} - $w.help insert 4.0 {\cX same as X & 0x1F \uwxyz unicode \x backref \S [^[:space:]] \M end of a word} - $w.help insert 5.0 {\e ESC \v vert tab \w [[:alnum:]_] \y beginning or end of a word} - $w.help insert 6.0 {\f form feed \xhhh hexa code \W [^[:alnum:]_] \Y not beginning or end of a word} - $w.help insert 7.0 {----------------------------------------------------------------------------------------------------------------} - $w.help insert 8.0 { ungreedy: ?? single optional *? zero-many +? at least one {n,m}? ungreedy quantifiers} - $w.help insert 9.0 {(?:) ghost group (?=) lookahead (?!) neg. lookahead} - $w.help tag configure bold -font $sbfont - foreach line {1 2 3 4 5 6} { - foreach {min max} {0 2 23 25 42 44 61 63 79 82} { - $w.help tag add bold $line.$min $line.$max - } - } - $w.help tag remove bold 2.43 2.44 4.43 4.44 - # buttons & selection of match - set fb [frame $w.b] - button $fb.go -text "Go" -underline 0 -command "regexp::go" -bd 1 -width 5 - button $fb.clear -text "Clear (z)" -underline 7 -command "regexp::clear" -bd 1 -width 5 - pack $fb.go [frame $fb.00 -width 10] $fb.clear -side left -pady 5 + # frame for regexp + set w [frame $top.regexp -bd 2 -relief groove] + # options + set fo [frame $w.options] + set sep 0 + foreach option {nocase all - line lineanchor linestop - inline} \ + label {nocase all - line "lineanchor (k)" "linestop (m)" - inline} \ + underline {0 0 - 0 12 10 - 0} { + if {$option != "-"} { + checkbutton $fo.$option -text $label -bd 1 -underline $underline \ + -variable regexp::data(v:$option) \ + -offvalue "" -onvalue "-$option" + set data(v:$option) "" + pack $fo.$option -side left + } else { + pack [frame $fo.[incr sep] -width 40] -side left + } + } + # text for regexp entry + set data(w:regexp) [text $w.regexp -wrap char -bg white -font $::font_regexp \ + -selectbackground lightblue -selectborderwidth 0 \ + -width 1 -height 3 -bd 1] + if {$tcl_platform(platform) == "windows"} { + set sfont {Courier 8} + set sbfont {Courier 8 bold} + } else { + set sfont 6x13 + set sbfont 6x13bold + } + set data(w:help) [text $w.help -font $sfont -bd 0 -height 9 -wrap none -bg [$w cget -bg]] + $w.help insert 1.0 "\n\n\n\n\n\n\n\n" + $w.help insert 1.0 {\a alert \n newline \0 char 0 \d [[:digit:]] \A beginning of the string } + $w.help insert 2.0 {\b backspace \r carriage \xyz octal code \D [^[:digit:]] \Z end of string } + $w.help insert 3.0 {\B synomyn for \ \t tab \s [[:space:]] \m beginning of a word} + $w.help insert 4.0 {\cX same as X & 0x1F \uwxyz unicode \x backref \S [^[:space:]] \M end of a word} + $w.help insert 5.0 {\e ESC \v vert tab \w [[:alnum:]_] \y beginning or end of a word} + $w.help insert 6.0 {\f form feed \xhhh hexa code \W [^[:alnum:]_] \Y not beginning or end of a word} + $w.help insert 7.0 {----------------------------------------------------------------------------------------------------------------} + $w.help insert 8.0 { ungreedy: ?? single optional *? zero-many +? at least one {n,m}? ungreedy quantifiers} + $w.help insert 9.0 {(?:) ghost group (?=) lookahead (?!) neg. lookahead} + $w.help tag configure bold -font $sbfont + foreach line {1 2 3 4 5 6} { + foreach {min max} {0 2 23 25 42 44 61 63 79 82} { + $w.help tag add bold $line.$min $line.$max + } + } + $w.help tag remove bold 2.43 2.44 4.43 4.44 + # buttons & selection of match + set fb [frame $w.b] + button $fb.go -text "Go" -underline 0 -command "regexp::go" -bd 1 -width 5 + button $fb.clear -text "Clear (z)" -underline 7 -command "regexp::clear" -bd 1 -width 5 + pack $fb.go [frame $fb.00 -width 10] $fb.clear -side left -pady 5 - # selection - buttons for match level - label $fb.sep - label $fb.l -text "Select:" - pack $fb.sep -side left -fill x -expand true - pack $fb.l -side left -padx 5 -pady 5 - set i 0 - foreach c $colors t {match 1 2 3 4 5 6 7 8 9} { - button $fb.$i -text $t -fg $c -bd 1 -padx 0 -width 6 -command "regexp::select $i" - pack $fb.$i -side left -fill y -pady 5 - incr i - } - # text for replace - set f [frame $w.replace] - set data(w:replace) [text $f.replace -wrap char -bg white -font $::font_replace \ - -selectbackground lightblue -selectborderwidth 0 \ - -width 1 -height 2 -bd 1] - button $f.do -text "Replace" -underline 0 -bd 1 -width 9 -command "regexp::replace" - label $f.nb -textvariable regexp::data(v:nbreplace) -width 12 -anchor e - pack $data(w:replace) -side left -expand true -fill both -pady 5 -padx 5 - pack $f.do -side left -pady 5 - pack $f.nb -side left -pady 5 -padx 5 - # layout - pack [frame $w.0 -height 5] $data(w:regexp) -side top -anchor w -padx 5 -expand true -fill both - pack $fo $fb -side top -anchor w -padx 5 -expand true -fill both - pack $fb -side top -anchor w -padx 5 -expand true -fill both - set data(w:allreplace) $f + # selection - buttons for match level + label $fb.sep + label $fb.l -text "Select:" + pack $fb.sep -side left -fill x -expand true + pack $fb.l -side left -padx 5 -pady 5 + set i 0 + foreach c $colors t {match 1 2 3 4 5 6 7 8 9} { + button $fb.$i -text $t -fg $c -bd 1 -padx 0 -width 6 -command "regexp::select $i" + pack $fb.$i -side left -fill y -pady 5 + incr i + } + # text for replace + set f [frame $w.replace] + set data(w:replace) [text $f.replace -wrap char -bg white -font $::font_replace \ + -selectbackground lightblue -selectborderwidth 0 \ + -width 1 -height 2 -bd 1] + button $f.do -text "Replace" -underline 0 -bd 1 -width 9 -command "regexp::replace" + label $f.nb -textvariable regexp::data(v:nbreplace) -width 12 -anchor e + pack $data(w:replace) -side left -expand true -fill both -pady 5 -padx 5 + pack $f.do -side left -pady 5 + pack $f.nb -side left -pady 5 -padx 5 + # layout + pack [frame $w.0 -height 5] $data(w:regexp) -side top -anchor w -padx 5 -expand true -fill both + pack $fo $fb -side top -anchor w -padx 5 -expand true -fill both + pack $fb -side top -anchor w -padx 5 -expand true -fill both + set data(w:allreplace) $f - # frame for sample - set w [frame $top.sample -bd 2 -relief groove] - set w [frame $w.inner] - pack $top.sample.inner -padx 5 -pady 5 -fill both -expand true - # text for sample highlighting - set data(w:sample) [text $w.sample -bg white -font $::font_sample -bd 1 -width 1 -height 1 \ - -selectbackground lightblue -selectborderwidth 0 \ - -yscrollcommand "$w.sy set" -xscrollcommand "$w.sx set"] - scrollbar $w.sy -command "$w.sample yview" -orient vertical -bd 1 - scrollbar $w.sx -command "$w.sample xview" -orient horizontal -bd 1 - # set tags for colors & special - set data(v:levels) {e0 e1 e2 e3 e4 e5 e6 e7 e8 e9} - foreach level $data(v:levels) \ - color $colors { - $data(w:regexp) tag configure $level -foreground $color - $data(w:history) tag configure $level -foreground $color - $data(w:sample) tag configure $level -foreground $color - } - $data(w:regexp) tag configure lookahead -background $color_lookahead - $data(w:regexp) tag configure noreport -background $color_noreport - $data(w:history) tag configure lookahead -background $color_lookahead - $data(w:history) tag configure noreport -background $color_noreport - # options - set f [frame $w.matches] - label $f.nb -textvariable regexp::data(v:nbmatches) -anchor w - set regexp::data(v:nbmatches) "0 matches" - # button for navigation - button $f.p -text "Previous" -bd 1 -pady 2 -width 8 -command "regexp::sample:move -1" - button $f.n -text "Next" -bd 1 -pady 2 -width 8 -command "regexp::sample:move +1" - set data(v:positions) [list ] - set data(v:position) 0 - # layout - pack $f.nb [frame $f.0 -width 15] $f.p $f.n -padx 5 -side left - - # layout - grid $w.sample $w.sy -sticky news - grid $w.sx x -sticky news - grid $w.matches - -sticky news - grid rowconfigure $w {0} -weight 1 - grid columnconfigure $w {0} -weight 1 + # frame for sample + set w [frame $top.sample -bd 2 -relief groove] + set w [frame $w.inner] + pack $top.sample.inner -padx 5 -pady 5 -fill both -expand true + # text for sample highlighting + set data(w:sample) [text $w.sample -bg white -font $::font_sample -bd 1 -width 1 -height 1 \ + -selectbackground lightblue -selectborderwidth 0 \ + -yscrollcommand "$w.sy set" -xscrollcommand "$w.sx set"] + scrollbar $w.sy -command "$w.sample yview" -orient vertical -bd 1 + scrollbar $w.sx -command "$w.sample xview" -orient horizontal -bd 1 + # set tags for colors & special + set data(v:levels) {e0 e1 e2 e3 e4 e5 e6 e7 e8 e9} + foreach level $data(v:levels) \ + color $colors { + $data(w:regexp) tag configure $level -foreground $color + $data(w:history) tag configure $level -foreground $color + $data(w:sample) tag configure $level -foreground $color + } + $data(w:regexp) tag configure lookahead -background $color_lookahead + $data(w:regexp) tag configure noreport -background $color_noreport + $data(w:history) tag configure lookahead -background $color_lookahead + $data(w:history) tag configure noreport -background $color_noreport + # options + set f [frame $w.matches] + label $f.nb -textvariable regexp::data(v:nbmatches) -anchor w + set regexp::data(v:nbmatches) "0 matches" + # button for navigation + button $f.p -text "Previous" -bd 1 -pady 2 -width 8 -command "regexp::sample:move -1" + button $f.n -text "Next" -bd 1 -pady 2 -width 8 -command "regexp::sample:move +1" + set data(v:positions) [list ] + set data(v:position) 0 + # layout + pack $f.nb [frame $f.0 -width 15] $f.p $f.n -padx 5 -side left + + # layout + grid $w.sample $w.sy -sticky news + grid $w.sx x -sticky news + grid $w.matches - -sticky news + grid rowconfigure $w {0} -weight 1 + grid columnconfigure $w {0} -weight 1 - # main layout - pack $top.regexp -side top -anchor w -padx 5 -pady 5 -fill x - pack $top.sample -side top -anchor w -padx 5 -pady 5 -expand true -fill both - wm geometry . $geometry - wm title . "Visual REGEXP $::version" - focus $data(w:regexp) + # main layout + pack $top.regexp -side top -anchor w -padx 5 -pady 5 -fill x + pack $top.sample -side top -anchor w -padx 5 -pady 5 -expand true -fill both + wm geometry . $geometry + wm title . "Visual REGEXP $::version" + focus $data(w:regexp) - # main menu - . configure -menu .menubar - set m [menu .menubar -tearoff 0 -bd 1 -activeborderwidth 1] - # file - $m add cascade -menu $m.file -label "File" -underline 0 - set mm [menu $m.file -tearoff 0 -bd 1 -activeborderwidth 1] - $mm add command -label "Load regexp ..." -command "regexp::regexp:load" - $mm add command -label "Load sample ..." -command "regexp::sample:load" -accelerator "Alt-O" - $mm add separator - $mm add command -label "Save sample (auto) ..." -command "regexp::sample:save auto" -accelerator "Alt-S" - $mm add command -label "Save sample Unix (lf) ..." -command "regexp::sample:save lf" - $mm add command -label "Save sample Windows (crlf) ..." -command "regexp::sample:save crlf" - $mm add command -label "Save sample Mac (cr) ..." -command "regexp::sample:save cr" - $mm add separator - $mm add command -label "Quit" -underline 0 -command "exit" -accelerator "Alt-Q" - # edit - $m add cascade -menu $m.edit -label "Edit" -underline 0 - set mm [menu $m.edit -tearoff 0 -bd 1 -activeborderwidth 1] - $mm add command -label "Copy regexp to clipboard" -command "regexp::dump" -accelerator "Alt-C" - $mm add separator - $mm add command -label "Undo" -command "regexp::unredo:regexp -1" -accelerator "Control-Z" - $mm add command -label "Redo" -command "regexp::unredo:regexp +1" -accelerator "Control-R" - # view - $m add cascade -menu $m.view -label "View" -underline 0 - set mm [menu $m.view -tearoff 0 -bd 1 -activeborderwidth 1] - set regexp::data(v:background) $::background - regexp::sample:background - $mm add checkbutton -label "Show background for matches" -command "regexp::sample:background" \ - -variable regexp::data(v:background) - $mm add checkbutton -label "Show regexp help" -command "regexp::regexp:help:toggle" \ - -variable regexp::data(v:help) - set regexp::data(v:help) $show_help - $mm add checkbutton -label "Wrap lines in sample" -variable regexp::data(v:wrap) \ - -command "$data(w:sample) configure -wrap \$regexp::data(v:wrap)" \ - -offvalue "none" -onvalue "char" - set regexp::data(v:history) $history - $mm add checkbutton -label "History of Regexp" -variable regexp::data(v:history) \ - -command "if {\$regexp::data(v:history)} {wm deiconify .history} else {wm iconify .history}" - # select mode - $m add cascade -menu $m.select -label "Select mode" -underline 5 - set mm [menu $m.select -tearoff 0 -bd 1 -activeborderwidth 1] - $mm add radiobutton -label "select / concat raw matches" \ - -variable regexp::data(v:mode) -value "raw" -command regexp::replace:toggle - $mm add radiobutton -label "select / insert new line between matches" \ - -variable regexp::data(v:mode) -value "nl" -command regexp::replace:toggle - $mm add radiobutton -label "replace widget" \ - -variable regexp::data(v:mode) -value "replace" -command regexp::replace:toggle - # insert well know regexp - $m add cascade -menu $m.insert -label "Insert regexp" -underline 11 - set mm [menu $m.insert -tearoff 0 -bd 1 -activeborderwidth 1] - $mm add command -label "Make regexp ..." -command "regexp::make-regexp" - $mm add separator - $mm add command -label "Load patterns ..." -command "regexp::pattern:load" - $mm add separator - foreach {n e} $regexp_db { - $mm add command -label "$n" -command "regexp::regexp:insert [list $e]" - } - set data(w:menu) $mm - # help - $m add cascade -menu $m.help -label "Help" -underline 0 - set mm [menu $m.help -tearoff 0 -bd 1 -activeborderwidth 1] - $mm add command -label "Help" -command "regexp::help" + # main menu + . configure -menu .menubar + set m [menu .menubar -tearoff 0 -bd 1 -activeborderwidth 1] + # file + $m add cascade -menu $m.file -label "File" -underline 0 + set mm [menu $m.file -tearoff 0 -bd 1 -activeborderwidth 1] + $mm add command -label "Load regexp ..." -command "regexp::regexp:load" + $mm add command -label "Load sample ..." -command "regexp::sample:load" -accelerator "Alt-O" + $mm add separator + $mm add command -label "Save sample (auto) ..." -command "regexp::sample:save auto" -accelerator "Alt-S" + $mm add command -label "Save sample Unix (lf) ..." -command "regexp::sample:save lf" + $mm add command -label "Save sample Windows (crlf) ..." -command "regexp::sample:save crlf" + $mm add command -label "Save sample Mac (cr) ..." -command "regexp::sample:save cr" + $mm add separator + $mm add command -label "Quit" -underline 0 -command "exit" -accelerator "Alt-Q" + # edit + $m add cascade -menu $m.edit -label "Edit" -underline 0 + set mm [menu $m.edit -tearoff 0 -bd 1 -activeborderwidth 1] + $mm add command -label "Copy regexp to clipboard" -command "regexp::dump" -accelerator "Alt-C" + $mm add separator + $mm add command -label "Undo" -command "regexp::unredo:regexp -1" -accelerator "Control-Z" + $mm add command -label "Redo" -command "regexp::unredo:regexp +1" -accelerator "Control-R" + # view + $m add cascade -menu $m.view -label "View" -underline 0 + set mm [menu $m.view -tearoff 0 -bd 1 -activeborderwidth 1] + set regexp::data(v:background) $::background + regexp::sample:background + $mm add checkbutton -label "Show background for matches" -command "regexp::sample:background" \ + -variable regexp::data(v:background) + $mm add checkbutton -label "Show regexp help" -command "regexp::regexp:help:toggle" \ + -variable regexp::data(v:help) + set regexp::data(v:help) $show_help + $mm add checkbutton -label "Wrap lines in sample" -variable regexp::data(v:wrap) \ + -command "$data(w:sample) configure -wrap \$regexp::data(v:wrap)" \ + -offvalue "none" -onvalue "char" + set regexp::data(v:history) $history + $mm add checkbutton -label "History of Regexp" -variable regexp::data(v:history) \ + -command "if {\$regexp::data(v:history)} {wm deiconify .history} else {wm iconify .history}" + # select mode + $m add cascade -menu $m.select -label "Select mode" -underline 5 + set mm [menu $m.select -tearoff 0 -bd 1 -activeborderwidth 1] + $mm add radiobutton -label "select / concat raw matches" \ + -variable regexp::data(v:mode) -value "raw" -command regexp::replace:toggle + $mm add radiobutton -label "select / insert new line between matches" \ + -variable regexp::data(v:mode) -value "nl" -command regexp::replace:toggle + $mm add radiobutton -label "replace widget" \ + -variable regexp::data(v:mode) -value "replace" -command regexp::replace:toggle + # insert well know regexp + $m add cascade -menu $m.insert -label "Insert regexp" -underline 11 + set mm [menu $m.insert -tearoff 0 -bd 1 -activeborderwidth 1] + $mm add command -label "Make regexp ..." -command "regexp::make-regexp" + $mm add separator + $mm add command -label "Load patterns ..." -command "regexp::pattern:load" + $mm add separator + foreach {n e} $regexp_db { + $mm add command -label "$n" -command "regexp::regexp:insert [list $e]" + } + set data(w:menu) $mm + # help + $m add cascade -menu $m.help -label "Help" -underline 0 + set mm [menu $m.help -tearoff 0 -bd 1 -activeborderwidth 1] + $mm add command -label "Help" -command "regexp::help" - # key binding - bind all "exit" - bind all "regexp::go" - bind $data(w:regexp) "regexp::go; break" - bind all "regexp::dump" - bind all "regexp::replace" - bind all "regexp::sample:load" - bind all "regexp::sample:save auto" + # key binding + bind all "exit" + bind all "regexp::go" + bind $data(w:regexp) "regexp::go; break" + bind all "regexp::dump" + bind all "regexp::replace" + bind all "regexp::sample:load" + bind all "regexp::sample:save auto" - bind $data(w:regexp) "regexp::unredo:regexp -1" - bind $data(w:regexp) "regexp::unredo:regexp +1" + bind $data(w:regexp) "regexp::unredo:regexp -1" + bind $data(w:regexp) "regexp::unredo:regexp +1" - bind $data(w:replace) "regexp::undo:sample" - bind $data(w:sample) "regexp::undo:sample" + bind $data(w:replace) "regexp::undo:sample" + bind $data(w:sample) "regexp::undo:sample" - bind all "$fo.all toggle" - bind all "$fo.nocase toggle" - bind all "$fo.line toggle" - bind all "$fo.lineanchor toggle" - bind all "$fo.linestop toggle" - bind all "$fo.inline toggle" - bind all "regexp::clear" + bind all "$fo.all toggle" + bind all "$fo.nocase toggle" + bind all "$fo.line toggle" + bind all "$fo.lineanchor toggle" + bind all "$fo.linestop toggle" + bind all "$fo.inline toggle" + bind all "regexp::clear" - bind $data(w:regexp) { # nothing } - bind $data(w:regexp) { # nothing } - bind $data(w:regexp) { # nothing } - bind $data(w:regexp) { # nothing } - bind $data(w:regexp) "regexp::undo:regexp:compute %W %K %A" + bind $data(w:regexp) { # nothing } + bind $data(w:regexp) { # nothing } + bind $data(w:regexp) { # nothing } + bind $data(w:regexp) { # nothing } + bind $data(w:regexp) "regexp::undo:regexp:compute %W %K %A" - bind $data(w:replace) "$data(w:replace) insert insert {\\t}; break;" - bind $data(w:sample) "$data(w:sample) insert insert {\t}; break;" - # special for regexp Ctrl+letter = \ - bind $data(w:regexp) "$data(w:regexp) insert insert {\\t}; break;" - foreach key {a b B e f n r t v u x 0 d D s S w W A Z m M y Y} { - bind $data(w:regexp) "$data(w:regexp) insert insert {\\$key}; break;" - } - foreach key {a b B e f n r t v u x 0} { - bind $data(w:replace) "$data(w:replace) insert insert {\\$key}; break;" - } + bind $data(w:replace) "$data(w:replace) insert insert {\\t}; break;" + bind $data(w:sample) "$data(w:sample) insert insert {\t}; break;" + # special for regexp Ctrl+letter = \ + bind $data(w:regexp) "$data(w:regexp) insert insert {\\t}; break;" + foreach key {a b B e f n r t v u x 0 d D s S w W A Z m M y Y} { + bind $data(w:regexp) "$data(w:regexp) insert insert {\\$key}; break;" + } + foreach key {a b B e f n r t v u x 0} { + bind $data(w:replace) "$data(w:replace) insert insert {\\$key}; break;" + } - bind Text {} + bind Text {} - # font selection popup - foreach w {regexp replace sample} { - set m [menu .fonts_$w -tearoff 0] - foreach f $::fonts { - if {$f == "----"} { - $m add separator - } else { - $m add command -label $f -command "$data(w:$w) configure -font [list $f]" - } - } - bind $data(w:$w) <3> "tk_popup $m %X %Y" - } + # font selection popup + foreach w {regexp replace sample} { + set m [menu .fonts_$w -tearoff 0] + foreach f $::fonts { + if {$f == "----"} { + $m add separator + } else { + $m add command -label $f -command "$data(w:$w) configure -font [list $f]" + } + } + bind $data(w:$w) <3> "tk_popup $m %X %Y" + } - # some init - set data(v:nocase) "-nocase" - set data(v:all) "-all" - set data(v:wrap) "char" - set regexp::data(v:mode) $::mode - replace:toggle ;# set bindings - regexp:help:toggle + # some init + set data(v:nocase) "-nocase" + set data(v:all) "-all" + set data(v:wrap) "char" + set regexp::data(v:mode) $::mode + replace:toggle ;# set bindings + regexp:help:toggle } proc regexp::pattern:load {{file ""}} { variable data - # get filename - if {$file == ""} { - set types [list [list "All" *]] - set file [tk_getOpenFile -filetypes $types -parent .] - if {$file == ""} { - return - } - } - # do it - set in [open $file "r"] - $data(w:menu) delete [expr 4+[llength $::regexp_db]/2] end - while {![eof $in]} { - set name [gets $in] - while {$name == ""} { - set name [gets $in] - } - set pattern [gets $in] - while {$pattern == ""} { - set pattern [gets $in] - } - $data(w:menu) add command -label $name -command "regexp::regexp:insert [list $pattern]" - } - close $in + # get filename + if {$file == ""} { + set types [list [list "All" *]] + set file [tk_getOpenFile -filetypes $types -parent .] + if {$file == ""} { + return + } + } + # do it + set in [open $file "r"] + $data(w:menu) delete [expr 4+[llength $::regexp_db]/2] end + while {![eof $in]} { + set name [gets $in] + while {$name == ""} { + set name [gets $in] + } + set pattern [gets $in] + while {$pattern == ""} { + set pattern [gets $in] + } + $data(w:menu) add command -label $name -command "regexp::regexp:insert [list $pattern]" + } + close $in } #---------------------------------------------------------------------------------------------- -# Main toplevel commands +# Main toplevel commands #---------------------------------------------------------------------------------------------- proc regexp::go {} { variable data - set exp [$data(w:regexp) get 1.0 end-1char] - # check if regexp is OK - if {[catch { regexp -- $exp dummy } errMsg]} { - tk_messageBox -type ok -icon error -message "Malformed regexp: $errMsg" - return - } - regexp::regexp:colorize - regexp::sample:colorize - regexp::history:add + set exp [$data(w:regexp) get 1.0 end-1char] + # check if regexp is OK + if {[catch { regexp -- $exp dummy } errMsg]} { + tk_messageBox -type ok -icon error -message "Malformed regexp: $errMsg" + return + } + regexp::regexp:colorize + regexp::sample:colorize + regexp::history:add } proc regexp::clear {} { variable data - regexp::history:add - $data(w:regexp) delete 1.0 end - regexp::go + regexp::history:add + $data(w:regexp) delete 1.0 end + regexp::go } proc regexp::dump {} { variable data - # update display - go - # built list of options - set dump "regexp" - foreach option {nocase all line lineanchor linestop inline} { - if {$data(v:$option) != ""} { - append dump " $data(v:$option)" - } - } - # build expression - set exp [$data(w:regexp) get 1.0 end-1char] - append dump " -- {$exp} string" - # add variables if needed - if {$data(v:inline) == ""} { - append dump " match" - for {set i 1} {$i < $data(v:nblevels)} {incr i} { - append dump " v$i" - } - } - # put dump into the clipboard (by creating a hidden entry ... anyone has a better solution?) - destroy .e - entry .e - .e insert 0 $dump - .e selection range 0 end - puts "$dump" + # update display + go + # built list of options + set dump "regexp" + foreach option {nocase all line lineanchor linestop inline} { + if {$data(v:$option) != ""} { + append dump " $data(v:$option)" + } + } + # build expression + set exp [$data(w:regexp) get 1.0 end-1char] + append dump " -- {$exp} string" + # add variables if needed + if {$data(v:inline) == ""} { + append dump " match" + for {set i 1} {$i < $data(v:nblevels)} {incr i} { + append dump " v$i" + } + } + # put dump into the clipboard (by creating a hidden entry ... anyone has a better solution?) + destroy .e + entry .e + .e insert 0 $dump + .e selection range 0 end + puts "$dump" } proc regexp::select {level} { variable data - # update - go - if {[llength $data(v:result)] == 0} { - bell - return - } - # puts regexp - dump - # extract matching parts in sample - set i 0 - set newsample "" - foreach match $data(v:result) { - if {($i % $data(v:nblevels)) == $level} { - set text [$data(w:sample) get \ - [$data(w:sample) index "1.0+[lindex $match 0]chars"] \ - [$data(w:sample) index "1.0+[expr [lindex $match 1]+1]chars"]] - append newsample $text - if {$data(v:mode) == "nl"} { - append newsample "\n" - } - } - incr i - } - $data(w:sample) delete 1.0 end - $data(w:sample) insert 1.0 $newsample - # update with regexp - go + # update + go + if {[llength $data(v:result)] == 0} { + bell + return + } + # puts regexp + dump + # extract matching parts in sample + set i 0 + set newsample "" + foreach match $data(v:result) { + if {($i % $data(v:nblevels)) == $level} { + set text [$data(w:sample) get \ + [$data(w:sample) index "1.0+[lindex $match 0]chars"] \ + [$data(w:sample) index "1.0+[expr [lindex $match 1]+1]chars"]] + append newsample $text + if {$data(v:mode) == "nl"} { + append newsample "\n" + } + } + incr i + } + $data(w:sample) delete 1.0 end + $data(w:sample) insert 1.0 $newsample + # update with regexp + go } proc regexp::help {} { global tcl_platform - toplevel .help - wm title .help "Help" - # logo - label .help.l -image logo - pack .help.l -side top -padx 10 -pady 10 - # help text - if {$tcl_platform(platform) == "windows"} { - text .help.t -bd 2 -relief groove -font {Courier 10} - } else { - text .help.t -bd 2 -relief groove - } - pack .help.t -side top -padx 20 - .help.t tag configure bold -font "[.help.t cget -font] bold" - .help.t insert 1.0 "Version:" bold " $::version + toplevel .help + wm title .help "Help" + # logo + label .help.l -image logo + pack .help.l -side top -padx 10 -pady 10 + # help text + if {$tcl_platform(platform) == "windows"} { + text .help.t -bd 2 -relief groove -font {Courier 10} + } else { + text .help.t -bd 2 -relief groove + } + pack .help.t -side top -padx 20 + .help.t tag configure bold -font "[.help.t cget -font] bold" + .help.t insert 1.0 "Version:" bold " $::version " normal "Usage:" bold " tkregexp @@ -524,199 +524,199 @@ global tcl_platform to undo/redo the last typing. 4) When using the replace function, using Control-Z restore the value of the sample before the replacement : you try, retry, reretry, ..." - # ok button - button .help.ok -text "Ok" -width 10 -default active -command "destroy .help" - pack .help.ok -side bottom -pady 10 + # ok button + button .help.ok -text "Ok" -width 10 -default active -command "destroy .help" + pack .help.ok -side bottom -pady 10 } proc regexp::regexp:help:toggle {} { variable data - if {$data(v:help) == 0} { - pack forget $data(w:help) - } else { - pack $data(w:help) -before $data(w:regexp) -fill x -padx 5 - } + if {$data(v:help) == 0} { + pack forget $data(w:help) + } else { + pack $data(w:help) -before $data(w:regexp) -fill x -padx 5 + } } #---------------------------------------------------------------------------------------------- -# Undo/redo (quick and dirty UNDO/REDO support) +# Undo/redo (quick and dirty UNDO/REDO support) #---------------------------------------------------------------------------------------------- proc regexp::undo:sample {} { variable data - # display result - $data(w:sample) delete 1.0 end - $data(w:sample) insert 1.0 $data(v:undo:sample) - # colorize - go + # display result + $data(w:sample) delete 1.0 end + $data(w:sample) insert 1.0 $data(v:undo:sample) + # colorize + go } proc regexp::unredo:regexp {dir} { variable data - set index [expr ($data(v:undo:index)+$dir) % 100] - if {![info exists data(v:undo:r$index)]} { - return - } - set data(v:undo:index) $index + set index [expr ($data(v:undo:index)+$dir) % 100] + if {![info exists data(v:undo:r$index)]} { + return + } + set data(v:undo:index) $index - set t $data(w:regexp) - $t delete 1.0 end - $t insert 1.0 [lindex $data(v:undo:r$index) 1] - $t mark set insert [lindex $data(v:undo:r$index) 0] + set t $data(w:regexp) + $t delete 1.0 end + $t insert 1.0 [lindex $data(v:undo:r$index) 1] + $t mark set insert [lindex $data(v:undo:r$index) 0] } proc regexp::undo:regexp:compute {w k a} { variable data - if {[string match -nocase "*control*" $k] - || [string match -nocase "*shift*" $k] - || [string match -nocase "*alt*" $k]} { - return - } + if {[string match -nocase "*control*" $k] + || [string match -nocase "*shift*" $k] + || [string match -nocase "*alt*" $k]} { + return + } - set data(v:undo:r$data(v:undo:index)) [list [$w index insert] [$w get 1.0 end-1char]] - set data(v:undo:index) [expr ($data(v:undo:index)+1) % 100] + set data(v:undo:r$data(v:undo:index)) [list [$w index insert] [$w get 1.0 end-1char]] + set data(v:undo:index) [expr ($data(v:undo:index)+1) % 100] } #---------------------------------------------------------------------------------------------- -# Replace +# Replace #---------------------------------------------------------------------------------------------- proc regexp::replace {} { variable data - set exp [$data(w:regexp) get 1.0 end-1char] - set subst [$data(w:replace) get 1.0 end-1char] - if {$exp == ""} { - set regexp::data(v:nbreplace) "empty regexp" - return - } + set exp [$data(w:regexp) get 1.0 end-1char] + set subst [$data(w:replace) get 1.0 end-1char] + if {$exp == ""} { + set regexp::data(v:nbreplace) "empty regexp" + return + } - # get sample & store it for undo - set sample [$data(w:sample) get 1.0 end] - set data(v:undo:sample) $sample - set result [eval regsub $data(v:all) \ - $data(v:line) $data(v:lineanchor) $data(v:linestop) \ - $data(v:nocase) -- \ - [list $exp] [list $sample] [list [subst -nocommands -novariables $subst]] sample] - set regexp::data(v:nbreplace) "$result replaced" - # display result - $data(w:sample) delete 1.0 end - $data(w:sample) insert 1.0 $sample + # get sample & store it for undo + set sample [$data(w:sample) get 1.0 end] + set data(v:undo:sample) $sample + set result [eval regsub $data(v:all) \ + $data(v:line) $data(v:lineanchor) $data(v:linestop) \ + $data(v:nocase) -- \ + [list $exp] [list $sample] [list [subst -nocommands -novariables $subst]] sample] + set regexp::data(v:nbreplace) "$result replaced" + # display result + $data(w:sample) delete 1.0 end + $data(w:sample) insert 1.0 $sample } proc regexp::replace:toggle {} { variable data - if {$regexp::data(v:mode) == "replace"} { - bind $data(w:regexp) "focus $data(w:replace); break;" - bind $data(w:regexp) "focus $data(w:sample); break;" - catch { bind $data(w:regexp) "focus $data(w:sample); break;" } + if {$regexp::data(v:mode) == "replace"} { + bind $data(w:regexp) "focus $data(w:replace); break;" + bind $data(w:regexp) "focus $data(w:sample); break;" + catch { bind $data(w:regexp) "focus $data(w:sample); break;" } - bind $data(w:replace) "focus $data(w:sample); break;" - bind $data(w:replace) "focus $data(w:regexp); break;" - catch { bind $data(w:replace) "focus $data(w:regexp); break;" } + bind $data(w:replace) "focus $data(w:sample); break;" + bind $data(w:replace) "focus $data(w:regexp); break;" + catch { bind $data(w:replace) "focus $data(w:regexp); break;" } - bind $data(w:sample) "focus $data(w:regexp); break;" - bind $data(w:sample) "focus $data(w:replace); break;" - catch { bind $data(w:sample) "focus $data(w:replace); break;" } + bind $data(w:sample) "focus $data(w:regexp); break;" + bind $data(w:sample) "focus $data(w:replace); break;" + catch { bind $data(w:sample) "focus $data(w:replace); break;" } - pack $data(w:allreplace) -side top -fill both + pack $data(w:allreplace) -side top -fill both - } else { - bind $data(w:regexp) "focus $data(w:sample); break;" - catch { bind $data(w:regexp) "focus $data(w:sample); break;" } + } else { + bind $data(w:regexp) "focus $data(w:sample); break;" + catch { bind $data(w:regexp) "focus $data(w:sample); break;" } - bind $data(w:sample) "focus $data(w:regexp); break;" - catch { bind $data(w:sample) "focus $data(w:regexp); break;" } + bind $data(w:sample) "focus $data(w:regexp); break;" + catch { bind $data(w:sample) "focus $data(w:regexp); break;" } - pack forget $data(w:allreplace) - } + pack forget $data(w:allreplace) + } } #---------------------------------------------------------------------------------------------- -# Manage REGEXP +# Manage REGEXP #---------------------------------------------------------------------------------------------- proc regexp::regexp:set {text} { variable data - $data(w:regexp) delete 1.0 end - $data(w:regexp) insert 1.0 $text + $data(w:regexp) delete 1.0 end + $data(w:regexp) insert 1.0 $text } proc regexp::regexp:colorize {} { variable data - set exp [$data(w:regexp) get 1.0 end-1char] - set max [string length $exp] - set stack {} - # list format : min max min max ... - set indices [list "report" 0 [string length $exp]] - # search the groups in the regexp - set data(v:nblevels) 1 - for {set i 0} {$i < $max} {incr i} { - set c [string index $exp $i] - if {$c == "\\"} { - incr i - continue - } elseif {$c == "("} { - set c [string index $exp [expr $i+1]] - set what [string index $exp [expr $i+2]] - # test for escape with (?...) - if {$c == "?"} { - if {$what != ":"} { - lappend indices "lookahead" - } else { - lappend indices "noreport" - } - } else { - lappend indices "report" - incr data(v:nblevels) - } - lappend indices $i - set stack "[llength $indices] $stack" - lappend indices 0 + set exp [$data(w:regexp) get 1.0 end-1char] + set max [string length $exp] + set stack {} + # list format : min max min max ... + set indices [list "report" 0 [string length $exp]] + # search the groups in the regexp + set data(v:nblevels) 1 + for {set i 0} {$i < $max} {incr i} { + set c [string index $exp $i] + if {$c == "\\"} { + incr i + continue + } elseif {$c == "("} { + set c [string index $exp [expr $i+1]] + set what [string index $exp [expr $i+2]] + # test for escape with (?...) + if {$c == "?"} { + if {$what != ":"} { + lappend indices "lookahead" + } else { + lappend indices "noreport" + } + } else { + lappend indices "report" + incr data(v:nblevels) + } + lappend indices $i + set stack "[llength $indices] $stack" + lappend indices 0 - } elseif {$c == ")"} { - set idx [lindex $stack 0] - if {$idx == ""} { - continue - } - set stack [lrange $stack 1 end] - set indices [lreplace $indices $idx $idx $i] - } - } + } elseif {$c == ")"} { + set idx [lindex $stack 0] + if {$idx == ""} { + continue + } + set stack [lrange $stack 1 end] + set indices [lreplace $indices $idx $idx $i] + } + } - # remove old colors - foreach level $data(v:levels) { - $data(w:regexp) tag remove $level 1.0 end - } - $data(w:regexp) tag remove "lookahead" 1.0 end - $data(w:regexp) tag remove "noreport" 1.0 end - # colorize the regexp - set i 0 - foreach {type min max} $indices { - if {$type != "report"} { - continue - } - $data(w:regexp) tag add [lindex $data(v:levels) $i] \ - [$data(w:regexp) index "1.0+${min}chars"] \ - [$data(w:regexp) index "1.0+[expr $max+1]chars"] - incr i - } - # apply special item - foreach {type min max} $indices { - if {$type == "report"} { - continue - } - $data(w:regexp) tag add $type \ - [$data(w:regexp) index "1.0+${min}chars"] \ - [$data(w:regexp) index "1.0+[expr $max+1]chars"] - } + # remove old colors + foreach level $data(v:levels) { + $data(w:regexp) tag remove $level 1.0 end + } + $data(w:regexp) tag remove "lookahead" 1.0 end + $data(w:regexp) tag remove "noreport" 1.0 end + # colorize the regexp + set i 0 + foreach {type min max} $indices { + if {$type != "report"} { + continue + } + $data(w:regexp) tag add [lindex $data(v:levels) $i] \ + [$data(w:regexp) index "1.0+${min}chars"] \ + [$data(w:regexp) index "1.0+[expr $max+1]chars"] + incr i + } + # apply special item + foreach {type min max} $indices { + if {$type == "report"} { + continue + } + $data(w:regexp) tag add $type \ + [$data(w:regexp) index "1.0+${min}chars"] \ + [$data(w:regexp) index "1.0+[expr $max+1]chars"] + } } #---------------------------------------------------------------------------------------------- @@ -724,16 +724,16 @@ variable data proc regexp::regexp:load {} { variable data - # get filename - set types [list [list "All" *]] - set file [tk_getOpenFile -filetypes $types -parent .] - if {$file == ""} { - return - } - # do it - set in [open $file "r"] - regexp:set [read $in [file size $file]] - close $in + # get filename + set types [list [list "All" *]] + set file [tk_getOpenFile -filetypes $types -parent .] + if {$file == ""} { + return + } + # do it + set in [open $file "r"] + regexp:set [read $in [file size $file]] + close $in } #---------------------------------------------------------------------------------------------- @@ -741,14 +741,14 @@ variable data proc regexp::regexp:insert {what} { variable data - set w $data(w:regexp) - # prepare undo/redo - set data(v:undo:r$data(v:undo:index)) [list [$w index insert] [$w get 1.0 end-1char]] - set data(v:undo:index) [expr ($data(v:undo:index)+1) % 100] - # do it - $w insert insert $what - # prepare undo/redo - set data(v:undo:r$data(v:undo:index)) [list [$w index insert] [$w get 1.0 end-1char]] + set w $data(w:regexp) + # prepare undo/redo + set data(v:undo:r$data(v:undo:index)) [list [$w index insert] [$w get 1.0 end-1char]] + set data(v:undo:index) [expr ($data(v:undo:index)+1) % 100] + # do it + $w insert insert $what + # prepare undo/redo + set data(v:undo:r$data(v:undo:index)) [list [$w index insert] [$w get 1.0 end-1char]] } #---------------------------------------------------------------------------------------------- @@ -758,38 +758,38 @@ proc regexp::history:init {} { variable data global font - set w [toplevel .history] - wm title $w "Visual REGEXP $::version -- REGEXP History" - wm geometry $w 640x480 - wm protocol $w WM_DELETE_WINDOW "set regexp::data(v:history) 0; wm withdraw $w" + set w [toplevel .history] + wm title $w "Visual REGEXP $::version -- REGEXP History" + wm geometry $w 640x480 + wm protocol $w WM_DELETE_WINDOW "set regexp::data(v:history) 0; wm withdraw $w" - # text zone - set tf [frame $w.t] - pack $tf -side top -expand true -fill both - set t [text $tf.t -xscrollcommand "$tf.x set" -yscrollcommand "$tf.y set" \ - -bg white -font $::font_regexp -width 5 -height 1 \ - -selectbackground lightblue -selectborderwidth 0] - set data(w:history) $t - $t tag configure spacing -font {Helvetica 6} - set tx [scrollbar $tf.x -bd 1 -orient horizontal -command "$t xview"] - set ty [scrollbar $tf.y -bd 1 -orient vertical -command "$t yview"] - bindtags $t "$t all" - grid $t $ty -sticky news - grid $tx x -sticky news - grid columnconfigure $tf {0} -weight 1 - grid columnconfigure $tf {1} -weight 0 - grid rowconfigure $tf {0} -weight 1 - grid rowconfigure $tf {1} -weight 0 + # text zone + set tf [frame $w.t] + pack $tf -side top -expand true -fill both + set t [text $tf.t -xscrollcommand "$tf.x set" -yscrollcommand "$tf.y set" \ + -bg white -font $::font_regexp -width 5 -height 1 \ + -selectbackground lightblue -selectborderwidth 0] + set data(w:history) $t + $t tag configure spacing -font {Helvetica 6} + set tx [scrollbar $tf.x -bd 1 -orient horizontal -command "$t xview"] + set ty [scrollbar $tf.y -bd 1 -orient vertical -command "$t yview"] + bindtags $t "$t all" + grid $t $ty -sticky news + grid $tx x -sticky news + grid columnconfigure $tf {0} -weight 1 + grid columnconfigure $tf {1} -weight 0 + grid rowconfigure $tf {0} -weight 1 + grid rowconfigure $tf {1} -weight 0 - # buttons - set bf [frame $w.f] - pack $bf -side bottom -padx 5 -pady 5 + # buttons + set bf [frame $w.f] + pack $bf -side bottom -padx 5 -pady 5 - set b1 [button $bf.1 -bd 1 -text "Hide" -command "wm withdraw $w; set ::regexp::data(v:history) 0"] - set b2 [button $bf.2 -bd 1 -text "Save ..." -command "regexp::history:save"] - pack $b2 $b1 -side left -anchor c + set b1 [button $bf.1 -bd 1 -text "Hide" -command "wm withdraw $w; set ::regexp::data(v:history) 0"] + set b2 [button $bf.2 -bd 1 -text "Save ..." -command "regexp::history:save"] + pack $b2 $b1 -side left -anchor c - wm withdraw $w + wm withdraw $w } set last "" @@ -798,41 +798,41 @@ set counter 0 proc regexp::history:add {} { variable data - if {$::inReplay} { - # avoid to put the same expression again when replaying it - set ::inReplay 0 - return - } + if {$::inReplay} { + # avoid to put the same expression again when replaying it + set ::inReplay 0 + return + } - set exp [$data(w:regexp) get 1.0 end-1char] - if {$exp != "" && $exp != $::last} { - # memorize position - set start [$data(w:history) index insert] - # add text - $data(w:history) insert end "$exp\n" - set end [$data(w:history) index insert] - $data(w:history) insert end "\n" {spacing} - set ::last $exp - $data(w:history) yview moveto 1.0 - # do the binding - set tag "t$::counter" - incr ::counter - $data(w:history) tag bind $tag "$data(w:history) tag configure $tag -background lightblue" - $data(w:history) tag bind $tag "$data(w:history) tag configure $tag -background {}" - $data(w:history) tag bind $tag <1> "regexp::history:replay [list $exp]" - $data(w:history) tag add $tag $start $end + set exp [$data(w:regexp) get 1.0 end-1char] + if {$exp != "" && $exp != $::last} { + # memorize position + set start [$data(w:history) index insert] + # add text + $data(w:history) insert end "$exp\n" + set end [$data(w:history) index insert] + $data(w:history) insert end "\n" {spacing} + set ::last $exp + $data(w:history) yview moveto 1.0 + # do the binding + set tag "t$::counter" + incr ::counter + $data(w:history) tag bind $tag "$data(w:history) tag configure $tag -background lightblue" + $data(w:history) tag bind $tag "$data(w:history) tag configure $tag -background {}" + $data(w:history) tag bind $tag <1> "regexp::history:replay [list $exp]" + $data(w:history) tag add $tag $start $end - # colorize the expression in history - scan $start "%d.%d" sl sc - incr sl -1 - foreach tag {e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 lookahead noreport} { - foreach {start end} [$data(w:regexp) tag ranges $tag] { - set start [$data(w:history) index "$start + $sc chars + $sl lines"] - set end [$data(w:history) index "$end + $sc chars + $sl lines"] - $data(w:history) tag add $tag $start $end - } - } - } + # colorize the expression in history + scan $start "%d.%d" sl sc + incr sl -1 + foreach tag {e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 lookahead noreport} { + foreach {start end} [$data(w:regexp) tag ranges $tag] { + set start [$data(w:history) index "$start + $sc chars + $sl lines"] + set end [$data(w:history) index "$end + $sc chars + $sl lines"] + $data(w:history) tag add $tag $start $end + } + } + } } set inReplay 0 @@ -840,111 +840,111 @@ set inReplay 0 proc regexp::history:replay {text} { variable data - set ::inReplay 1 - regexp:set $text - go + set ::inReplay 1 + regexp:set $text + go } proc regexp::history:save {} { variable data - set file [tk_getSaveFile -defaultextension .txt] - if {$file != ""} { - set out [open $file "w"] - puts -nonewline $out [$data(w:history) get 1.0 end] - close $out - } + set file [tk_getSaveFile -defaultextension .txt] + if {$file != ""} { + set out [open $file "w"] + puts -nonewline $out [$data(w:history) get 1.0 end] + close $out + } } #---------------------------------------------------------------------------------------------- -# Manage SAMPLE +# Manage SAMPLE #---------------------------------------------------------------------------------------------- proc regexp::sample:set {text} { variable data - $data(w:sample) delete 1.0 end - $data(w:sample) insert 1.0 $text - set data(v:undo:sample) $text + $data(w:sample) delete 1.0 end + $data(w:sample) insert 1.0 $text + set data(v:undo:sample) $text } proc regexp::sample:colorize {} { variable data - # remove old tags - foreach level $data(v:levels) { - $data(w:sample) tag remove $level 1.0 end - } - set data(v:position) 0 - set data(v:positions) [list ] + # remove old tags + foreach level $data(v:levels) { + $data(w:sample) tag remove $level 1.0 end + } + set data(v:position) 0 + set data(v:positions) [list ] - # set new tags - set exp [$data(w:regexp) get 1.0 end-1char] - if {$exp == ""} { - set data(v:result) {} - return - } - set result [eval regexp -inline -indices $data(v:all) \ - $data(v:line) $data(v:lineanchor) $data(v:linestop) \ - $data(v:nocase) -- \ - [list $exp] [list [$data(w:sample) get 1.0 end]]] - set data(v:result) $result - set i 0 - foreach match $result { - set start [$data(w:sample) index "1.0+[lindex $match 0]chars"] - $data(w:sample) tag add e[expr $i % $data(v:nblevels)] \ - $start [$data(w:sample) index "1.0+[expr [lindex $match 1]+1]chars"] - lappend data(v:positions) $start - if {$i == 0} { - $data(w:sample) see $start - } - incr i - } - # set nb of matches - if {$data(v:nblevels)} { - set nb 0 - foreach item $result { - if {[lindex $item 0] <= [lindex $item 1]} { - incr nb - } - } - set regexp::data(v:nbmatches) "[expr $nb/$data(v:nblevels)] matches" - } else { - set regexp::data(v:nbmatches) "? matches" - } + # set new tags + set exp [$data(w:regexp) get 1.0 end-1char] + if {$exp == ""} { + set data(v:result) {} + return + } + set result [eval regexp -inline -indices $data(v:all) \ + $data(v:line) $data(v:lineanchor) $data(v:linestop) \ + $data(v:nocase) -- \ + [list $exp] [list [$data(w:sample) get 1.0 end]]] + set data(v:result) $result + set i 0 + foreach match $result { + set start [$data(w:sample) index "1.0+[lindex $match 0]chars"] + $data(w:sample) tag add e[expr $i % $data(v:nblevels)] \ + $start [$data(w:sample) index "1.0+[expr [lindex $match 1]+1]chars"] + lappend data(v:positions) $start + if {$i == 0} { + $data(w:sample) see $start + } + incr i + } + # set nb of matches + if {$data(v:nblevels)} { + set nb 0 + foreach item $result { + if {[lindex $item 0] <= [lindex $item 1]} { + incr nb + } + } + set regexp::data(v:nbmatches) "[expr $nb/$data(v:nblevels)] matches" + } else { + set regexp::data(v:nbmatches) "? matches" + } } proc regexp::sample:background {} { variable data - foreach level $data(v:levels) color $::colors bgcolor $::bgcolors { - if {$data(v:background)} { - $data(w:sample) tag configure $level -foreground $color -background $bgcolor - } else { - $data(w:sample) tag configure $level -foreground $color -background {} - } - } + foreach level $data(v:levels) color $::colors bgcolor $::bgcolors { + if {$data(v:background)} { + $data(w:sample) tag configure $level -foreground $color -background $bgcolor + } else { + $data(w:sample) tag configure $level -foreground $color -background {} + } + } } proc regexp::sample:move {amount} { variable data - if {$amount == -1} { - if {$data(v:position) > 0} { - incr data(v:position) -1 - } - } else { - if {$data(v:position) < [llength $data(v:positions)]-1} { - incr data(v:position) +1 - } - } - set where [lindex $data(v:positions) $data(v:position)] - if {$where != ""} { - $data(w:sample) see $where - $data(w:sample) mark set insert $where - focus $data(w:sample) - } + if {$amount == -1} { + if {$data(v:position) > 0} { + incr data(v:position) -1 + } + } else { + if {$data(v:position) < [llength $data(v:positions)]-1} { + incr data(v:position) +1 + } + } + set where [lindex $data(v:positions) $data(v:position)] + if {$where != ""} { + $data(w:sample) see $where + $data(w:sample) mark set insert $where + focus $data(w:sample) + } } #---------------------------------------------------------------------------------------------- @@ -952,127 +952,127 @@ variable data proc regexp::sample:load {} { variable data - # get filename - set types [list [list "All" *]] - set file [tk_getOpenFile -initialdir $data(v:dir) -filetypes $types -parent .] + # get filename + set types [list [list "All" *]] + set file [tk_getOpenFile -initialdir $data(v:dir) -filetypes $types -parent .] if {$file == ""} { - return - } - # memorize location - set data(v:dir) [file dirname $file] - set data(v:file) [file tail $file] - # do it - set in [open $file "r"] - sample:set [read $in [file size $file]] - close $in + return + } + # memorize location + set data(v:dir) [file dirname $file] + set data(v:file) [file tail $file] + # do it + set in [open $file "r"] + sample:set [read $in [file size $file]] + close $in } proc regexp::sample:save {mode} { variable data - # get filename - set types [list [list "All" *]] - set file [tk_getSaveFile -initialdir $data(v:dir) -initialfile $data(v:file) \ - -filetypes $types -parent .] + # get filename + set types [list [list "All" *]] + set file [tk_getSaveFile -initialdir $data(v:dir) -initialfile $data(v:file) \ + -filetypes $types -parent .] if {$file == ""} { - return - } - # memorize location - set data(v:dir) [file dirname $file] - set data(v:file) [file tail $file] - # do it - set out [open $file "w"] - fconfigure $out -translation $mode - puts $out [$data(w:sample) get 1.0 end] - close $out + return + } + # memorize location + set data(v:dir) [file dirname $file] + set data(v:file) [file tail $file] + # do it + set out [open $file "w"] + fconfigure $out -translation $mode + puts $out [$data(w:sample) get 1.0 end] + close $out } #---------------------------------------------------------------------------------------------- -# Main toplevel commands +# Main toplevel commands #---------------------------------------------------------------------------------------------- proc regexp::make-regexp {} { variable data - # new dialog - catch { destroy .mkregexp } - set w [toplevel .mkregexp] - wm title $w "Make regexp" - wm geometry $w 640x480 - # widgets - set f [frame $w.top] - # area to input words - label $f.l1 -text "Words list:" - set list [text $f.list -wrap char -bg white -font $::font_regexp \ - -selectbackground lightblue -selectborderwidth 0 \ - -width 1 -height 10 -bd 1 -yscrollcommand "$f.sy1 set"] - scrollbar $f.sy1 -command "$list yview" -orient vertical -bd 1 - # button to compute the regexp - set doit [button $f.doit -text "Compute" -width 15 -bd 1 -command "regexp::make-regexp:compute"] - # display result - label $f.l2 -text "Regexp:" - set output [text $f.output -wrap char -bg white -font $::font_regexp \ - -selectbackground lightblue -selectborderwidth 0 \ - -width 1 -height 4 -bd 1 -yscrollcommand "$f.sy2 set"] - bindtags $output "$output all" - scrollbar $f.sy2 -command "$output yview" -orient vertical -bd 1 - # layout - grid $f.l1 $list $f.sy1 -sticky news - grid $doit - - -sticky ns -pady 2 - grid $f.l2 $output $f.sy2 -sticky news - grid columnconfigure $f {1} -weight 1 - grid rowconfigure $f {0 2} -weight 1 - # init - set data(w:make:list) $list - set data(w:make:output) $output - # button OK / CANCEL - set ff [frame $w.bottom] - set ok [button $ff.ok -text "Insert into regexp" -width 20 -bd 1 -command "regexp::make-regexp:ok $w"] - set cancel [button $ff.cancel -text "Cancel" -width 20 -bd 1 -command "destroy $w"] - pack $ok $cancel -side left -fill both -padx 10 -pady 10 - # layout - pack $f -side top -expand true -fill both - pack $ff -side bottom -anchor c + # new dialog + catch { destroy .mkregexp } + set w [toplevel .mkregexp] + wm title $w "Make regexp" + wm geometry $w 640x480 + # widgets + set f [frame $w.top] + # area to input words + label $f.l1 -text "Words list:" + set list [text $f.list -wrap char -bg white -font $::font_regexp \ + -selectbackground lightblue -selectborderwidth 0 \ + -width 1 -height 10 -bd 1 -yscrollcommand "$f.sy1 set"] + scrollbar $f.sy1 -command "$list yview" -orient vertical -bd 1 + # button to compute the regexp + set doit [button $f.doit -text "Compute" -width 15 -bd 1 -command "regexp::make-regexp:compute"] + # display result + label $f.l2 -text "Regexp:" + set output [text $f.output -wrap char -bg white -font $::font_regexp \ + -selectbackground lightblue -selectborderwidth 0 \ + -width 1 -height 4 -bd 1 -yscrollcommand "$f.sy2 set"] + bindtags $output "$output all" + scrollbar $f.sy2 -command "$output yview" -orient vertical -bd 1 + # layout + grid $f.l1 $list $f.sy1 -sticky news + grid $doit - - -sticky ns -pady 2 + grid $f.l2 $output $f.sy2 -sticky news + grid columnconfigure $f {1} -weight 1 + grid rowconfigure $f {0 2} -weight 1 + # init + set data(w:make:list) $list + set data(w:make:output) $output + # button OK / CANCEL + set ff [frame $w.bottom] + set ok [button $ff.ok -text "Insert into regexp" -width 20 -bd 1 -command "regexp::make-regexp:ok $w"] + set cancel [button $ff.cancel -text "Cancel" -width 20 -bd 1 -command "destroy $w"] + pack $ok $cancel -side left -fill both -padx 10 -pady 10 + # layout + pack $f -side top -expand true -fill both + pack $ff -side bottom -anchor c } proc regexp::make-regexp:compute {} { variable data - set words [$data(w:make:list) get 1.0 end-1c] - $data(w:make:output) delete 1.0 end - $data(w:make:output) insert 1.0 [make-regexp::make-regexp $words] + set words [$data(w:make:list) get 1.0 end-1c] + $data(w:make:output) delete 1.0 end + $data(w:make:output) insert 1.0 [make-regexp::make-regexp $words] } proc regexp::make-regexp:ok {w} { variable data - set words [$data(w:make:list) get 1.0 end-1c] + set words [$data(w:make:list) get 1.0 end-1c] - $data(w:regexp) insert insert "([make-regexp::make-regexp $words])" - destroy $w + $data(w:regexp) insert insert "([make-regexp::make-regexp $words])" + destroy $w } #============================================================================================== -# Main entry point +# Main entry point #============================================================================================== # try to get customization from 'visual_regexp.ini' puts "[file exists visual_regexp.ini]" set filename [file dirname [info nameofexecutable]]/visual_regexp.ini if {[file exists $filename]} { - source $filename + source $filename } elseif {[file exists visual_regexp.ini]} { - source visual_regexp.ini + source visual_regexp.ini } # try to auto user patterns set filename [file dirname [info nameofexecutable]]/regexp.txt if {[file exists $filename]} { - regexp::pattern:load $filename + regexp::pattern:load $filename } elseif {[file exists regexp.txt]} { - regexp::pattern:load regexp.txt + regexp::pattern:load regexp.txt } # buld the GUI @@ -1081,19 +1081,19 @@ regexp::gui regexp::go if {$argc > 1} { - puts "Usage: $argv0 " + puts "Usage: $argv0 " } elseif {$argc == 1} { - set filename [lindex $argv 0] - set file [open $filename] - set data [read $file [file size $filename]] - close $file + set filename [lindex $argv 0] + set file [open $filename] + set data [read $file [file size $filename]] + close $file - # memorize location - set regexp::data(v:dir) [file dirname $filename] - set regexp::data(v:file) [file tail $filename] + # memorize location + set regexp::data(v:dir) [file dirname $filename] + set regexp::data(v:file) [file tail $filename] - regexp::sample:set $data - unset data + regexp::sample:set $data + unset data } @@ -1105,261 +1105,262 @@ image create photo logo -data {R0lGODlhLAFxAMYAAAICAhcXFzw8WFtbb4+Njq2ssioqNMfGx #============================================================================================== -# Make Regexp +# Make Regexp #============================================================================================== namespace eval make-regexp { } -# Takes a list of words, returns a list "prefix prefix ..." -# after grouping by first common letter. +# Takes a list of words, returns a list "prefix prefix ..." +# after grouping by first common letter. proc make-regexp::prefix {words} { - # init - set result {} - lappend words "" ;# to force last completion - # group by first letter - set prefix [string range [lindex $words 0] 0 0] - set subwords [list [string range [lindex $words 0] 1 end]] - foreach word [lrange $words 1 end] { - set char [string range $word 0 0] - if {$char == $prefix} { - lappend subwords [string range $word 1 end] - } else { - # compute prefixes recursively - set recurse [prefix $subwords] - if {[llength $recurse] == 2} { - # only one prefix, so concat with previous prefix - append prefix [lindex $recurse 0] - set recurse [lindex $recurse 1] - } - append result " [verify [list $prefix $recurse]]" - set prefix $char - set subwords [list [string range $word 1 end]] - } - } - # return - set result + # init + set result {} + lappend words "" ;# to force last completion + # group by first letter + set prefix [string range [lindex $words 0] 0 0] + set subwords [list [string range [lindex $words 0] 1 end]] + foreach word [lrange $words 1 end] { + set char [string range $word 0 0] + if {$char == $prefix} { + lappend subwords [string range $word 1 end] + } else { + # compute prefixes recursively + set recurse [prefix $subwords] + if {[llength $recurse] == 2} { + # only one prefix, so concat with previous prefix + append prefix [lindex $recurse 0] + set recurse [lindex $recurse 1] + } + append result " [verify [list $prefix $recurse]]" + set prefix $char + set subwords [list [string range $word 1 end]] + } + } + # return + set result } -# Verification of regexp. -# After searching common suffixes, some patterns grouped by parenthesis or conditional exps -# may be broken. We need to fix them. +# Verification of regexp. +# After searching common suffixes, some patterns grouped by parenthesis or conditional exps +# may be broken. We need to fix them. proc make-regexp::verify {exp} { - set orphans [isOrphans $exp] - set result {} - foreach {prefix recurse} $exp { - if {![isBalanced $prefix]} { - if {[llength $recurse]} { - foreach {pp rr} $recurse { - lappend result "$prefix$pp" $rr - } - if {![isBalanced $prefix] && $orphans} { - set result [verify $result] - } - } else { - lappend result "$prefix" "" - } - } else { - lappend result $prefix $recurse - } - } - # return result after fixing - set result + set orphans [isOrphans $exp] + set result {} + foreach {prefix recurse} $exp { + if {![isBalanced $prefix]} { + if {[llength $recurse]} { + foreach {pp rr} $recurse { + lappend result "$prefix$pp" $rr + } + if {![isBalanced $prefix] && $orphans} { + set result [verify $result] + } + } else { + lappend result "$prefix" "" + } + } else { + lappend result $prefix $recurse + } + } + # return result after fixing + set result } -# Check for orphan grouping ('|' lost in lower level) +# Check for orphan grouping ('|' lost in lower level) proc make-regexp::isOrphans {exp} { - set orphan 0 - foreach {prefix recurse} $exp { - if {[string index $prefix 0] == "|"} { - set orphan 1 - break - } - if {[isOrphans $recurse]} { - set orphan 1 - break - } - } - set orphan + set orphan 0 + foreach {prefix recurse} $exp { + if {[string index $prefix 0] == "|"} { + set orphan 1 + break + } + if {[isOrphans $recurse]} { + set orphan 1 + break + } + } + set orphan } #============================================================================================== -# Check if parenthesis in 'str' after balanced. +# Check if parenthesis in 'str' after balanced. proc make-regexp::isBalanced {str} { - # if start with '?' skip it - if {[string index $str 0] == "?"} { - return 0 - } - # must start with a ')' - if {[string index $str 0] != ")"} { - return 1 - } - # try to balanced each ')' with an appropriate '(' - set depth 0 - foreach c [split $str {}] { - if {$c == "("} { - incr depth -1 - } elseif {$c == ")"} { - incr depth +1 - } - } - return [expr $depth == 0] + # if start with '?' skip it + if {[string index $str 0] == "?"} { + return 0 + } + # must start with a ')' + if {[string index $str 0] != ")"} { + return 1 + } + # try to balanced each ')' with an appropriate '(' + set depth 0 + foreach c [split $str {}] { + if {$c == "("} { + incr depth -1 + } elseif {$c == ")"} { + incr depth +1 + } + } + return [expr $depth == 0] } -# Check if 'str' contains a first level grouping +# Check if 'str' contains a first level grouping proc make-regexp::firstLevelGroup {str} { - set depth 0 - foreach c [split $str {}] { - if {$c == "("} { - incr depth -1 - } elseif {$c == ")"} { - incr depth +1 - } elseif {$depth == 0 && $c == "|"} { - return 1 - } - } - return 0 + set depth 0 + foreach c [split $str {}] { + if {$c == "("} { + incr depth -1 + } elseif {$c == ")"} { + incr depth +1 + } elseif {$depth == 0 && $c == "|"} { + return 1 + } + } + return 0 } #============================================================================================== -# After having found common prefixes, try to find common suffixes in expression +# After having found common prefixes, try to find common suffixes in expression proc make-regexp::suffix {list} { - # end of recursion if empty list - if {[llength $list] == 0} { - return "" - } - set newlist {} - foreach {prefix recurse} $list { - set result [suffix $recurse] - lappend newlist $prefix [lindex $result 0] - } - # compute longest common suffixes - set words {} - foreach {prefix tail} $newlist { - if {[firstLevelGroup $tail]} { - set tail "($tail)" - } - lappend words [reverse $prefix$tail] - } - set words [lsort -unique $words] - set reverse [prefix $words] - # compute regexp from precomputed reverse list - set regexp [build "" $reverse] - # returns computed regexp - set regexp + # end of recursion if empty list + if {[llength $list] == 0} { + return "" + } + set newlist {} + foreach {prefix recurse} $list { + set result [suffix $recurse] + lappend newlist $prefix [lindex $result 0] + } + # compute longest common suffixes + set words {} + foreach {prefix tail} $newlist { + if {[firstLevelGroup $tail]} { + set tail "($tail)" + } + lappend words [reverse $prefix$tail] + } + set words [lsort -unique $words] + set reverse [prefix $words] + # compute regexp from precomputed reverse list + set regexp [build "" $reverse] + # returns computed regexp + set regexp } proc make-regexp::build {mainstem reverse} { - # flag to indicate need for '?' (optional group) - set addQuestionMark 0 - set regexp "" - foreach {prefix recurse} $reverse { - set stem "[reverse $prefix]$mainstem" - if {[llength $recurse]} { - set fromlower [build $stem $recurse] - } else { - set fromlower "" - } - # build regexp - if {$prefix == ""} { - set addQuestionMark 1 - } else { - if {[string length $fromlower] > 1 && [string index $fromlower end] != "?"} { - set fromlower "($fromlower)" - } - append regexp "$fromlower[reverse $prefix]|" - } - } - # remove last trailing '|' - set regexp "[string range $regexp 0 end-1]" - # add '?' if needed - if {$addQuestionMark} { - if {[string length $regexp] == 1} { - set regexp "$regexp?" - } else { - set regexp "($regexp)?" - } - } - # result - set regexp + # flag to indicate need for '?' (optional group) + set addQuestionMark 0 + set regexp "" + foreach {prefix recurse} $reverse { + set stem "[reverse $prefix]$mainstem" + if {[llength $recurse]} { + set fromlower [build $stem $recurse] + } else { + set fromlower "" + } + # build regexp + if {$prefix == ""} { + set addQuestionMark 1 + } else { + if {[string length $fromlower] > 1 && [string index $fromlower end] != "?"} { + set fromlower "($fromlower)" + } + append regexp "$fromlower[reverse $prefix]|" + } + } + # remove last trailing '|' + set regexp "[string range $regexp 0 end-1]" + # add '?' if needed + if {$addQuestionMark} { + if {[string length $regexp] == 1} { + set regexp "$regexp?" + } else { + set regexp "($regexp)?" + } + } + # result + set regexp } #---------------------------------------------------------------------------------------------- -# Last pass for grouping '(x|y|z|...)' into char range '[xyz...]' +# Last pass for grouping '(x|y|z|...)' into char range '[xyz...]' proc make-regexp::optimize:charset {regexp} { - set optimized "" - set memory "" - set ok 1 - set charset "" - # examine char one by one - set len [string length $regexp] - for {set i 0} {$i < $len} {incr i} { - set char [string index $regexp $i] - append memory $char - if {$char =="("} { - # start of group - if {$ok} { - append optimized [string range $memory 0 end-1] - } - incr i - set result [optimize:charset [string range $regexp $i end]] - append optimized "[lindex $result 2][lindex $result 0][lindex $result 3]" - set memory "" - set ok 0 - incr i [expr [lindex $result 1]] - continue - } elseif {$char ==")"} { - # end of group - if {$ok} { - set optimized "\[$charset\]" - return [list $optimized $i "" ""] - } else { - return [list $optimized $i "(" ")"] - } - } - if {$ok} { - if {$i & 1} { - if {$char != "|"} { - set ok 0 - append optimized $memory - } - } else { - append charset $char - } - } else { - append optimized $char - } - } - # return result - list $optimized $i "(" ")" + set optimized "" + set memory "" + set ok 1 + set charset "" + # examine char one by one + set len [string length $regexp] + for {set i 0} {$i < $len} {incr i} { + set char [string index $regexp $i] + append memory $char + if {$char =="("} { + # start of group + if {$ok} { + append optimized [string range $memory 0 end-1] + } + incr i + set result [optimize:charset [string range $regexp $i end]] + append optimized "[lindex $result 2][lindex $result 0][lindex $result 3]" + set memory "" + set ok 0 + incr i [expr [lindex $result 1]] + continue + } elseif {$char ==")"} { + # end of group + if {$ok} { + set optimized "\[$charset\]" + return [list $optimized $i "" ""] + } else { + return [list $optimized $i "(" ")"] + } + } + if {$ok} { + if {$i & 1} { + if {$char != "|"} { + set ok 0 + append optimized $memory + } + } else { + append charset $char + } + } else { + append optimized $char + } + } + # return result + list $optimized $i "(" ")" } #============================================================================================== -# Compute string in reverse order +# Compute string in reverse order proc make-regexp::reverse {string} { - set result "" - for {set i [expr [string length $string]-1]} {$i >= 0} {incr i -1} { - append result [string index $string $i] - } - set result + set result "" + for {set i [expr [string length $string]-1]} {$i >= 0} {incr i -1} { + append result [string index $string $i] + } + set result } #============================================================================================== proc make-regexp::make-regexp {words} { - set words [lsort -unique $words] - # escape special chars used to form regexp - regsub -all -- {\|} $words "\x01" words - regsub -all -- {\(} $words "\x02" words - regsub -all -- {\)} $words "\x03" words - regsub -all -- {\?} $words "\x04" words - regsub -all -- {\[} $words "\x07" words - regsub -all -- {\]} $words "\x08" words - # do it - set list [prefix $words] - set regexp [suffix $list] - # returns regexp - set regexp [lindex [optimize:charset $regexp] 0] - # un-escape special chars used to form regexp - regsub -all -- "\x01" $regexp "\\|" regexp - regsub -all -- "\x02" $regexp "\\(" regexp - regsub -all -- "\x03" $regexp "\\)" regexp - regsub -all -- "\x04" $regexp "\\?" regexp - regsub -all -- "\x07" $regexp "\\\[" regexp - regsub -all -- "\x08" $regexp "\\\]" regexp - regsub -all -- "\\*" $regexp "\\*" regexp - regsub -all -- "\\+" $regexp "\\+" regexp - regsub -all -- "\\\$" $regexp "\$" regexp - regsub -all -- "\\\^" $regexp "\\\^" regexp - # returns result - set regexp + set words [lsort -unique $words] + # escape special chars used to form regexp + regsub -all -- {\|} $words "\x01" words + regsub -all -- {\(} $words "\x02" words + regsub -all -- {\)} $words "\x03" words + regsub -all -- {\?} $words "\x04" words + regsub -all -- {\[} $words "\x07" words + regsub -all -- {\]} $words "\x08" words + # do it + set list [prefix $words] + set regexp [suffix $list] + # returns regexp + set regexp [lindex [optimize:charset $regexp] 0] + # un-escape special chars used to form regexp + regsub -all -- "\x01" $regexp "\\|" regexp + regsub -all -- "\x02" $regexp "\\(" regexp + regsub -all -- "\x03" $regexp "\\)" regexp + regsub -all -- "\x04" $regexp "\\?" regexp + regsub -all -- "\x07" $regexp "\\\[" regexp + regsub -all -- "\x08" $regexp "\\\]" regexp + regsub -all -- "\\*" $regexp "\\*" regexp + regsub -all -- "\\+" $regexp "\\+" regexp + regsub -all -- "\\\$" $regexp "\$" regexp + regsub -all -- "\\\^" $regexp "\\\^" regexp + # returns result + set regexp } #============================================================================================== +