Yac@BBf`h#i9v>8%Y}9kxMqHy*XVpkk<|pKYsjadP@~SlSBv#!?HHbl>*(`&t zc)J!M`E}5*7yF39&oCjMrQqC?tj4)q9A_kPDaC-M^2bCMuUsL!lufm)I;QQOA6NAK zyD;n{Ckrka6ElLe7F@yXM$(#1ipkqkucY{Eo2&ZUgp%#v_U$-$U%;)l25@$pzIzfj z?{vwn4=x)T$+gZqR_~$}RE;kI1GJJfMBAnaCF!+i43BE$8RXVOtx-PJc&WA-3HK+n zBxJj1U;!FL{8;*`*08shU!r4D!VqmQEk%S}QsoN_LFk6#WzscXs#`UKApd6!AxhIx znL`nM%1?IeiU^ftp25-@Vl3>N;q$md4WO;UO<4yK&pA2$cvlXxs{sZ1WPkR}qa|lD zEY9B%bCWg3MNvTFn{;8#wu}KH-NjiDORir;DSDQ8_7IW3$aN`1A(Um#B@dU%>MwE4 zdf1Gf=ECpbVK2=CF`8j{pLV(80$N7`4u(&DxD-cQ2~;5SsKBwxV4@+m6klY5yvS)G zK5>>k436)Rn9$<(&E@!b;6t1}^sz!|gF&`P&VKsMLJ*}nS^C(4#}V^e z-G{gwk_-~n(LPyU$P5QtQ|v;`IzRcRg#GkW3IB%~mzb|I?oO9Of EQxnW9J0)wYQa*AEd08G>+}U+P~q6dauH|DwOpa9!Hexrw=)sW1aIQ z2{S&$p5!eNpjw4H_Uo8(t-LeSHnQkH^+)&IVkASgKuU=GSgbCC-{C4E0l`0;yS&&PSOlntA5${xbV2HNNJap#ziVsKlfvDO_+Cz=6?TDuXA9F zuV>D(X7XI+M)?HA>#XVZHoZV@iTdzATdDY|u<3N4@Dw$+^IWHXVbuRJ>)v2|$caJf zkihY;dozb^+Q-U$8{_vf$Q!3D|BjNIq600NdQ)cTODkMIlcZ(;cQi0AE&V5a{`9Iy zN*QUEn_&7+3rYt7P+kug{#~zu14ug=)@vmZGPiL`LC9 n!rMa zJd|O+=DH<&8#sX!lI8rP^=v6fJ@L99KDe%GZrJ}_uYrR|H(8Er{y6Au`FIEb;O+Xt zR>T2rZ3}-PF8s>*`TsQm*ZC|NvwC^0NtFNq0ROAzdVdX6K_1Go{jv6+`ibQK`{0Tc zh2Hp}54{ZxK)OP2ZhCDQsEVwBvRt39T>xGnx1lV5Ueh1&rG!C%RY+dgjo1zA0@5DF e^4EVC52FDlA&X#a|0CXs{0`$F@Rq*0+kXLB9Y|vU delta 4598 zcmZWtby$>37vF_NQMz*p0ZD0>k`Sp~Lb|&_U;$~6WtVPb0SUR%h%_tR(w$0!fRs`a z5*OqH@Adia{l59*o%ea>H)qb7IdjhWO}kf|7oNH@Hi#Sm0N?_&D)E|tKrKu!kOYXU zg|< Tl+pjC|l?4@C8RIQB-mKk(tJt z^&X!~aWlIlA%)jsM94+a8)2a}&D&1a+3wI(n0GH;jv|0Br@eQhEevbXSp6kmc@P0b zi4jSN3OSRRF)vb;f8GcFo;)&VE#B}Jl}TpR2E5fkn#joyWFJn@Z!+qzG?yytGn%q% z2B5nuNGXRP3xN~uDuC!X@yi_iP4UP`rip;hrhF}+aj_Iz%{_W%^>b1Y9ldb(sxKL8 zJKcCt%Ha{J2~T$LG;ws)MLeYf*6vn3XyV&MiL*L* m&7syIb>F!>v4>ZCpHfeVm;>>Kno5Amo8d (E4>Dp*OWMRcL z0OCYyUbHoV)v-XA=kR83$1@9Ie`tTNfIftUnWbb|CvFFKpodioXP){Q#F}|RD9FPQ zCuUPW@{1{ 9t^xD?^OoN!dQwh2n^B#MsK`U2+u+CbI9CpBov60 zeYQ*Fvg%1VHc(Op;K>bi>E{>}UW(lmXXCMCTIcS6ThU;b4Gp0&a|%EZKUDtGFmwrU zqys#VKMA&9C$34Cj~-3!UY#;HgGI5LW>rpQn;iCtQ7-KT)z|X)SNLTLo&e*RlUP lU1=Ywg<$AZp`@?M{~_DXX~f`=;$qlC3mIy zHO%ROdfG@e1=#Szds$6% @^^ASWa+^n=l(_N z@**k@)6O_k^an}>`YSIO{c0UY?ce(a4|ozd9{UX~6g=J=- -c=gK(<=S9#?Wl0^3Lf YPc>WV#Fpl*^IXD}c1*vaB2alrcrj|O #(T?zlsncNp?b)19)Sc zM$~{y6G4?*?ImykEsY0v` dmszZuCiK0(W($uXm5 zhmLi=l0}PBR)*{oekL7z>w~Ld#|n0{;zXAHW3xT8Q@1`YbOCeBhY|_Fj|LmZ3i$*E zAz}<2&&LpXCIMU7im+9xm4Ugr`)SX?;T&Sb#u=Tl6c(-{bx_ -0emRp&h$A!`wBtGWR~d zWyeM#DbRjM)hE0n8P;sLerF`*q3+_Ofc@^(ML_UR;&H{przI1BcSbNN ? izfYL+gF_EWU6vv14Fs!lZ3dGycrVlPZEXB zra}Z8<*Raq<@G<+@l_u7HIEHK!`my%ScNof54IjmfZmtXM!60Iu)P>;QJ#q&xm-X1 z{}ID6@9{jZGcbBsm;s|ikbIMj7YR>suDdDn4>tqtVq}<7%Iuqgr_@|n1UFgQPF(Wo z1U3MWj1HsaK(PDB4$HJTi$nd_6IzZ`Ye4on(Ta)8ug#W@ !Y8DdUo7p`7AJcR zExZyLevPe>4ijKJ6ItwK&Phm(S_nAWP=>UC#b%k1Bxuy2B72Ua*)F0%q9C0bTXz (MBc8Tt`BZdVq>2@*w^W;+X8PSi2+Oe{B6(HzfRrX(OJT@?)W>wiOVE8+ z7nYaVnK~g0eNbEA1zqz}#v8xXC-PLC|761!9Yto59ziBg{e>xXaYEDR;ZL)VLGwm0 zJ6gdjZE4jK=Zh3QlCaPv$uelU7e_Kr#3$FsuV+9-o7jqPLKdx-WVUxBV#(|NG{uOI zJo+hsM0`fexzg>Se!rm=c-h#Y-?#^wZ>Fd%AtLS3_s| z6O~^yCe4c#uxa2JAI~34j$}@T+%snA)!U@!B=#qF7WPrI+rCRvMSL3SKAx58q|r5q z*Ds=w!sIWLa5>rN%yv@f{#1_TfJ!)HEtkpV3}G2h&V{d$K}z9@A=0E~ORMfU@OEIx z!jKyW6h?fsjfYh^Vt@NnBJC^frr_8xGaKBM2UX+-Hqjg$o0}(Sve)HS31f}h(uJ|) zF`IonBRt6R*^Rq|{J1^+?TGh9WZN4EqX(}B_w(iHICNmOgCbcSZs)QgU-uBElV2jv z0g=CXyf;!U|09?eDRqBPtz>6~j(%j;Z_#n9JlNsHJZOi854WR@(b{&5hvw+cg>`0E zunM{L7!w)Jvamj(AVxGGl|T?r8n2o8{%}*i$R?Rx--lMPWkIBLBY4ofA);wnR6WRs zlu%%R-?Zd*8lvo&>u`0=ymZQqy1ShijW~lQ;h$R<^T&N!;NIN*qwx5&oYAVWKT8O_ z==X@}5ALYf8|T;pMGxGM8}dFJh#|)w52vXn8@WGnxids!MdQ)R) 2{ zqHhb-UiiipA=OwsU;LpyksZ6E8;gN2Bv?6Wd9(N`*vvrOS`IgOa~qq#f0Gif=-8Le znfcO~wTcSEGc23Q%8{bc_l{=3 %Ewo4vKI`5JQ9<2>MKg?XX~1@+j^PmR@UF~zRqATlU75h+`T*E z_I$ U+HdnVojW(Sv0Po4l&|5rPdx&Xg_|57Ls^TIw>&mfF`|&DK}yi&q5yj0+JA zJ@|iJe{?A&9>#?`<#(81d64{9v5r&*45Hh384&|6EBxePCoDq}a*M%Ma>QgL?;J>S zci(xf1C4u_byuUE!rSIX`kJ-4KsG`dqAjoYE;cO7cL}R-f6R+#>!5mt<$!uBg|a)O zM;j+zRdUEf?fmznQS6(&;07baRn0rgGR=HRZy-}rG bmVp^Pu`Y)+()N4^QEz!;W4iy(jlB zu=%7>UmWabU2!tfY7+fYXTd3xEy=c6#!s4kC_?uYWx}Eva>=v}DZC^4nDQZ!Mw| vh>Fe$FI3k;0G3#$OBZhfayVP*bONsbOtke`_|oACnR)z2N)qRnE=| zyFpC?yAjc_`Ypj_;-N?3wf9R1?rN~RKp5|j*pz0Zn6fmPF1I(?9Es08m}9VSF;RLW z-}C-JHhGBb_&{KMzZL&TtIrO_aJ4{i&i4<`xycy6T;`TQ3h>TNx`=j#hhm}g1sM@T zadS+>J$uRLgp?;BvMvqBE`#b=%^m0JIVnK2Tg)eZT-Vo4FTQ&>7|8dnk4FpOA7)$) z0*b?fc~Fufx DXX?>wv)hlK?EE~P}L=y#IUZ#ybG zJl{`__Df8)iP?%hjAK-|RZl~@4EH%>U>(uI9!eImHD~n 05_XnS!4tOU(+ph2$kR4q6-Ai5Zxg| zRclhGDW$zAk#*n_a{9dq4RWe?&yX`(_sr(ro$^hkSn5Y*FZbbtrjdEFu}Ep1bo5H% zCZuf}zoOy-A~(rgA=&@kQQObk>=lBB<5-F8WQ^hCT$^Ss+jM5i1ewzw* @51Ux5g^=IXsXW_Dw$r(f8ea{W> z3iGi;rnn!~)yA0GJrmpsTc6uFvIxXaB75g#TJ-9qKJ3co9V4tI=|>+?XW13jKU@Vf zEL?pPRYD*#*WWIP=zre;a6}-#eCHP_Mazjm7;il3f9d8m k^?gBTQR9zW}MGpA;1>#z289WiI` b%7 diff --git a/tests/test_files/escape_tpl_auto.docx b/tests/test_files/escape_tpl_auto.docx index 9a8dd4592dff932c58d088e7b3f6d1f0e612c21e..c6f7a6c5b5456134779f35fb5a4fa6deae65aac9 100644 GIT binary patch delta 4078 zcmZ9PWmME%yT)gzhwh$1a*$L?=>b7NQbLdr9ERqhQ}QoEr@#Qx>5zjU$bh7D2qGyx zARr}3iuCb0XPxt&_uU_^wbx$Py7v9yxAuMSx@hpXXmIUIGO}SR)*X6c5NHq`OU4Z# zZo ^&+o)3euz5Qd zI>svzgsPer;dd4OBIh=X;{hku$^nV2DJro=a2QWrug3ssgM-SsU$1B0v0w&DAA@N7 zd$`QhOcoj-6#ZRWA$*Xe)*cPg)-7OW-RtD?ZE-57Aymt;U=UwNK*`yxsdQ!Qct!fr zzll6-u(K~Cb#8;Uq{vyvaQvx_UNLA{CP_@X!Qf3CTitN;Y?|I3jpkxez=;$}^b{Pw z0Z&X)Bec _PARl2BX|A=?~*4GkZ&3R|NC+@>vzWdtJ16cmVx0Sw&cT z=xCONIFXRJ0`(^k(K#(90Zqv-XbE_~+zJa8Fa~9byt`AFO&w8?dBZwluAg`nja!$| ztDknsHB)=~*lp{_7w-Isz=?5-ZLO3biL0F*zKBQ*BPgy~qg2&-wvS6PDCVrZ)-d$2 z%^mCKhT9PH60WF|sn2NN6hhhT(;JGzD5D1$El=32@wxDr39|tiK+WSR6LF6PZN>`^O9A|YRU2^RZRYn@XzV< z)zA@y(XvaCYU{<(hPPLq<#cXkeTe*DSfp122C2i _2#jhnnyJ+P}>G o^8z3T$sgfh0J9~Ezy zSD$ihU~+eJQe`DzOR?LY0Vh_W>)fwCMeLcg?|mA<*alV$ l=xXVMhX3iSffk@?3(mu#fBYa+Iic)Td*;VP;4dmZq7)SmRdt#KqF2Y7 zz-5Ha&T83J-0rWhmFrBGCrdjlg2r_&H)^njB>l`q#K%=rUgy0h%P!tdabo?vFYeqi zeC^L6RVt;|z|9~y($ez5+q$?SqVbYXN~Sve-XLnn7YbACY#0Qvq~ZQy?hIYQ32#?) zO+KnIQFg+f0y$Aq&rT<^S5xhe%+KUyNn98s_9r4e`2^Q7k69RDY6@wB(LwiuMs&8P ztEK|&M4h*9xwL;sd;q_6_1dD>U5*G(Gdq|y6nV2=Z+7}tQr*szp(j$EPyj_xr)S7H zl1W`BMVz8HmiL8GT;F2goeC;i(_A1ZmYPUoYRXp19f(D`z$H)aW$-`Dr0GdGl}TDI zyxvfMW-alVSCn%;(p*1bc+=Inp1&LJ>h&qdvHpsOpr~EDlIbuyCi1qqEwK;Bd9RPZ zT}ko7Qxg<6f<7eEHc+@B?rBw-1*O2Rir_-k7;(Mf`8GWyLb*&|Az5eYbz>;+T?u*h zi>xkf2H _%ypc&@YtL*9Mw zYyGQ{gA|QeHniUbYT=Q6>QwGm#Zt0b?EN_G2o(|*G7M*)jd$N?xdEf!(K8ZTb1!$1 zql>6H0lfR17;QiP_AU@}Nv%gK#!Oe~T5g1|#9a_R>*qGHDX^0#y1uXs?b3=YZ2bXC z+HDyP8Fj!Px|PKtgt6#C2Kq!*deRZ@^gwj7(%sV%VzOKZIXhy m=pj|JgC`n_W z0JCDhq>9@}ovAEttkRKc+f~8NS3+OD9{8zM5odB1fMm4NPhl5-@r-8$pV>y=`vy*Q zJvj#DaFc4G7Lx@J=QUA_@6b-}POUgSvG=w}2P_0e!uZ`w6gL~gjHR){ri-q!?VWq~ z#Ybf&f2T3M;=Io;5+tfmHx2)INURGGqt4Tlrwrt&DrbID&B JMrCD2U%6D09fru24~6(7sy6xW(XUo3ZODSfEe5@{D#_Cg6hOa@MtS z!0AqqIEj7e5hsa#h&QcTtwWy|jDb;Cl~GL7cxe631HfwUwlJfqhOHJk%nX$@T%0p< z>b@gnFOfbZ4gsmmHH}L>_~0$qH#43~hAcxFm0*V!(uBf{GdzbpFgkG#){MY3FefmC zjeOA&v%nB<4pmGj!9+b-{t@P_ CM|>x|zs>NLyo+{c2bwB~Ym zu625!I@M R4 cT zQqyc}fkL{Kv|ygfi~7E{pzckd`xd3* 0I;{&fVoqj*(Kd)Gm)TFub zJ7NKWZf*!c`r3p<=oWhN`l4F`BxJgpGfszuAkYwcoKFyVq4HVzqpO@|(D&r_V_h7v zV{yC&J?;5UOKNpy{QOGp?Kf9`9hSQz3c+UxpW1#yy3R5ykBuP0VQmAt_N+jlZM{3l zy-?~KQ!#3_!oO$e;_&y;W146k>*@!(R4-9g3F$`eRla$N>Xi$~sL8x?@xMGo`Bd58 zdPyQ5wg21(tOZRIr36V~=Q89WN+;&*;wOHo4x+uuDTd^*>A6f>WE(%s4akjb?RB@Q zqg_w3ep}t2(!+?PedelJ4TW47+y^x#+1>!JW+b tsm4_CNpmZE!8a(N*w^_m^%F=S@5Rb%rIh(Ls^n%J1BR9HU@#zWYYk^H}Y3nwHk z$H0&JAnzy0nw8l{U!173;>O8q#*((BpJ3mYhxxtYI)4Y?_1#{bFnensO6%lwuZlVC zdjau$LiaMN*wgiAZ+A8@PHq{0qbVvt)bTO4+hNz7 )5Fu2)A9bD6pef({yJ# |!Q=8>D+l8Nds zEo+C%>p?plcSeWSyDG>rm%-JrFtDJ=6SF#<>T#u#iLSDI=Vbz&J|KI)I#m$lbTo G&$fO2 eDA*N0wP~5ZeZIv)dns-$q#w-zfgT%tVMX zn~S)J1wFt7usJqH>oLpC##*h}8r+W06WOzkMZ@w$eCs9$5T`bpWI%M@8Zt?}ojEOz z@NMYMzOVtBsO2l*GuAlA$kD4;u*E(s@O6WdX`EEcMcdcj#p05O`Dk7EPj%Y^aeLvu zUy1Z$QHhq_jk*+Dwa-PEd(2=%4w-y1W&zEluiq*8S #L;sz~BV*7a3u&D*969k}_g}e)OeH={(K&CAc0er%6EMwWtzRucsgm2C64AOh{cV zi%en&?^cB6iw2=hWpH+ohd24UgxoO@+1=s5eo098_mX?F@=@h^mK*g>DGrVpqq*sw z%MYzt&%T@KbO~AK_WFkQWV-)8V^bjB5a&x2=Ou%D4M3-MAVr2qEa=K6ag!C#9MyPO zoxfLVX)nm0O&9CBSTPDm0i0yjD)$b;5lg~WZDlucLbv6C1B^o8_^Li~C-Kn$XS1fH z@tuZ`B+Oc`BLscpTe$*3`+Uv`!6ewb%gd;^-~ceT1~DJQWm`;q*y}>=60tHDRDyZ* z-aNF%&ST72Fi7ESq&Wbw%B#%wO8}43>;K%x+Led%QL_BPVk;5@$dTfMKR{@IV8og* z$F21IJhhwzxVI-=sZfZ}cu?YKyHAT7-E-cKL4$#Cy^$pfO=jk*b(y_#!XTtU%1vjN z@<-9D6ogzzcEi2OpOOG%k>L4x*`Py}(*wMd4Ia9FYl-rP=zkw+Fo7tD5kvwa1%W`^ zAO~-OyXZ^!$N%>M?p3<~KjU7iG84ES&8(~h-bI@zD}v|IX@7J8J^n`<(6kQ}!Nq93 zKbnkAc)$z!?-_sq1akNb1fu(s{jU{@9(n*Lz}-UE++snmE7L;$uQ!nYr*#RfqXGxt zpyO2(z?bL&6#@2tXaa*ku78sMJ+&82t_lZBqcv4wkbh9}`{Nq= };u4*v^lDuX`& delta 4022 zcma) 4AQFlMkX}TTA~h0v5Tq-S7Dzx8{!~GQ5I~gPi-<_1 zN(br0Lhm4g2*PpibH+aR-lw}B=2&BmIp%u#jc=~?H6C0Y53YPjOIy8r?b0R$1hNHi zv?7?iGwqc^*$K8uv(Dk8NfOG$)ZTx*T2PflENJiTQSI9*{#`CT=I+ku f$lDPH#Y`hq-$7l`qxDLK(? OWwqeNnw^$6TcrDLUw+n1H8RC;HLM~W;w$UIPzaX;3 zdNKZzg9*89F8D80@!RF?KveACJvF{i%J3l9?Po;H*j!OWGhJG#km |t9ub>^%5P=aIikUAt0gPJZDQ`x@FH9Uf@;IypOSDh{3Dj8_HA| zrs(yAo@`S m1@&-7+OY@_R3TCByI8bi-U2hIjbTD3o;dV{lr2 zWoeCbs&nTuo>{R!`tI*vk)ZTT53xnZI%9z}H_d@CFB9ZX4S6SNSZbj1fkv(OsX|Bf z4=?6Y4LdH;TUw7zwBEB>T^1=@e?lLJp@u0?kVXB4jNlJ_GSpBOrqma*rZG4P*_WN| zw`X=WDr~(~%yM1VY<#mehC~EExZe(FQAoc)ezjkLE`mw b?f!IEk_Q`{0bAkq54>F=A*0Swi zNcGOO!|l10RKC-*g<{CGIz`tpCR6bKyXhvfy+113numBNKH=7+67fW1`~7;DEqp{P zajMr77Fcp~nW@HV;NV6Ne-;}W@uTuhxJ=7lR-a;iODeV{AW$UR@fCi#VJ!GglUQpj zcX_SWbv~8Q;)$5JrjX$2*1(vzbF&5W{c|@C1+x %&q9=j54DF{NEn zi(Mw9sGoh(VNUBEQ$-Tf9)vW&xh1gB(7qR)T*Y+_=GC9W&+C>v|J=Ex^(nT!<=q6U z3s^sMM?xmgl2Yg1z>j8O4C91A-BKmd7A r@gNq zgYdqMNlmIgJx8B9<>RDox@qWs&8lA?lPRw0_F9ioD1kX=!>7<@b$o4=RTO{j)z%8j z)dcqAdfy^8o*|f+l2ys!c+gNc5ZSjT{C(#=7Vzn?pt(+=x&6Gp%rPFV*^lZ@b9C5R z*7MGZuKN*L?}&YXnmI6?PTp4CT(-2J9egzEHE;`i=DbcRD)w>WWaCap#)l&owy^}H zX7Z}P&QpQ>&D_x9;4D}!V@HZ%{AJ9`&idSCOV %8z z0L1l;r_6=rvs&13wAN@p)JP@MF)1pWd=ejJ3+G3i-^f AYMx1M%gE;wlTEgAXyZlb#!jSn>W^ zFUOac?mVKxTIF6i3L4>XU_?PNn#O@SddyQ!My~R`^W`?fCvWMiJYOqPRHTs8t 611P9-0+l>`HC(L0^psJ?ppSGw3coBSx!NYzYewqz z{Hx$Yuv91P)xU9|#02L+jh^=XgTtJ_{{x4)vNnwUI4zJ3=`;DvG9p$-kcO7tpzXwR znXo8v=6WeSnUSW95*fUFr;+N}7h9gVe$0yz?QEFb{JE3}SBv<9_&$$piMqgpcbAJO zhcg89_3vF0>(tuW6TOyOM1?nO$d2J6HJ8l0= zEi5_pP|+Q>qubJYQ&27Qr1$jDudFd$;%ujnres)S`(Qhn$xCxz^ml_EPSHBMOa>)1 z>N*E ef^zEuxB8?h)!=|mU6dmEw_kH 9d7*{SQ5 zA4JJG4Ot8CR6xqQ{CLN3a45<>3v=P=t)Xt&-HUp_%c|>sYt2Cixdeq-pMsy7dtCh^ z*hM0Ab9Df4!Z#$o7_N@f@YLebdkL&2UGvLczmy*$)uh!pbw5kvrlV@fMd3G&U)o#m z?5oen&haXf VzJ??y zMMe7{iTT~iIS?oV_#q~Z*^SMOVrf_v+sxMeHKIDjm4}lPG}K =750-{))3ij zINtO^FCFyp6%@cT@HCqAgx3l@E{=)Vo&JkI*9-Zbs6`7|(JY+&gVCZk?U^kvFwJld zI&VfVF9?SNXX$fF`?48VMav&tO2l$R;^l|lBIif^({pHb_kt!c$=>aDL_ RZ5w2s55v<@as3ODuIh drk!c-0l zd_aEip3^hID%9Az0AYuH5Kc4o#{Ry9hTD*lrCVX1cG52p?Y2O%P{RBJrzrFx!kBW& z(!;zs1w}Ss!C-{DIZrk5A1zJBQog8~6IW1HBRb~9)N8?v%X{r>U+;FrAvojwh2=#< zr@QsJXLT~qL?L_vc&
m%Wm%O&-AiomJbig#o?`_o zhUNh?AfCUIT$S=#)@!#quyo5$FF)y>9zp+@qOHBgUsu^A+?W?T@2 6P>MBJ77 zbk##n`4no7W})_UZ&zEp@08#>Es r1xE zl~ Q8kE*F8kD9&9zE};c6C*T9yJTke&fWBN13OLm+yTJodx4XjEu7) znI~(j2qLfIdTLR>k`{`VgLnfh=)RvFU&);ExpfNtP`)`7gV+>B`=2F9nLZQ$@(ZUR zkGa|6wOFQB`ib46D@W^aWU0h_Fn>tFb8=ysc8a#H+556wTToAVi9@z0Y4D|Qi%7Z3 z@Wni2&3H<-E@K1LsllXi9ZrDD{^FKGgic-9d5;!d`NY-@g#2zbF|*Jy YJ9Ckd^|>J ztv>G*8%CvC$#7NKi)gmd8!4ffvFo( zK(34kM%P4Yz`&R>&k`1EK2hsfwVhPn-l=L;T%4PIec}qaM#PuqtG?Nln)%%glK=0i z?2U7}V*?pS_iYx=+pVV6n`XD!grG9RxPVF{9#qxGL!R&6k>M2b?O_atZXd6`?^Hxz z-;?Pi_*Ajq)%P`iHXUas7M<@>US3DCmkbe@CUNQAZQsEt<==QYa3Yn(jDP)j-^p?j zxh?Pax>XX+#2GxF5PMScLRo3iirNR6A7Gee6w*ykFaXID+PjzEVJYSvEK=kv9x`&4 z+Ox)*a0oj&$VHhd%!Z +_9`TI5w}(8*Gg((dhcdRD zKzwwHTnG$%ESh;sAHpZiQ0^JwNYBnX$qe?M2y-z^e#E)j+I7>ZX+|@lqZ=Jiy^v$J z*-3B6H899M8YC$&$&!dadCa9xv9 T4k|c;dSc_KPp>S>~>Ze!ERd=HG Date: Wed, 7 Nov 2018 16:56:25 +0100 Subject: [PATCH 5/5] Render can now autoescape context dict --- CHANGES.rst | 4 ++++ docs/index.rst | 3 ++- docxtpl/__init__.py | 6 +++--- tests/escape_auto.py | 2 +- tests/test_files/cellbg.docx | Bin 8213 -> 8211 bytes tests/test_files/dynamic_table.docx | Bin 5265 -> 5263 bytes tests/test_files/embedded.docx | Bin 272369 -> 272386 bytes tests/test_files/embedded_embedded_docx.docx | Bin 22124 -> 22126 bytes tests/test_files/escape.docx | Bin 8449 -> 8450 bytes tests/test_files/escape_auto.docx | Bin 15169 -> 15162 bytes tests/test_files/header_footer.docx | Bin 12560 -> 12562 bytes tests/test_files/header_footer_entities.docx | Bin 9879 -> 9879 bytes tests/test_files/header_footer_image.docx | Bin 21371 -> 21369 bytes tests/test_files/header_footer_utf8.docx | Bin 13957 -> 13955 bytes tests/test_files/inline_image.docx | Bin 264572 -> 264577 bytes tests/test_files/nested_for.docx | Bin 11541 -> 11542 bytes tests/test_files/order.docx | Bin 9341 -> 9341 bytes tests/test_files/replace_picture.docx | Bin 20547 -> 20549 bytes tests/test_files/richtext.docx | Bin 9140 -> 9141 bytes tests/test_files/richtext_and_if.docx | Bin 7584 -> 7585 bytes tests/test_files/subdoc.docx | Bin 56198 -> 56198 bytes tests/test_files/template_error.docx | Bin 4080 -> 4080 bytes tests/test_files/vertical_merge.docx | Bin 10027 -> 10025 bytes tests/test_files/vertical_merge_nested.docx | Bin 6010 -> 6010 bytes tests/test_files/word2016.docx | Bin 7738 -> 7739 bytes 25 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 77d2dff..2dc1a2d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,7 @@ +0.5.7 (2018-11-07) +------------------ +- Render can now autoescape context dict + 0.5.6 (2018-10-18) ------------------ - Fix invalid xml parse because using {% vm %} diff --git a/docs/index.rst b/docs/index.rst index 7d6a1b1..03aaef9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -159,11 +159,12 @@ Escaping, newline, new paragraph, Listing ----------------------------------------- When you use a ``{{ }}``, you are modifying an **XML** word document, this means you cannot use all chars, -especially ``<``, ``>`` and ``&``. In order to use them, you must escape them. There are 3 ways : +especially ``<``, ``>`` and ``&``. In order to use them, you must escape them. There are 4 ways : * ``context = { 'var':R('my text') }`` and ``{{r }}`` in the template (note the ``r``), * ``context = { 'var':'my text'}`` and ``{{ |e }}`` in your word template * ``context = { 'var':escape('my text')}`` and ``{{ }}`` in the template. + * enable autoescaping when calling render method: ``tpl.render(context, autoescape=True)`` (default is autoescape=False) The ``RichText()`` or ``R()`` offers newline and new paragraph feature : just use ``\n`` or ``\a`` in the text, they will be converted accordingly. diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 287fcd0..6d245be 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -5,7 +5,7 @@ Created : 2015-03-12 @author: Eric Lapouyade ''' -__version__ = '0.5.6' +__version__ = '0.5.7' from lxml import etree from docx import Document @@ -200,8 +200,8 @@ class DocxTemplate(object): escape_recursively(context) - def render(self, context, jinja_env=None): - if sys.version_info >= (3, 0): + def render(self, context, jinja_env=None, autoescape=False): + if sys.version_info >= (3, 0) and autoescape: self.escape_values(context) else: # Sorry folk, use awesome Python3 such as 3.6 diff --git a/tests/escape_auto.py b/tests/escape_auto.py index f38c3ed..d792fc2 100644 --- a/tests/escape_auto.py +++ b/tests/escape_auto.py @@ -9,5 +9,5 @@ context = {'myvar': R('"less than" must be escaped : <, this can be done with Ri 'autoescape': """These string should be auto escaped for an XML Word document which may contain <, >, &, ", and '.""" } -tpl.render(context) +tpl.render(context, autoescape=True) tpl.save("test_files/escape_auto.docx") diff --git a/tests/test_files/cellbg.docx b/tests/test_files/cellbg.docx index ca70ebfb23a3382cfeac1d152b19ba6c5a9f161b..a01362a4b0980c7d66e3514b9683ad9112036a78 100644 GIT binary patch delta 1002 zcmbR0Fxi1Oz?+#xgn@y9gTb#YeIsu(V?B`e{l~I~?I}>ymx+Oa8%W0&rREgt>w(C% zlg@iF8w#|)w{tzAy8K;^c8AC2y&V^3d(<{4&b-Te_mAStYv11TE_&gl*(CSe+*n@z z@EUV<`%dMjkCHBA-Q408U~qAlLB`iz)lqk}10|Y|YO-B=<>Q*WYxY-e-xH wEM> z0~Hr$SQ;&7Z%A_c6ftXt#uY#L&F` $dd?d&y0+4Ub;Snz_A9_2|1f zFY }m3%l_{LlTc_<8@2Y*zW9wG@LFC7z z>ot#VKhsU){${){t@!tRvyvpPX>YzVCwj#TyBYj$dMAq#E}K1BiWr%J0ke4@YZeP9 zD1;t3&;9gavLTmNeb!+E0oU(;xfb?@ZGH2_QFG#E&c>YR@5~~Ve->;~F}d9Sf1i@- zTIc4MhfY_w@BD6Xrs}h0#5X>{>i1JLHpLhe9J{_ZduqkXvg`a!ikacruVpn1nYw%{ zx7IPO)_j|AojpbK$ihdmffZAPeA%0ionbG?y!68&!^>!!QO4(0(G%)d+w7lSIP2i) z%|6@Ki}wHi)wel|=fnJ*`zCuE*P7=uTkHx@)O_p2b!8)K&>xNcXO+AYW8%^xbWb)o zOzG?1FQJ~!w=hDa(TzK}Ve!1x`y)5~W9B +#zo|OXi-%Uh;3AsMf6!Zn3HU z@`)QITzuE%Pud*L{fQMEHW!5dGC>$(1#H|%$!hW|p~qkeAHms>U|h;HlaZH^NrV}m z^d|et+JOTWob)D7ku``11@nyw6S&+M85lZ%2~iN35MiK!aSBi*B|kZ!D8HasKRLfB zRj(p9C%_xUP~XE3ciy*SVPMFSMc2;BGC5IBUI8AJK!XjK85m?>769o6#xjn{3*@vw zPM>^MPMT=}=j2y%%3wX$q6LC30$s3_4c*|G{FB$q%Y*e?l$TbTDa61~o?n!rUtCg| zlUj_$k&^@DrI|z|C+Es5fprN0xxXYQ>&h#5fL&Ll@~jLP0+)cc381)chBQ(LBo-7v W%w`3;2$X5L84dz<*Z@7wzyJX8IBJyu delta 966 zcmbR2Fx7!Kz?+#xgn@y9gF!4HXd`bkV?B`ewY*Ui_Yx@T%f!II4W#3XQge#+^+4p> zNoT#74FwwB+qs@lUH&ddyTfDiUXO+56Mr!{8|{|9^Jjw3*4k=ija>oW{Bp)Ke?FU? zcy0FL`A4LmK1#Zfb#seXfWgIG1{q&B-Pe0JRio$NBN67z(nX8R?w ^{ZRG zKleNdU8APXnR>r#(qe?7{ypz{CTVZ>-Y{BxL;S;h=^3$(-x*QDX7f_%nT*^>fwg%d zQxPLGFtj#{v1GAuf`U!SbWPE_$( >>} zb>#uW|7)hJ%kTZegc3}?>+&Zt9oxK_^8+h5Y}ln{g9B-@qU2++z%u^7Ob~`p0UIwP zlL#|B`AzngwF8GEIQdPUBx?XtIQg8sOg%6irsO9F6y+Bb>n9cz=vCzA1bCxp_PsG- z0+$;j149Q;tspSX!axI~4GWU) hRI5DatiPm2AXWZ z%)lT6vjIpqFv@XFPLR_AJGfU)n#qlO@+vuHFt<-$n#o>p@@jbnFxLmjy(=`?KvHaS zy*v+C=mJo~Vd2Sd<>bL!etBul!(t2!<@rS^`o$%cIjO}E7qhZ~tmFp5gFsK(0bR<# F004^sQ9}R# diff --git a/tests/test_files/dynamic_table.docx b/tests/test_files/dynamic_table.docx index 1a480e25a7683881477ebab20816908ce7739d60..ea013cd7059d6de5333601b24fd68554df1bbf12 100644 GIT binary patch delta 826 zcmbQJ*{{hP;LXe;!oa}5!Qj`HzL7VRkrPP!{wUeU`gC$VqeQ*0H?yHY+xvfA6TJQI z-V76%m{u*g(0t-A=C+hF^ODbwMr+^hH}6=)y_BPBPWiLi3ck(v=KN9Vo6_CwxH|Q+ zmg7N}*M}Bdef=)8aJ@?+kJxevkJZMaTVLi~(>GDP?k5?mwaCfoVo{18Kf}?UCmT%+ z16RzpOY4t0ZsXvz`FLYO{nc&d6Y7mp%#*v;UNy>p8`O2z^5Xp)4>~U@DbJXZIk6}= zy(~ma=Ci|^rM=H~9(($D(aIFg>8)Y=#k*?X^Vqr-e-QaGNqp{%Ce`X#&fr~XCBNsp zeeTYmxqXK2jq^WFv!%sf*vpI(2EI?F1=d(FGBEfuF)#>j{w(0f$c+?4n-BBLGcp6i zXmcmiOEwNrV2LN@hD@&F)T%$5#casa^1hbqakqbLevrn}BeT6VpG0lrUr@Ex{)o1; zH|O2$>lfB@wp?=VQ(l 1>|vv-S0ybG!4FhVEAR!*BiV?~{+3zYh1Pi0kN_7Mj2<_^IL1m*wlY+;5-$_B#94 z_lZkdw>RwPtaGbx-LX51T_b2-^{qqKpIA59{?7f(h!QlLPw{+X0{gv|+Y1~BlbgBT z^D;7tFvFA3WIrK0q$D&|$N;2avbTt|N)<3bQ}UAoit-DJ^^^09QuQiwa{|0kweyNd zGd*OUtR*6+01DfA3I$1f*%%nE)d3>|m`q`yfsvVY@>3ysup&?dTmi}`11*q&sQ}Uq zjPJQ8s|ag>U2s8In(^=CH^OpY-UMN3rf>X{*9t3uxq-sc+Ri}p%kzs;^ovtVN;31( Wiy_Wq1=`NQzzKvlK;vzNKs*5Ec05=B delta 896 zcmeCzoT$kg;LXe;!oa}5!5|h8w2?QHkrPP!uF*OC@%iL>Mv3~fUd)C94e#w-PpB?` zm!sX`v3YODh1njp4T>}G^4|S3!6*CoH@AQ-LEijw&)?7PPn@>8dH#`kMTLeLruk8- z8Z$CtCAL)EwK@B4sz%SjM |m%|spIP- zlC`w|rt)T!W*xvSwcY7S?sv@S^FP8{f}eNH($dZ#=)| z$JM}-GuV@K? {yu$0i=R#JWKlxFcb-B)(q1+OhHG^Un`Kz ?sr;~ zSH&L5G%x;P^!zt(kLJ(TNAdpT0Kxa%NQq)Ivw#;PGcX7?bMby-0yEw*%R@xknPM1u z8JR?w;Ynz+kB}Ww5}GVzpa2Rzq#$Jw1SU5aXke^inw%gk4^{*U;wwNIWhMp&8JG$n z-N2Z^IeEUY7Rc_&o+8pJWn2sl<@rS^`o*awC7F5Y#d;OFIRW0N4&fA$W-8#GtR|uW z)^|o&nsM*s7s7J&Aoo0MkJ0}EG`gLUfk6Pps%`uX3@Q1^0Y&)*#rlZ_1z3#seJU-m q#sa9*7wAw_-`oHi2G^aOUz7^b&I(LT3=Et=Xv4(8z+f)~;sO91Ts&3) diff --git a/tests/test_files/embedded.docx b/tests/test_files/embedded.docx index 4d80e0213ac0b32d926598c4e9febc3b87eafe22..014caffa6ce7fa82d2792bd834fe7ad671b30bae 100644 GIT binary patch delta 22108 zcmY)UV~j3L(*+8Twa2!NJ+^Jzw!Mef*tTukwr$(C=iJZxC11|@)s=KtvXZsZRn@)j zXAuMD5aAT0LBUXgfPkQY 5HHOj3gekvNEVv#j)!os|*Nnb6p1lbyl0)W4%}nnT*3TR_X39Y7yU5^Q>2E zuQPMTERgd4vsFM`OyJUP@lM&ZS7j Htw5jhWasp*f S7PBsXS?_kVUQlh*Y^N!4#iY)=vIY(I8Gr z&YFxUR?VPb{?6nMh*ebE_(ath#F|(Ze+DVjS_n2XFppdfPU5pz0idPOB(9qf(x9#d zGM-Q*?y^dPi~kS8I49I|YO#?atqS`sx}7>AqCeW`4=^&IEikVd+*-mFIxY0_P)x?y z8a;soF