diff --git a/composer.lock b/composer.lock index df1c97b0..039cc652 100644 --- a/composer.lock +++ b/composer.lock @@ -179,15 +179,21 @@ "source": { "type": "git", "url": "https://github.com/websharks/sharkicons.git", - "reference": "aa793546f57ff08fc6b2f37619a7b59c5ebf5241" + "reference": "b9ed1f30c66617768c82596cb54b7507c235b047" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/websharks/sharkicons/zipball/aa793546f57ff08fc6b2f37619a7b59c5ebf5241", - "reference": "aa793546f57ff08fc6b2f37619a7b59c5ebf5241", + "url": "https://api.github.com/repos/websharks/sharkicons/zipball/b9ed1f30c66617768c82596cb54b7507c235b047", + "reference": "b9ed1f30c66617768c82596cb54b7507c235b047", "shasum": "" }, + "require-dev": { + "package/bourbon": "4.2.3" + }, "type": "library", + "autoload": { + "psr-4": [] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-3.0+" @@ -216,7 +222,7 @@ "websharks", "wordpress" ], - "time": "2015-06-04 23:51:54" + "time": "2015-08-15 02:47:56" }, { "name": "websharks/wp-php-rv", diff --git a/src/.htaccess b/src/.htaccess index db40e5aa..9367731b 100644 --- a/src/.htaccess +++ b/src/.htaccess @@ -5,7 +5,7 @@ deny from all - + Require all granted diff --git a/src/client-s/css/admin-bar.css b/src/client-s/css/admin-bar.css index 3aeafaf8..9212d315 100644 --- a/src/client-s/css/admin-bar.css +++ b/src/client-s/css/admin-bar.css @@ -1,8 +1,15 @@ +@charset "UTF-8"; /*[pro strip-from='lite']*/ -.zencache-animation-spin { - -webkit-animation-duration: 1s; - -moz-animation-duration: 1s; - animation-duration: 1s; +@font-face { + font-family: sharkicons; + src: url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.eot"); + src: url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.eot?#iefix") format("embedded-opentype"), url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.ttf") format("truetype"), url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.woff") format("woff"), url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.svg#sharkicons") format("svg"); + font-weight: normal; + font-style: normal; } +.zencache-admin-bar-animation-spin { + -webkit-animation-duration: 0.75s; + -moz-animation-duration: 0.75s; + animation-duration: 0.75s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; animation-fill-mode: both; @@ -12,37 +19,45 @@ -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; animation-iteration-count: infinite; - -webkit-animation-name: zencache-animation-spin; - -moz-animation-name: zencache-animation-spin; - animation-name: zencache-animation-spin; } + -webkit-animation-name: zencache-admin-bar-animation-spin; + -moz-animation-name: zencache-admin-bar-animation-spin; + animation-name: zencache-admin-bar-animation-spin; } -@-webkit-keyframes zencache-animation-spin { +@-webkit-keyframes zencache-admin-bar-animation-spin { 0% { - transform: rotate(0deg); } + -webkit-transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } -@-moz-keyframes zencache-animation-spin { + -webkit-transform: rotate(360deg); } } +@-moz-keyframes zencache-admin-bar-animation-spin { 0% { - transform: rotate(0deg); } + -moz-transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } -@keyframes zencache-animation-spin { + -moz-transform: rotate(360deg); } } +@keyframes zencache-admin-bar-animation-spin { 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -o-transform: rotate(360deg); transform: rotate(360deg); } } -.zencache-animation-zoom-in-down { +.zencache-admin-bar-animation-zoom-in-down { -webkit-animation-duration: 0.75s; -moz-animation-duration: 0.75s; animation-duration: 0.75s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; animation-fill-mode: both; - -webkit-animation-name: zencache-animation-zoom-in-down; - -moz-animation-name: zencache-animation-zoom-in-down; - animation-name: zencache-animation-zoom-in-down; } + -webkit-animation-name: zencache-admin-bar-animation-zoom-in-down; + -moz-animation-name: zencache-admin-bar-animation-zoom-in-down; + animation-name: zencache-admin-bar-animation-zoom-in-down; } -@-webkit-keyframes zencache-animation-zoom-in-down { +@-webkit-keyframes zencache-admin-bar-animation-zoom-in-down { from { -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); @@ -51,7 +66,7 @@ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); opacity: 1; } } -@-moz-keyframes zencache-animation-zoom-in-down { +@-moz-keyframes zencache-admin-bar-animation-zoom-in-down { from { -moz-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); -moz-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); @@ -60,7 +75,7 @@ -moz-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); -moz-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); opacity: 1; } } -@keyframes zencache-animation-zoom-in-down { +@keyframes zencache-admin-bar-animation-zoom-in-down { from { -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); -moz-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); @@ -81,184 +96,258 @@ -moz-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); opacity: 1; } } -.zencache-animation-bounce-out-up { - -webkit-animation-duration: 0.75s; - -moz-animation-duration: 0.75s; - animation-duration: 0.75s; +.zencache-admin-bar-animation-zoom-out-up { + -webkit-animation-duration: 0.15s; + -moz-animation-duration: 0.15s; + animation-duration: 0.15s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; animation-fill-mode: both; - -webkit-animation-name: zencache-animation-bounce-out-up; - -moz-animation-name: zencache-animation-bounce-out-up; - animation-name: zencache-animation-bounce-out-up; } + -webkit-animation-name: zencache-admin-bar-animation-zoom-out-up; + -moz-animation-name: zencache-admin-bar-animation-zoom-out-up; + animation-name: zencache-admin-bar-animation-zoom-out-up; } -@-webkit-keyframes zencache-animation-bounce-out-up { - 20% { - -webkit-transform: translate3d(0, -10px, 0); } - 40%, - 45% { - -webkit-transform: translate3d(0, 20px, 0); +@-webkit-keyframes zencache-admin-bar-animation-zoom-out-up { + 40% { + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); opacity: 1; } 100% { - -webkit-transform: translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); opacity: 0; } } -@-moz-keyframes zencache-animation-bounce-out-up { - 20% { - -moz-transform: translate3d(0, -10px, 0); } - 40%, - 45% { - -moz-transform: translate3d(0, 20px, 0); +@-moz-keyframes zencache-admin-bar-animation-zoom-out-up { + 40% { + -moz-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -moz-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); opacity: 1; } 100% { - -moz-transform: translate3d(0, -2000px, 0); + -moz-transform-origin: center bottom; + -moz-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -moz-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); opacity: 0; } } -@keyframes zencache-animation-bounce-out-up { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - -moz-transform: translate3d(0, -10px, 0); - -ms-transform: translate3d(0, -10px, 0); - -o-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); } - 40%, - 45% { - -webkit-transform: translate3d(0, 20px, 0); - -moz-transform: translate3d(0, 20px, 0); - -ms-transform: translate3d(0, 20px, 0); - -o-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); +@keyframes zencache-admin-bar-animation-zoom-out-up { + 40% { + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -moz-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -ms-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -o-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + -moz-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); opacity: 1; } 100% { - -webkit-transform: translate3d(0, -2000px, 0); - -moz-transform: translate3d(0, -2000px, 0); - -ms-transform: translate3d(0, -2000px, 0); - -o-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + -moz-transform-origin: center bottom; + -ms-transform-origin: center bottom; + -o-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -moz-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -ms-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -o-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + -moz-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); opacity: 0; } } /*[pro strip-from='lite']*/ -#wp-admin-bar-zencache-dir-stats { - width: 100px; } - #wp-admin-bar-zencache-dir-stats > a { - padding: 0 !important; } - #wp-admin-bar-zencache-dir-stats .-container { - width: 100%; - height: 32px; - line-height: 32px; - margin: 5px; - display: block; - position: relative; - box-sizing: border-box; - border-radius: 5px; - background: rgba(0, 0, 0, 0.5); } - #wp-admin-bar-zencache-dir-stats .-bars { - left: 0; - bottom: 3px; - position: absolute; - width: 100%; - height: 3px; - line-height: 3px; - display: block; +#wp-admin-bar-zencache-dir-stats > a::after { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } +#wp-admin-bar-zencache-dir-stats > a::after { + text-align: center; + width: 1.28571429em; + margin: .35em 0 0 .25em; } +#wp-admin-bar-zencache-dir-stats .-wrapper, +#wp-admin-bar-zencache-dir-stats .-container, +#wp-admin-bar-zencache-dir-stats .-container > div { + margin: 0 !important; + padding: 0 !important; + display: block !important; + white-space: normal !important; + width: 100% !important; + min-width: 100% !important; + height: auto !important; + line-height: normal !important; + box-sizing: border-box !important; } +#wp-admin-bar-zencache-dir-stats .-wrapper { + padding: 1em !important; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container * { + margin: 0; + padding: 0; + width: auto; + height: auto; + position: static; + line-height: normal; box-sizing: border-box; } - #wp-admin-bar-zencache-dir-stats .-bars > span { - -webkit-animation-duration: 0.9s; - -moz-animation-duration: 0.9s; - animation-duration: 0.9s; + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-refreshing { + font-size: 50px; + width: 250px; + height: 250px; + text-align: center; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-refreshing::before { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-refreshing::before { + -webkit-animation-duration: 0.75s; + -moz-animation-duration: 0.75s; + animation-duration: 0.75s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; animation-fill-mode: both; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; animation-iteration-count: infinite; - -webkit-animation-name: zencache-animation-dir-stats-bars; - -moz-animation-name: zencache-animation-dir-stats-bars; - animation-name: zencache-animation-dir-stats-bars; - -webkit-animation-timing-function: cubic-bezier(0.11, 0.49, 0.38, 0.78); - -moz-animation-timing-function: cubic-bezier(0.11, 0.49, 0.38, 0.78); - animation-timing-function: cubic-bezier(0.11, 0.49, 0.38, 0.78); - width: 19.4%; - height: 100%; - line-height: 100%; - margin: 0 0.5%; - box-sizing: border-box; + -webkit-animation-name: zencache-admin-bar-animation-spin; + -moz-animation-name: zencache-admin-bar-animation-spin; + animation-name: zencache-admin-bar-animation-spin; + margin-top: calc((250px - 50px) / 2); } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-chart { + width: 250px; + height: 250px; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals { + text-align: center; + margin: 1em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-heading { + opacity: 0.5; + font-size: 120%; + text-align: center; + font-family: 'Georgia', serif; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-files { display: inline-block; - background-color: currentColor; } - #wp-admin-bar-zencache-dir-stats .-bars > span:nth-child(1), - #wp-admin-bar-zencache-dir-stats .-bars > span:nth-child(5) { - -webkit-animation-delay: -0.4s; - -moz-animation-delay: -0.4s; - animation-delay: -0.4s; - margin: 0; } - #wp-admin-bar-zencache-dir-stats .-bars > span:nth-child(2), - #wp-admin-bar-zencache-dir-stats .-bars > span:nth-child(4) { - -webkit-animation-delay: -0.65s; - -moz-animation-delay: -0.65s; - animation-delay: -0.65s; } - #wp-admin-bar-zencache-dir-stats .-bars > span:nth-child(3) { - -webkit-animation-delay: -0.9s; - -moz-animation-delay: -0.9s; - animation-delay: -0.9s; } - #wp-admin-bar-zencache-dir-stats .-meter { - left: 0; - bottom: 0; - position: absolute; - width: 100%; - height: 10px; - line-height: 10px; - opacity: 0.75; - display: block; - box-sizing: border-box; - background-color: currentColor; } + margin: 0 1em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-files::before { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-files::before { + margin: 0 .5em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-size { + display: inline-block; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-size::before { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-totals .-size::before { + margin: 0 .5em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-disk { + text-align: center; + margin: 1em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-disk .-heading { + opacity: 0.5; + font-size: 120%; + text-align: center; + font-family: 'Georgia', serif; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-disk .-size::before { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-disk .-size::before { + margin: 0 .5em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-disk .-free::before { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-disk .-free::before { + margin: 0 .5em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-more-info { + margin: 1em 0 0; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-more-info > a { + padding: .25em; + border-radius: .25em; + text-decoration: none; + display: block; + text-align: center; + color: #fff !important; + background: #00a0d2 !important; + border: 1px solid #0073aa !important; + box-shadow: inset 0 1px 0 rgba(120, 200, 230, 0.5), 0 1px 0 rgba(0, 0, 0, 0.15) !important; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-more-info > a:hover { + color: #fff !important; + background: #0091cd !important; + border: 1px solid #0073aa !important; + box-shadow: inset 0 1px 0 rgba(120, 200, 230, 0.6) !important; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-more-info > a:focus { + color: rgba(255, 255, 255, 0.95) !important; + background: #0073aa !important; + border: 1px solid #0e3950 !important; + box-shadow: inset 0 1px 0 rgba(120, 200, 230, 0.6), 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8) !important; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-more-info > a:active { + color: rgba(255, 255, 255, 0.95) !important; + background: #0073aa !important; + border: 1px solid #005082 !important; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1) !important; } + #wp-admin-bar-zencache-dir-stats .-wrapper .-container .-spacer { + min-width: 250px; } -@-webkit-keyframes zencache-animation-dir-stats-bars { - 0% { - -webkit-transform: scaley(1); } - 80% { - -webkit-transform: scaley(0.3); } - 90% { - -webkit-transform: scaley(1); } } -@-moz-keyframes zencache-animation-dir-stats-bars { - 0% { - -moz-transform: scaley(1); } - 80% { - -moz-transform: scaley(0.3); } - 90% { - -moz-transform: scaley(1); } } -@keyframes zencache-animation-dir-stats-bars { - 0% { - -webkit-transform: scaley(1); - -moz-transform: scaley(1); - -ms-transform: scaley(1); - -o-transform: scaley(1); - transform: scaley(1); } - 80% { - -webkit-transform: scaley(0.3); - -moz-transform: scaley(0.3); - -ms-transform: scaley(0.3); - -o-transform: scaley(0.3); - transform: scaley(0.3); } - 90% { - -webkit-transform: scaley(1); - -moz-transform: scaley(1); - -ms-transform: scaley(1); - -o-transform: scaley(1); - transform: scaley(1); } } /*[/pro]*/ /*[pro strip-from='lite']*/ #wp-admin-bar-zencache-wipe > a::after, #wp-admin-bar-zencache-clear > a::after { + border: 0; + padding: 0; content: ' '; width: 16px; height: 16px; - padding: 0; - margin: -3px 0 0 5px; - border: 0; + line-height: 16px; vertical-align: middle; + margin: -3px 0 0 5px; display: inline-block; } -#wp-admin-bar-zencache-wipe.-wiping > a::after, #wp-admin-bar-zencache-wipe.-clearing > a::after, -#wp-admin-bar-zencache-clear.-wiping > a::after, -#wp-admin-bar-zencache-clear.-clearing > a::after { - -webkit-animation-duration: 1s; - -moz-animation-duration: 1s; - animation-duration: 1s; +#wp-admin-bar-zencache-wipe.-wipe > a::after, +#wp-admin-bar-zencache-clear.-wipe > a::after { + content: url("../images/wipe.png"); } +#wp-admin-bar-zencache-wipe.-clear > a::after, +#wp-admin-bar-zencache-clear.-clear > a::after { + content: url("../images/clear.png"); } +#wp-admin-bar-zencache-wipe.-processing > a::after, +#wp-admin-bar-zencache-clear.-processing > a::after { + -webkit-animation-duration: 0.75s; + -moz-animation-duration: 0.75s; + animation-duration: 0.75s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; animation-fill-mode: both; @@ -268,16 +357,10 @@ -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; animation-iteration-count: infinite; - -webkit-animation-name: zencache-animation-spin; - -moz-animation-name: zencache-animation-spin; - animation-name: zencache-animation-spin; - background: url("../images/spinner.png"); } - -#wp-admin-bar-zencache-wipe > a::after { - background: url("../images/wipe.png"); } - -#wp-admin-bar-zencache-clear > a::after { - background: url("../images/clear.png"); } + -webkit-animation-name: zencache-admin-bar-animation-spin; + -moz-animation-name: zencache-admin-bar-animation-spin; + animation-name: zencache-admin-bar-animation-spin; + content: url("../images/spinner.png"); } /*[/pro]*/ /*[pro strip-from='lite']*/ @@ -286,40 +369,57 @@ -moz-user-select: none; -ms-user-select: none; user-select: none; + display: none; left: 50%; top: 100px; z-index: 10000; position: fixed; - width: 600px; + width: 700px; height: auto; + min-height: 64px; padding: 15px; - margin: 0 0 0 -300px; text-align: center; - color: #fff; outline: none; cursor: pointer; - display: none; - box-sizing: border-box; border-radius: 5px; + box-sizing: border-box; + margin: 0 0 0 -350px; + background: #15181b; + color: #fff; box-shadow: 0 0 5px 0 #23282d; } - .zencache-ajax-response.-wipe { - background: #15181b url("../images/wipe-response.png") no-repeat 5px 5px; } - .zencache-ajax-response.-clear { - background: #15181b url("../images/clear-response.png") no-repeat 5px 5px; } + .zencache-ajax-response::after { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } .zencache-ajax-response:hover, .zencache-ajax-response.-hovered { background-color: #000; } - .zencache-ajax-response::before { + .zencache-ajax-response.-wipe::before, .zencache-ajax-response.-clear::before { + left: 0; + top: 0; + width: 64px; + height: 64px; + position: absolute; } + .zencache-ajax-response.-wipe::before { + content: url("../images/wipe-response.png"); } + .zencache-ajax-response.-clear::before { + content: url("../images/clear-response.png"); } + .zencache-ajax-response::after { top: 5px; right: 8px; - position: absolute; opacity: 0.5; - content: '\00d7'; - font: 18px/1em sans-serif; } + font-size: 120%; + position: absolute; } .zencache-ajax-response p { margin: 0; padding: 0; opacity: 0.35; - font: 15px/1em sans-serif; } + font: 15px/1.2em sans-serif; } .zencache-ajax-response p:first-child { opacity: 1; } .zencache-ajax-response code { diff --git a/src/client-s/css/admin-bar.css.map b/src/client-s/css/admin-bar.css.map index 519d179b..26c37f6a 100644 --- a/src/client-s/css/admin-bar.css.map +++ b/src/client-s/css/admin-bar.css.map @@ -1,7 +1,7 @@ { "version": 3, -"mappings": "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", -"sources": ["effects/_animations.scss","../../vendor/package/bourbon/bourbon-v4.2.3/addons/_prefixer.scss","../../vendor/package/bourbon/bourbon-v4.2.3/css3/_keyframes.scss","admin-bar/_dir-stats.scss","admin-bar/_wipe-purge.scss","admin-bar/_ajax-response.scss"], +"mappings": "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", +"sources": ["../../vendor/websharks/sharkicons/src/_sharkicons.scss","admin-bar/_animations.scss","../../vendor/package/bourbon/bourbon-v4.2.3/addons/_prefixer.scss","../../vendor/package/bourbon/bourbon-v4.2.3/css3/_keyframes.scss","../../vendor/websharks/sharkicons/src/_map.scss","admin-bar/_dir-stats.scss","admin-bar/_wipe-purge.scss","admin-bar/_ajax-response.scss"], "names": [], "file": "admin-bar.css" } \ No newline at end of file diff --git a/src/client-s/css/admin-bar.scss b/src/client-s/css/admin-bar.scss index 73659623..b660f39f 100644 --- a/src/client-s/css/admin-bar.scss +++ b/src/client-s/css/admin-bar.scss @@ -1,7 +1,11 @@ /*[pro strip-from='lite']*/ @import '../../vendor/package/bourbon/bourbon-v4.2.3/bourbon'; -@import 'effects/animations'; + +@import '../../vendor/websharks/sharkicons/src/sharkicons'; +@include sharkicons-font('../../vendor/websharks/sharkicons/src'); + +@import 'admin-bar/animations'; @import 'admin-bar/dir-stats'; @import 'admin-bar/wipe-purge'; @import 'admin-bar/ajax-response'; diff --git a/src/client-s/css/admin-bar/_ajax-response.scss b/src/client-s/css/admin-bar/_ajax-response.scss index dab3ff87..75459935 100644 --- a/src/client-s/css/admin-bar/_ajax-response.scss +++ b/src/client-s/css/admin-bar/_ajax-response.scss @@ -9,53 +9,68 @@ $ajax-response-code-bg-color: #eee; .zencache-ajax-response { @include user-select(none); + @include sharkicon(times-circle, after); + display: none; left: 50%; top: 100px; z-index: 10000; position: fixed; - width: 600px; + width: 700px; height: auto; + min-height: 64px; padding: 15px; - margin: 0 0 0 -300px; text-align: center; - color: $ajax-response-text-color; outline: none; cursor: pointer; - display: none; - box-sizing: border-box; border-radius: 5px; - - // Background defined below. + box-sizing: border-box; + margin: 0 0 0 -350px; + background: $ajax-response-bg-color; + color: $ajax-response-text-color; box-shadow: 0 0 5px 0 $ajax-response-box-shadow-color; - &.-wipe { - background: $ajax-response-bg-color url('../images/wipe-response.png') no-repeat 5px 5px; + &:hover, + &.-hovered { + background-color: $ajax-response-bg-hover-color; } + &.-wipe, &.-clear { - background: $ajax-response-bg-color url('../images/clear-response.png') no-repeat 5px 5px; + &::before { + left: 0; + top: 0; + width: 64px; + height: 64px; + position: absolute; + } } - &:hover, - &.-hovered { - background-color: $ajax-response-bg-hover-color; + &.-wipe { + &::before { + content: url('../images/wipe-response.png'); + } } - &::before { + &.-clear { + &::before { + content: url('../images/clear-response.png'); + } + } + + &::after { top: 5px; right: 8px; - position: absolute; opacity: 0.5; - content: '\00d7'; - font: 18px/1em sans-serif; + font-size: 120%; + position: absolute; } p { margin: 0; padding: 0; opacity: 0.35; - font: 15px/1em sans-serif; + font: 15px/1.2em sans-serif; } p:first-child { diff --git a/src/client-s/css/admin-bar/_animations.scss b/src/client-s/css/admin-bar/_animations.scss new file mode 100644 index 00000000..1e19b94d --- /dev/null +++ b/src/client-s/css/admin-bar/_animations.scss @@ -0,0 +1,80 @@ +// Animation :: spin. + +@mixin zencache-admin-bar-animation-spin { + @include animation-duration(0.75s); + @include animation-fill-mode(both); + @include animation-timing-function(linear); + @include animation-iteration-count(infinite); + @include animation-name(zencache-admin-bar-animation-spin); +} + +.zencache-admin-bar-animation-spin { + @include zencache-admin-bar-animation-spin; +} + +@include keyframes(zencache-admin-bar-animation-spin) { + 0% { + @include transform(rotate(0deg)); + } + + 100% { + @include transform(rotate(360deg)); + } +} + +// Animation :: zoom-in-down. + +@mixin zencache-admin-bar-animation-zoom-in-down { + @include animation-duration(0.75s); + @include animation-fill-mode(both); + @include animation-name(zencache-admin-bar-animation-zoom-in-down); +} + +.zencache-admin-bar-animation-zoom-in-down { + @include zencache-admin-bar-animation-zoom-in-down; +} + +@include keyframes(zencache-admin-bar-animation-zoom-in-down) { + from { + @include transform(scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0)); + @include animation-timing-function(cubic-bezier(0.55, 0.055, 0.675, 0.19)); + + opacity: 0; + } + + 60% { + @include transform(scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0)); + @include animation-timing-function(cubic-bezier(0.175, 0.885, 0.32, 1)); + + opacity: 1; + } +} + +// Animation :: zoom-out-up. + +@mixin zencache-admin-bar-animation-zoom-out-up { + @include animation-duration(0.15s); + @include animation-fill-mode(both); + @include animation-name(zencache-admin-bar-animation-zoom-out-up); +} + +.zencache-admin-bar-animation-zoom-out-up { + @include zencache-admin-bar-animation-zoom-out-up; +} + +@include keyframes(zencache-admin-bar-animation-zoom-out-up) { + 40% { + @include transform(scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0)); + @include animation-timing-function(cubic-bezier(0.55, 0.055, 0.675, 0.19)); + + opacity: 1; + } + + 100% { + @include transform-origin(center bottom); + @include transform(scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0)); + @include animation-timing-function(cubic-bezier(0.175, 0.885, 0.32, 1)); + + opacity: 0; + } +} diff --git a/src/client-s/css/admin-bar/_dir-stats.scss b/src/client-s/css/admin-bar/_dir-stats.scss index e1e02e41..3ee6ac25 100644 --- a/src/client-s/css/admin-bar/_dir-stats.scss +++ b/src/client-s/css/admin-bar/_dir-stats.scss @@ -1,96 +1,192 @@ /*[pro strip-from='lite']*/ -$dir-stats-container-bg-color: rgba(0, 0, 0, 0.5); +$dir-stats-more-info-color: #fff; +$dir-stats-more-info-bg-color: #00a0d2; +$dir-stats-more-info-border-color: #0073aa; +$dir-stats-more-info-box-shadow-color-a: rgba(120, 200, 230, 0.5); +$dir-stats-more-info-box-shadow-color-b: rgba(0, 0, 0, 0.15); + +$dir-stats-more-info-hover-color: #fff; +$dir-stats-more-info-hover-bg-color: #0091cd; +$dir-stats-more-info-hover-border-color: #0073aa; +$dir-stats-more-info-hover-box-shadow-color: rgba(120, 200, 230, 0.6); + +$dir-stats-more-info-focus-color: rgba(255, 255, 255, 0.95); +$dir-stats-more-info-focus-bg-color: #0073aa; +$dir-stats-more-info-focus-border-color: #0e3950; +$dir-stats-more-info-focus-box-shadow-color-a: rgba(120, 200, 230, 0.6); +$dir-stats-more-info-focus-box-shadow-color-b: #5b9dd9; +$dir-stats-more-info-focus-box-shadow-color-c: rgba(30, 140, 190, 0.8); + +$dir-stats-more-info-active-color: rgba(255, 255, 255, 0.95); +$dir-stats-more-info-active-bg-color: #0073aa; +$dir-stats-more-info-active-border-color: #005082; +$dir-stats-more-info-active-box-shadow-color: rgba(0, 0, 0, 0.1); #wp-admin-bar-zencache-dir-stats { - width: 100px; - > a { - padding: 0 !important; - } - - .-container { - width: 100%; - height: 32px; - line-height: 32px; - margin: 5px; - display: block; - position: relative; - box-sizing: border-box; - border-radius: 5px; - background: $dir-stats-container-bg-color; - } - - .-bars { - left: 0; - bottom: 3px; - position: absolute; - width: 100%; - height: 3px; - line-height: 3px; - display: block; - box-sizing: border-box; - - > span { - @include animation-duration(0.9s); - @include animation-fill-mode(both); - @include animation-iteration-count(infinite); - @include animation-name(zencache-animation-dir-stats-bars); - @include animation-timing-function(cubic-bezier(0.11, 0.49, 0.38, 0.78)); - - width: 19.4%; - height: 100%; - line-height: 100%; - margin: 0 0.5%; - box-sizing: border-box; - display: inline-block; - background-color: currentColor; - } - - > span:nth-child(1), - > span:nth-child(5) { - @include animation-delay(-0.4s); - - margin: 0; - } + @include sharkicon(pie-chart, after); - > span:nth-child(2), - > span:nth-child(4) { - @include animation-delay(-0.65s); + &::after { + text-align: center; + width: 1.28571429em; + margin: .35em 0 0 .25em; } - - > span:nth-child(3) { - @include animation-delay(-0.9s); - } - } - - .-meter { - left: 0; - bottom: 0; - position: absolute; - width: 100%; - height: 10px; - line-height: 10px; - opacity: 0.75; - display: block; - box-sizing: border-box; - background-color: currentColor; - } -} - -@include keyframes(zencache-animation-dir-stats-bars) { - 0% { - @include transform(scaley(1)); } - 80% { - @include transform(scaley(0.3)); + .-wrapper, + .-container, + .-container > div { + margin: 0 !important; + padding: 0 !important; + display: block !important; + white-space: normal !important; + width: 100% !important; + min-width: 100% !important; + height: auto !important; + line-height: normal !important; + box-sizing: border-box !important; } - 90% { - @include transform(scaley(1)); + .-wrapper { + padding: 1em !important; + + .-container { + * { + margin: 0; + padding: 0; + width: auto; + height: auto; + position: static; + line-height: normal; + box-sizing: border-box; + } + + .-refreshing { + @include sharkicon(spinner); + + font-size: 50px; + width: 250px; + height: 250px; + text-align: center; + + &::before { + @include zencache-admin-bar-animation-spin; + + margin-top: calc((250px - 50px) / 2); + } + } + + .-chart { + width: 250px; + height: 250px; + } + + .-totals { + text-align: center; + margin: 1em 0 0; + + .-heading { + opacity: 0.5; + font-size: 120%; + text-align: center; + font-family: 'Georgia', serif; + } + + .-files { + @include sharkicon(feat-layers); + + display: inline-block; + margin: 0 1em 0 0; + + &::before { + margin: 0 .5em 0 0; + } + } + + .-size { + @include sharkicon(database); + + display: inline-block; + + &::before { + margin: 0 .5em 0 0; + } + } + } + + .-disk { + text-align: center; + margin: 1em 0 0; + + .-heading { + opacity: 0.5; + font-size: 120%; + text-align: center; + font-family: 'Georgia', serif; + } + + .-size { + @include sharkicon(enty-drive); + + &::before { + margin: 0 .5em 0 0; + } + } + + .-free { + @include sharkicon(building-o); + + &::before { + margin: 0 .5em 0 0; + } + } + } + + .-more-info { + margin: 1em 0 0; + + > a { + padding: .25em; + border-radius: .25em; + text-decoration: none; + display: block; + text-align: center; + + // Color coordination w/ WordPress. + color: $dir-stats-more-info-color !important; + background: $dir-stats-more-info-bg-color !important; + border: 1px solid $dir-stats-more-info-border-color !important; + box-shadow: inset 0 1px 0 $dir-stats-more-info-box-shadow-color-a, 0 1px 0 $dir-stats-more-info-box-shadow-color-b !important; + + &:hover { + color: $dir-stats-more-info-hover-color !important; + background: $dir-stats-more-info-hover-bg-color !important; + border: 1px solid $dir-stats-more-info-hover-border-color !important; + box-shadow: inset 0 1px 0 $dir-stats-more-info-hover-box-shadow-color !important; + } + + &:focus { + color: $dir-stats-more-info-focus-color !important; + background: $dir-stats-more-info-focus-bg-color !important; + border: 1px solid $dir-stats-more-info-focus-border-color !important; + box-shadow: inset 0 1px 0 $dir-stats-more-info-focus-box-shadow-color-a, 0 0 0 1px $dir-stats-more-info-focus-box-shadow-color-b, 0 0 2px 1px $dir-stats-more-info-focus-box-shadow-color-c !important; + } + + &:active { + color: $dir-stats-more-info-active-color !important; + background: $dir-stats-more-info-active-bg-color !important; + border: 1px solid $dir-stats-more-info-active-border-color !important; + box-shadow: inset 0 1px 0 $dir-stats-more-info-active-box-shadow-color !important; + } + } + } + + .-spacer { + min-width: 250px; + } + } } } - /*[/pro]*/ diff --git a/src/client-s/css/admin-bar/_wipe-purge.scss b/src/client-s/css/admin-bar/_wipe-purge.scss index 03aa3f20..72bbed17 100644 --- a/src/client-s/css/admin-bar/_wipe-purge.scss +++ b/src/client-s/css/admin-bar/_wipe-purge.scss @@ -2,36 +2,44 @@ #wp-admin-bar-zencache-wipe, #wp-admin-bar-zencache-clear { - > a::after { - content: ' '; - width: 16px; - height: 16px; - padding: 0; - margin: -3px 0 0 5px; - border: 0; - vertical-align: middle; - display: inline-block; + > a { + &::after { + border: 0; + padding: 0; + content: ' '; + width: 16px; + height: 16px; + line-height: 16px; + vertical-align: middle; + margin: -3px 0 0 5px; + display: inline-block; + } } - &.-wiping, - &.-clearing { - > a::after { - @include zencache-animation-spin; - - background: url('../images/spinner.png'); + &.-wipe { + > a { + &::after { + content: url('../images/wipe.png'); + } } } -} -#wp-admin-bar-zencache-wipe { - > a::after { - background: url('../images/wipe.png'); + &.-clear { + > a { + &::after { + content: url('../images/clear.png'); + } + } } -} -#wp-admin-bar-zencache-clear { - > a::after { - background: url('../images/clear.png'); + &.-processing { + > a { + &::after { + @include zencache-admin-bar-animation-spin; + + content: url('../images/spinner.png'); + } + } } } diff --git a/src/client-s/css/effects/_animations.scss b/src/client-s/css/effects/_animations.scss deleted file mode 100644 index a28e68fb..00000000 --- a/src/client-s/css/effects/_animations.scss +++ /dev/null @@ -1,84 +0,0 @@ -// Animation :: spin. - -@mixin zencache-animation-spin { - @include animation-duration(1s); - @include animation-fill-mode(both); - @include animation-timing-function(linear); - @include animation-iteration-count(infinite); - @include animation-name(zencache-animation-spin); -} - -.zencache-animation-spin { - @include zencache-animation-spin; -} - -@include keyframes(zencache-animation-spin) { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } -} - - -// Animation :: zoom-in-down. - -@mixin zencache-animation-zoom-in-down { - @include animation-duration(0.75s); - @include animation-fill-mode(both); - @include animation-name(zencache-animation-zoom-in-down); -} - -.zencache-animation-zoom-in-down { - @include zencache-animation-zoom-in-down; -} - -@include keyframes(zencache-animation-zoom-in-down) { - from { - @include transform(scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0)); - @include animation-timing-function(cubic-bezier(0.55, 0.055, 0.675, 0.19)); - - opacity: 0; - } - - 60% { - @include transform(scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0)); - @include animation-timing-function(cubic-bezier(0.175, 0.885, 0.32, 1)); - - opacity: 1; - } -} - - -// Animation :: bounce-out-up. - -@mixin zencache-animation-bounce-out-up { - @include animation-duration(0.75s); - @include animation-fill-mode(both); - @include animation-name(zencache-animation-bounce-out-up); -} - -.zencache-animation-bounce-out-up { - @include zencache-animation-bounce-out-up; -} - -@include keyframes(zencache-animation-bounce-out-up) { - 20% { - @include transform(translate3d(0, -10px, 0)); - } - - 40%, - 45% { - @include transform(translate3d(0, 20px, 0)); - - opacity: 1; - } - - 100% { - @include transform(translate3d(0, -2000px, 0)); - - opacity: 0; - } -} diff --git a/src/client-s/css/menu-pages.css b/src/client-s/css/menu-pages.css index 7f14e80b..e9180b5d 100644 --- a/src/client-s/css/menu-pages.css +++ b/src/client-s/css/menu-pages.css @@ -1,140 +1,2451 @@ -@import url("//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css"); -@import url("../../vendor/websharks/sharkicons/src/styles.min.css"); -.zencache-animation-spin { - -webkit-animation-duration: 1s; - -moz-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-timing-function: linear; - -moz-animation-timing-function: linear; - animation-timing-function: linear; - -webkit-animation-iteration-count: infinite; - -moz-animation-iteration-count: infinite; - animation-iteration-count: infinite; - -webkit-animation-name: zencache-animation-spin; - -moz-animation-name: zencache-animation-spin; - animation-name: zencache-animation-spin; } - -@-webkit-keyframes zencache-animation-spin { +@charset "UTF-8"; +@font-face { + font-family: sharkicons; + src: url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.eot"); + src: url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.eot?#iefix") format("embedded-opentype"), url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.ttf") format("truetype"), url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.woff") format("woff"), url("../../vendor/websharks/sharkicons/src/fonts/sharkicons.svg#sharkicons") format("svg"); + font-weight: normal; + font-style: normal; } +.si::before { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; } + +.si-broom::before { + content: ""; } + +.si-comment-mail-one::before { + content: ""; } + +.si-comment-mail::before { + content: ""; } + +.si-s2member::before { + content: ""; } + +.si-websharks::before { + content: ""; } + +.si-wp-kb-articles::before { + content: ""; } + +.si-zencache-logo::before { + content: ""; } + +.si-zencache::before { + content: ""; } + +.si-feat-watch::before { + content: ""; } + +.si-feat-server::before { + content: ""; } + +.si-feat-layers::before { + content: ""; } + +.si-feat-box::before { + content: ""; } + +.si-feat-ellipsis::before { + content: ""; } + +.si-typi-group::before { + content: ""; } + +.si-enty-bookmark::before { + content: ""; } + +.si-enty-bookmarks::before { + content: ""; } + +.si-enty-open-book::before { + content: ""; } + +.si-enty-archive::before { + content: ""; } + +.si-enty-area-graph::before { + content: ""; } + +.si-enty-bucket::before { + content: ""; } + +.si-enty-colors::before { + content: ""; } + +.si-enty-copy::before { + content: ""; } + +.si-enty-drive::before { + content: ""; } + +.si-enty-feather::before { + content: ""; } + +.si-enty-gauge::before { + content: ""; } + +.si-enty-hand::before { + content: ""; } + +.si-enty-lab-flask::before { + content: ""; } + +.si-enty-mask::before { + content: ""; } + +.si-enty-medal::before { + content: ""; } + +.si-enty-exclamation::before { + content: ""; } + +.si-enty-palette::before { + content: ""; } + +.si-enty-ruler::before { + content: ""; } + +.si-enty-shop::before { + content: ""; } + +.si-enty-basket::before { + content: ""; } + +.si-enty-cart::before { + content: ""; } + +.si-enty-traffic-cone::before { + content: ""; } + +.si-enty-tree::before { + content: ""; } + +.si-enty-trophy::before { + content: ""; } + +.si-enty-v-card::before { + content: ""; } + +.si-enty-google-hangouts::before { + content: ""; } + +.si-eleg-line-graph::before { + content: ""; } + +.si-eleg-male::before { + content: ""; } + +.si-eleg-female::before { + content: ""; } + +.si-eleg-atom::before { + content: ""; } + +.si-broc-cart::before { + content: ""; } + +.si-broc-crap::before { + content: ""; } + +.si-broc-atom::before { + content: ""; } + +.si-icom-headphones::before { + content: ""; } + +.si-icom-barcode::before { + content: ""; } + +.si-icom-user::before { + content: ""; } + +.si-icom-users::before { + content: ""; } + +.si-icom-user-plus::before { + content: ""; } + +.si-icom-user-minus::before { + content: ""; } + +.si-icom-user-check::before { + content: ""; } + +.si-icom-user-tie::before { + content: ""; } + +.si-icom-key::before { + content: ""; } + +.si-icom-key2::before { + content: ""; } + +.si-icom-happy::before { + content: ""; } + +.si-icom-happy2::before { + content: ""; } + +.si-icom-smile::before { + content: ""; } + +.si-icom-smile2::before { + content: ""; } + +.si-icom-tongue::before { + content: ""; } + +.si-icom-tongue2::before { + content: ""; } + +.si-icom-sad::before { + content: ""; } + +.si-icom-sad2::before { + content: ""; } + +.si-icom-wink::before { + content: ""; } + +.si-icom-wink2::before { + content: ""; } + +.si-icom-grin::before { + content: ""; } + +.si-icom-grin2::before { + content: ""; } + +.si-icom-cool::before { + content: ""; } + +.si-icom-cool2::before { + content: ""; } + +.si-icom-angry::before { + content: ""; } + +.si-icom-angry2::before { + content: ""; } + +.si-icom-evil::before { + content: ""; } + +.si-icom-evil2::before { + content: ""; } + +.si-icom-shocked::before { + content: ""; } + +.si-icom-shocked2::before { + content: ""; } + +.si-icom-baffled::before { + content: ""; } + +.si-icom-baffled2::before { + content: ""; } + +.si-icom-confused::before { + content: ""; } + +.si-icom-confused2::before { + content: ""; } + +.si-icom-neutral::before { + content: ""; } + +.si-icom-neutral2::before { + content: ""; } + +.si-icom-hipster::before { + content: ""; } + +.si-icom-hipster2::before { + content: ""; } + +.si-icom-wondering::before { + content: ""; } + +.si-icom-wondering2::before { + content: ""; } + +.si-icom-sleepy::before { + content: ""; } + +.si-icom-sleepy2::before { + content: ""; } + +.si-icom-frustrated::before { + content: ""; } + +.si-icom-frustrated2::before { + content: ""; } + +.si-icom-crying::before { + content: ""; } + +.si-icom-crying2::before { + content: ""; } + +.si-icom-spell-check::before { + content: ""; } + +.si-icom-command-key::before { + content: ""; } + +.si-icom-shift-key::before { + content: ""; } + +.si-icom-control-key::before { + content: ""; } + +.si-icom-option-key::before { + content: ""; } + +.si-icom-wordpress::before { + content: ""; } + +.si-icom-wordpress-square::before { + content: ""; } + +.si-icom-yahoo::before { + content: ""; } + +.si-icom-linux::before { + content: ""; } + +.si-icom-finder::before { + content: ""; } + +.si-icom-android::before { + content: ""; } + +.si-icom-reddit::before { + content: ""; } + +.si-icom-paypal::before { + content: ""; } + +.si-icom-git::before { + content: ""; } + +.si-octi-alignment-align::before { + content: ""; } + +.si-octi-alignment-aligned-to::before { + content: ""; } + +.si-octi-alignment-unalign::before { + content: ""; } + +.si-octi-bookmark::before { + content: ""; } + +.si-octi-broadcast::before { + content: ""; } + +.si-octi-browser::before { + content: ""; } + +.si-octi-checklist::before { + content: ""; } + +.si-octi-circuit-board::before { + content: ""; } + +.si-octi-clippy::before { + content: ""; } + +.si-octi-cloud-download::before { + content: ""; } + +.si-octi-cloud-upload::before { + content: ""; } + +.si-octi-comment::before { + content: ""; } + +.si-octi-comments::before { + content: ""; } + +.si-octi-tach::before { + content: ""; } + +.si-octi-device-camera::before { + content: ""; } + +.si-octi-device-camera-video::before { + content: ""; } + +.si-octi-device-desktop::before { + content: ""; } + +.si-octi-diff::before { + content: ""; } + +.si-octi-file-binary::before { + content: ""; } + +.si-octi-file-media::before { + content: ""; } + +.si-octi-file-submodule::before { + content: ""; } + +.si-octi-file-symlink-directory::before { + content: ""; } + +.si-octi-file-symlink-file::before { + content: ""; } + +.si-octi-fold::before { + content: ""; } + +.si-octi-git-branch::before { + content: ""; } + +.si-octi-git-commit::before { + content: ""; } + +.si-octi-git-compare::before { + content: ""; } + +.si-octi-git-merge::before { + content: ""; } + +.si-octi-git-pull-request::before { + content: ""; } + +.si-octi-graph::before { + content: ""; } + +.si-octi-home::before { + content: ""; } + +.si-octi-horizontal-rule::before { + content: ""; } + +.si-octi-key::before { + content: ""; } + +.si-octi-light-bulb::before { + content: ""; } + +.si-octi-link-external::before { + content: ""; } + +.si-octi-lock::before { + content: ""; } + +.si-octi-markdown::before { + content: ""; } + +.si-octi-microscope::before { + content: ""; } + +.si-octi-mirror::before { + content: ""; } + +.si-octi-move-down::before { + content: ""; } + +.si-octi-move-left::before { + content: ""; } + +.si-octi-move-right::before { + content: ""; } + +.si-octi-move-up::before { + content: ""; } + +.si-octi-mute::before { + content: ""; } + +.si-octi-organization::before { + content: ""; } + +.si-octi-package::before { + content: ""; } + +.si-octi-paintcan::before { + content: ""; } + +.si-octi-person::before { + content: ""; } + +.si-octi-plug::before { + content: ""; } + +.si-octi-podium::before { + content: ""; } + +.si-octi-pulse::before { + content: ""; } + +.si-octi-puzzle::before { + content: ""; } + +.si-octi-repo::before { + content: ""; } + +.si-octi-repo-clone::before { + content: ""; } + +.si-octi-repo-force-push::before { + content: ""; } + +.si-octi-repo-forked::before { + content: ""; } + +.si-octi-repo-pull::before { + content: ""; } + +.si-octi-repo-push::before { + content: ""; } + +.si-octi-rocket::before { + content: ""; } + +.si-octi-ruby::before { + content: ""; } + +.si-octi-screen-full::before { + content: ""; } + +.si-octi-screen-normal::before { + content: ""; } + +.si-octi-sign-in::before { + content: ""; } + +.si-octi-sign-out::before { + content: ""; } + +.si-octi-split::before { + content: ""; } + +.si-octi-squirrel::before { + content: ""; } + +.si-octi-steps::before { + content: ""; } + +.si-octi-tag::before { + content: ""; } + +.si-octi-telescope::before { + content: ""; } + +.si-octi-terminal::before { + content: ""; } + +.si-octi-unfold::before { + content: ""; } + +.si-octi-versions::before { + content: ""; } + +.si-glass::before { + content: ""; } + +.si-music::before { + content: ""; } + +.si-search::before { + content: ""; } + +.si-envelope-o::before { + content: ""; } + +.si-heart::before { + content: ""; } + +.si-star::before { + content: ""; } + +.si-star-o::before { + content: ""; } + +.si-user::before { + content: ""; } + +.si-film::before { + content: ""; } + +.si-th-large::before { + content: ""; } + +.si-th::before { + content: ""; } + +.si-th-list::before { + content: ""; } + +.si-check::before { + content: ""; } + +.si-close::before { + content: ""; } + +.si-search-plus::before { + content: ""; } + +.si-search-minus::before { + content: ""; } + +.si-power-off::before { + content: ""; } + +.si-signal::before { + content: ""; } + +.si-cog::before { + content: ""; } + +.si-trash-o::before { + content: ""; } + +.si-home::before { + content: ""; } + +.si-file-o::before { + content: ""; } + +.si-clock-o::before { + content: ""; } + +.si-road::before { + content: ""; } + +.si-download::before { + content: ""; } + +.si-arrow-circle-o-down::before { + content: ""; } + +.si-arrow-circle-o-up::before { + content: ""; } + +.si-inbox::before { + content: ""; } + +.si-play-circle-o::before { + content: ""; } + +.si-repeat::before { + content: ""; } + +.si-refresh::before { + content: ""; } + +.si-list-alt::before { + content: ""; } + +.si-lock::before { + content: ""; } + +.si-flag::before { + content: ""; } + +.si-headphones::before { + content: ""; } + +.si-volume-off::before { + content: ""; } + +.si-volume-down::before { + content: ""; } + +.si-volume-up::before { + content: ""; } + +.si-qrcode::before { + content: ""; } + +.si-barcode::before { + content: ""; } + +.si-tag::before { + content: ""; } + +.si-tags::before { + content: ""; } + +.si-book::before { + content: ""; } + +.si-bookmark::before { + content: ""; } + +.si-print::before { + content: ""; } + +.si-camera::before { + content: ""; } + +.si-font::before { + content: ""; } + +.si-bold::before { + content: ""; } + +.si-italic::before { + content: ""; } + +.si-text-height::before { + content: ""; } + +.si-text-width::before { + content: ""; } + +.si-align-left::before { + content: ""; } + +.si-align-center::before { + content: ""; } + +.si-align-right::before { + content: ""; } + +.si-align-justify::before { + content: ""; } + +.si-list::before { + content: ""; } + +.si-dedent::before { + content: ""; } + +.si-indent::before { + content: ""; } + +.si-video-camera::before { + content: ""; } + +.si-image::before { + content: ""; } + +.si-pencil::before { + content: ""; } + +.si-map-marker::before { + content: ""; } + +.si-adjust::before { + content: ""; } + +.si-tint::before { + content: ""; } + +.si-edit::before { + content: ""; } + +.si-share-square-o::before { + content: ""; } + +.si-check-square-o::before { + content: ""; } + +.si-arrows::before { + content: ""; } + +.si-step-backward::before { + content: ""; } + +.si-fast-backward::before { + content: ""; } + +.si-backward::before { + content: ""; } + +.si-play::before { + content: ""; } + +.si-pause::before { + content: ""; } + +.si-stop::before { + content: ""; } + +.si-forward::before { + content: ""; } + +.si-fast-forward::before { + content: ""; } + +.si-step-forward::before { + content: ""; } + +.si-eject::before { + content: ""; } + +.si-chevron-left::before { + content: ""; } + +.si-chevron-right::before { + content: ""; } + +.si-plus-circle::before { + content: ""; } + +.si-minus-circle::before { + content: ""; } + +.si-times-circle::before { + content: ""; } + +.si-check-circle::before { + content: ""; } + +.si-question-circle::before { + content: ""; } + +.si-info-circle::before { + content: ""; } + +.si-crosshairs::before { + content: ""; } + +.si-times-circle-o::before { + content: ""; } + +.si-check-circle-o::before { + content: ""; } + +.si-ban::before { + content: ""; } + +.si-arrow-left::before { + content: ""; } + +.si-arrow-right::before { + content: ""; } + +.si-arrow-up::before { + content: ""; } + +.si-arrow-down::before { + content: ""; } + +.si-mail-forward::before { + content: ""; } + +.si-expand::before { + content: ""; } + +.si-compress::before { + content: ""; } + +.si-plus::before { + content: ""; } + +.si-minus::before { + content: ""; } + +.si-asterisk::before { + content: ""; } + +.si-exclamation-circle::before { + content: ""; } + +.si-gift::before { + content: ""; } + +.si-leaf::before { + content: ""; } + +.si-fire::before { + content: ""; } + +.si-eye::before { + content: ""; } + +.si-eye-slash::before { + content: ""; } + +.si-exclamation-triangle::before { + content: ""; } + +.si-plane::before { + content: ""; } + +.si-calendar::before { + content: ""; } + +.si-random::before { + content: ""; } + +.si-comment::before { + content: ""; } + +.si-magnet::before { + content: ""; } + +.si-chevron-up::before { + content: ""; } + +.si-chevron-down::before { + content: ""; } + +.si-retweet::before { + content: ""; } + +.si-shopping-cart::before { + content: ""; } + +.si-folder::before { + content: ""; } + +.si-folder-open::before { + content: ""; } + +.si-arrows-v::before { + content: ""; } + +.si-arrows-h::before { + content: ""; } + +.si-bar-chart::before { + content: ""; } + +.si-twitter-square::before { + content: ""; } + +.si-facebook-square::before { + content: ""; } + +.si-camera-retro::before { + content: ""; } + +.si-key::before { + content: ""; } + +.si-cogs::before { + content: ""; } + +.si-comments::before { + content: ""; } + +.si-thumbs-o-up::before { + content: ""; } + +.si-thumbs-o-down::before { + content: ""; } + +.si-star-half::before { + content: ""; } + +.si-heart-o::before { + content: ""; } + +.si-sign-out::before { + content: ""; } + +.si-linkedin-square::before { + content: ""; } + +.si-thumb-tack::before { + content: ""; } + +.si-external-link::before { + content: ""; } + +.si-sign-in::before { + content: ""; } + +.si-trophy::before { + content: ""; } + +.si-github-square::before { + content: ""; } + +.si-upload::before { + content: ""; } + +.si-lemon-o::before { + content: ""; } + +.si-phone::before { + content: ""; } + +.si-square-o::before { + content: ""; } + +.si-bookmark-o::before { + content: ""; } + +.si-phone-square::before { + content: ""; } + +.si-twitter::before { + content: ""; } + +.si-facebook::before { + content: ""; } + +.si-github::before { + content: ""; } + +.si-unlock::before { + content: ""; } + +.si-credit-card::before { + content: ""; } + +.si-feed::before { + content: ""; } + +.si-hdd-o::before { + content: ""; } + +.si-bullhorn::before { + content: ""; } + +.si-bell-o::before { + content: ""; } + +.si-certificate::before { + content: ""; } + +.si-hand-o-right::before { + content: ""; } + +.si-hand-o-left::before { + content: ""; } + +.si-hand-o-up::before { + content: ""; } + +.si-hand-o-down::before { + content: ""; } + +.si-arrow-circle-left::before { + content: ""; } + +.si-arrow-circle-right::before { + content: ""; } + +.si-arrow-circle-up::before { + content: ""; } + +.si-arrow-circle-down::before { + content: ""; } + +.si-globe::before { + content: ""; } + +.si-wrench::before { + content: ""; } + +.si-tasks::before { + content: ""; } + +.si-filter::before { + content: ""; } + +.si-briefcase::before { + content: ""; } + +.si-arrows-alt::before { + content: ""; } + +.si-group::before { + content: ""; } + +.si-chain::before { + content: ""; } + +.si-cloud::before { + content: ""; } + +.si-flask::before { + content: ""; } + +.si-cut::before { + content: ""; } + +.si-copy::before { + content: ""; } + +.si-paperclip::before { + content: ""; } + +.si-floppy-o::before { + content: ""; } + +.si-square::before { + content: ""; } + +.si-bars::before { + content: ""; } + +.si-list-ul::before { + content: ""; } + +.si-list-ol::before { + content: ""; } + +.si-strikethrough::before { + content: ""; } + +.si-underline::before { + content: ""; } + +.si-table::before { + content: ""; } + +.si-magic::before { + content: ""; } + +.si-truck::before { + content: ""; } + +.si-pinterest::before { + content: ""; } + +.si-pinterest-square::before { + content: ""; } + +.si-google-plus-square::before { + content: ""; } + +.si-google-plus::before { + content: ""; } + +.si-money::before { + content: ""; } + +.si-caret-down::before { + content: ""; } + +.si-caret-up::before { + content: ""; } + +.si-caret-left::before { + content: ""; } + +.si-caret-right::before { + content: ""; } + +.si-columns::before { + content: ""; } + +.si-sort::before { + content: ""; } + +.si-sort-desc::before { + content: ""; } + +.si-sort-asc::before { + content: ""; } + +.si-envelope::before { + content: ""; } + +.si-linkedin::before { + content: ""; } + +.si-rotate-left::before { + content: ""; } + +.si-gavel::before { + content: ""; } + +.si-dashboard::before { + content: ""; } + +.si-comment-o::before { + content: ""; } + +.si-comments-o::before { + content: ""; } + +.si-bolt::before { + content: ""; } + +.si-sitemap::before { + content: ""; } + +.si-umbrella::before { + content: ""; } + +.si-clipboard::before { + content: ""; } + +.si-lightbulb-o::before { + content: ""; } + +.si-exchange::before { + content: ""; } + +.si-cloud-download::before { + content: ""; } + +.si-cloud-upload::before { + content: ""; } + +.si-user-md::before { + content: ""; } + +.si-stethoscope::before { + content: ""; } + +.si-suitcase::before { + content: ""; } + +.si-bell::before { + content: ""; } + +.si-coffee::before { + content: ""; } + +.si-cutlery::before { + content: ""; } + +.si-file-text-o::before { + content: ""; } + +.si-building-o::before { + content: ""; } + +.si-hospital-o::before { + content: ""; } + +.si-ambulance::before { + content: ""; } + +.si-medkit::before { + content: ""; } + +.si-fighter-jet::before { + content: ""; } + +.si-beer::before { + content: ""; } + +.si-h-square::before { + content: ""; } + +.si-plus-square::before { + content: ""; } + +.si-angle-double-left::before { + content: ""; } + +.si-angle-double-right::before { + content: ""; } + +.si-angle-double-up::before { + content: ""; } + +.si-angle-double-down::before { + content: ""; } + +.si-angle-left::before { + content: ""; } + +.si-angle-right::before { + content: ""; } + +.si-angle-up::before { + content: ""; } + +.si-angle-down::before { + content: ""; } + +.si-desktop::before { + content: ""; } + +.si-laptop::before { + content: ""; } + +.si-tablet::before { + content: ""; } + +.si-mobile::before { + content: ""; } + +.si-circle-o::before { + content: ""; } + +.si-quote-left::before { + content: ""; } + +.si-quote-right::before { + content: ""; } + +.si-spinner::before { + content: ""; } + +.si-circle::before { + content: ""; } + +.si-mail-reply::before { + content: ""; } + +.si-github-alt::before { + content: ""; } + +.si-folder-o::before { + content: ""; } + +.si-folder-open-o::before { + content: ""; } + +.si-smile-o::before { + content: ""; } + +.si-frown-o::before { + content: ""; } + +.si-meh-o::before { + content: ""; } + +.si-gamepad::before { + content: ""; } + +.si-keyboard-o::before { + content: ""; } + +.si-flag-o::before { + content: ""; } + +.si-flag-checkered::before { + content: ""; } + +.si-terminal::before { + content: ""; } + +.si-code::before { + content: ""; } + +.si-mail-reply-all::before { + content: ""; } + +.si-star-half-empty::before { + content: ""; } + +.si-location-arrow::before { + content: ""; } + +.si-crop::before { + content: ""; } + +.si-code-fork::before { + content: ""; } + +.si-chain-broken::before { + content: ""; } + +.si-question::before { + content: ""; } + +.si-info::before { + content: ""; } + +.si-exclamation::before { + content: ""; } + +.si-superscript::before { + content: ""; } + +.si-subscript::before { + content: ""; } + +.si-eraser::before { + content: ""; } + +.si-puzzle-piece::before { + content: ""; } + +.si-microphone::before { + content: ""; } + +.si-microphone-slash::before { + content: ""; } + +.si-shield::before { + content: ""; } + +.si-calendar-o::before { + content: ""; } + +.si-fire-extinguisher::before { + content: ""; } + +.si-rocket::before { + content: ""; } + +.si-maxcdn::before { + content: ""; } + +.si-chevron-circle-left::before { + content: ""; } + +.si-chevron-circle-right::before { + content: ""; } + +.si-chevron-circle-up::before { + content: ""; } + +.si-chevron-circle-down::before { + content: ""; } + +.si-html5::before { + content: ""; } + +.si-css3::before { + content: ""; } + +.si-anchor::before { + content: ""; } + +.si-unlock-alt::before { + content: ""; } + +.si-bullseye::before { + content: ""; } + +.si-ellipsis-h::before { + content: ""; } + +.si-ellipsis-v::before { + content: ""; } + +.si-rss-square::before { + content: ""; } + +.si-play-circle::before { + content: ""; } + +.si-ticket::before { + content: ""; } + +.si-minus-square::before { + content: ""; } + +.si-minus-square-o::before { + content: ""; } + +.si-level-up::before { + content: ""; } + +.si-level-down::before { + content: ""; } + +.si-check-square::before { + content: ""; } + +.si-pencil-square::before { + content: ""; } + +.si-external-link-square::before { + content: ""; } + +.si-share-square::before { + content: ""; } + +.si-compass::before { + content: ""; } + +.si-caret-square-o-down::before { + content: ""; } + +.si-caret-square-o-up::before { + content: ""; } + +.si-caret-square-o-right::before { + content: ""; } + +.si-eur::before { + content: ""; } + +.si-gbp::before { + content: ""; } + +.si-dollar::before { + content: ""; } + +.si-inr::before { + content: ""; } + +.si-cny::before { + content: ""; } + +.si-rouble::before { + content: ""; } + +.si-krw::before { + content: ""; } + +.si-bitcoin::before { + content: ""; } + +.si-file::before { + content: ""; } + +.si-file-text::before { + content: ""; } + +.si-sort-alpha-asc::before { + content: ""; } + +.si-sort-alpha-desc::before { + content: ""; } + +.si-sort-amount-asc::before { + content: ""; } + +.si-sort-amount-desc::before { + content: ""; } + +.si-sort-numeric-asc::before { + content: ""; } + +.si-sort-numeric-desc::before { + content: ""; } + +.si-thumbs-up::before { + content: ""; } + +.si-thumbs-down::before { + content: ""; } + +.si-youtube-square::before { + content: ""; } + +.si-youtube::before { + content: ""; } + +.si-xing::before { + content: ""; } + +.si-xing-square::before { + content: ""; } + +.si-youtube-play::before { + content: ""; } + +.si-dropbox::before { + content: ""; } + +.si-stack-overflow::before { + content: ""; } + +.si-instagram::before { + content: ""; } + +.si-flickr::before { + content: ""; } + +.si-adn::before { + content: ""; } + +.si-bitbucket::before { + content: ""; } + +.si-bitbucket-square::before { + content: ""; } + +.si-tumblr::before { + content: ""; } + +.si-tumblr-square::before { + content: ""; } + +.si-long-arrow-down::before { + content: ""; } + +.si-long-arrow-up::before { + content: ""; } + +.si-long-arrow-left::before { + content: ""; } + +.si-long-arrow-right::before { + content: ""; } + +.si-apple::before { + content: ""; } + +.si-windows::before { + content: ""; } + +.si-android::before { + content: ""; } + +.si-linux::before { + content: ""; } + +.si-dribbble::before { + content: ""; } + +.si-skype::before { + content: ""; } + +.si-foursquare::before { + content: ""; } + +.si-trello::before { + content: ""; } + +.si-female::before { + content: ""; } + +.si-male::before { + content: ""; } + +.si-gittip::before { + content: ""; } + +.si-sun-o::before { + content: ""; } + +.si-moon-o::before { + content: ""; } + +.si-archive::before { + content: ""; } + +.si-bug::before { + content: ""; } + +.si-vk::before { + content: ""; } + +.si-weibo::before { + content: ""; } + +.si-renren::before { + content: ""; } + +.si-pagelines::before { + content: ""; } + +.si-stack-exchange::before { + content: ""; } + +.si-arrow-circle-o-right::before { + content: ""; } + +.si-arrow-circle-o-left::before { + content: ""; } + +.si-caret-square-o-left::before { + content: ""; } + +.si-dot-circle-o::before { + content: ""; } + +.si-wheelchair::before { + content: ""; } + +.si-vimeo-square::before { + content: ""; } + +.si-try::before { + content: ""; } + +.si-plus-square-o::before { + content: ""; } + +.si-space-shuttle::before { + content: ""; } + +.si-slack::before { + content: ""; } + +.si-envelope-square::before { + content: ""; } + +.si-wordpress::before { + content: ""; } + +.si-openid::before { + content: ""; } + +.si-bank::before { + content: ""; } + +.si-graduation-cap::before { + content: ""; } + +.si-yahoo::before { + content: ""; } + +.si-google::before { + content: ""; } + +.si-reddit::before { + content: ""; } + +.si-reddit-square::before { + content: ""; } + +.si-stumbleupon-circle::before { + content: ""; } + +.si-stumbleupon::before { + content: ""; } + +.si-delicious::before { + content: ""; } + +.si-digg::before { + content: ""; } + +.si-pied-piper::before { + content: ""; } + +.si-pied-piper-alt::before { + content: ""; } + +.si-drupal::before { + content: ""; } + +.si-joomla::before { + content: ""; } + +.si-language::before { + content: ""; } + +.si-fax::before { + content: ""; } + +.si-building::before { + content: ""; } + +.si-child::before { + content: ""; } + +.si-paw::before { + content: ""; } + +.si-spoon::before { + content: ""; } + +.si-cube::before { + content: ""; } + +.si-cubes::before { + content: ""; } + +.si-behance::before { + content: ""; } + +.si-behance-square::before { + content: ""; } + +.si-steam::before { + content: ""; } + +.si-steam-square::before { + content: ""; } + +.si-recycle::before { + content: ""; } + +.si-automobile::before { + content: ""; } + +.si-cab::before { + content: ""; } + +.si-tree::before { + content: ""; } + +.si-spotify::before { + content: ""; } + +.si-deviantart::before { + content: ""; } + +.si-soundcloud::before { + content: ""; } + +.si-database::before { + content: ""; } + +.si-file-pdf-o::before { + content: ""; } + +.si-file-word-o::before { + content: ""; } + +.si-file-excel-o::before { + content: ""; } + +.si-file-powerpoint-o::before { + content: ""; } + +.si-file-image-o::before { + content: ""; } + +.si-file-archive-o::before { + content: ""; } + +.si-file-audio-o::before { + content: ""; } + +.si-file-movie-o::before { + content: ""; } + +.si-file-code-o::before { + content: ""; } + +.si-vine::before { + content: ""; } + +.si-codepen::before { + content: ""; } + +.si-jsfiddle::before { + content: ""; } + +.si-life-bouy::before { + content: ""; } + +.si-circle-o-notch::before { + content: ""; } + +.si-ra::before { + content: ""; } + +.si-empire::before { + content: ""; } + +.si-git-square::before { + content: ""; } + +.si-git::before { + content: ""; } + +.si-hacker-news::before { + content: ""; } + +.si-tencent-weibo::before { + content: ""; } + +.si-qq::before { + content: ""; } + +.si-wechat::before { + content: ""; } + +.si-paper-plane::before { + content: ""; } + +.si-paper-plane-o::before { + content: ""; } + +.si-history::before { + content: ""; } + +.si-circle-thin::before { + content: ""; } + +.si-header::before { + content: ""; } + +.si-paragraph::before { + content: ""; } + +.si-sliders::before { + content: ""; } + +.si-share-alt::before { + content: ""; } + +.si-share-alt-square::before { + content: ""; } + +.si-bomb::before { + content: ""; } + +.si-futbol-o::before { + content: ""; } + +.si-tty::before { + content: ""; } + +.si-binoculars::before { + content: ""; } + +.si-plug::before { + content: ""; } + +.si-slideshare::before { + content: ""; } + +.si-twitch::before { + content: ""; } + +.si-yelp::before { + content: ""; } + +.si-newspaper-o::before { + content: ""; } + +.si-wifi::before { + content: ""; } + +.si-calculator::before { + content: ""; } + +.si-paypal::before { + content: ""; } + +.si-google-wallet::before { + content: ""; } + +.si-cc-visa::before { + content: ""; } + +.si-cc-mastercard::before { + content: ""; } + +.si-cc-discover::before { + content: ""; } + +.si-cc-amex::before { + content: ""; } + +.si-cc-paypal::before { + content: ""; } + +.si-cc-stripe::before { + content: ""; } + +.si-bell-slash::before { + content: ""; } + +.si-bell-slash-o::before { + content: ""; } + +.si-trash::before { + content: ""; } + +.si-copyright::before { + content: ""; } + +.si-at::before { + content: ""; } + +.si-eyedropper::before { + content: ""; } + +.si-paint-brush::before { + content: ""; } + +.si-birthday-cake::before { + content: ""; } + +.si-area-chart::before { + content: ""; } + +.si-pie-chart::before { + content: ""; } + +.si-line-chart::before { + content: ""; } + +.si-lastfm::before { + content: ""; } + +.si-lastfm-square::before { + content: ""; } + +.si-toggle-off::before { + content: ""; } + +.si-toggle-on::before { + content: ""; } + +.si-bicycle::before { + content: ""; } + +.si-bus::before { + content: ""; } + +.si-ioxhost::before { + content: ""; } + +.si-angellist::before { + content: ""; } + +.si-cc::before { + content: ""; } + +.si-ils::before { + content: ""; } + +.si-meanpath::before { + content: ""; } + +.si-buysellads::before { + content: ""; } + +.si-connectdevelop::before { + content: ""; } + +.si-dashcube::before { + content: ""; } + +.si-forumbee::before { + content: ""; } + +.si-leanpub::before { + content: ""; } + +.si-sellsy::before { + content: ""; } + +.si-shirtsinbulk::before { + content: ""; } + +.si-simplybuilt::before { + content: ""; } + +.si-skyatlas::before { + content: ""; } + +.si-cart-plus::before { + content: ""; } + +.si-cart-arrow-down::before { + content: ""; } + +.si-diamond::before { + content: ""; } + +.si-ship::before { + content: ""; } + +.si-user-secret::before { + content: ""; } + +.si-motorcycle::before { + content: ""; } + +.si-street-view::before { + content: ""; } + +.si-heartbeat::before { + content: ""; } + +.si-venus::before { + content: ""; } + +.si-mars::before { + content: ""; } + +.si-mercury::before { + content: ""; } + +.si-intersex::before { + content: ""; } + +.si-transgender-alt::before { + content: ""; } + +.si-venus-double::before { + content: ""; } + +.si-mars-double::before { + content: ""; } + +.si-venus-mars::before { + content: ""; } + +.si-mars-stroke::before { + content: ""; } + +.si-mars-stroke-v::before { + content: ""; } + +.si-mars-stroke-h::before { + content: ""; } + +.si-neuter::before { + content: ""; } + +.si-genderless::before { + content: ""; } + +.si-facebook-official::before { + content: ""; } + +.si-pinterest-p::before { + content: ""; } + +.si-whatsapp::before { + content: ""; } + +.si-server::before { + content: ""; } + +.si-user-plus::before { + content: ""; } + +.si-user-times::before { + content: ""; } + +.si-bed::before { + content: ""; } + +.si-viacoin::before { + content: ""; } + +.si-train::before { + content: ""; } + +.si-subway::before { + content: ""; } + +.si-medium::before { + content: ""; } + +.si-y-combinator::before { + content: ""; } + +.si-optin-monster::before { + content: ""; } + +.si-opencart::before { + content: ""; } + +.si-expeditedssl::before { + content: ""; } + +.si-battery-4::before { + content: ""; } + +.si-battery-3::before { + content: ""; } + +.si-battery-2::before { + content: ""; } + +.si-battery-1::before { + content: ""; } + +.si-battery-0::before { + content: ""; } + +.si-mouse-pointer::before { + content: ""; } + +.si-i-cursor::before { + content: ""; } + +.si-object-group::before { + content: ""; } + +.si-object-ungroup::before { + content: ""; } + +.si-sticky-note::before { + content: ""; } + +.si-sticky-note-o::before { + content: ""; } + +.si-cc-jcb::before { + content: ""; } + +.si-cc-diners-club::before { + content: ""; } + +.si-clone::before { + content: ""; } + +.si-balance-scale::before { + content: ""; } + +.si-hourglass-o::before { + content: ""; } + +.si-hourglass-1::before { + content: ""; } + +.si-hourglass-2::before { + content: ""; } + +.si-hourglass-3::before { + content: ""; } + +.si-hourglass::before { + content: ""; } + +.si-hand-grab-o::before { + content: ""; } + +.si-hand-paper-o::before { + content: ""; } + +.si-hand-scissors-o::before { + content: ""; } + +.si-hand-lizard-o::before { + content: ""; } + +.si-hand-spock-o::before { + content: ""; } + +.si-hand-pointer-o::before { + content: ""; } + +.si-hand-peace-o::before { + content: ""; } + +.si-trademark::before { + content: ""; } + +.si-registered::before { + content: ""; } + +.si-creative-commons::before { + content: ""; } + +.si-gg::before { + content: ""; } + +.si-gg-circle::before { + content: ""; } + +.si-tripadvisor::before { + content: ""; } + +.si-odnoklassniki::before { + content: ""; } + +.si-odnoklassniki-square::before { + content: ""; } + +.si-get-pocket::before { + content: ""; } + +.si-wikipedia-w::before { + content: ""; } + +.si-safari::before { + content: ""; } + +.si-chrome::before { + content: ""; } + +.si-firefox::before { + content: ""; } + +.si-opera::before { + content: ""; } + +.si-internet-explorer::before { + content: ""; } + +.si-television::before { + content: ""; } + +.si-contao::before { + content: ""; } + +.si-500px::before { + content: ""; } + +.si-amazon::before { + content: ""; } + +.si-calendar-plus-o::before { + content: ""; } + +.si-calendar-minus-o::before { + content: ""; } + +.si-calendar-times-o::before { + content: ""; } + +.si-calendar-check-o::before { + content: ""; } + +.si-industry::before { + content: ""; } + +.si-map-pin::before { + content: ""; } + +.si-map-signs::before { + content: ""; } + +.si-map-o::before { + content: ""; } + +.si-map::before { + content: ""; } + +.si-commenting::before { + content: ""; } + +.si-commenting-o::before { + content: ""; } + +.si-houzz::before { + content: ""; } + +.si-vimeo::before { + content: ""; } + +.si-black-tie::before { + content: ""; } + +.si-fonticons::before { + content: ""; } + +.si-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; } + +.si-2x { + font-size: 2em; } + +.si-3x { + font-size: 3em; } + +.si-4x { + font-size: 4em; } + +.si-5x { + font-size: 5em; } + +.si-fw { + text-align: center; + width: 1.28571429em; } + +.si-border { + border-radius: .1em; + padding: .2em .25em .15em; + border: solid 0.08em; } + +.si-pull-left { + float: left; + margin-right: .3em; } + +.si-pull-right { + float: right; + margin-left: .3em; } + +.si-rotate-90 { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); } + +.si-rotate-180 { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); } + +.si-rotate-270 { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); } + +.si-flip-horizontal { + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.si-flip-vertical { + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); } + +.si-inverse { + -webkit-filter: invert(100%); + filter: invert(100%); } + +.si-spin { + -webkit-animation: si-animation-spin 2s infinite linear; + -moz-animation: si-animation-spin 2s infinite linear; + animation: si-animation-spin 2s infinite linear; } + +.si-pulse { + -webkit-animation: si-animation-spin 1s infinite steps(8); + -moz-animation: si-animation-spin 1s infinite steps(8); + animation: si-animation-spin 1s infinite steps(8); } + +.si-ul { + padding-left: 0; + list-style-type: none; + margin-left: 2.14285714em; } + .si-ul > li { + position: relative; } + .si-ul > li .si-li { + text-align: center; + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; } + .si-ul > li .si-li .si-lg { + left: -1.85714286em; } + +.si-stack { + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; + position: relative; + display: inline-block; } + .si-stack .si-stack-1x, + .si-stack .si-stack-2x { + left: 0; + width: 100%; + text-align: center; + position: absolute; } + .si-stack .si-stack-1x { + line-height: inherit; } + .si-stack .si-stack-2x { + font-size: 2em; } + +@-webkit-keyframes si-animation-spin { 0% { - transform: rotate(0deg); } + -webkit-transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } -@-moz-keyframes zencache-animation-spin { + -webkit-transform: rotate(359deg); } } +@-moz-keyframes si-animation-spin { 0% { - transform: rotate(0deg); } + -moz-transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } -@keyframes zencache-animation-spin { + -moz-transform: rotate(359deg); } } +@keyframes si-animation-spin { 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } -.zencache-animation-zoom-in-down { - -webkit-animation-duration: 0.75s; - -moz-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-name: zencache-animation-zoom-in-down; - -moz-animation-name: zencache-animation-zoom-in-down; - animation-name: zencache-animation-zoom-in-down; } - -@-webkit-keyframes zencache-animation-zoom-in-down { - from { - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - opacity: 0; } - 60% { - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - opacity: 1; } } -@-moz-keyframes zencache-animation-zoom-in-down { - from { - -moz-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -moz-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - opacity: 0; } - 60% { - -moz-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -moz-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - opacity: 1; } } -@keyframes zencache-animation-zoom-in-down { - from { - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -moz-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -ms-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -o-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - -moz-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - opacity: 0; } - 60% { - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -moz-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -ms-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -o-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - -moz-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - opacity: 1; } } -.zencache-animation-bounce-out-up { - -webkit-animation-duration: 0.75s; - -moz-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-name: zencache-animation-bounce-out-up; - -moz-animation-name: zencache-animation-bounce-out-up; - animation-name: zencache-animation-bounce-out-up; } - -@-webkit-keyframes zencache-animation-bounce-out-up { - 20% { - -webkit-transform: translate3d(0, -10px, 0); } - 40%, - 45% { - -webkit-transform: translate3d(0, 20px, 0); - opacity: 1; } - 100% { - -webkit-transform: translate3d(0, -2000px, 0); - opacity: 0; } } -@-moz-keyframes zencache-animation-bounce-out-up { - 20% { - -moz-transform: translate3d(0, -10px, 0); } - 40%, - 45% { - -moz-transform: translate3d(0, 20px, 0); - opacity: 1; } - 100% { - -moz-transform: translate3d(0, -2000px, 0); - opacity: 0; } } -@keyframes zencache-animation-bounce-out-up { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - -moz-transform: translate3d(0, -10px, 0); - -ms-transform: translate3d(0, -10px, 0); - -o-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); } - 40%, - 45% { - -webkit-transform: translate3d(0, 20px, 0); - -moz-transform: translate3d(0, 20px, 0); - -ms-transform: translate3d(0, 20px, 0); - -o-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - opacity: 1; } - 100% { - -webkit-transform: translate3d(0, -2000px, 0); - -moz-transform: translate3d(0, -2000px, 0); - -ms-transform: translate3d(0, -2000px, 0); - -o-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - opacity: 0; } } + -webkit-transform: rotate(359deg); + -moz-transform: rotate(359deg); + -ms-transform: rotate(359deg); + -o-transform: rotate(359deg); + transform: rotate(359deg); } } #wpwrap { position: relative; } #wpwrap::after { @@ -373,18 +2684,24 @@ background: #23263e; color: #ddd !important; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25); } + .plugin-menu-page-panel .plugin-menu-page-panel-heading::after { + font: normal normal normal 14px/1 sharkicons; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + display: inline-block; + font-size: inherit; + text-decoration: inherit; + text-transform: none; + content: ""; } .plugin-menu-page-panel .plugin-menu-page-panel-heading:hover, .plugin-menu-page-panel .plugin-menu-page-panel-heading.open { color: #fff !important; } .plugin-menu-page-panel .plugin-menu-page-panel-heading::after { font-size: 80%; - content: '\f078'; - font-weight: normal; - font-family: 'FontAwesome'; float: right; - margin: 0 0 0 5px; - display: inline-block; } + margin: 0 0 0 5px; } .plugin-menu-page-panel .plugin-menu-page-panel-heading.open::after { - content: '\f077'; } + content: ""; } .pro-preview .plugin-menu-page-panel .plugin-menu-page-panel-heading { opacity: 0.5; } .pro-preview .plugin-menu-page-panel .plugin-menu-page-panel-heading::after { diff --git a/src/client-s/css/menu-pages.css.map b/src/client-s/css/menu-pages.css.map index eea1ecc8..0dc7e6de 100644 --- a/src/client-s/css/menu-pages.css.map +++ b/src/client-s/css/menu-pages.css.map @@ -1,7 +1,7 @@ { "version": 3, -"mappings": "AAAQ,oFAA4E;AAC5E,mEAA2D;ACSnE,wBAAyB;ECyBjB,0BAAoB,EAAE,EAAM;EAI5B,uBAAiB,EAAE,EAAM;EAYzB,kBAAY,EAAE,EAAM;EAhBpB,2BAAoB,EAAE,IAAM;EAI5B,wBAAiB,EAAE,IAAM;EAYzB,mBAAY,EAAE,IAAM;EAhBpB,iCAAoB,EAAE,MAAM;EAI5B,8BAAiB,EAAE,MAAM;EAYzB,yBAAY,EAAE,MAAM;EAhBpB,iCAAoB,EAAE,QAAM;EAI5B,8BAAiB,EAAE,QAAM;EAYzB,yBAAY,EAAE,QAAM;EAhBpB,sBAAoB,EAAE,uBAAM;EAI5B,mBAAiB,EAAE,uBAAM;EAYzB,cAAY,EAAE,uBAAM;;ACxCxB,0CAEC;EFEH,EAAG;IACD,SAAS,EAAiB,YAAY;EAGxC,IAAK;IACH,SAAS,EAAiB,cAAc;AEDxC,uCAEC;EFNH,EAAG;IACD,SAAS,EAAiB,YAAY;EAGxC,IAAK;IACH,SAAS,EAAiB,cAAc;AEWxC,kCAEC;EFlBH,EAAG;IACD,SAAS,EAAiB,YAAY;EAGxC,IAAK;IACH,SAAS,EAAiB,cAAc;AAa5C,gCAAiC;ECEzB,0BAAoB,EAAE,KAAM;EAI5B,uBAAiB,EAAE,KAAM;EAYzB,kBAAY,EAAE,KAAM;EAhBpB,2BAAoB,EAAE,IAAM;EAI5B,wBAAiB,EAAE,IAAM;EAYzB,mBAAY,EAAE,IAAM;EAhBpB,sBAAoB,EAAE,+BAAM;EAI5B,mBAAiB,EAAE,+BAAM;EAYzB,cAAY,EAAE,+BAAM;;ACxCxB,kDAEC;EFyBH,IAAK;ICHC,iBAAoB,EDIL,iDAAiD;ICJhE,iCAAoB,EAAE,sCAAM;IDOhC,OAAO,EAAmB,CAAC;EAG7B,GAAI;ICVE,iBAAoB,EDWL,oDAAoD;ICXnE,iCAAoB,EAAE,mCAAM;IDchC,OAAO,EAAmB,CAAC;AE9B3B,+CAEC;EFiBH,IAAK;ICCC,cAAiB,EDAF,iDAAiD;ICAhE,8BAAiB,EAAE,sCAAM;IDG7B,OAAO,EAAmB,CAAC;EAG7B,GAAI;ICNE,cAAiB,EDOF,oDAAoD;ICPnE,8BAAiB,EAAE,mCAAM;IDU7B,OAAO,EAAmB,CAAC;AElB3B,0CAEC;EFKH,IAAK;ICHC,iBAAoB,EDIL,iDAAiD;ICAhE,cAAiB,EDAF,iDAAiD;ICIhE,aAAgB,EDJD,iDAAiD;ICQhE,YAAe,EDRA,iDAAiD;ICYhE,SAAY,EDZG,iDAAiD;ICJhE,iCAAoB,EAAE,sCAAM;IAI5B,8BAAiB,EAAE,sCAAM;IAYzB,yBAAY,EAAE,sCAAM;IDTxB,OAAO,EAAmB,CAAC;EAG7B,GAAI;ICVE,iBAAoB,EDWL,oDAAoD;ICPnE,cAAiB,EDOF,oDAAoD;ICHnE,aAAgB,EDGD,oDAAoD;ICCnE,YAAe,EDDA,oDAAoD;ICKnE,SAAY,EDLG,oDAAoD;ICXnE,iCAAoB,EAAE,mCAAM;IAI5B,8BAAiB,EAAE,mCAAM;IAYzB,yBAAY,EAAE,mCAAM;IDFxB,OAAO,EAAmB,CAAC;AAa/B,iCAAkC;EC3B1B,0BAAoB,EAAE,KAAM;EAI5B,uBAAiB,EAAE,KAAM;EAYzB,kBAAY,EAAE,KAAM;EAhBpB,2BAAoB,EAAE,IAAM;EAI5B,wBAAiB,EAAE,IAAM;EAYzB,mBAAY,EAAE,IAAM;EAhBpB,sBAAoB,EAAE,gCAAM;EAI5B,mBAAiB,EAAE,gCAAM;EAYzB,cAAY,EAAE,gCAAM;;ACxCxB,mDAEC;EFsDH,GAAI;IChCE,iBAAoB,EAAE,wBAAM;EDoClC;KACI;ICrCE,iBAAoB,EAAE,uBAAM;IDwChC,OAAO,EAAmB,CAAC;EAG7B,IAAK;IC3CC,iBAAoB,EAAE,0BAAM;ID8ChC,OAAO,EAAmB,CAAC;AE9D3B,gDAEC;EF8CH,GAAI;IC5BE,cAAiB,EAAE,wBAAM;EDgC/B;KACI;ICjCE,cAAiB,EAAE,uBAAM;IDoC7B,OAAO,EAAmB,CAAC;EAG7B,IAAK;ICvCC,cAAiB,EAAE,0BAAM;ID0C7B,OAAO,EAAmB,CAAC;AElD3B,2CAEC;EFkCH,GAAI;IChCE,iBAAoB,EAAE,wBAAM;IAI5B,cAAiB,EAAE,wBAAM;IAIzB,aAAgB,EAAE,wBAAM;IAIxB,YAAe,EAAE,wBAAM;IAIvB,SAAY,EAAE,wBAAM;EDoB1B;KACI;ICrCE,iBAAoB,EAAE,uBAAM;IAI5B,cAAiB,EAAE,uBAAM;IAIzB,aAAgB,EAAE,uBAAM;IAIxB,YAAe,EAAE,uBAAM;IAIvB,SAAY,EAAE,uBAAM;IDwBxB,OAAO,EAAmB,CAAC;EAG7B,IAAK;IC3CC,iBAAoB,EAAE,0BAAM;IAI5B,cAAiB,EAAE,0BAAM;IAIzB,aAAgB,EAAE,0BAAM;IAIxB,YAAe,EAAE,0BAAM;IAIvB,SAAY,EAAE,0BAAM;ID8BxB,OAAO,EAAmB,CAAC;AGjF/B,OAAQ;EACN,QAAQ,EAAoB,QAAQ;EAEpC,cAAS;IACP,GAAG,EAAuB,CAAC;IAC3B,KAAK,EAAqB,CAAC;IAC3B,MAAM,EAAoB,CAAC;IAC3B,IAAI,EAAsB,CAAC;IAC3B,OAAO,EAAkB,EAAE;IAC3B,QAAQ,EAAkB,QAAQ;IAClC,OAAO,EAAmB,EAAE;IAC5B,OAAO,EAAmB,IAAI;IAC9B,UAAU,EAAgB,uBAAuB;EAGnD;gBACO;IACL,MAAM,EAAoB,2BAA2B;;ACjBzD,iBAAkB;EAChB,SAAS,EAAmB,KAAK;EACjC,MAAM,EAAsB,2BAA2B;EAEvD;qBACE;IACA,SAAS,EAAiB,IAAI;EAGhC,mBAAE;IACA,KAAK,ECVM,OAAO;IDYlB,qDACS;MACP,KAAK,ECbiB,OAAO;EDiBjC;mCACgB;IACd,UAAU,EAAgB,CAAC;EAG7B;kCACe;IACb,aAAa,EAAa,CAAC;EAG7B,sBAAK;IACH,aAAa,EAAa,GAAG;IAC7B,OAAO,EAAmB,YAAY;IACtC,UAAU,ECzBE,yBAAyB;ID0BrC,WAAW,EAAe,uDAAuD;EAIjF,0BAAO;IACL,OAAO,EAAiB,CAAC;IACzB,UAAU,EAAc,IAAI;IAE5B,iCAAO;MACL,SAAS,EAAa,GAAG;MACzB,UAAU,EAAY,IAAI;MAC1B,SAAS,EAAa,IAAI;MAC1B,aAAa,EAAS,GAAG;MACzB,OAAO,EAAe,GAAG;MACzB,OAAO,EAAe,KAAK;MAC3B,KAAK,EC5CI,IAAI;MD6Cb,UAAU,EC5CE,IAAI;MD6ChB,UAAU,EAAY,sBAA4C;EAKxE,qBAAI;IACF,MAAM,EAAoB,CAAC;IAE3B,gCAAa;MACX,KAAK,EAAmB,KAAK;MAC7B,aAAa,EAAW,GAAG;MAC3B,OAAO,EAAiB,KAAK;MAC7B,MAAM,EAAkB,WAAW;MACnC,UAAU,EChDU,IAAI;MDiDxB,MAAM,EAAkB,iBAAsC;MAC9D,UAAU,EAAc,kCAAgD;EAI5E,oBAAG;IACD,MAAM,EAAoB,CAAC;IAC3B,OAAO,EAAmB,CAAC;IAC3B,MAAM,EAAoB,GAAG;IAC7B,MAAM,EAAoB,KAAK;IAC/B,UAAU,EAAgB,uEAAwE;EAGpG,uBAAM;IHzCA,mBAAoB,EG0CH,IAAI;IHtCrB,gBAAiB,EGsCA,IAAI;IHlCrB,eAAgB,EGkCC,IAAI;IH1BrB,WAAY,EG0BK,IAAI;IAEzB,sCAAiB;MACf,SAAS,EAAe,IAAI;MAC5B,MAAM,EAAkB,CAAC;MACzB,OAAO,EAAiB,KAAK;MAC7B,aAAa,EAAW,GAAG;MAC3B,OAAO,EAAiB,MAAM;MAC9B,KAAK,ECrEY,IAAI;MDsErB,UAAU,ECrEU,OAAO;MDsE3B,MAAM,EAAkB,6BAAsC;MAC9D,UAAU,EAAa,+DAAsD;EAIjF;;;;;0EAKuD;IACrD,KAAK,EAAqB,IAAI;IAC9B,WAAW,EAAe,KAAK;IAC/B,MAAM,EAAoB,CAAC;IAC3B,OAAO,EAAmB,YAAY;IACtC,aAAa,EAAa,GAAG;IAC7B,UAAU,EAAgB,UAAU;IACpC,KAAK,EClFK,IAAI;IDmFd,UAAU,EClFG,OAAO;IDmFpB,MAAM,EAAoB,iBAA6B;IACvD,UAAU,EAAgB,wCAAuC;EAGnE;gCACa;IACX,UAAU,EAAgB,kEAA+C;EAG3E;;;0EAGuD;IACrD,MAAM,EAAoB,GAAG;EAG/B;;0EAEuD;IACrD,KAAK,EClGW,IAAI;IDmGpB,UAAU,EClGS,OAAO;EDqG5B;;sCAEmB;IACjB,OAAO,EAAmB,GAAG;EEjI7B;uDAA8B;IFuI5B,UAAU,EAAc,MAAM;IAC9B,KAAK,EC3Ge,kBAAkB;EC7BxC;8CAA8B;IFuI5B,UAAU,EAAc,MAAM;IAC9B,KAAK,EC3Ge,kBAAkB;EC7BxC;6CAA8B;IFuI5B,UAAU,EAAc,MAAM;IAC9B,KAAK,EC3Ge,kBAAkB;EC7BxC;kDAA8B;IFuI5B,UAAU,EAAc,MAAM;IAC9B,KAAK,EC3Ge,kBAAkB;ED+G1C,uBAAM;IACJ,MAAM,EAAoB,KAAK;EAGjC,wBAAO;IHhHD,mBAAoB,EGiHH,IAAI;IH7GrB,gBAAiB,EG6GA,IAAI;IHzGrB,eAAgB,EGyGC,IAAI;IHjGrB,WAAY,EGiGK,IAAI;IAEzB,SAAS,EAAiB,IAAI;IAC9B,WAAW,EAAe,IAAI;IAC9B,WAAW,EAAe,GAAG;IAC7B,OAAO,EAAmB,IAAI;IAC9B,MAAM,EAAoB,OAAO;IACjC,aAAa,EAAa,GAAG;IAC7B,MAAM,EAAoB,CAAC;IAC3B,OAAO,EAAmB,YAAY;IACtC,UAAU,EAAgB,UAAU;IACpC,KAAK,EC7HM,IAAI;ID8Hf,UAAU,EC7HI,OAAO;ID8HrB,MAAM,EAAoB,4BAA8B;IACxD,UAAU,EAAgB,mHAAsC;IAEhE,8BAAQ;MACN,UAAU,ECjIQ,OAAO;IDoI3B,uCAAiB;MACf,UAAU,ECpIS,OAAO;IDuI5B,6CAAuB;MACrB,UAAU,ECvIe,OAAO;ID0IlC,+BAAS;MH7IL,iBAAoB,EAAE,iBAAM;MAI5B,cAAiB,EAAE,iBAAM;MAIzB,aAAgB,EAAE,iBAAM;MAIxB,YAAe,EAAE,iBAAM;MAIvB,SAAY,EAAE,iBAAM;EGkI1B;;;0BAGO;IACL,aAAa,EAAa,GAAG;IAC7B,OAAO,EAAmB,KAAK;IAC/B,MAAM,EAAoB,KAAK;EAGjC,uBAAM;IACJ,UAAU,ECnJE,OAAO;IDoJnB,MAAM,EAAoB,iBAA4B;EAGxD,yBAAQ;IACN,UAAU,ECrJI,OAAO;IDsJrB,MAAM,EAAoB,iBAA8B;EAG1D,0BAAS;IACP,UAAU,ECvJK,OAAO;IDwJtB,MAAM,EAAoB,iBAA+B;EAG3D,wBAAO;IACL,UAAU,ECzJG,OAAO;ID0JpB,MAAM,EAAoB,iBAA6B;EAGzD,4BAAW;IACT,WAAW,EAAe,uDAAuD;EAGnF,oCAAmB;IACjB,WAAW,EAAe,GAAG;EAG/B;oCACiB;IACf,OAAO,EAAmB,KAAK;IAC/B,OAAO,EAAmB,GAAG;EAG/B,kCAAiB;IACf,KAAK,EAAqB,IAAI;;AGhOhC;0DACiC;EAC/B,KAAK,EAAqB,KAAK;EAC/B,MAAM,EAAoB,SAAS;AAInC,iEAAO;EACL,UAAU,EAAc,kBAA2C;AAIvE,mDAA0B;EACxB,KAAK,EAAqB,KAAK;EAC/B,KAAK,EAAqB,KAAK;EAC/B,UAAU,EAAgB,MAAM;EAChC,SAAS,EAAiB,KAAK;EAC/B,MAAM,EAAoB,OAAO;EAEjC,qDAAE;IACA,eAAe,EAAS,IAAI;IAC5B,WAAW,EAAa,KAAK;IAC7B,MAAM,EAAkB,OAAO;IAC/B,OAAO,EAAiB,YAAY;;ACxB1C,iCAAkC;EAChC,MAAM,EAAsB,KAAK;EAEjC,yCAAQ;IACN,SAAS,EAAiB,GAAG;IAC7B,UAAU,EAAgB,MAAM;IAChC,MAAM,EAAoB,CAAC;IAC3B,OAAO,EAAmB,KAAK;IAC/B,OAAO,EAAmB,GAAG;;ACRjC,uBAAwB;EACtB,MAAM,EAAsB,KAAK;EAEjC,mCAAc;IACZ,UAAU,EAAgB,CAAC;EAG7B,uDAAgC;IR4B1B,mBAAoB,EQ3BH,IAAI;IR+BrB,gBAAiB,EQ/BA,IAAI;IRmCrB,eAAgB,EQnCC,IAAI;IR2CrB,WAAY,EQ3CK,IAAI;IAEzB,eAAe,EAAW,IAAI;IAC9B,OAAO,EAAmB,IAAI;IAC9B,SAAS,EAAiB,IAAI;IAC9B,WAAW,EAAe,IAAI;IAC9B,aAAa,EAAa,GAAG;IAC7B,OAAO,EAAmB,KAAK;IAC/B,MAAM,EAAoB,OAAO;IACjC,UAAU,EJ2CW,OAAO;II1C5B,KAAK,EAAqB,eAA+B;IACzD,UAAU,EAAgB,+BAA2C;IAErE,2HACO;MACL,KAAK,EAAmB,eAAqC;IAG/D,8DAAS;MACP,SAAS,EAAe,GAAG;MAC3B,OAAO,EAAiB,OAAO;MAC/B,WAAW,EAAa,MAAM;MAC9B,WAAW,EAAa,aAAa;MACrC,KAAK,EAAmB,KAAK;MAC7B,MAAM,EAAkB,SAAS;MACjC,OAAO,EAAiB,YAAY;IAGtC,mEAAc;MACZ,OAAO,EAAiB,OAAO;IAGxB,oEAAqE;MAC5E,OAAO,EAAiB,GAAG;MAE3B,2EAAS;QACP,YAAY,EAAU,qBAAqB;QAC3C,WAAW,EAAW,qBAAqB;QAC3C,OAAO,EAAe,6BAA6B;EAKzD,oDAA6B;IAC3B,KAAK,EAAqB,GAAG;IAC7B,MAAM,EAAoB,MAAM;IAChC,OAAO,EAAmB,IAAI;IAC9B,OAAO,EAAmB,KAAK;IAC/B,yBAAyB,EAAE,GAAG;IAC9B,0BAA0B,EAAE,GAAG;IAC/B,UAAU,EAAgB,UAAU;IACpC,KAAK,EJIU,IAAI;IIHnB,MAAM,EAAoB,iBAAkC;IAC5D,UAAU,EJKQ,IAAI;IIJtB,UAAU,EAAgB,yEAA0C;IAEpE,yDAAO;MACL,OAAO,EAAiB,KAAK;IAG/B,sDAAE;MACA,SAAS,EAAe,GAAG;MAC3B,KAAK,EJNU,IAAI;IISrB;;;gEAGQ;MACN,KAAK,EJZiB,IAAI;IIe5B,uDAAG;MACD,MAAM,EAAkB,SAAS;IAGnC,mEAAe;MACb,UAAU,EAAc,CAAC;IAG3B,2DAAO;MACL,UAAU,EAAc,CAAC;IAG3B,6DAAS;MACP,eAAe,EAAS,IAAI;MAC5B,aAAa,EAAW,UAAU;IAGpC;qEACa;MACX,OAAO,EAAiB,GAAG;;ACnGjC,sBAAuB;EACrB,UAAU,EAAkB,GAAG;EAE/B,6BAAO;IACL,WAAW,EAAe,KAAK;IAC/B,KAAK,EAAqB,IAAI", -"sources": ["menu-pages.scss","effects/_animations.scss","../../vendor/package/bourbon/bourbon-v4.2.3/addons/_prefixer.scss","../../vendor/package/bourbon/bourbon-v4.2.3/css3/_keyframes.scss","menu-pages/_wpwrap.scss","menu-pages/_elements.scss","menu-pages/_colors.scss","../../vendor/package/bourbon/bourbon-v4.2.3/css3/_placeholder.scss","menu-pages/_heading.scss","menu-pages/_sections.scss","menu-pages/_panels.scss","menu-pages/_save.scss"], +"mappings": "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", +"sources": ["../../vendor/websharks/sharkicons/src/_sharkicons.scss","../../vendor/websharks/sharkicons/src/_map.scss","../../vendor/package/bourbon/bourbon-v4.2.3/addons/_prefixer.scss","../../vendor/package/bourbon/bourbon-v4.2.3/css3/_keyframes.scss","menu-pages/_wpwrap.scss","menu-pages/_elements.scss","menu-pages/_colors.scss","../../vendor/package/bourbon/bourbon-v4.2.3/css3/_placeholder.scss","menu-pages/_heading.scss","menu-pages/_sections.scss","menu-pages/_panels.scss","menu-pages/_save.scss"], "names": [], "file": "menu-pages.css" } \ No newline at end of file diff --git a/src/client-s/css/menu-pages.scss b/src/client-s/css/menu-pages.scss index b3d80749..e631d62f 100644 --- a/src/client-s/css/menu-pages.scss +++ b/src/client-s/css/menu-pages.scss @@ -1,7 +1,9 @@ -@import url('//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css'); -@import url('../../vendor/websharks/sharkicons/src/styles.min.css'); @import '../../vendor/package/bourbon/bourbon-v4.2.3/bourbon'; -@import 'effects/animations'; + +@import '../../vendor/websharks/sharkicons/src/sharkicons'; +@include sharkicons-font('../../vendor/websharks/sharkicons/src'); +@include sharkicon-short-classes; + @import 'menu-pages/colors'; @import 'menu-pages/wpwrap'; @import 'menu-pages/elements'; diff --git a/src/client-s/css/menu-pages/_panels.scss b/src/client-s/css/menu-pages/_panels.scss index 6267c699..e0120fc0 100644 --- a/src/client-s/css/menu-pages/_panels.scss +++ b/src/client-s/css/menu-pages/_panels.scss @@ -7,6 +7,7 @@ .plugin-menu-page-panel-heading { @include user-select(none); + @include sharkicon(chevron-down, after); text-decoration: none; padding: 10px; @@ -26,16 +27,12 @@ &::after { font-size: 80%; - content: '\f078'; - font-weight: normal; - font-family: 'FontAwesome'; float: right; margin: 0 0 0 5px; - display: inline-block; } &.open::after { - content: '\f077'; + content: map-get($sharkicons, chevron-up); } @at-root .pro-preview .plugin-menu-page-panel .plugin-menu-page-panel-heading { diff --git a/src/client-s/images/clear-response.png b/src/client-s/images/clear-response.png index e4904984..4ac05c5d 100644 Binary files a/src/client-s/images/clear-response.png and b/src/client-s/images/clear-response.png differ diff --git a/src/client-s/images/wipe-response.png b/src/client-s/images/wipe-response.png index 9f57015d..b9cd137c 100644 Binary files a/src/client-s/images/wipe-response.png and b/src/client-s/images/wipe-response.png differ diff --git a/src/client-s/js/admin-bar.js b/src/client-s/js/admin-bar.js index 961da8f3..5538ebef 100644 --- a/src/client-s/js/admin-bar.js +++ b/src/client-s/js/admin-bar.js @@ -7,21 +7,49 @@ $window = $(window), $document = $(document); - var animationEnd = // All vendor prefixes. - 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd' + - ' oanimationend animationend'; - plugin.onReady = function () // DOM ready event handler. { + plugin.dirStatsData = null; + plugin.dirStatsRunning = false; plugin.hideAJAXResponseTimeout = null; plugin.vars = $('#' + plugin.namespace + '-vars').data('json'); $('#wp-admin-bar-' + plugin.namespace + '-wipe > a').on('click', plugin.wipeCache); $('#wp-admin-bar-' + plugin.namespace + '-clear > a').on('click', plugin.clearCache); $document.on('click', '.' + plugin.namespace + '-ajax-response', plugin.hideAJAXResponse); + + var $dirStats = $('#wp-admin-bar-' + plugin.namespace + '-dir-stats'); + if ($dirStats.length && plugin.MutationObserver) { // Possible? + (new plugin.MutationObserver(function (mutations) { + $.each(mutations, function (index, mutation) { + if (mutation.type !== 'attributes') { + return; // Not applicable. + } + if (mutation.attributeName !== 'class') { + return; // Not applicable. + } + var oldValue = mutation.oldValue, // Provided by event. + newValue = $(mutation.target).prop(mutation.attributeName); + + if (!/\bhover\b/i.test(oldValue) && /\bhover\b/i.test(newValue)) { + plugin.dirStats(); // Received `hover` class. + } + return false; // Stop iterating now. + }); + })) + .observe($dirStats[0], { + attributes: true, + childList: true, + characterData: true + }); // See: + $dirStats.find('> a').on('click', plugin.preventDefault); + } }; - plugin.wipeCache = function () { + plugin.wipeCache = function (event) { + plugin.preventDefault(event); + plugin.dirStatsData = null; + var postVars = { _wpnonce: plugin.vars._wpnonce }; // HTTP post vars. @@ -31,12 +59,12 @@ var $wipe = $('#wp-admin-bar-' + plugin.namespace + '-wipe > a'); plugin.removeAJAXResponse(); - $wipe.parent().addClass('-wiping'); + $wipe.parent().addClass('-processing'); $wipe.attr('disabled', 'disabled'); $.post(plugin.vars.ajaxURL, postVars, function (data) { plugin.removeAJAXResponse(); - $wipe.parent().removeClass('-wiping'); + $wipe.parent().removeClass('-processing'); $wipe.removeAttr('disabled'); var $response = $('
' + data + '
'); @@ -45,7 +73,10 @@ }); }; - plugin.clearCache = function () { + plugin.clearCache = function (event) { + plugin.preventDefault(event); + plugin.dirStatsData = null; + var postVars = { _wpnonce: plugin.vars._wpnonce }; // HTTP post vars. @@ -55,12 +86,12 @@ var $clear = $('#wp-admin-bar-' + plugin.namespace + '-clear > a'); plugin.removeAJAXResponse(); - $clear.parent().addClass('-clearing'); + $clear.parent().addClass('-processing'); $clear.attr('disabled', 'disabled'); $.post(plugin.vars.ajaxURL, postVars, function (data) { plugin.removeAJAXResponse(); - $clear.parent().removeClass('-clearing'); + $clear.parent().removeClass('-processing'); $clear.removeAttr('disabled'); var $response = $('
' + data + '
'); @@ -72,30 +103,281 @@ plugin.showAJAXResponse = function () { clearTimeout(plugin.hideAJAXResponseTimeout); - $('.' + plugin.namespace + '-ajax-response').off(animationEnd).on(animationEnd, function () { - plugin.hideAJAXResponseTimeout = setTimeout(plugin.hideAJAXResponse, 2500); - }).addClass(plugin.namespace + '-animation-zoom-in-down').show() - - .on('mouseover', function () { // Do not auto-hide if hovered. - clearTimeout(plugin.hideAJAXResponseTimeout); - $(this).addClass('-hovered'); - }); + $('.' + plugin.namespace + '-ajax-response') + .off(plugin.animationEndEvents) // Reattaching below. + .on(plugin.animationEndEvents, function () { // Reattach. + plugin.hideAJAXResponseTimeout = setTimeout(plugin.hideAJAXResponse, 2500); + }) + .addClass(plugin.namespace + '-admin-bar-animation-zoom-in-down').show() + .on('mouseover', function () { // Do not auto-hide if hovered. + clearTimeout(plugin.hideAJAXResponseTimeout); + $(this).addClass('-hovered'); + }); }; - plugin.hideAJAXResponse = function (event, animate) { + plugin.hideAJAXResponse = function (event) { + plugin.preventDefault(event); + clearTimeout(plugin.hideAJAXResponseTimeout); - $('.' + plugin.namespace + '-ajax-response').off(animationEnd).on(animationEnd, function () { - plugin.removeAJAXResponse(); - }).addClass(plugin.namespace + '-animation-bounce-out-up'); + $('.' + plugin.namespace + '-ajax-response') + .off(plugin.animationEndEvents) // Reattaching below. + .on(plugin.animationEndEvents, function () { // Reattach. + plugin.removeAJAXResponse(); // Remove completely. + }) + .addClass(plugin.namespace + '-admin-bar-animation-zoom-out-up'); }; plugin.removeAJAXResponse = function () { clearTimeout(plugin.hideAJAXResponseTimeout); - $('.' + plugin.namespace + '-ajax-response').off(animationEnd).remove(); + $('.' + plugin.namespace + '-ajax-response') + .off(plugin.animationEndEvents).remove(); }; + plugin.dirStats = function () { + if (plugin.dirStatsRunning) { + return; // Still running. + } + plugin.dirStatsRunning = true; + + var canSeeMore = !plugin.vars.isMultisite || plugin.vars.currentUserHasNetworkCap, + + $stats = $('#wp-admin-bar-' + plugin.namespace + '-dir-stats'), + + $wrapper = $stats.find('.-wrapper'), + $container = $wrapper.find('.-container'), + + $refreshing = $container.find('.-refreshing'), + $chart = $container.find('.-chart'), + + $totals = $container.find('.-totals'), + $totalFiles = $totals.find('.-files'), + $totalSize = $totals.find('.-size'), + + $disk = $container.find('.-disk'), + $diskFree = $disk.find('.-free'), + $diskSize = $disk.find('.-size'), + + $moreInfo = $container.find('.-more-info'), + + beforeData = function () { + if (!$stats.hasClass('hover')) { + plugin.dirStatsRunning = false; + return; // Hidden now. + } + $refreshing.show(); + $chart.hide(); // Hide. + + $totals.css('visibility', 'hidden'); + $disk.css('visibility', 'hidden'); + + if (canSeeMore) { // Will display? + $moreInfo.css('visibility', 'hidden'); + } else { // Not showing. + $moreInfo.hide(); + } + if (!plugin.dirStatsData) { + var postVars = { + _wpnonce: plugin.vars._wpnonce + }; // HTTP post vars. + postVars[plugin.namespace] = { + ajaxDirStats: '1' + }; + $.post(plugin.vars.ajaxURL, postVars, function (data) { + plugin.dirStatsData = data; + afterData(); + }); + } else { + setTimeout(afterData, 500); + } + }, + afterData = function () { + if (!plugin.dirStatsData) { + plugin.dirStatsRunning = false; + return; // Not possible. + } + if (!$stats.hasClass('hover')) { + plugin.dirStatsRunning = false; + return; // Hidden now. + } + $refreshing.hide(); + $chart.css('display', 'block'); + + var chart = null, // Initialize. + chartDimensions = null, // Initialize. + + forCache = canSeeMore ? 'forCache' : 'forHostCache', + forHtmlCCache = canSeeMore ? 'forHtmlCCache' : 'forHtmlCHostCache', + largestCacheSize = canSeeMore ? 'largestCacheSize' : 'largestHostCacheSize', + + largestSize = plugin.dirStatsData[largestCacheSize].size, + largestSizeInDays = plugin.dirStatsData[largestCacheSize].days, + + forCache_totalLinksFiles = plugin.dirStatsData[forCache].stats.total_links_files, + forHtmlCCache_totalLinksFiles = plugin.dirStatsData[forHtmlCCache].stats.total_links_files, + totalLinksFiles = forCache_totalLinksFiles + forHtmlCCache_totalLinksFiles, + + forCache_totalSize = plugin.dirStatsData[forCache].stats.total_size, + forHtmlCCache_totalSize = plugin.dirStatsData[forHtmlCCache].stats.total_size, + totalSize = forCache_totalSize + forHtmlCCache_totalSize, + + forCache_diskSize = plugin.dirStatsData[forCache].stats.disk_total_space, + forCache_diskFree = plugin.dirStatsData[forCache].stats.disk_free_space, + + chartOptions = { // Chart.js config. options. + responsive: true, + animationSteps: 35, + + scaleSteps: 10, + scaleStepWidth: 1, + scaleFontSize: 10, + scaleShowLine: true, + scaleBeginAtZero: false, + scaleStartValue: 10000000, + scaleFontFamily: 'sans-serif', + scaleShowLabelBackdrop: true, + scaleBackdropPaddingY: 2, + scaleBackdropPaddingX: 4, + scaleFontColor: 'rgba(0,0,0,1)', + scaleBackdropColor: 'rgba(255,255,255,1)', + scaleLineColor: $('body').hasClass('admin-color-light') ? + 'rgba(0,0,0,0.25)' : 'rgba(255,255,255,0.25)', + scaleLabel: function (payload) { + return plugin.bytesToSizeLabel(payload.value); + }, + + tooltipFontSize: 12, + tooltipFillColor: 'rgba(0,0,0,1)', + tooltipFontFamily: 'Georgia, serif', + tooltipTemplate: function (payload) { + return payload.label + ': ' + plugin.bytesToSizeLabel(payload.value); + }, + + segmentShowStroke: true, + segmentStrokeWidth: 1, + segmentStrokeColor: $('body').hasClass('admin-color-light') ? + 'rgba(0,0,0,1)' : 'rgba(255,255,255,1)' + }, // ↑ Merged w/ global config. options. + + chartData = [{ + value: largestSize, + label: plugin.vars.i18n.xDayHigh + .replace('%s', largestSizeInDays), + color: '#ff5050', + highlight: '#c63f3f' + }, { + value: totalSize, + label: plugin.vars.i18n.currentTotalSize, + color: '#46bf52', + highlight: '#33953e' + }, { + value: forCache_totalSize, + label: plugin.vars.i18n.pageCache, + color: '#0096CC', + highlight: '#057ca7' + }, { + value: forHtmlCCache_totalSize, + label: plugin.vars.i18n.htmlCompressor, + color: '#FFC870', + highlight: '#d6a85d' + }]; + + if ((chart = $stats.data('chart'))) { + chart.destroy(); // Destroy previous. + } + if ((chartDimensions = $stats.data('chartDimensions'))) { + $chart.attr('width', parseInt(chartDimensions.width)) + .attr('height', parseInt(chartDimensions.height)); + $chart.css(chartDimensions); // Restore. + } + chart = new Chart($chart[0].getContext('2d')).PolarArea(chartData, chartOptions); + $stats.data('chart', chart) // Save these. + .data('chartDimensions', { + width: $chart.width() + 'px', + height: $chart.height() + 'px' + }); + $totals.css('visibility', 'visible'); + $totalFiles.find('span').html(plugin.escHtml(plugin.numberFormat(totalLinksFiles) + ' ' + (totalLinksFiles === 1 ? plugin.vars.i18n.file : plugin.vars.i18n.files))); + $totalSize.find('span').html(plugin.escHtml(plugin.bytesToSizeLabel(totalSize))); + + $disk.css('visibility', 'visible'); + $diskSize.find('span').html(plugin.escHtml(plugin.bytesToSizeLabel(forCache_diskSize))); + $diskFree.find('span').html(plugin.escHtml(plugin.bytesToSizeLabel(forCache_diskFree))); + + if (canSeeMore) { // Will display this? + $moreInfo.css('visibility', 'visible'); + } + plugin.dirStatsRunning = false; + }; + beforeData(); // Begin w/ data acquisition. + }; + + plugin.bytesToSizeLabel = function (bytes, decimals) { + if (isNaN(bytes) || bytes <= 1) { + return bytes === 1 ? '1 byte' : '0 bytes'; + } // See: + if (isNaN(decimals) || decimals <= 0) { + decimals = 0; // Default; integer. + } + var base = 1024, // 1 Kilobyte base (binary). + baseLog = Math.floor(Math.log(bytes) / Math.log(base)), + sizes = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], + sizeInBaseLog = (bytes / Math.pow(base, baseLog)); + + return sizeInBaseLog.toFixed(decimals) + ' ' + sizes[baseLog]; + }; + + plugin.numberFormat = function (number, decimals) { + if (isNaN(number)) { + return String(number); + } // See: + if (isNaN(decimals) || decimals <= 0) { + decimals = 0; // Default; integer. + } + return number.toFixed(decimals).replace(/./g, function (m, o, s) { + return o && m !== '.' && ((s.length - o) % 3 === 0) ? ',' + m : m; + }); + }; + + plugin.escHtml = function (string) { + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + return String(string).replace(/[&<>"']/g, function (specialChar) { + return entityMap[specialChar]; + }); + }; + + plugin.preventDefault = function (event, stopImmediatePropagation) { + if (!event) { + return; // Not possible. + } + event.preventDefault(); // Always. + + if (stopImmediatePropagation) { + event.stopImmediatePropagation(); + } + }; + + plugin.MutationObserver = (function () { + var observer = null; // Initialize default value. + $.each(['', 'WebKit', 'O', 'Moz', 'Ms'], function (index, prefix) { + if (prefix + 'MutationObserver' in window) { + observer = window[prefix + 'MutationObserver']; + return false; // Stop iterating now. + } // See: + }); + return observer; // See: + }()); + + plugin.animationEndEvents = // All vendor prefixes. + 'webkitAnimationEnd mozAnimationEnd msAnimationEnd oAnimationEnd animationEnd'; + $document.ready(plugin.onReady); // On DOM ready. })(jQuery); diff --git a/src/client-s/js/menu-pages.js b/src/client-s/js/menu-pages.js index 555ee680..eaed06d2 100644 --- a/src/client-s/js/menu-pages.js +++ b/src/client-s/js/menu-pages.js @@ -1,7 +1,9 @@ (function ($) { 'use strict'; // Standards. - var plugin = {}, + var plugin = { + namespace: 'zencache' + }, $window = $(window), $document = $(document); @@ -17,8 +19,8 @@ $('.plugin-menu-page-panel-heading', $menuPage).removeClass('open') .next('.plugin-menu-page-panel-body').removeClass('open'); }); - $('.plugin-menu-page-panel-heading', $menuPage).on('click', function (e) { - e.preventDefault(); // Prevent click event. + $('.plugin-menu-page-panel-heading', $menuPage).on('click', function (event) { + plugin.preventDefault(event); var $this = $(this); @@ -43,21 +45,21 @@ else $thisPanel.find('.plugin-menu-page-panel-if-enabled').css('opacity', 0.4).find(':input').attr('readonly', 'readonly'); }) .trigger('change'); // Initialize. - $('[data-toggle-target]', $menuPage).on('click', function (e) { - e.preventDefault(); - e.stopImmediatePropagation(); + + $('[data-toggle-target]', $menuPage).on('click', function (event) { + plugin.preventDefault(event); var $this = $(this), $target = $($this.data('toggleTarget')); if ($target.is(':visible')) { $target.hide(); - $this.find('.fa').removeClass('fa-eye-slash') - .addClass('fa-eye'); + $this.find('.fa').removeClass('si-eye-slash') + .addClass('si-eye'); } else { $target.show(); - $this.find('.fa').removeClass('fa-eye') - .addClass('fa-eye-slash'); + $this.find('.fa').removeClass('si-eye') + .addClass('si-eye-slash'); } }); $('textarea[name$="\[cdn_hosts\]"]', $menuPage).on('input propertychange', function () { @@ -79,5 +81,15 @@ } }); }; + + plugin.preventDefault = function (event, stopImmediatePropagation) { + if (event) { + event.preventDefault(); + if (stopImmediatePropagation) { + event.stopImmediatePropagation(); + } + } + }; $document.ready(plugin.onReady); // On DOM ready. + })(jQuery); diff --git a/src/includes/classes/AbsBase.php b/src/includes/classes/AbsBase.php index 9307c465..c83f1f35 100644 --- a/src/includes/classes/AbsBase.php +++ b/src/includes/classes/AbsBase.php @@ -62,6 +62,23 @@ public function __construct() $this->overload = new \stdClass(); } + /** + * Instance (singleton). + * + * @since 15xxxx Directory stats. + * + * @return AbsBase Instance. + */ + public static function instance() + { + static $instance; // Per class. + + if (isset($instance)) { + return $instance; + } + return ($instance = new static()); + } + /** * Magic/overload `isset()` checker. * diff --git a/src/includes/classes/Actions.php b/src/includes/classes/Actions.php index 0e8f215e..aa6765b9 100644 --- a/src/includes/classes/Actions.php +++ b/src/includes/classes/Actions.php @@ -18,6 +18,7 @@ class Actions extends AbsBase 'clearCache', /*[pro strip-from="lite"]*/ + 'ajaxDirStats', 'ajaxWipeCache', 'ajaxClearCache', /*[/pro]*/ @@ -137,6 +138,48 @@ protected function clearCache($args) wp_redirect($redirect_to).exit(); } + /*[pro strip-from="lite"]*/ + /** + * Action handler. + * + * @since 15xxxx Directory stats. + * + * @param mixed Input action argument(s). + */ + protected function ajaxDirStats($args) + { + if (!current_user_can($this->plugin->cap)) { + return; // Nothing to do. + } + if (empty($_REQUEST['_wpnonce']) || !wp_verify_nonce($_REQUEST['_wpnonce'])) { + return; // Unauthenticated POST data. + } + if (!$this->plugin->options['dir_stats_enable']) { + exit(); // Not applicable. + } + if (!$this->plugin->options['dir_stats_admin_bar_enable']) { + exit(); // Not applicable. + } + $dir_stats = DirStats::instance(); // Directory stats. + + if (!is_multisite() || current_user_can($this->plugin->network_cap)) { + $dir_stats_data = array( + 'forCache' => $dir_stats->forCache(), + 'forHtmlCCache' => $dir_stats->forHtmlCCache(), + 'largestCacheSize' => $dir_stats->largestCacheSize(), + ); + } else { // Stats for a child blog owner w/o access to more info. + $dir_stats_data = array( + 'forHostCache' => $dir_stats->forHostCache(), + 'forHtmlCHostCache' => $dir_stats->forHtmlCHostCache(), + 'largestHostCacheSize' => $dir_stats->largestHostCacheSize(), + ); + } + header('Content-Type: application/json; charset=UTF-8'); + exit(json_encode($dir_stats_data)); // JavaScript will take it from here. + } + /*[/pro]*/ + /*[pro strip-from="lite"]*/ /** * Action handler. @@ -257,7 +300,7 @@ protected function saveOptions($args) $query_args[GLOBAL_NS.'_wp_config_wp_cache_add_failure'] = '1'; } if (!($add_advanced_cache = $this->plugin->addAdvancedCache())) { - $query_args[GLOBAL_NS.'_advanced_cache_add_failure'] = $add_advanced_cache === null ? 'zc-advanced-cache' : '1'; + $query_args[GLOBAL_NS.'_advanced_cache_add_failure'] = $add_advanced_cache === null ? 'advanced-cache' : '1'; } $this->plugin->updateBlogPaths(); // Multisite networks only. } else { @@ -300,7 +343,7 @@ protected function restoreDefaultOptions($args) $query_args[GLOBAL_NS.'_wp_config_wp_cache_add_failure'] = '1'; } if (!($add_advanced_cache = $this->plugin->addAdvancedCache())) { - $query_args[GLOBAL_NS.'_advanced_cache_add_failure'] = $add_advanced_cache === null ? 'zc-advanced-cache' : '1'; + $query_args[GLOBAL_NS.'_advanced_cache_add_failure'] = $add_advanced_cache === null ? 'advanced-cache' : '1'; } $this->plugin->updateBlogPaths(); // Multisite networks only. } else { diff --git a/src/includes/classes/AutoCache.php b/src/includes/classes/AutoCache.php index 0c47a968..bde4afea 100644 --- a/src/includes/classes/AutoCache.php +++ b/src/includes/classes/AutoCache.php @@ -166,7 +166,7 @@ protected function logAutoCacheUrl($url, $wp_remote_get_response) { $cache_dir = $this->plugin->cacheDir(); $cache_lock = $this->plugin->cacheLock(); - $auto_cache_log_file = $cache_dir.'/zc-auto-cache.log'; + $auto_cache_log_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-auto-cache.log'; if (is_file($auto_cache_log_file) && !is_writable($auto_cache_log_file)) { throw new \Exception(sprintf(__('Auto-cache log file is NOT writable: `%1$s`. Please set permissions to `644` (or higher). `666` might be needed in some cases.', SLUG_TD), $auto_cache_log_file)); @@ -203,7 +203,7 @@ protected function logAutoCacheRun($total_urls, $total_time) { $cache_dir = $this->plugin->cacheDir(); $cache_lock = $this->plugin->cacheLock(); - $auto_cache_log_file = $cache_dir.'/zc-auto-cache.log'; + $auto_cache_log_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-auto-cache.log'; if (is_file($auto_cache_log_file) && !is_writable($auto_cache_log_file)) { throw new \Exception(sprintf(__('Auto-cache log file is NOT writable: `%1$s`. Please set permissions to `644` (or higher). `666` might be needed in some cases.', SLUG_TD), $auto_cache_log_file)); diff --git a/src/includes/classes/CdnFilters.php b/src/includes/classes/CdnFilters.php index 5b5b4967..7ae8d30b 100644 --- a/src/includes/classes/CdnFilters.php +++ b/src/includes/classes/CdnFilters.php @@ -120,31 +120,31 @@ public function __construct() { parent::__construct(); - /* Primary switch; CDN filters enabled? */ + // Primary switch; CDN filters enabled? $this->cdn_enable = (boolean) $this->plugin->options['cdn_enable']; - /* Another switch; HTML Compressor enabled? */ + // Another switch; HTML Compressor enabled? $this->htmlc_enable = (boolean) $this->plugin->options['htmlc_enable']; - /* Host-related properties. */ + // Host-related properties. $this->local_host = strtolower($this->plugin->hostToken()); $this->cdn_host = strtolower($this->plugin->options['cdn_host']); $this->cdn_hosts = strtolower($this->plugin->options['cdn_hosts']); $this->parseCdnHosts(); // Convert CDN hosts to an array. - /* Configure invalidation-related properties. */ + // Configure invalidation-related properties. $this->cdn_invalidation_var = (string) $this->plugin->options['cdn_invalidation_var']; $this->cdn_invalidation_counter = (integer) $this->plugin->options['cdn_invalidation_counter']; - /* CDN supports SSL connections? */ + // CDN supports SSL connections? $this->cdn_over_ssl = (boolean) $this->plugin->options['cdn_over_ssl']; - /* Whitelisted extensions; MUST have these at all times. */ + // Whitelisted extensions; MUST have these at all times. if (!($cdn_whitelisted_extensions = trim($this->plugin->options['cdn_whitelisted_extensions']))) { $cdn_whitelisted_extensions = implode('|', static::defaultWhitelistedExtensions()); @@ -153,7 +153,7 @@ public function __construct() $this->cdn_whitelisted_extensions = preg_split('/[|;,\s]+/', $this->cdn_whitelisted_extensions, null, PREG_SPLIT_NO_EMPTY); $this->cdn_whitelisted_extensions = array_unique($this->cdn_whitelisted_extensions); - /* Blacklisted extensions; if applicable. */ + // Blacklisted extensions; if applicable. $cdn_blacklisted_extensions = $this->plugin->options['cdn_blacklisted_extensions']; @@ -163,7 +163,7 @@ public function __construct() $this->cdn_blacklisted_extensions = array_unique($this->cdn_blacklisted_extensions); - /* Whitelisted URI patterns; if applicable. */ + // Whitelisted URI patterns; if applicable. $cdn_whitelisted_uri_patterns = trim(strtolower($this->plugin->options['cdn_whitelisted_uri_patterns'])); $cdn_whitelisted_uri_patterns = preg_split('/['."\r\n".']+/', $cdn_whitelisted_uri_patterns, null, PREG_SPLIT_NO_EMPTY); @@ -171,11 +171,10 @@ public function __construct() if ($cdn_whitelisted_uri_patterns) { $this->cdn_whitelisted_uri_patterns = '/(?:'.implode('|', array_map(function ($pattern) { - return preg_replace(array('/\\\\\*/', '/\\\\\^/'), array('.*?', '[^\/]*?'), preg_quote('/'.ltrim($pattern, '/'), '/')); # - + return preg_replace(array('/\\\\\*/', '/\\\\\^/'), array('.*?', '[^\/]*?'), preg_quote('/'.ltrim($pattern, '/'), '/')); }, $cdn_whitelisted_uri_patterns)).')/i'; // CaSe inSensitive. } - /* Blacklisted URI patterns; if applicable. */ + // Blacklisted URI patterns; if applicable. $cdn_blacklisted_uri_patterns = trim(strtolower($this->plugin->options['cdn_blacklisted_uri_patterns'])); $cdn_blacklisted_uri_patterns = preg_split('/['."\r\n".']+/', $cdn_blacklisted_uri_patterns, null, PREG_SPLIT_NO_EMPTY); @@ -191,11 +190,10 @@ public function __construct() if ($cdn_blacklisted_uri_patterns) { $this->cdn_blacklisted_uri_patterns = '/(?:'.implode('|', array_map(function ($pattern) { - return preg_replace(array('/\\\\\*/', '/\\\\\^/'), array('.*?', '[^\/]*?'), preg_quote('/'.ltrim($pattern, '/'), '/')); # - + return preg_replace(array('/\\\\\*/', '/\\\\\^/'), array('.*?', '[^\/]*?'), preg_quote('/'.ltrim($pattern, '/'), '/')); }, $cdn_blacklisted_uri_patterns)).')/i'; // CaSe inSensitive. } - /* Maybe attach filters. */ + // Maybe attach filters. $this->maybeSetupFilters(); } diff --git a/src/includes/classes/DirStats.php b/src/includes/classes/DirStats.php new file mode 100644 index 00000000..7d38a0c1 --- /dev/null +++ b/src/includes/classes/DirStats.php @@ -0,0 +1,778 @@ +cache_key = GLOBAL_NS.'_dir_stats'; + $this->history_cache_key = GLOBAL_NS.'_h_dir_stats'; + + $this->allowed_history_cache_keys = array(md5('forCache0'), md5('forHtmlCCache0')); + $this->allowed_host_history_cache_keys = array(md5('forHostCache0'), md5('forHtmlCHostCache0')); + } + + /** + * Directory stats cache. + * + * @since 15xxxx Directory stats. + * + * @return array Directory stats cache. + */ + protected function getCache() + { + if (!is_array($cache = get_site_option($this->cache_key))) { + update_site_option($this->cache_key, ($cache = array())); + } + return $cache; + } + + /** + * Directory stats cache (current host). + * + * @since 15xxxx Directory stats. + * + * @return array Directory stats cache (current host). + */ + protected function getHostCache() + { + $host_cache_key = $this->cacheKeyForBlog(); + + if (!is_array($host_cache = get_site_option($host_cache_key))) { + update_site_option($host_cache_key, ($host_cache = array())); + } + return $host_cache; + } + + /** + * Directory stats history cache. + * + * @since 15xxxx Directory stats. + * + * @return array Directory stats history cache. + */ + protected function getHistoryCache() + { + if (!is_array($cache = get_site_option($this->history_cache_key))) { + update_site_option($this->history_cache_key, ($cache = array())); + } + return $cache; + } + + /** + * Directory stats history cache (current host). + * + * @since 15xxxx Directory stats. + * + * @return array Directory stats history cache (current host). + */ + protected function getHostHistoryCache() + { + $host_history_cache_key = $this->historyCacheKeyForBlog(); + + if (!is_array($host_history_cache = get_site_option($host_history_cache_key))) { + update_site_option($host_history_cache_key, ($host_history_cache = array())); + } + return $host_history_cache; + } + + /** + * Update directory stats cache. + * + * @since 15xxxx Directory stats. + * + * @param string $key Cache key. + * @param \stdClass $stats Stats to update. + */ + protected function updateCache($key, \stdClass $stats) + { + $cache = $this->getCache(); + $cache = array_merge($cache, array((string) $key => $stats)); + update_site_option($this->cache_key, $cache); + $this->updateHistoryCache($key, $stats); + } + + /** + * Update directory stats cache (current host). + * + * @since 15xxxx Directory stats. + * + * @param string $key Cache key. + * @param \stdClass $stats Stats to update. + */ + protected function updateHostCache($key, \stdClass $stats) + { + $host_cache = $this->getHostCache(); + $host_cache_key = $this->cacheKeyForBlog(); + $host_cache = array_merge($host_cache, array((string) $key => $stats)); + update_site_option($host_cache_key, $host_cache); + $this->updateHostHistoryCache($key, $stats); + } + + /** + * Update directory stats history cache. + * + * @since 15xxxx Directory stats. + * + * @param string $key Cache key. + * @param \stdClass $stats Stats to update. + */ + protected function updateHistoryCache($key, \stdClass $stats) + { + $history_injected = false; // Initialize. + $history_cache = $this->getHistoryCache(); + $history_max_time_keys = max(1, $this->plugin->options['dir_stats_history_days']) * 5; // 30 x 5 = 150 + $history_max_age = strtotime('-'.max(1, $this->plugin->options['dir_stats_history_days']).' days'); + + // Note: Time keys are based on the hour they were pulled in; i.e., `$stats->time`. + // This time-rounding prevents any single day from adding more than 24 times. + + // In addition, we don't overwrite stats in any hour that had a larger size previously. + // This gives us a better look at what a load average looks like overall throughout a day. + + if (in_array($key, $this->allowed_history_cache_keys, true) && isset($stats->stats, $stats->time) && is_object($stats->stats)) { + $stats_hour = $stats->time - ($stats->time % 3600); // Stats hour; i.e., based on the stats time. + if (!isset($history_cache[$key][$stats_hour]->stats->total_size) || $stats->stats->total_size > $history_cache[$key][$stats_hour]->stats->total_size) { + $history_cache[$key][$stats_hour] = $stats; // Keep the largest size in this hour. + $history_injected = true; // Flag as true. + } + } + if (!$history_injected) { // If not injected we can stop here. + return; // Nothing more to do; sub-routine below is not necessary. + } + $history_cache = array_slice($history_cache, 0, count($this->allowed_history_cache_keys), true); + + foreach ($history_cache as $_key => $_key_stats) { // Each string key. + if (!$_key || !is_string($_key) || !$_key_stats || !is_array($_key_stats)) { + unset($history_cache[$_key]); // Delete key. + continue; // All done for this key. + } + foreach ($_key_stats as $_time => $_stats) { // Each time in this key. + if (!$_time || !isset($_stats->stats, $_stats->time) || !is_object($_stats->stats)) { + unset($history_cache[$_key][$_time]); // Delete time key. + continue; // All done for this time key. + } + if ($_time < $history_max_age || $_stats->time < $history_max_age) { + unset($history_cache[$_key][$_time]); // Delete time key. + continue; // All done for this time key. + } + } + if (!$history_cache[$_key]) { + unset($history_cache[$_key]); + } else { // Newest to oldest sorting + slicer. + krsort($history_cache[$_key], SORT_NUMERIC); + $history_cache[$_key] = array_slice($history_cache[$_key], 0, $history_max_time_keys, true); + } + } + unset($_key, $_key_stats, $_time, $_stats); // Housekeeping. + + update_site_option($this->history_cache_key, $history_cache); + } + + /** + * Update directory stats history cache (current host). + * + * @since 15xxxx Directory stats. + * + * @param string $key Cache key (optional). + * @param \stdClass $stats Stats to update (optional). + */ + protected function updateHostHistoryCache($key = '', \stdClass $stats = null) + { + $host_history_injected = false; // Initialize. + $host_history_cache = $this->getHostHistoryCache(); + $host_history_cache_key = $this->historyCacheKeyForBlog(); + $host_history_max_time_keys = max(1, $this->plugin->options['dir_stats_history_days']) * 5; // 30 x 5 = 150 + $host_history_max_age = strtotime('-'.max(1, $this->plugin->options['dir_stats_history_days']).' days'); + + // Note: Time keys are based on the hour they were pulled in; i.e., `$stats->time`. + // This time-rounding prevents any single day from adding more than 24 times. + + // In addition, we don't overwrite stats in any hour that had a larger size previously. + // This gives us a better look at what a load average looks like overall throughout a day. + + if (in_array($key, $this->allowed_host_history_cache_keys, true) && isset($stats->stats, $stats->time) && is_object($stats->stats)) { + $stats_hour = $stats->time - ($stats->time % 3600); // Stats hour; i.e., based on the stats time. + if (!isset($host_history_cache[$key][$stats_hour]->stats->total_size) || $stats->stats->total_size > $host_history_cache[$key][$stats_hour]->stats->total_size) { + $host_history_cache[$key][$stats_hour] = $stats; // Keep the largest size in this hour. + $host_history_injected = true; // Flag as true. + } + } + if (!$host_history_injected) { // If not injected we can stop here. + return; // Nothing more to do; sub-routine below is not necessary. + } + $host_history_cache = array_slice($host_history_cache, 0, count($this->allowed_host_history_cache_keys), true); + + foreach ($host_history_cache as $_key => $_key_stats) { // Each string key. + if (!$_key || !is_string($_key) || !$_key_stats || !is_array($_key_stats)) { + unset($host_history_cache[$_key]); // Delete key. + continue; // All done for this key. + } + foreach ($_key_stats as $_time => $_stats) { // Each time in this key. + if (!$_time || !isset($_stats->stats, $_stats->time) || !is_object($_stats->stats)) { + unset($host_history_cache[$_key][$_time]); // Delete time key. + continue; // All done for this time key. + } + if ($_time < $host_history_max_age || $_stats->time < $host_history_max_age) { + unset($host_history_cache[$_key][$_time]); // Delete time key. + continue; // All done for this time key. + } + } + if (!$host_history_cache[$_key]) { + unset($host_history_cache[$_key]); + } else { // Newest to oldest sorting + slicer. + krsort($host_history_cache[$_key], SORT_NUMERIC); + $host_history_cache[$_key] = array_slice($host_history_cache[$_key], 0, $host_history_max_time_keys, true); + } + } + unset($_key, $_key_stats, $_time, $_stats); // Housekeeping. + + update_site_option($host_history_cache_key, $host_history_cache); + } + + /** + * Wipes directory stats cache. + * + * @since 15xxxx Directory stats. + * + * @param bool $include_child_blogs Include? + */ + public function wipeCache($include_child_blogs = true) + { + if ($include_child_blogs && is_multisite()) { + $wpdb = $this->plugin->wpdb(); + $site_id = get_current_site()->id; + $like = '%'.$wpdb->esc_like($this->cache_key).'%'; + $wpdb->query('DELETE FROM `'.$wpdb->sitemeta.'` WHERE `site_id` = \''.esc_sql($site_id).'\' AND `meta_key` LIKE \''.esc_sql($like).'\''); + + if (is_array($child_blogs = wp_get_sites())) { + foreach ($child_blogs as $_child_blog) { + $_host_cache_key = $this->cacheKeyForBlog($_child_blog['blog_id']); + wp_cache_delete($site_id.':'.$_host_cache_key, 'site-options'); + } + unset($_child_blog, $_host_cache_key); // Housekeeping. + } + } // ↓ Even if clearing child blogs. + // This makes sure the option cache is updated also. + update_site_option($this->cache_key, array()); // Always. + + // Clear network and current blog. + // If different; or in case `$include_child_blogs=false`. + $host_cache_key = $this->cacheKeyForBlog(); // If not the same. + if ($this->cache_key !== $host_cache_key) { // Clear host? + update_site_option($host_cache_key, array()); + } + } + + /** + * Clear directory stats cache (current host). + * + * @since 15xxxx Directory stats. + * + * @param bool $consider_network_cap Consider? + */ + public function clearHostCache($consider_network_cap = true) + { + if ($consider_network_cap && is_multisite() && current_user_can($this->plugin->network_cap)) { + $this->wipeCache(false); // Wipe network and current blog. + } else { + $host_cache_key = $this->cacheKeyForBlog(); + update_site_option($host_cache_key, array()); + } + } + + /** + * Wipe directory stats history cache. + * + * @since 15xxxx Directory stats. + * + * @param bool $include_child_blogs Include? + */ + public function wipeHistoryCache($include_child_blogs = true) + { + if ($include_child_blogs && is_multisite()) { + $wpdb = $this->plugin->wpdb(); + $site_id = get_current_site()->id; + $like = '%'.$wpdb->esc_like($this->history_cache_key).'%'; + $wpdb->query('DELETE FROM `'.$wpdb->sitemeta.'` WHERE `site_id` = \''.esc_sql($site_id).'\' AND `meta_key` LIKE \''.esc_sql($like).'\''); + + if (is_array($child_blogs = wp_get_sites())) { + foreach ($child_blogs as $_child_blog) { + $_host_history_cache_key = $this->historyCacheKeyForBlog($_child_blog['blog_id']); + wp_cache_delete($site_id.':'.$_host_history_cache_key, 'site-options'); + } + unset($_child_blog, $_host_history_cache_key); // Housekeeping. + } + } // ↓ Even if clearing child blogs. + // This makes sure the option cache is updated also. + update_site_option($this->history_cache_key, array()); // Always. + + // Clear network and current blog. + // If different; or in case `$include_child_blogs=false`. + $host_history_cache_key = $this->historyCacheKeyForBlog(); // If not the same. + if ($this->history_cache_key !== $host_history_cache_key) { // Clear host? + update_site_option($host_history_cache_key, array()); + } + } + + /** + * Clear directory stats history cache (current host). + * + * @since 15xxxx Directory stats. + * + * @param bool $consider_network_cap Consider? + */ + public function clearHostHistoryCache($consider_network_cap = true) + { + if ($consider_network_cap && is_multisite() && current_user_can($this->plugin->network_cap)) { + $this->wipeHistoryCache(false); // Wipe network and current blog. + } else { + $host_history_cache_key = $this->historyCacheKeyForBlog(); + update_site_option($host_history_cache_key, array()); + } + } + + /** + * Cache key for a specific blog ID. + * + * @since 15xxxx Directory stats. + * + * @param int $blog_id The blog ID. + * + * @return string Cache key for a specific blog ID. + */ + protected function cacheKeyForBlog($blog_id = 0) + { + if (is_multisite()) { + if (($blog_id = (integer) $blog_id) < 0) { + $blog_id = (integer) get_current_site()->blog_id; + } + if (!$blog_id) { + $blog_id = (integer) get_current_blog_id(); + } + return $this->cache_key.'_'.$blog_id; + } + return $this->cache_key; + } + + /** + * History cache key for a specific blog ID. + * + * @since 15xxxx Directory stats. + * + * @param int $blog_id The blog ID. + * + * @return string History cache key for a specific blog ID. + */ + protected function historyCacheKeyForBlog($blog_id = 0) + { + if (is_multisite()) { + if (($blog_id = (integer) $blog_id) < 0) { + $blog_id = (integer) get_current_site()->blog_id; + } + if (!$blog_id) { + $blog_id = (integer) get_current_blog_id(); + } + return $this->history_cache_key.'_'.$blog_id; + } + return $this->history_cache_key; + } + + /** + * Cache directory stats. + * + * @since 15xxxx Adding cache directory statistics. + * + * @param bool $no_cache Do not read a cache entry? + * @param bool $include_paths Include array of all scanned file paths? + * + * @return \stdClass Cache directory stats. + * + * @TODO Optimize this for multisite networks w/ a LOT of child blogs. + * @TODO Optimize this for extremely large sites. A LOT of files here could slow things down. + * See also: + */ + public function forCache($no_cache = false, $include_paths = false) + { + $cache_key = md5(__FUNCTION__.(integer) $include_paths); + + if (!$no_cache && ($cache = $this->getCache()) && isset($cache[$cache_key])) { + if (isset($cache[$cache_key]->stats, $cache[$cache_key]->time) && is_object($cache[$cache_key]->stats) + && $cache[$cache_key]->stats->total_resources > $this->plugin->options['dir_stats_auto_refresh_max_resources'] + && $cache[$cache_key]->time >= strtotime('-'.$this->plugin->options['dir_stats_refresh_time'])) { + return $cache[$cache_key]; // Cached stats. + } + } // Otherwise, we need to pull a fresh set of stats. + + $stats = (object) $this->plugin->getDirRegexStats($this->plugin->cacheDir(), '', $include_paths, true, true); + $stats = (object) array('stats' => $stats, 'time' => time()); + + $this->updateCache($cache_key, $stats); + + return $stats; + } + + /** + * HTML compressor cache directory stats. + * + * @since 15xxxx Adding cache directory statistics. + * + * @param bool $no_cache Do not read a cache entry? + * @param bool $include_paths Include array of all scanned file paths? + * + * @return \stdClass HTML compressor cache directory stats. + * + * @TODO Optimize this for multisite networks w/ a LOT of child blogs. + * @TODO Optimize this for extremely large sites. A LOT of files here could slow things down. + * See also: + */ + public function forHtmlCCache($no_cache = false, $include_paths = false) + { + $cache_key = md5(__FUNCTION__.(integer) $include_paths); + + if (!$no_cache && ($cache = $this->getCache()) && isset($cache[$cache_key])) { + if (isset($cache[$cache_key]->stats, $cache[$cache_key]->time) && is_object($cache[$cache_key]->stats) + && $cache[$cache_key]->stats->total_resources > $this->plugin->options['dir_stats_auto_refresh_max_resources'] + && $cache[$cache_key]->time >= strtotime('-'.$this->plugin->options['dir_stats_refresh_time'])) { + return $cache[$cache_key]; // Cached stats. + } + } // Otherwise, we need to pull a fresh set of stats. + + $stats = new \stdClass(); // Initialize stats object instance. + + $htmlc_cache_dirs = array(); // Initialize directories. + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_public); + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_private); + + foreach (array_unique($htmlc_cache_dirs) as $_htmlc_cache_dir) { + $_check_disk_stats = isset($stats->disk_total_space) ? false : true; + + foreach ($this->plugin->getDirRegexStats($_htmlc_cache_dir, '', $include_paths, $_check_disk_stats, true) as $_key => $_value) { + if (is_integer($_value) || is_float($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? $stats->{$_key} + $_value : $_value; + } elseif (is_array($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? array_merge($stats->{$_key}, $_value) : $_value; + } else { + throw new \Exception(__('Unexpected data type.', SLUG_TD)); + } + } + unset($_key, $_value); // Housekeeping. + } + unset($_htmlc_cache_dir, $_check_disk_stats); // Housekeeping. + + $stats = (object) array('stats' => $stats, 'time' => time()); + + $this->updateCache($cache_key, $stats); + + return $stats; + } + + /** + * Cache directory stats for the current host. + * + * @since 15xxxx Adding cache directory statistics. + * + * @param bool $no_cache Do not read a cache entry? + * @param bool $include_paths Include array of all scanned file paths? + * @param bool $___considering_domain_mapping For internal use only. + * @param bool $___consider_domain_mapping_host_token For internal use only. + * @param bool $___consider_domain_mapping_host_base_dir_tokens For internal use only. + * + * @return \stdClass Cache directory stats for the current host. + */ + public function forHostCache( + $no_cache = false, + $include_paths = false, + $___considering_domain_mapping = false, + $___consider_domain_mapping_host_token = null, + $___consider_domain_mapping_host_base_dir_tokens = null + ) { + $cache_key = md5(__FUNCTION__.(integer) $include_paths); + $no_cache = $___considering_domain_mapping ? true : $no_cache; + + if (!$no_cache && ($cache = $this->getHostCache()) && isset($cache[$cache_key])) { + if (isset($cache[$cache_key]->stats, $cache[$cache_key]->time) && is_object($cache[$cache_key]->stats) + && $cache[$cache_key]->stats->total_resources > $this->plugin->options['dir_stats_auto_refresh_max_resources'] + && $cache[$cache_key]->time >= strtotime('-'.$this->plugin->options['dir_stats_refresh_time'])) { + return $cache[$cache_key]; // Cached stats. + } + } // Otherwise, we need to pull a fresh set of stats. + + $cache_dir = $this->plugin->nDirSeps($cache_dir); + $host_token = $current_host_token = $this->plugin->hostToken(); + $host_base_dir_tokens = $current_host_base_dir_tokens = $this->plugin->hostBaseDirTokens(); + + if ($___considering_domain_mapping && isset($___consider_domain_mapping_host_token, $___consider_domain_mapping_host_base_dir_tokens)) { + $host_token = (string) $___consider_domain_mapping_host_token; + $host_base_dir_tokens = (string) $___consider_domain_mapping_host_base_dir_tokens; + } + if (!$host_token) { // Must have a host in the sub-routine below. + throw new \Exception(__('Invalid argument; host token empty!', SLUG_TD)); + } + $stats = new \stdClass(); // Initialize stats object instance. + + foreach (array('http', 'https') as $_host_scheme) { + $_host_url = $_host_scheme.'://'.$host_token.$host_base_dir_tokens; + $_host_cache_path_flags = CACHE_PATH_NO_PATH_INDEX | CACHE_PATH_NO_QUV | CACHE_PATH_NO_EXT; + $_host_cache_path = $this->plugin->buildCachePath($_host_url, '', '', $_host_cache_path_flags); + $_host_cache_dir = $this->plugin->nDirSeps($cache_dir.'/'.$_host_cache_path); // Normalize path. + $_check_disk_stats = $___considering_domain_mapping || isset($stats->disk_total_space) ? false : true; + + foreach ($this->plugin->getDirRegexStats($_host_cache_dir, '', $include_paths, $_check_disk_stats, true) as $_key => $_value) { + if (is_integer($_value) || is_float($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? $stats->{$_key} + $_value : $_value; + } elseif (is_array($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? array_merge($stats->{$_key}, $_value) : $_value; + } else { + throw new \Exception(__('Unexpected data type.', SLUG_TD)); + } + } + unset($_key, $_value); // Housekeeping. + } + unset($_host_scheme, $_host_url, $_host_cache_path_flags, $_host_cache_path, $_host_cache_dir, $_check_disk_stats); + + if (!$___considering_domain_mapping && is_multisite() && $this->plugin->canConsiderDomainMapping()) { + $domain_mapping_variations = array(); // Initialize array of domain variations. + + if (($_host_token_for_blog = $this->plugin->hostTokenForBlog())) { + $_host_base_dir_tokens_for_blog = $this->plugin->hostBaseDirTokensForBlog(); + $domain_mapping_variations[] = array('host_token' => $_host_token_for_blog, 'host_base_dir_tokens' => $_host_base_dir_tokens_for_blog); + } // The original blog host; i.e., without domain mapping. + unset($_host_token_for_blog, $_host_base_dir_tokens_for_blog); // Housekeeping. + + foreach ($this->plugin->domainMappingBlogDomains() as $_domain_mapping_blog_domain) { + if (($_domain_host_token_for_blog = $this->plugin->hostTokenForBlog(false, true, $_domain_mapping_blog_domain))) { + $_domain_host_base_dir_tokens_for_blog = $this->plugin->hostBaseDirTokensForBlog(false, true); // This is only a formality. + $domain_mapping_variations[] = array('host_token' => $_domain_host_token_for_blog, 'host_base_dir_tokens' => $_domain_host_base_dir_tokens_for_blog); + } + } // This includes all of the domain mappings configured for the current blog ID. + unset($_domain_mapping_blog_domain, $_domain_host_token_for_blog, $_domain_host_base_dir_tokens_for_blog); // Housekeeping. + + foreach ($domain_mapping_variations as $_domain_mapping_variation) { + if ($_domain_mapping_variation['host_token'] === $current_host_token && $_domain_mapping_variation['host_base_dir_tokens'] === $current_host_base_dir_tokens) { + continue; // Exclude current tokens. They were already iterated above. + } + foreach ($this->forHostCache(true, $include_paths, true, $_domain_mapping_variation['host_token'], $_domain_mapping_variation['host_base_dir_tokens'])->stats as $_key => $_value) { + if (is_integer($_value) || is_float($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? $stats->{$_key} + $_value : $_value; + } elseif (is_array($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? array_merge($stats->{$_key}, $_value) : $_value; + } else { + throw new \Exception(__('Unexpected data type.', SLUG_TD)); + } + } + unset($_key, $_value); // Housekeeping. + } + unset($_domain_mapping_variation); // Housekeeping. + } + $stats = (object) array('stats' => $stats, 'time' => time()); + + if (!$___considering_domain_mapping) { + $this->updateHostCache($cache_key, $stats); + } + return $stats; + } + + /** + * HTML compressor cache directory stats for the current host. + * + * @since 15xxxx Adding cache directory statistics. + * + * @param bool $no_cache Do not read a cache entry? + * @param bool $include_paths Include array of all scanned file paths? + * + * @return \stdClass HTML compressor cache directory stats for the current host. + */ + public function forHtmlCHostCache($no_cache = false, $include_paths = false) + { + $cache_key = md5(__FUNCTION__.(integer) $include_paths); + + if (!$no_cache && ($cache = $this->getHostCache()) && isset($cache[$cache_key])) { + if (isset($cache[$cache_key]->stats, $cache[$cache_key]->time) && is_object($cache[$cache_key]->stats) + && $cache[$cache_key]->stats->total_resources > $this->plugin->options['dir_stats_auto_refresh_max_resources'] + && $cache[$cache_key]->time >= strtotime('-'.$this->plugin->options['dir_stats_refresh_time'])) { + return $cache[$cache_key]; // Cached stats. + } + } // Otherwise, we need to pull a fresh set of stats. + + $stats = new \stdClass(); // Initialize stats object instance. + + $host_token = $this->plugin->hostToken(true); // Dashify. + $host_base_dir_tokens = $this->plugin->hostBaseDirTokens(true); // Dashify. + + $htmlc_cache_dirs = array(); // Initialize array of all HTML Compressor directories to clear. + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_public.rtrim($host_base_dir_tokens, '/').'/'.$host_token); + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_private.rtrim($host_base_dir_tokens, '/').'/'.$host_token); + + if (is_multisite() && $this->plugin->canConsiderDomainMapping()) { + if (($_host_token_for_blog = $this->plugin->hostTokenForBlog(true))) { // Dashify. + $_host_base_dir_tokens_for_blog = $this->plugin->hostBaseDirTokensForBlog(true); // Dashify. + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_public.rtrim($_host_base_dir_tokens_for_blog, '/').'/'.$_host_token_for_blog); + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_private.rtrim($_host_base_dir_tokens_for_blog, '/').'/'.$_host_token_for_blog); + } + unset($_host_token_for_blog, $_host_base_dir_tokens_for_blog); // Housekeeping. + + foreach ($this->plugin->domainMappingBlogDomains() as $_domain_mapping_blog_domain) { + if (($_domain_host_token_for_blog = $this->plugin->hostTokenForBlog(true, true, $_domain_mapping_blog_domain))) { // Dashify. + $_domain_host_base_dir_tokens_for_blog = $this->plugin->hostBaseDirTokensForBlog(true, true); // Dashify. This is only a formality. + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_public.rtrim($_domain_host_base_dir_tokens_for_blog, '/').'/'.$_domain_host_token_for_blog); + $htmlc_cache_dirs[] = $this->plugin->wpContentBaseDirTo($this->plugin->htmlc_cache_sub_dir_private.rtrim($_domain_host_base_dir_tokens_for_blog, '/').'/'.$_domain_host_token_for_blog); + } + } + unset($_domain_mapping_blog_domain, $_domain_host_token_for_blog, $_domain_host_base_dir_tokens_for_blog); // Housekeeping. + } + foreach (array_unique($htmlc_cache_dirs) as $_htmlc_cache_dir) { + $_check_disk_stats = isset($stats->disk_total_space) ? false : true; + + foreach ($this->plugin->getDirRegexStats($_htmlc_cache_dir, '', $include_paths, $_check_disk_stats, true) as $_key => $_value) { + if (is_integer($_value) || is_float($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? $stats->{$_key} + $_value : $_value; + } elseif (is_array($_value)) { + $stats->{$_key} = isset($stats->{$_key}) ? array_merge($stats->{$_key}, $_value) : $_value; + } else { + throw new \Exception(__('Unexpected data type.', SLUG_TD)); + } + } + unset($_key, $_value); // Housekeeping. + } + unset($_htmlc_cache_dir, $_check_disk_stats); // Just a little housekeeping. + + $stats = (object) array('stats' => $stats, 'time' => time()); + + $this->updateHostCache($cache_key, $stats); + + return $stats; + } + + /** + * Largest cache size in last X days. + * + * @since 15xxxx Adding cache directory statistics. + * + * @param int $last_x_days Last X days (optional). + * + * @return \stdClass Largest cache size in last X days. + */ + public function largestCacheSize($last_x_days = null) + { + if (!is_integer($last_x_days) || $last_x_days <= 0) { + $last_x_days = max(1, $this->plugin->options['dir_stats_history_days']); + } + $largest_size = 0; // Initialize. + $largest_sizes = array(); // Initialize. + + $history_cache = $this->getHistoryCache(); + $history_max_age = strtotime('-'.$last_x_days.' days'); + + foreach ($this->allowed_history_cache_keys as $_key) { + if (empty($history_cache[$_key]) || !is_array($history_cache[$_key])) { + continue; // Not possible at this time. + } + $largest_sizes[$_key] = 0; // Initialize largest size for this key. + + foreach ($history_cache[$_key] as $_time => $_stats) { // Each time in this key. + if (!$_time || !isset($_stats->stats, $_stats->time) || !is_object($_stats->stats)) { + continue; // Not possible w/ these stats. + } + if ($_time >= $history_max_age && $_stats->time >= $history_max_age && isset($_stats->stats->total_size)) { + $largest_sizes[$_key] = max($largest_sizes[$_key], $_stats->stats->total_size); + } + } + $largest_size += $largest_sizes[$_key]; // Collectively. + } + unset($_key, $_time, $_stats); // Housekeeping. + + return (object) array('days' => $last_x_days, 'size' => $largest_size); + } + + /** + * Largest cache size in last X days. + * + * @since 15xxxx Adding cache directory statistics. + * + * @param int $last_x_days Last X days (optional). + * + * @return \stdClass Largest cache size in last X days. + */ + public function largestHostCacheSize($last_x_days = null) + { + if (!is_integer($last_x_days) || $last_x_days <= 0) { + $last_x_days = max(1, $this->plugin->options['dir_stats_history_days']); + } + $largest_size = 0; // Initialize. + $largest_sizes = array(); // Initialize. + + $host_history_cache = $this->getHostHistoryCache(); + $host_history_max_age = strtotime('-'.$last_x_days.' days'); + + foreach ($this->allowed_host_history_cache_keys as $_key) { + if (empty($host_history_cache[$_key]) || !is_array($host_history_cache[$_key])) { + continue; // Not possible at this time. + } + $largest_sizes[$_key] = 0; // Initialize largest size for this key. + + foreach ($host_history_cache[$_key] as $_time => $_stats) { // Each time in this key. + if (!$_time || !isset($_stats->stats, $_stats->time) || !is_object($_stats->stats)) { + continue; // Not possible w/ these stats. + } + if ($_time >= $host_history_max_age && $_stats->time >= $host_history_max_age && isset($_stats->stats->total_size)) { + $largest_sizes[$_key] = max($largest_sizes[$_key], $_stats->stats->total_size); + } + } + $largest_size += $largest_sizes[$_key]; // Collectively. + } + unset($_key, $_time, $_stats); // Housekeeping. + + return (object) array('days' => $last_x_days, 'size' => $largest_size); + } +} +/*[/pro]*/ diff --git a/src/includes/classes/MenuPageOptions.php b/src/includes/classes/MenuPageOptions.php index 8439af31..41fe56db 100644 --- a/src/includes/classes/MenuPageOptions.php +++ b/src/includes/classes/MenuPageOptions.php @@ -36,23 +36,23 @@ public function __construct() echo ' '."\n"; + ' '.__('Restore', SLUG_TD).' '."\n"; echo '
'."\n"; - echo ' '."\n"; - echo ' '."\n"; + echo ' '."\n"; + echo ' '."\n"; echo '
'."\n"; echo '
'."\n"; if (IS_PRO && current_user_can($this->plugin->update_cap)) { - echo ' '.__('Pro Updater', SLUG_TD).''."\n"; + echo ' '.__('Pro Updater', SLUG_TD).''."\n"; } if (!IS_PRO) { - echo ' '.__('Preview Pro Features', SLUG_TD).''."\n"; - echo ' '.__('Pro Upgrade', SLUG_TD).''."\n"; + echo ' '.__('Preview Pro Features', SLUG_TD).''."\n"; + echo ' '.__('Pro Upgrade', SLUG_TD).''."\n"; } - echo ' '.__('Newsletter', SLUG_TD).''."\n"; - echo ' '.__('Beta Testers', SLUG_TD).''."\n"; + echo ' '.__('Newsletter', SLUG_TD).''."\n"; + echo ' '.__('Beta Testers', SLUG_TD).''."\n"; echo '
'."\n"; echo ' '.esc_attr(__('Plugin Options', SLUG_TD)).''."\n"; @@ -67,12 +67,12 @@ public function __construct() if (!empty($_REQUEST[GLOBAL_NS.'_updated'])) { echo '
'."\n"; - echo ' '.__('Options updated successfully.', SLUG_TD)."\n"; + echo ' '.__('Options updated successfully.', SLUG_TD)."\n"; echo '
'."\n"; } if (!empty($_REQUEST[GLOBAL_NS.'_restored'])) { echo '
'."\n"; - echo ' '.__('Default options successfully restored.', SLUG_TD)."\n"; + echo ' '.__('Default options successfully restored.', SLUG_TD)."\n"; echo '
'."\n"; } if (!empty($_REQUEST[GLOBAL_NS.'_cache_wiped'])) { @@ -87,37 +87,37 @@ public function __construct() } if (!empty($_REQUEST[GLOBAL_NS.'_wp_config_wp_cache_add_failure'])) { echo '
'."\n"; - echo ' '.__('Failed to update your /wp-config.php file automatically. Please add the following line to your /wp-config.php file (right after the opening <?php tag; on it\'s own line).
<?php
define(\'WP_CACHE\', TRUE);
', SLUG_TD)."\n"; + echo ' '.__('Failed to update your /wp-config.php file automatically. Please add the following line to your /wp-config.php file (right after the opening <?php tag; on it\'s own line).
<?php
define(\'WP_CACHE\', TRUE);
', SLUG_TD)."\n"; echo '
'."\n"; } if (!empty($_REQUEST[GLOBAL_NS.'_wp_config_wp_cache_remove_failure'])) { echo '
'."\n"; - echo ' '.__('Failed to update your /wp-config.php file automatically. Please remove the following line from your /wp-config.php file, or set WP_CACHE to a FALSE value.
define(\'WP_CACHE\', TRUE);
', SLUG_TD)."\n"; + echo ' '.__('Failed to update your /wp-config.php file automatically. Please remove the following line from your /wp-config.php file, or set WP_CACHE to a FALSE value.
define(\'WP_CACHE\', TRUE);
', SLUG_TD)."\n"; echo '
'."\n"; } if (!empty($_REQUEST[GLOBAL_NS.'_advanced_cache_add_failure'])) { echo '
'."\n"; - if ($_REQUEST[GLOBAL_NS.'_advanced_cache_add_failure'] === 'zc-advanced-cache') { - echo ' '.sprintf(__('Failed to update your /wp-content/advanced-cache.php file. Cannot write stat file: %1$s/zc-advanced-cache. Please be sure this directory exists (and that it\'s writable): %1$s. Please use directory permissions 755 or higher (perhaps 777). Once you\'ve done this, please try again.', SLUG_TD), esc_html($this->plugin->cacheDir()))."\n"; + if ($_REQUEST[GLOBAL_NS.'_advanced_cache_add_failure'] === 'advanced-cache') { + echo ' '.sprintf(__('Failed to update your /wp-content/advanced-cache.php file. Cannot write stat file: %1$s/%2$s-advanced-cache. Please be sure this directory exists (and that it\'s writable): %1$s. Please use directory permissions 755 or higher (perhaps 777). Once you\'ve done this, please try again.', SLUG_TD), esc_html($this->plugin->cacheDir()), esc_html(strtolower(SHORT_NAME)))."\n"; } else { - echo ' '.__('Failed to update your /wp-content/advanced-cache.php file. Most likely a permissions error. Please create an empty file here: /wp-content/advanced-cache.php (just an empty PHP file, with nothing in it); give it permissions 644 or higher (perhaps 666). Once you\'ve done this, please try again.', SLUG_TD)."\n"; + echo ' '.__('Failed to update your /wp-content/advanced-cache.php file. Most likely a permissions error. Please create an empty file here: /wp-content/advanced-cache.php (just an empty PHP file, with nothing in it); give it permissions 644 or higher (perhaps 666). Once you\'ve done this, please try again.', SLUG_TD)."\n"; } echo '
'."\n"; } if (!empty($_REQUEST[GLOBAL_NS.'_advanced_cache_remove_failure'])) { echo '
'."\n"; - echo ' '.__('Failed to remove your /wp-content/advanced-cache.php file. Most likely a permissions error. Please delete (or empty the contents of) this file: /wp-content/advanced-cache.php.', SLUG_TD)."\n"; + echo ' '.__('Failed to remove your /wp-content/advanced-cache.php file. Most likely a permissions error. Please delete (or empty the contents of) this file: /wp-content/advanced-cache.php.', SLUG_TD)."\n"; echo '
'."\n"; } if (!IS_PRO && $this->plugin->isProPreview()) { echo '
'."\n"; - echo ''.__('close', SLUG_TD).' '."\n"; - echo ' '.sprintf(__('Pro Features (Preview) ~ New option panels below. Please explore before upgrading .
NOTE: the free version of %1$s (this lite version) is more-than-adequate for most sites. Please upgrade only if you desire advanced features or would like to support the developer.', SLUG_TD), esc_html(NAME))."\n"; + echo ''.__('close', SLUG_TD).' '."\n"; + echo ' '.sprintf(__('Pro Features (Preview) ~ New option panels below. Please explore before upgrading .
NOTE: the free version of %1$s (this lite version) is more-than-adequate for most sites. Please upgrade only if you desire advanced features or would like to support the developer.', SLUG_TD), esc_html(NAME))."\n"; echo '
'."\n"; } if (!$this->plugin->options['enable']) { echo '
'."\n"; - echo ' '.sprintf(__('%1$s is currently disabled; please review options below.', SLUG_TD), esc_html(NAME))."\n"; + echo ' '.sprintf(__('%1$s is currently disabled; please review options below.', SLUG_TD), esc_html(NAME))."\n"; echo '
'."\n"; } /* ----------------------------------------------------------------------------------------- */ @@ -136,20 +136,20 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Enable/Disable', SLUG_TD)."\n"; + echo ' '.__('Enable/Disable', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; echo ' '."\n"; echo '

'.sprintf(__('%1$s™ = SPEED!!', SLUG_TD), esc_html(NAME)).'

'."\n"; - echo '

   

'."\n"; - echo '

'.sprintf(__('HUGE Time-Saver: Approx. 95%% of all WordPress sites running %1$s, simply enable it here; and that\'s it :-) No further configuration is necessary (really). All of the other options (down below) are already tuned for the BEST performance on a typical WordPress installation. Simply enable %1$s here and click "Save All Changes". If you get any warnings please follow the instructions given. Otherwise, you\'re good . This plugin is designed to run just fine like it is. Take it for a spin right away; you can always fine-tune things later if you deem necessary.', SLUG_TD), esc_html(NAME)).'

'."\n"; + echo '

   

'."\n"; + echo '

'.sprintf(__('HUGE Time-Saver: Approx. 95%% of all WordPress sites running %1$s, simply enable it here; and that\'s it :-) No further configuration is necessary (really). All of the other options (down below) are already tuned for the BEST performance on a typical WordPress installation. Simply enable %1$s here and click "Save All Changes". If you get any warnings please follow the instructions given. Otherwise, you\'re good . This plugin is designed to run just fine like it is. Take it for a spin right away; you can always fine-tune things later if you deem necessary.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '
'."\n"; echo ' '."\n"; echo '

'.sprintf(__('How Can I Tell %1$s is Working?', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'.sprintf(__('First of all, please make sure that you\'ve enabled %1$s here; then scroll down to the bottom of this page and click "Save All Changes". All of the other options (below) are already pre-configured for typical usage. Feel free to skip them all for now. You can go back through all of these later and fine-tune things the way you like them.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'.sprintf(__('Once %1$s has been enabled, you\'ll need to log out (and/or clear browser cookies). By default, cache files are NOT served to visitors who are logged-in, and that includes you too ;-) Cache files are NOT served to recent comment authors either. If you\'ve commented (or replied to a comment lately); please clear your browser cookies before testing.', SLUG_TD), esc_html(NAME)).'

'."\n"; - echo '

'.sprintf(__('To verify that %1$s is working, navigate your site like a normal visitor would. Right-click on any page (choose View Source), then scroll to the very bottom of the document. At the bottom, you\'ll find comments that show %1$s stats and information. You should also notice that page-to-page navigation is lightning fast now that %1$s is running; and it gets faster over time!', SLUG_TD), esc_html(NAME)).'

'."\n"; + echo '

'.sprintf(__('To verify that %1$s is working, navigate your site like a normal visitor would. Right-click on any page (choose View Source), then scroll to the very bottom of the document. At the bottom, you\'ll find comments that show %1$s stats and information. You should also notice that page-to-page navigation is lightning fast now that %1$s is running; and it gets faster over time!', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'."\n"; @@ -191,7 +191,7 @@ public function __construct() echo '

'."\n"; echo ' '."\n"; - echo ' '.__('Clearing the Cache', SLUG_TD)."\n"; + echo ' '.__('Clearing the Cache', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; @@ -311,7 +311,7 @@ public function __construct() echo ' '."\n"; echo ' '."\n"; echo '

'."\n"; - echo '

   '.__('XML Sitemap Patterns... A default value of /sitemap*.xml covers all XML Sitemaps for most installations. However, you may customize this further if you deem necessary. One pattern per line please. A wildcard * matches zero or more characters. Searches are performed against the REQUEST_URI; e.g. a request for /sitemap.xml and/or /sitemap-xyz.xml are both matched by the pattern: /sitemap*.xml. If your XML Sitemap was located inside a sub-directory; e.g. /my/sitemaps/xyz.xml; you might add the following pattern on a new line: /my/sitemaps/*.xml', SLUG_TD).'

'."\n"; + echo '

   '.__('XML Sitemap Patterns... A default value of /sitemap*.xml covers all XML Sitemaps for most installations. However, you may customize this further if you deem necessary. One pattern per line please. A wildcard * matches zero or more characters. Searches are performed against the REQUEST_URI; e.g. a request for /sitemap.xml and/or /sitemap-xyz.xml are both matched by the pattern: /sitemap*.xml. If your XML Sitemap was located inside a sub-directory; e.g. /my/sitemaps/xyz.xml; you might add the following pattern on a new line: /my/sitemaps/*.xml', SLUG_TD).'

'."\n"; echo '

'."\n"; if (is_multisite()) { echo '

'.__('In a Multisite Network, each child blog (whether it be a sub-domain, a sub-directory, or a mapped domain); will automatically change the leading http://[sub.]domain/[sub-directory] used in pattern matching. In short, there is no need to add sub-domains or sub-directories for each child blog in these patterns. Please include only the REQUEST_URI (i.e. the path) which leads to the XML Sitemap on all child blogs in the network.', SLUG_TD).'

'."\n"; @@ -325,7 +325,7 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Directory / Expiration Time', SLUG_TD)."\n"; + echo ' '.__('Directory / Expiration Time', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; @@ -333,11 +333,11 @@ public function __construct() echo '

'.sprintf(__('This is where %1$s will store the cached version of your site. If you\'re not sure how to deal with directory permissions, don\'t worry too much about this. If there is a problem, %1$s will let you know about it. By default, this directory is created by %1$s and the permissions are setup automatically. In most cases there is nothing more you need to do.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '
'.esc_html(WP_CONTENT_DIR).'//
'."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.__('Automatic Expiration Time (Max Age)', SLUG_TD).'

'."\n"; echo '

'.__('If you don\'t update your site much, you could set this to 6 months and optimize everything even further. The longer the Cache Expiration Time is, the greater your performance gain. Alternatively, the shorter the Expiration Time, the fresher everything will remain on your site. A default value of 7 days (recommended); is a good conservative middle-ground.', SLUG_TD).'

'."\n"; echo '

'.sprintf(__('Keep in mind that your Expiration Time is only one part of the big picture. %1$s will also clear the cache automatically as changes are made to the site (i.e. you edit a post, someone comments on a post, you change your theme, you add a new navigation menu item, etc., etc.). Thus, your Expiration Time is really just a fallback; e.g. the maximum amount of time that a cache file could ever possibly live.', SLUG_TD), esc_html(NAME)).'

'."\n"; - echo '

'.sprintf(__('All of that being said, you could set this to just 60 seconds and you would still see huge differences in speed and performance. If you\'re just starting out with %1$s (perhaps a bit nervous about old cache files being served to your visitors); you could set this to something like 30 minutes, and experiment with it while you build confidence in %1$s. It\'s not necessary to do so, but many site owners have reported this makes them feel like they\'re more-in-control when the cache has a short expiration time. All-in-all, it\'s a matter of preference .', SLUG_TD), esc_html(NAME)).'

'."\n"; + echo '

'.sprintf(__('All of that being said, you could set this to just 60 seconds and you would still see huge differences in speed and performance. If you\'re just starting out with %1$s (perhaps a bit nervous about old cache files being served to your visitors); you could set this to something like 30 minutes, and experiment with it while you build confidence in %1$s. It\'s not necessary to do so, but many site owners have reported this makes them feel like they\'re more-in-control when the cache has a short expiration time. All-in-all, it\'s a matter of preference .', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'."\n"; echo '

'.__('Tip: the value that you specify here MUST be compatible with PHP\'s strtotime() function. Examples: 30 seconds, 2 hours, 7 days, 6 months, 1 year.', SLUG_TD).'

'."\n"; echo '

'.sprintf(__('Note: %1$s will never serve a cache file that is older than what you specify here (even if one exists in your cache directory; stale cache files are never used). In addition, a WP Cron job will automatically cleanup your cache directory (once daily); purging expired cache files periodically. This prevents a HUGE cache from building up over time, creating a potential storage issue.', SLUG_TD), esc_html(NAME)).'

'."\n"; @@ -350,11 +350,11 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Client-Side Cache', SLUG_TD)."\n"; + echo ' '.__('Client-Side Cache', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.__('Allow Double-Caching In The Client-Side Browser?', SLUG_TD).'

'."\n"; echo '

'.__('Recommended setting: No (for membership sites, very important). Otherwise, Yes would be better (if users do NOT log in/out of your site).', SLUG_TD).'

'."\n"; echo '

'.sprintf(__('%1$s handles content delivery through its ability to communicate with a browser using PHP. If you allow a browser to (cache) the caching system itself, you are momentarily losing some control; and this can have a negative impact on users that see more than one version of your site; e.g. one version while logged-in, and another while NOT logged-in. For instance, a user may log out of your site, but upon logging out they report seeing pages on the site which indicate they are STILL logged in (even though they\'re not — that\'s bad). This can happen if you allow a client-side cache, because their browser may cache web pages they visited while logged into your site which persist even after logging out. Sending no-cache headers will work to prevent this issue.', SLUG_TD), esc_html(NAME)).'

'."\n"; @@ -376,14 +376,14 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Logged-In Users', SLUG_TD)."\n"; + echo ' '.__('Logged-In Users', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.__('Caching Enabled for Logged-In Users & Comment Authors?', SLUG_TD).'

'."\n"; echo '

'.__('This should almost ALWAYS be set to No. Most sites will NOT want to cache content generated while a user is logged-in. Doing so could result in a cache of dynamic content generated specifically for a particular user, where the content being cached may contain details that pertain only to the user that was logged-in when the cache was generated. Imagine visiting a website that says you\'re logged-in as Billy Bob (but you\'re not Billy Bob; NOT good). In short, do NOT turn this on unless you know what you\'re doing.', SLUG_TD).'

'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.sprintf(__('Exception (Membership Sites): If you run a site with many users and the majority of your traffic comes from users who ARE logged-in, please choose: Yes (maintain separate cache). %1$s will operate normally; but when a user is logged-in, the cache is user-specific. %1$s will intelligently refresh the cache when/if a user submits a form on your site with the GET or POST method. Or, if you make changes to their account (or another plugin makes changes to their account); including user option|meta additions, updates & deletions too. However, please note that enabling this feature (e.g. user-specific cache entries); will eat up MUCH more disk space. That being said, the benefits of this feature for most sites will outweigh the disk overhead (e.g. it\'s NOT an issue in most cases). Unless you are short on disk space (or you have MANY thousands of users), the disk overhead is neglible.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'."\n"; @@ -423,11 +423,11 @@ public function __construct() echo '

'."\n"; echo ' '."\n"; - echo ' '.__('404 Requests', SLUG_TD)."\n"; + echo ' '.__('404 Requests', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.__('Caching Enabled for 404 Requests?', SLUG_TD).'

'."\n"; echo '

'.sprintf(__('When this is set to No, %1$s will ignore all 404 requests and no cache file will be served. While this is fine for most site owners, caching the 404 page on a high-traffic site may further reduce server load. When this is set to Yes, %1$s will cache the 404 page (see Creating an Error 404 Page) and then serve that single cache file to all future 404 requests.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'."\n"; @@ -466,7 +466,7 @@ public function __construct() echo '

'."\n"; echo ' '."\n"; - echo ' '.__('URI Exclusion Patterns', SLUG_TD)."\n"; + echo ' '.__('URI Exclusion Patterns', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; @@ -484,7 +484,7 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('HTTP Referrer Exclusion Patterns', SLUG_TD)."\n"; + echo ' '.__('HTTP Referrer Exclusion Patterns', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; @@ -502,7 +502,7 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('User-Agent Exclusion Patterns', SLUG_TD)."\n"; + echo ' '.__('User-Agent Exclusion Patterns', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; @@ -521,11 +521,11 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Auto-Cache Engine', SLUG_TD)."\n"; + echo ' '.__('Auto-Cache Engine', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.__('Enable the Auto-Cache Engine?', SLUG_TD).'

'."\n"; echo '

'.sprintf(__('After using %1$s for awhile (or any other page caching plugin, for that matter); it becomes obvious that at some point (based on your configured Expiration Time) %1$s has to refresh itself. It does this by ditching its cached version of a page, reloading the database-driven content, and then recreating the cache with the latest data. This is a never ending regeneration cycle that is based entirely on your configured Expiration Time.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'.__('Understanding this, you can see that 99% of your visitors are going to receive a lightning fast response from your server. However, there will always be around 1% of your visitors that land on a page for the very first time (before it\'s been cached), or land on a page that needs to have its cache regenerated, because the existing cache has become outdated. We refer to this as a First-Come Slow-Load Issue. Not a huge problem, but if you\'re optimizing your site for every ounce of speed possible, the Auto-Cache Engine can help with this. The Auto-Cache Engine has been designed to combat this issue by taking on the responsibility of being that first visitor to a page that has not yet been cached, or has an expired cache. The Auto-Cache Engine is powered, in part, by WP-Cron (already built into WordPress). The Auto-Cache Engine runs at 15-minute intervals via WP-Cron. It also uses the WP_Http class, which is also built into WordPress already.', SLUG_TD).'

'."\n"; @@ -562,11 +562,11 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('HTML Compression', SLUG_TD)."\n"; + echo ' '.__('HTML Compression', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.__('Enable WebSharks™ HTML Compression?', SLUG_TD).'

'."\n"; echo '

'.__('This is an experimental feature, however it offers a potentially HUGE speed boost. You can learn more here. Please use with caution.', SLUG_TD).'

'."\n"; echo '

'."\n"; @@ -810,7 +810,7 @@ public function __construct() echo '

'.sprintf(__('Export Existing Options from this %1$s Installation?', SLUG_TD), esc_html(NAME)).'

'."\n"; echo ' '."\n"; + ' '.sprintf(__('%1$s-options.json', SLUG_TD), GLOBAL_NS).' '."\n"; echo '

'.sprintf(__('Download your existing options and import them all into another %1$s installation; saves time on future installs.', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '
'."\n"; @@ -819,7 +819,7 @@ public function __construct() /* ----------------------------------------------------------------------------------------- */ echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '
'."\n"; /* ----------------------------------------------------------------------------------------- */ diff --git a/src/includes/classes/MenuPageProUpdater.php b/src/includes/classes/MenuPageProUpdater.php index a05d0017..89fa41d2 100644 --- a/src/includes/classes/MenuPageProUpdater.php +++ b/src/includes/classes/MenuPageProUpdater.php @@ -25,19 +25,19 @@ public function __construct() echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; - echo ' '."\n"; + echo ' '."\n"; + echo ' '."\n"; echo '
'."\n"; echo '
'."\n"; if (current_user_can($this->plugin->cap)) { - echo ' '.__('Options', SLUG_TD).''."\n"; + echo ' '.__('Options', SLUG_TD).''."\n"; } - echo ' '.__('Newsletter', SLUG_TD).''."\n"; - echo ' '.__('Beta Testers', SLUG_TD).''."\n"; + echo ' '.__('Newsletter', SLUG_TD).''."\n"; + echo ' '.__('Beta Testers', SLUG_TD).''."\n"; echo '
'."\n"; echo ' '.esc_attr(__('Pro Plugin Updater', SLUG_TD)).''."\n"; @@ -52,7 +52,7 @@ public function __construct() if (!empty($_REQUEST[GLOBAL_NS.'_error'])) { echo '
'."\n"; - echo ' '.esc_html(stripslashes((string) $_REQUEST[GLOBAL_NS.'_error']))."\n"; + echo ' '.esc_html(stripslashes((string) $_REQUEST[GLOBAL_NS.'_error']))."\n"; echo '
'."\n"; } /* ----------------------------------------------------------------------------------------- */ @@ -64,13 +64,13 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Update Credentials', SLUG_TD)."\n"; + echo ' '.__('Update Credentials', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.sprintf(__('%1$s™ Authentication', SLUG_TD), esc_html(NAME)).'

'."\n"; - echo '

'.sprintf(__('From this page you can update to the latest version of %1$s Pro for WordPress. %1$s Pro is a premium product available for purchase @ zencache.com. In order to connect with our update servers, we ask that you supply your account login details for zencache.com. If you prefer not to provide your password, you can use your License Key in place of your password. Your License Key is located under "My Account" when you log in @ zencache.com. This will authenticate your copy of %1$s Pro; providing you with access to the latest version. You only need to enter these credentials once. %1$s Pro will save them in your WordPress database; making future upgrades even easier. ', SLUG_TD), esc_html(NAME)).'

'."\n"; + echo '

'.sprintf(__('From this page you can update to the latest version of %1$s Pro for WordPress. %1$s Pro is a premium product available for purchase @ zencache.com. In order to connect with our update servers, we ask that you supply your account login details for zencache.com. If you prefer not to provide your password, you can use your License Key in place of your password. Your License Key is located under "My Account" when you log in @ zencache.com. This will authenticate your copy of %1$s Pro; providing you with access to the latest version. You only need to enter these credentials once. %1$s Pro will save them in your WordPress database; making future upgrades even easier. ', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '
'."\n"; echo '

'.sprintf(__('Customer Username', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'."\n"; @@ -85,11 +85,11 @@ public function __construct() echo '
'."\n"; echo ' '."\n"; - echo ' '.__('Update Notifier', SLUG_TD)."\n"; + echo ' '.__('Update Notifier', SLUG_TD)."\n"; echo ' '."\n"; echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '

'.sprintf(__('%1$s™ Update Notifier', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '

'.sprintf(__('When a new version of %1$s Pro becomes available, %1$s Pro can display a notification in your WordPress Dashboard prompting you to return to this page and perform an upgrade. Would you like this functionality enabled or disabled?', SLUG_TD), esc_html(NAME)).'

'."\n"; echo '
'."\n"; @@ -104,7 +104,7 @@ public function __construct() /* ----------------------------------------------------------------------------------------- */ echo '
'."\n"; - echo ' '."\n"; + echo ' '."\n"; echo '
'."\n"; /* ----------------------------------------------------------------------------------------- */ diff --git a/src/includes/classes/Plugin.php b/src/includes/classes/Plugin.php index bc39eb1f..8c50abe0 100644 --- a/src/includes/classes/Plugin.php +++ b/src/includes/classes/Plugin.php @@ -203,7 +203,9 @@ public function setup() 'dir_stats_enable', 'dir_stats_admin_bar_enable', + 'dir_stats_auto_refresh_max_resources', 'dir_stats_refresh_time', + 'dir_stats_history_days', 'pro_update_check', 'latest_pro_version', @@ -329,9 +331,11 @@ public function setup() /* Related to cache directory statistics. */ - 'dir_stats_enable' => is_multisite() ? '0' : '1', // `0|1`; enable? - 'dir_stats_admin_bar_enable' => '1', // `0|1`; enable stats in admin bar? - 'dir_stats_refresh_time' => '15 minutes', // `strtotime()` compatible. + 'dir_stats_enable' => is_multisite() ? '0' : '1', // `0|1`; enable? + 'dir_stats_admin_bar_enable' => '1', // `0|1`; enable stats in admin bar? + 'dir_stats_auto_refresh_max_resources' => '1500', // Don't use cache if less than this. + 'dir_stats_refresh_time' => '15 minutes', // `strtotime()` compatible. + 'dir_stats_history_days' => '30', // Numeric; number of days. /* Related to automatic pro updates. */ @@ -476,7 +480,7 @@ public function setup() /*[/pro]*/ $this->updateOptions(array('crons_setup' => time().'-'.__NAMESPACE__)); } - add_action('_cron_'.GLOBAL_NS.'_cleanup', array($this, 'purgeCacheDir')); + add_action('_cron_'.GLOBAL_NS.'_cleanup', array($this, 'cleanupCache')); /*[pro strip-from="lite"]*/ // Auto-cache engine. add_action('_cron_'.GLOBAL_NS.'_auto_cache', array($this, 'autoCache')); diff --git a/src/includes/classes/VsUpgrades.php b/src/includes/classes/VsUpgrades.php index b6a44db3..0199176d 100644 --- a/src/includes/classes/VsUpgrades.php +++ b/src/includes/classes/VsUpgrades.php @@ -60,7 +60,7 @@ protected function fromLt110523() delete_site_option('ws_plugin__qcache_configured'); if (is_multisite()) { // Main site CRON jobs. - switch_to_blog($GLOBALS['current_site']->blog_id); + switch_to_blog(get_current_site()->blog_id); wp_clear_scheduled_hook('ws_plugin__qcache_garbage_collector__schedule'); wp_clear_scheduled_hook('ws_plugin__qcache_auto_cache_engine__schedule'); restore_current_blog(); // Restore. @@ -194,7 +194,7 @@ protected function fromQuickCache() delete_site_option('quick_cache_options'); if (is_multisite()) { // Main site CRON jobs. - switch_to_blog($GLOBALS['current_site']->blog_id); + switch_to_blog(get_current_site()->blog_id); wp_clear_scheduled_hook('_cron_quick_cache_auto_cache'); wp_clear_scheduled_hook('_cron_quick_cache_cleanup'); restore_current_blog(); // Restore. @@ -246,6 +246,7 @@ protected function fromLte150807() delete_site_option(GLOBAL_NS.'_errors'); // No longer necessary. if (is_multisite() && is_array($child_blogs = wp_get_sites())) { + $current_site = get_current_site(); // Current site. foreach ($child_blogs as $_child_blog) { switch_to_blog($_child_blog['blog_id']); @@ -254,7 +255,7 @@ protected function fromLte150807() delete_option(GLOBAL_NS.'_options'); delete_option(GLOBAL_NS.'_apc_warning_bypass'); - if ((integer) $_child_blog['blog_id'] !== (integer) $GLOBALS['current_site']->blog_id) { + if ((integer) $_child_blog['blog_id'] !== (integer) $current_site->blog_id) { wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_auto_cache'); wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_cleanup'); } diff --git a/src/includes/closures/Ac/PostloadUtils.php b/src/includes/closures/Ac/PostloadUtils.php index 9c3cd702..9b78f9f3 100644 --- a/src/includes/closures/Ac/PostloadUtils.php +++ b/src/includes/closures/Ac/PostloadUtils.php @@ -122,17 +122,8 @@ if (!$self->isLikeUserLoggedIn()) { return; // Nothing to do. } - if (!empty($_REQUEST[GLOBAL_NS]['wipeCache'])) { - return; // Site owner is clearing cache now. - } - if (!empty($_REQUEST[GLOBAL_NS]['clearCache'])) { - return; // Site owner is clearing cache now. - } - if (!empty($_REQUEST[GLOBAL_NS]['ajaxWipeCache'])) { - return; // Site owner is clearing cache now. - } - if (!empty($_REQUEST[GLOBAL_NS]['ajaxClearCache'])) { - return; // Site owner is clearing cache now. + if (!empty($_REQUEST[GLOBAL_NS])) { + return; // Plugin action. } if ($self->isPostPutDeleteRequest() || $self->isUncacheableRequestMethod()) { $self->postload['invalidate_when_logged_in'] = true; @@ -159,7 +150,7 @@ return; // Nothing to do in this case. } $regex = $self->buildCachePathRegex('', '.*?\.u\/'.preg_quote($self->user_token, '/').'[.\/]'); - $self->clearFilesFromCacheDir($regex); // Clear matching files. + $self->wipeFilesFromCacheDir($regex); // Wipe matching files. }; /*[/pro]*/ diff --git a/src/includes/closures/Plugin/AdminBarUtils.php b/src/includes/closures/Plugin/AdminBarUtils.php index f506dabe..73f1b8d3 100644 --- a/src/includes/closures/Plugin/AdminBarUtils.php +++ b/src/includes/closures/Plugin/AdminBarUtils.php @@ -2,8 +2,6 @@ /*[pro strip-from="lite"]*/ namespace WebSharks\ZenCache\Pro; -// @TODO Cache file count meter. - /* * Filter WordPress admin bar. * @@ -24,53 +22,95 @@ return; // Nothing to do. } if (is_multisite() && current_user_can($self->network_cap)) { - $wp_admin_bar->add_node( + $wp_admin_bar->add_menu( array( 'parent' => 'top-secondary', 'id' => GLOBAL_NS.'-wipe', - 'title' => __('Wipe', SLUG_TD), - 'href' => '#', - 'meta' => array( + + 'title' => __('Wipe', SLUG_TD), + 'href' => '#', + + 'meta' => array( 'title' => __('Wipe Cache (Start Fresh). Clears the cache for all sites in this network at once!', SLUG_TD), - 'class' => GLOBAL_NS, + 'class' => '-wipe', 'tabindex' => -1, ), ) ); } if (!is_multisite() || !is_network_admin()) { - $wp_admin_bar->add_node( + $wp_admin_bar->add_menu( array( 'parent' => 'top-secondary', 'id' => GLOBAL_NS.'-clear', - 'title' => __('Clear Cache', SLUG_TD), 'href' => '#', - 'meta' => array( + + 'title' => __('Clear Cache', SLUG_TD), + 'href' => '#', + 'meta' => array( 'title' => is_multisite() && current_user_can($self->network_cap) ? __('Clear Cache (Start Fresh). Affects the current site only.', SLUG_TD) : __('Clear Cache (Start Fresh)', SLUG_TD), - 'class' => GLOBAL_NS, + 'class' => '-clear', 'tabindex' => -1, ), ) ); } - if ($self->options['dir_stats_admin_bar_enable']) { - // Build the miniature directory stats graph. - // Goes into an `` tag, so these need to be inline tags. - $stats = ''; // Primary container. - $stats .= ''; - $stats .= ''; - $stats .= ''; // Close container. - - $wp_admin_bar->add_node( + if ($self->options['dir_stats_enable'] && $self->options['dir_stats_admin_bar_enable']) { + $wp_admin_bar->add_menu( array( 'parent' => 'top-secondary', 'id' => GLOBAL_NS.'-dir-stats', - 'title' => $stats, - 'href' => '#', - 'meta' => array( - 'title' => __('Cache directory statistics.', SLUG_TD), - 'class' => GLOBAL_NS, + + 'title' => __('Cache Stats', SLUG_TD), + 'href' => '#', + + 'meta' => array( + 'title' => __('Cache statistics.', SLUG_TD), + 'class' => '-stats', + 'tabindex' => -1, + ), + ) + ); + $wp_admin_bar->add_group( + array( + 'parent' => GLOBAL_NS.'-dir-stats', + 'id' => GLOBAL_NS.'-dir-stats-wrapper', + + 'meta' => array( + 'class' => '-wrapper', + ), + ) + ); + $wp_admin_bar->add_menu( + array( + 'parent' => GLOBAL_NS.'-dir-stats-wrapper', + 'id' => GLOBAL_NS.'-dir-stats-container', + + 'title' => '
'. + + ''. + + '
'. + '
'.__('Current Cache Totals', SLUG_TD).'
'. + '
 
'. + '
 
'. + '
'. + + '
'. + '
'.__('Current Disk Health', SLUG_TD).'
'. + '
  '.__('total capacity', SLUG_TD).'
'. + '
  '.__('available', SLUG_TD).'
'. + '
'. + + '
'. + + '
', + + 'meta' => array( + 'class' => '-container', 'tabindex' => -1, ), ) @@ -96,8 +136,19 @@ return; // Nothing to do. } $vars = array( - '_wpnonce' => wp_create_nonce(), // For security. - 'ajaxURL' => site_url('/wp-load.php', is_ssl() ? 'https' : 'http'), + '_wpnonce' => wp_create_nonce(), + 'isMultisite' => is_multisite(), // Network? + 'currentUserHasNetworkCap' => current_user_can($self->network_cap), + 'ajaxURL' => site_url('/wp-load.php', is_ssl() ? 'https' : 'http'), + 'i18n' => array( + 'name' => NAME, + 'file' => __('file', SLUG_TD), + 'files' => __('files', SLUG_TD), + 'pageCache' => __('Page Cache', SLUG_TD), + 'htmlCompressor' => __('HTML Compressor', SLUG_TD), + 'currentTotalSize' => __('Current Total Size', SLUG_TD), + 'xDayHigh' => __('%s Day High', SLUG_TD), + ), ); echo ''."\n"; @@ -144,8 +195,12 @@ if (!current_user_can($self->cap) || !is_admin_bar_showing()) { return; // Nothing to do. } - $deps = array('jquery'); // Plugin dependencies. + $deps = array('jquery', 'admin-bar'); // Plugin dependencies. + if ($self->options['dir_stats_enable'] && $self->options['dir_stats_admin_bar_enable']) { + $deps[] = 'chartjs'; // Add ChartJS dependency. + wp_enqueue_script('chartjs', set_url_scheme('//cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js'), array(), null, true); + } wp_enqueue_script(GLOBAL_NS.'-admin-bar', $self->url('/src/client-s/js/admin-bar.js'), $deps, VERSION, true); }; /*[/pro]*/ diff --git a/src/includes/closures/Plugin/AutoCacheUtils.php b/src/includes/closures/Plugin/AutoCacheUtils.php index 8de477fa..e670ece1 100644 --- a/src/includes/closures/Plugin/AutoCacheUtils.php +++ b/src/includes/closures/Plugin/AutoCacheUtils.php @@ -3,11 +3,11 @@ namespace WebSharks\ZenCache\Pro; /* - * Runs the auto-cache engine. + * Runs the auto-cache engine via CRON job. * * @since 150422 Rewrite. * - * @attaches-to `_cron_zencache_auto_cache` hook. + * @attaches-to `_cron_'.__GLOBAL_NS__.'_auto_cache` */ $self->autoCache = function () use ($self) { if (!$self->options['enable']) { diff --git a/src/includes/closures/Plugin/CacheDirStatUtils.php b/src/includes/closures/Plugin/CacheDirStatUtils.php deleted file mode 100644 index cc12f540..00000000 --- a/src/includes/closures/Plugin/CacheDirStatUtils.php +++ /dev/null @@ -1,304 +0,0 @@ - - */ -$self->statsForCacheDir = function ($no_cache = false, $include_paths = false) use ($self) { - if (!$no_cache) { // Allow a cached set of stats? - $site_option_cache_key = GLOBAL_NS.'_dir_stats_'; // Identifying prefix. - $site_option_cache_key .= md5('statsForCacheDir'.(integer) $include_paths); - - if (is_array($cached = get_site_option($site_option_cache_key)) // Cache exists? - && isset($cached['stats'], $cached['time']) && is_array($cached['stats']) - && $cached['time'] >= strtotime('-'.$self->options['dir_stats_refresh_time'])) { - return $cached['stats']; // Return cached stats. - } - } // Otherwise, we need to pull a fresh set of stats. - $stats = $self->getDirRegexStats($self->cacheDir(), '', $include_paths, true, true); - - if (!$no_cache && !empty($site_option_cache_key)) { // Cache these stats? - update_site_option($site_option_cache_key, array('stats' => $stats, 'time' => time())); - } - return $stats; -}; - -/* - * HTML compressor cache directory stats. - * - * @since 15xxxx Adding cache directory statistics. - * - * @param boolean $no_cache Do not read or write a cache entry? - * @param boolean $include_paths Include array of all scanned file paths? - * - * @return array HTML compressor cache directory stats. - * - * @TODO Optimize this for multisite networks w/ a LOT of child blogs. - * @TODO Optimize this for extremely large sites. A LOT of files here could slow things down. - * See also: - */ -$self->statsForHtmlCCacheDirs = function ($no_cache = false, $include_paths = false) use ($self) { - if (!$no_cache) { // Allow a cached set of stats? - $site_option_cache_key = GLOBAL_NS.'_dir_stats_'; // Identifying prefix. - $site_option_cache_key .= md5('statsForHtmlCCacheDirs'.(integer) $include_paths); - - if (is_array($cached = get_site_option($site_option_cache_key)) // Cache exists? - && isset($cached['stats'], $cached['time']) && is_array($cached['stats']) - && $cached['time'] >= strtotime('-'.$self->options['dir_stats_refresh_time'])) { - return $cached['stats']; // Return cached stats. - } - } // Otherwise, we need to pull a fresh set of stats. - - $stats = array(); // Initialize stats array. - - $htmlc_cache_dirs = array(); // Initialize array directories. - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_public); - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_private); - - foreach (array_unique($htmlc_cache_dirs) as $_htmlc_cache_dir) { - $_check_disk_stats = $stats ? false : true; - - foreach ($self->getDirRegexStats($_htmlc_cache_dir, '', $include_paths, $_check_disk_stats, true) as $_key => $_value) { - $stats[$_key] = isset($stats[$_key]) ? $stats[$_key] + $_value : $_value; - } - unset($_key, $_value); // Housekeeping. - } - unset($_htmlc_cache_dir); // Final housekeeping. - - if (!$no_cache && !empty($site_option_cache_key)) { // Cache these stats? - update_site_option($site_option_cache_key, array('stats' => $stats, 'time' => time())); - } - return $stats; -}; - -/* - * Cache directory stats for the current host. - * - * @since 15xxxx Adding cache directory statistics. - * - * @param boolean $no_cache Do not read or write a cache entry? - * - * @param boolean $___considering_domain_mapping For internal use only. - * @param boolean $___consider_domain_mapping_host_token For internal use only. - * @param boolean $___consider_domain_mapping_host_base_dir_tokens For internal use only. - * - * @return array Cache directory stats for the current host. - */ -$self->statsForHostCacheDir = function ( - $no_cache = false, - $___considering_domain_mapping = false, - $___consider_domain_mapping_host_token = null, - $___consider_domain_mapping_host_base_dir_tokens = null -) use ($self) { - - if (!$no_cache) { // Allow a cached set of stats? - if (is_multisite()) { - $site_option_cache_key = GLOBAL_NS.'_dir_stats_'; // Identifying prefix. - } else { - $site_option_cache_key = GLOBAL_NS.'_dir_stats_'; // Identifying prefix. - } - $site_option_cache_key .= md5('statsForHostCacheDir'.(integer) $include_paths); - - if (is_array($cached = get_site_option($site_option_cache_key)) // Cache exists? - && isset($cached['stats'], $cached['time']) && is_array($cached['stats']) - && $cached['time'] >= strtotime('-'.$self->options['dir_stats_refresh_time'])) { - return $cached['stats']; // Return cached stats. - } - } // Otherwise, we need to pull a fresh set of stats. - - $cache_dir = $self->nDirSeps($cache_dir); // Normalize. - $host_token = $current_host_token = $self->hostToken(); - $host_base_dir_tokens = $current_host_base_dir_tokens = $self->hostBaseDirTokens(); - - if ($___considering_domain_mapping && isset($___consider_domain_mapping_host_token, $___consider_domain_mapping_host_base_dir_tokens)) { - $host_token = (string) $___consider_domain_mapping_host_token; - $host_base_dir_tokens = (string) $___consider_domain_mapping_host_base_dir_tokens; - } - if (!$host_token) { // Must have a host in the sub-routine below. - throw new \Exception(__('Invalid argument; host token empty!', SLUG_TD)); - } - $stats = array(); // Initialize the stats array. - - foreach (array('http', 'https') as $_host_scheme) { - $_host_url = $_host_scheme.'://'.$host_token.$host_base_dir_tokens; - $_host_cache_path_flags = CACHE_PATH_NO_PATH_INDEX | CACHE_PATH_NO_QUV | CACHE_PATH_NO_EXT; - $_host_cache_path = $self->buildCachePath($_host_url, '', '', $_host_cache_path_flags); - $_host_cache_dir = $self->nDirSeps($cache_dir.'/'.$_host_cache_path); // Normalize. - $_check_disk_stats = $stats || $___considering_domain_mapping ? false : true; - - foreach ($self->getDirRegexStats($_host_cache_dir, '', false, $_check_disk_stats, $no_cache) as $_key => $_value) { - $stats[$_key] = isset($stats[$_key]) ? $stats[$_key] + $_value : $_value; - } - unset($_key, $_value); // Housekeeping. - } - unset($_host_scheme, $_host_url, $_host_cache_path_flags, $_host_cache_path, $_host_cache_dir, $_check_disk_stats); - - if (!$___considering_domain_mapping && is_multisite() && $self->canConsiderDomainMapping()) { - $domain_mapping_variations = array(); // Initialize array of domain variations. - - if (($_host_token_for_blog = $self->hostTokenForBlog())) { - $_host_base_dir_tokens_for_blog = $self->hostBaseDirTokensForBlog(); - $domain_mapping_variations[] = array('host_token' => $_host_token_for_blog, 'host_base_dir_tokens' => $_host_base_dir_tokens_for_blog); - } // The original blog host; i.e., without domain mapping. - unset($_host_token_for_blog, $_host_base_dir_tokens_for_blog); // Housekeeping. - - foreach ($self->domainMappingBlogDomains() as $_domain_mapping_blog_domain) { - if (($_domain_host_token_for_blog = $self->hostTokenForBlog(false, true, $_domain_mapping_blog_domain))) { - $_domain_host_base_dir_tokens_for_blog = $self->hostBaseDirTokensForBlog(false, true); // This is only a formality. - $domain_mapping_variations[] = array('host_token' => $_domain_host_token_for_blog, 'host_base_dir_tokens' => $_domain_host_base_dir_tokens_for_blog); - } - } // This includes all of the domain mappings configured for the current blog ID. - unset($_domain_mapping_blog_domain, $_domain_host_token_for_blog, $_domain_host_base_dir_tokens_for_blog); // Housekeeping. - - foreach ($domain_mapping_variations as $_domain_mapping_variation) { - if ($_domain_mapping_variation['host_token'] === $current_host_token && $_domain_mapping_variation['host_base_dir_tokens'] === $current_host_base_dir_tokens) { - continue; // Exclude current tokens. They were already iterated above. - } - foreach ($self->statsForHostCacheDir($no_cache, true, $_domain_mapping_variation['host_token'], $_domain_mapping_variation['host_base_dir_tokens']) as $_key => $_value) { - $stats[$_key] += $_value; // Increment stats for each domain mapping variation. - } - unset($_key, $_value); // Housekeeping. - } - unset($_domain_mapping_variation); // Housekeeping. - } - return $stats; -}; - -/* - * HTML compressor cache directory stats for the current host. - * - * @since 15xxxx Adding cache directory statistics. - * - * @param boolean $no_cache Do not read or write a cache entry? - * - * @return array HTML compressor cache directory stats for the current host. - */ -$self->statsForHtmlCHostCacheDirs = function ($no_cache = false) use ($self) { - $stats = array(); // Initialize the stats array. - - $host_token = $self->hostToken(true); // Dashify. - $host_base_dir_tokens = $self->hostBaseDirTokens(true); // Dashify. - - $htmlc_cache_dirs = array(); // Initialize array of all HTML Compressor directories to clear. - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_public.rtrim($host_base_dir_tokens, '/').'/'.$host_token); - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_private.rtrim($host_base_dir_tokens, '/').'/'.$host_token); - - if (is_multisite() && $self->canConsiderDomainMapping()) { - if (($_host_token_for_blog = $self->hostTokenForBlog(true))) { // Dashify. - $_host_base_dir_tokens_for_blog = $self->hostBaseDirTokensForBlog(true); // Dashify. - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_public.rtrim($_host_base_dir_tokens_for_blog, '/').'/'.$_host_token_for_blog); - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_private.rtrim($_host_base_dir_tokens_for_blog, '/').'/'.$_host_token_for_blog); - } - unset($_host_token_for_blog, $_host_base_dir_tokens_for_blog); // Housekeeping. - - foreach ($self->domainMappingBlogDomains() as $_domain_mapping_blog_domain) { - if (($_domain_host_token_for_blog = $self->hostTokenForBlog(true, true, $_domain_mapping_blog_domain))) { // Dashify. - $_domain_host_base_dir_tokens_for_blog = $self->hostBaseDirTokensForBlog(true, true); // Dashify. This is only a formality. - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_public.rtrim($_domain_host_base_dir_tokens_for_blog, '/').'/'.$_domain_host_token_for_blog); - $htmlc_cache_dirs[] = $self->wpContentBaseDirTo($self->htmlc_cache_sub_dir_private.rtrim($_domain_host_base_dir_tokens_for_blog, '/').'/'.$_domain_host_token_for_blog); - } - } - unset($_domain_mapping_blog_domain, $_domain_host_token_for_blog, $_domain_host_base_dir_tokens_for_blog); // Housekeeping. - } - foreach (array_unique($htmlc_cache_dirs) as $_htmlc_cache_dir) { - $_check_disk_stats = $stats ? false : true; - - foreach ($self->getDirRegexStats($_htmlc_cache_dir, '', false, $_check_disk_stats, $no_cache) as $_key => $_value) { - $stats[$_key] = isset($stats[$_key]) ? $stats[$_key] + $_value : $_value; - } - unset($_key, $_value); // Housekeeping. - } - unset($_htmlc_cache_dir); // Just a little housekeeping. - - return $stats; -}; - -/* - * Directory stats. - * - * @since 15xxxx Adding a few statistics. - * - * @param string $dir An absolute server directory path. - * @param string $regex A regex pattern; compares to each full file path. - * @param boolean $include_paths Include array of all scanned file paths? - * @param boolean $check_disk Also check disk statistics? - * @param boolean $no_cache Do not read/write cache? - * - * @return array Directory stats. - */ -$self->getDirRegexStats = function ($dir, $regex = '', $include_paths = false, $check_disk = true, $no_cache = false) use ($self) { - $dir = (string) $dir; // Force string. - $cache_keys = array($dir, $regex, $include_paths, $check_disk); - if (!$no_cache && !is_null($stats = &$self->staticKey('getDirRegexStats', $cache_keys))) { - return $stats; // Already cached this. - } - $stats = array( - 'dir' => $dir, - 'total_size' => 0, - - 'total_links' => 0, - 'link_subpaths' => array(), - - 'total_files' => 0, - 'file_subpaths' => array(), - - 'total_dirs' => 0, - 'dir_subpaths' => array(), - - 'disk_free_space' => 0, - 'disk_total_space' => 0, - ); - if (!$dir || !is_dir($dir) || !$self->options['dir_stats_enable']) { - return $stats; // Not possible. - } - foreach ($self->dirRegexIteration($dir, $regex) as $_resource) { - switch ($_resource->getType()) { // `link`, `file`, `dir`. - case 'link': - if ($include_paths) { - $stats['link_subpaths'][] = $_resource->getSubpathname(); - } - ++$stats['total_links']; // Counter. - - break; // Break switch handler. - - case 'file': - if ($include_paths) { - $stats['file_subpaths'][] = $_resource->getSubpathname(); - } - $stats['total_size'] += $_resource->getSize(); - ++$stats['total_files']; // Counter. - - break; // Break switch. - - case 'dir': - if ($include_paths) { - $stats['dir_subpaths'][] = $_resource->getSubpathname(); - } - ++$stats['total_dirs']; // Counter. - - break; // Break switch. - } - } - unset($_resource); // Housekeeping. - - if ($check_disk) { // Check disk also? - $stats['disk_free_space'] = disk_free_space($dir); - $stats['disk_total_space'] = disk_total_space($dir); - } - return $stats; -}; -/*[/pro]*/ diff --git a/src/includes/closures/Plugin/CleanupUtils.php b/src/includes/closures/Plugin/CleanupUtils.php new file mode 100644 index 00000000..c4b16b28 --- /dev/null +++ b/src/includes/closures/Plugin/CleanupUtils.php @@ -0,0 +1,26 @@ + + * Note: this is impact the AdvancedCache expiration check also. + */ +$self->cleanupCache = function () use ($self) { + if (!$self->options['enable']) { + return; // Nothing to do. + } + /*[pro strip-from="lite"]*/ + if (!$manually && $self->options['dir_stats_enable']) { + $dir_stats = DirStats::instance(); + $dir_stats->forCache(true); + } + /*[/pro]*/ + $self->wurgeCache(); // Purge now. +}; diff --git a/src/includes/closures/Plugin/InstallUtils.php b/src/includes/closures/Plugin/InstallUtils.php index 4a235d75..b0b52410 100644 --- a/src/includes/closures/Plugin/InstallUtils.php +++ b/src/includes/closures/Plugin/InstallUtils.php @@ -89,7 +89,7 @@ $self->deleteBaseDir(); if (is_multisite()) { // Main site CRON jobs. - switch_to_blog($GLOBALS['current_site']->blog_id); + switch_to_blog(get_current_site()->blog_id); wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_auto_cache'); wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_cleanup'); restore_current_blog(); // Restore current blog. @@ -103,7 +103,7 @@ if (is_multisite()) { // Site options for a network installation. $wpdb->query('DELETE FROM `'.esc_sql($wpdb->sitemeta).'` WHERE `meta_key` LIKE \''.esc_sql($like).'\''); - switch_to_blog($GLOBALS['current_site']->blog_id); // In case it started as a standard WP installation. + switch_to_blog(get_current_site()->blog_id); // In case it started as a standard WP installation. $wpdb->query('DELETE FROM `'.esc_sql($wpdb->options).'` WHERE `option_name` LIKE \''.esc_sql($like).'\''); restore_current_blog(); // Restore current blog. // @@ -200,7 +200,7 @@ }; /* - * Checks to make sure the `zc-advanced-cache` file still exists; + * Checks to make sure the `advanced-cache.php` file still exists; * and if it doesn't, the `advanced-cache.php` is regenerated automatically. * * @since 150422 Rewrite. @@ -223,8 +223,9 @@ if (!empty($_REQUEST[GLOBAL_NS])) { return; // Skip on plugin actions. } - $cache_dir = $self->cacheDir(); - $advanced_cache_file = WP_CONTENT_DIR.'/advanced-cache.php'; + $cache_dir = $self->cacheDir(); + $advanced_cache_file = WP_CONTENT_DIR.'/advanced-cache.php'; + $advanced_cache_check_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-advanced-cache'; // Fixes zero-byte advanced-cache.php bug related to migrating from Quick Cache // See: @@ -232,7 +233,7 @@ // Also fixes a missing `define('WP_CACHE', TRUE)` bug related to migrating from Quick Cache // See - if (!is_file($cache_dir.'/zc-advanced-cache') || !is_file($advanced_cache_file) || filesize($advanced_cache_file) === 0) { + if (!is_file($advanced_cache_check_file) || !is_file($advanced_cache_file) || filesize($advanced_cache_file) === 0) { $self->addAdvancedCache(); $self->addWpCacheToWpConfig(); } @@ -245,15 +246,16 @@ * * @return bool|null `TRUE` on success. `FALSE` or `NULL` on failure. * A special `NULL` return value indicates success with a single failure - * that is specifically related to the `zc-advanced-cache` file. + * that is specifically related to the `[SHORT_NAME]-advanced-cache` file. */ $self->addAdvancedCache = function () use ($self) { if (!$self->removeAdvancedCache()) { return false; // Still exists. } - $cache_dir = $self->cacheDir(); - $advanced_cache_file = WP_CONTENT_DIR.'/advanced-cache.php'; - $advanced_cache_template = dirname(dirname(dirname(__FILE__))).'/templates/advanced-cache.txt'; + $cache_dir = $self->cacheDir(); + $advanced_cache_file = WP_CONTENT_DIR.'/advanced-cache.php'; + $advanced_cache_check_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-advanced-cache'; + $advanced_cache_template = dirname(dirname(dirname(__FILE__))).'/templates/advanced-cache.txt'; if (is_file($advanced_cache_file) && !is_writable($advanced_cache_file)) { return false; // Not possible to create. @@ -362,9 +364,9 @@ function ($string) { if (is_writable($cache_dir) && !is_file($cache_dir.'/.htaccess')) { file_put_contents($cache_dir.'/.htaccess', $self->htaccess_deny); } - if (!is_dir($cache_dir) || !is_writable($cache_dir) || !is_file($cache_dir.'/.htaccess') || !file_put_contents($cache_dir.'/zc-advanced-cache', time())) { + if (!is_dir($cache_dir) || !is_writable($cache_dir) || !is_file($cache_dir.'/.htaccess') || !file_put_contents($advanced_cache_check_file, time())) { $self->cacheUnlock($cache_lock); // Release. - return; // Special return value (NULL) in this case. + return; // Special return value (NULL). } $self->cacheUnlock($cache_lock); // Release. @@ -419,8 +421,8 @@ function ($string) { */ $self->deleteAdvancedCache = function () use ($self) { $cache_dir = $self->cacheDir(); - $advanced_cache_check_file = $cache_dir.'/zc-advanced-cache'; $advanced_cache_file = WP_CONTENT_DIR.'/advanced-cache.php'; + $advanced_cache_check_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-advanced-cache'; if (is_file($advanced_cache_file)) { if (!is_writable($advanced_cache_file) || !unlink($advanced_cache_file)) { @@ -436,8 +438,8 @@ function ($string) { }; /* - * Checks to make sure the `zc-blog-paths` file still exists; - * and if it doesn't, the `zc-blog-paths` file is regenerated automatically. + * Checks to make sure the `[SHORT_NAME]-blog-paths` file still exists; + * and if it doesn't, the `[SHORT_NAME]-blog-paths` file is regenerated automatically. * * @since 150422 Rewrite. * @@ -445,10 +447,10 @@ function ($string) { * * @note This runs so that remote deployments which completely wipe out an * existing set of website files (like the AWS Elastic Beanstalk does) will NOT cause ZenCache - * to stop functioning due to the lack of a `zc-blog-paths` file, which is generated by ZenCache. + * to stop functioning due to the lack of a `[SHORT_NAME]-blog-paths` file, which is generated by ZenCache. * * For instance, if you have a Git repo with all of your site files; when you push those files - * to your website to deploy them, you most likely do NOT have the `zc-blog-paths` file. + * to your website to deploy them, you most likely do NOT have the `[SHORT_NAME]-blog-paths` file. * ZenCache creates this file on its own. Thus, if it's missing (and QC is active) * we simply regenerate the file automatically to keep ZenCache running. */ @@ -462,15 +464,16 @@ function ($string) { if (!empty($_REQUEST[GLOBAL_NS])) { return; // Skip on plugin actions. } - $cache_dir = $self->cacheDir(); + $cache_dir = $self->cacheDir(); + $blog_paths_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-blog-paths'; - if (!is_file($cache_dir.'/zc-blog-paths')) { + if (!is_file($blog_paths_file)) { $self->updateBlogPaths(); } }; /* - * Creates and/or updates the `zc-blog-paths` file. + * Creates and/or updates the `[SHORT_NAME]-blog-paths` file. * * @since 150422 Rewrite. * @@ -491,7 +494,9 @@ function ($string) { if (!is_multisite()) { return $value; // N/A. } - $cache_dir = $self->cacheDir(); + $cache_dir = $self->cacheDir(); + $blog_paths_file = $cache_dir.'/'.strtolower(SHORT_NAME).'-blog-paths'; + $cache_lock = $self->cacheLock(); if (!is_dir($cache_dir)) { @@ -517,7 +522,7 @@ function ($string) { } unset($_key, $_path); // Housekeeping. - file_put_contents($cache_dir.'/zc-blog-paths', serialize($paths)); + file_put_contents($blog_paths_file, serialize($paths)); } $self->cacheUnlock($cache_lock); // Release. diff --git a/src/includes/closures/Plugin/NoticeUtils.php b/src/includes/closures/Plugin/NoticeUtils.php index 582bd3d1..e9b7fffd 100644 --- a/src/includes/closures/Plugin/NoticeUtils.php +++ b/src/includes/closures/Plugin/NoticeUtils.php @@ -184,7 +184,7 @@ $blog_id = (integer) get_current_blog_id(); } if ($blog_id < 0) { // Blog for main site. - $blog_id = (integer) $GLOBALS['current_site']->blog_id; + $blog_id = (integer) get_current_site()->blog_id; } $blog_suffix = '_'.$blog_id; // Site option suffix. $notices = get_site_option(GLOBAL_NS.$blog_suffix.'_notices'); @@ -225,7 +225,7 @@ $blog_id = (integer) get_current_blog_id(); } if ($blog_id < 0) { // Blog for main site. - $blog_id = (integer) $GLOBALS['current_site']->blog_id; + $blog_id = (integer) get_current_site()->blog_id; } $blog_suffix = '_'.$blog_id; // Site option suffix. update_site_option(GLOBAL_NS.$blog_suffix.'_notices', $notices); diff --git a/src/includes/closures/Plugin/WcpUserUtils.php b/src/includes/closures/Plugin/WcpUserUtils.php index 5b75dab4..5e2bdbd1 100644 --- a/src/includes/closures/Plugin/WcpUserUtils.php +++ b/src/includes/closures/Plugin/WcpUserUtils.php @@ -36,7 +36,7 @@ return $counter; // Nothing to do. } $regex = $self->buildCachePathRegex('', '.*?\.u\/'.preg_quote($user_id, '/').'[.\/]'); - $counter += $self->clearFilesFromCacheDir($regex); // Clear matching files. + $counter += $self->wipeFilesFromCacheDir($regex); // Clear matching files. if ($counter && is_admin() && (!IS_PRO || $self->options['change_notifications_enable'])) { $self->enqueueNotice(''. diff --git a/src/includes/closures/Plugin/WcpUtils.php b/src/includes/closures/Plugin/WcpUtils.php index aebcd364..bb3ad318 100644 --- a/src/includes/closures/Plugin/WcpUtils.php +++ b/src/includes/closures/Plugin/WcpUtils.php @@ -13,15 +13,15 @@ $self->pre_post_update_post_permalink = array(); /* - * Wipes out all cache files in the cache directory. + * Wipes out all cache files. * * @since 150422 Rewrite. * - * @param bool $manually TRUE if the wipe is done manually by the site owner. + * @param bool $manually TRUE if wiping is done manually. * * @throws \Exception If a wipe failure occurs. * - * @return int Total files wiped by this routine (if any). + * @return int Total files wiped by this routine. */ $self->wipeCache = function ($manually = false) use ($self) { $counter = 0; // Initialize. @@ -32,27 +32,33 @@ @set_time_limit(1800); // @TODO Display a warning. if (is_dir($cache_dir = $self->cacheDir())) { - $counter += $self->deleteFilesFromCacheDir('/^.+/i'); + $regex = $self->buildCachePathRegex('', '.+'); + $counter += $self->wipeFilesFromCacheDir($regex); } /*[pro strip-from="lite"]*/ $counter += $self->wipeHtmlCCache($manually); /*[/pro]*/ + /*[pro strip-from="lite"]*/ + if ($self->options['dir_stats_enable']) { + $dir_stats = DirStats::instance(); + $dir_stats->wipeCache(); + } + /*[/pro]*/ return $counter; }; $self->wipe_cache = $self->wipeCache; // Back compat. /* - * Clears cache files for the current host|blog. + * Clears cache files (current blog). * * @since 150422 Rewrite. * - * @param bool $manually Defaults to a `FALSE` value. - * Pass as TRUE if the clearing is done manually by the site owner. + * @param bool $manually TRUE if clearing is done manually. * * @throws \Exception If a clearing failure occurs. * - * @return int Total files cleared by this routine (if any). + * @return int Total files cleared by this routine. */ $self->clearCache = function ($manually = false) use ($self) { $counter = 0; // Initialize. @@ -60,81 +66,95 @@ if (!$manually && $self->disableAutoClearCacheRoutines()) { return $counter; // Nothing to do. } - if (!is_dir($cache_dir = $self->cacheDir())) { - return ($counter += $self->clearHtmlCCache($manually)); - } @set_time_limit(1800); // @TODO Display a warning. - $regex = $self->buildHostCachePathRegex('', '.+'); - $counter += $self->clearFilesFromHostCacheDir($regex); - + if (is_dir($cache_dir = $self->cacheDir())) { + $regex = $self->buildHostCachePathRegex('', '.+'); + $counter += $self->clearFilesFromHostCacheDir($regex); + } /*[pro strip-from="lite"]*/ $counter += $self->clearHtmlCCache($manually); /*[/pro]*/ + /*[pro strip-from="lite"]*/ + if ($self->options['dir_stats_enable']) { + $dir_stats = DirStats::instance(); + $dir_stats->clearHostCache(); + } + /*[/pro]*/ return $counter; }; $self->clear_cache = $self->clearCache; // Back compat. /* - * Purges expired cache files for the current host|blog. + * Purges expired cache files (current blog). * * @since 150422 Rewrite. * - * @param bool $manually TRUE if the purging is done manually by the site owner. + * @param bool $manually TRUE if purging is done manually. * * @throws \Exception If a purge failure occurs. * - * @return int Total files purged by this routine (if any). + * @return int Total files purged by this routine. */ $self->purgeCache = function ($manually = false) use ($self) { $counter = 0; // Initialize. - if (!is_dir($cache_dir = $self->cacheDir())) { + if (!$manually && $self->disableAutoPurgeCacheRoutines()) { return $counter; // Nothing to do. } @set_time_limit(1800); // @TODO Display a warning. - $regex = $self->buildHostCachePathRegex('', '.+'); - $counter += $self->purgeFilesFromHostCacheDir($regex); - + if (is_dir($cache_dir = $self->cacheDir())) { + $regex = $self->buildHostCachePathRegex('', '.+'); + $counter += $self->purgeFilesFromHostCacheDir($regex); + } + /*[pro strip-from="lite"]*/ + if ($self->options['dir_stats_enable']) { + $dir_stats = DirStats::instance(); + $dir_stats->clearHostCache(); + } + /*[/pro]*/ return $counter; }; $self->purge_cache = $self->purgeCache; // Back compat. /* - * Purges all expired cache files. + * Wurges (purges) all expired cache files; like wipe, but expired files only. * * @since 15xxxx Look at entire cache directory. * - * @param bool $manually TRUE if the purging is done manually by the site owner. + * @param bool $manually TRUE if wurging is done manually. * - * @throws \Exception If a purge failure occurs. - * - * @return int Total files purged by this routine (if any). - * - * @attaches-to `'_cron_'.__GLOBAL_NS__.'_cleanup'` via CRON job. + * @throws \Exception If a wurge failure occurs. * - * @TODO Disable automatically when load average is high. - * See: - * Note: this is impact the AdvancedCache expiration check also. + * @return int Total files wurged by this routine. */ -$self->purgeCacheDir = function ($manually = false) use ($self) { +$self->wurgeCache = function ($manually = false) use ($self) { $counter = 0; // Initialize. - if (!is_dir($cache_dir = $self->cacheDir())) { + if (!$manually && $self->disableAutoPurgeCacheRoutines()) { return $counter; // Nothing to do. } @set_time_limit(1800); // @TODO Display a warning. - $regex = $self->buildCachePathRegex('', '.+'); - $counter += $self->purgeFilesFromCacheDir($regex); - + if (is_dir($cache_dir = $self->cacheDir())) { + $regex = $self->buildCachePathRegex('', '.+'); + $counter += $self->wurgeFilesFromCacheDir($regex); + } + /*[pro strip-from="lite"]*/ + if ($self->options['dir_stats_enable']) { + $dir_stats = DirStats::instance(); + $dir_stats->wipeCache(); + } + /*[/pro]*/ return $counter; }; /* - * Automatically wipes out all cache files in the cache directory. + * Automatically wipes out all cache files. + * + * @attaches-to Nothing at this time. * * @since 150422 Rewrite. * @@ -167,7 +187,7 @@ }; /* - * Automatically clears all cache files for the current blog. + * Automatically clears all cache files (current host). * * @attaches-to `switch_theme` hook. * @@ -213,7 +233,75 @@ }; /* - * Allows a site owner to disable the wipe cache routines. + * Automatically purges all cache files (current host). + * + * @attaches-to Nothing at this time. + * + * @since 15xxxx While working on directory stats. + * + * @return int Total files purged by this routine. + * + * @note Unlike many of the other `auto_` methods, this one is NOT currently attached to any hooks. + */ +$self->autoPurgeCache = function () use ($self) { + $counter = 0; // Initialize. + + if (!is_null($done = &$self->cacheKey('autoPurgeCache'))) { + return $counter; // Already did this. + } + $done = true; // Flag as having been done. + + if (!$self->options['enable']) { + return $counter; // Nothing to do. + } + if ($self->disableAutoPurgeCacheRoutines()) { + return $counter; // Nothing to do. + } + $counter += $self->purgeCache(); + + if ($counter && is_admin() && (!IS_PRO || $self->options['change_notifications_enable'])) { + $self->enqueueNotice(''. + sprintf(__('%1$s: detected important site changes. Found %2$s in the cache for this site that were expired; auto-purging.', SLUG_TD), esc_html(NAME), esc_html($self->i18nFiles($counter)))); + } + return $counter; +}; + +/* + * Automatically wurges all cache files. + * + * @attaches-to Nothing at this time. + * + * @since 15xxxx While working on directory stats. + * + * @return int Total files wurged by this routine. + * + * @note Unlike many of the other `auto_` methods, this one is NOT currently attached to any hooks. + */ +$self->autoWurgeCache = function () use ($self) { + $counter = 0; // Initialize. + + if (!is_null($done = &$self->cacheKey('autoWurgeCache'))) { + return $counter; // Already did this. + } + $done = true; // Flag as having been done. + + if (!$self->options['enable']) { + return $counter; // Nothing to do. + } + if ($self->disableAutoPurgeCacheRoutines()) { + return $counter; // Nothing to do. + } + $counter += $self->wurgeCache(); + + if ($counter && is_admin() && (!IS_PRO || $self->options['change_notifications_enable'])) { + $self->enqueueNotice(''. + sprintf(__('%1$s: detected important site changes. Found %2$s in the cache that were expired; auto-purging.', SLUG_TD), esc_html(NAME), esc_html($self->i18nFiles($counter)))); + } + return $counter; +}; + +/* + * Allows a site owner to disable the automatic cache wiping routines. * * This is done by filtering `'.__GLOBAL_NS__.'_disable_auto_wipe_cache_routines` to return TRUE, * in which case this method returns TRUE, otherwise it returns FALSE. @@ -227,13 +315,13 @@ if ($is_disabled && is_admin() && (!IS_PRO || $self->options['change_notifications_enable'])) { $self->enqueueMainNotice(''. - sprintf(__('%1$s: detected significant changes that would normally trigger a wipe cache routine, however wipe cache routines have been disabled by a site administrator. [?]', SLUG_TD), esc_html(NAME))); + sprintf(__('%1$s: detected significant changes that would normally trigger cache wiping routines. However, cache wiping routines have been disabled by a site administrator. [?]', SLUG_TD), esc_html(NAME))); } return $is_disabled; }; /* - * Allows a site owner to disable the clear and wipe cache routines. + * Allows a site owner to disable the automatic cache clearing routines. * * This is done by filtering `'.__GLOBAL_NS__.'_disable_auto_clear_cache_routines` to return TRUE, * in which case this method returns TRUE, otherwise it returns FALSE. @@ -247,7 +335,27 @@ if ($is_disabled && is_admin() && (!IS_PRO || $self->options['change_notifications_enable'])) { $self->enqueueMainNotice(''. - sprintf(__('%1$s: detected important site changes that would normally trigger a clear cache routine. However, clear cache routines have been disabled by a site administrator. [?]', SLUG_TD), esc_html(NAME))); + sprintf(__('%1$s: detected important site changes that would normally trigger cache clearing routines. However, cache clearing routines have been disabled by a site administrator. [?]', SLUG_TD), esc_html(NAME))); + } + return $is_disabled; +}; + +/* + * Allows a site owner to disable the automatic cache purging routines. + * + * This is done by filtering `'.__GLOBAL_NS__.'_disable_auto_purge_cache_routines` to return TRUE, + * in which case this method returns TRUE, otherwise it returns FALSE. + * + * @since 15xxxx While working on directory stats. + * + * @return bool `TRUE` if disabled; and this also creates a dashboard notice in some cases. + */ +$self->disableAutoPurgeCacheRoutines = function () use ($self) { + $is_disabled = (boolean) $self->applyWpFilters(GLOBAL_NS.'_disable_auto_purge_cache_routines', false); + + if ($is_disabled && is_admin() && (!IS_PRO || $self->options['change_notifications_enable'])) { + $self->enqueueMainNotice(''. + sprintf(__('%1$s: detected important site changes that would normally trigger cache purging routines. However, cache purging routines have been disabled by a site administrator. [?]', SLUG_TD), esc_html(NAME))); } return $is_disabled; }; diff --git a/src/includes/closures/Shared/BlogUtils.php b/src/includes/closures/Shared/BlogUtils.php index d2337346..e72e1cd7 100644 --- a/src/includes/closures/Shared/BlogUtils.php +++ b/src/includes/closures/Shared/BlogUtils.php @@ -17,7 +17,7 @@ return null; // Not possible. } if (($blog_id = (integer) $blog_id) < 0) { - $blog_id = (integer) $GLOBALS['current_site']->blog_id; + $blog_id = (integer) get_current_site()->blog_id; } if (!$blog_id) { $blog_id = (integer) get_current_blog_id(); diff --git a/src/includes/closures/Shared/CacheDirUtils.php b/src/includes/closures/Shared/CacheDirUtils.php index ca2fb0dd..3e0b0a3e 100644 --- a/src/includes/closures/Shared/CacheDirUtils.php +++ b/src/includes/closures/Shared/CacheDirUtils.php @@ -27,16 +27,16 @@ }; /* - * Clear files from the cache directory (for all hosts/blogs); + * Wipe files from the cache directory (for all hosts/blogs); * i.e., those that match a specific regex pattern. * - * @since 150422 Rewrite. Updated 15xxxx w/ multisite compat. improvements. + * @since 15xxxx While working on directory stats. * * @param string $regex A regex pattern; see {@link deleteFilesFromCacheDir()}. * - * @return integer Total files cleared by this routine (if any). + * @return integer Total files wiped by this routine. */ -$self->clearFilesFromCacheDir = function ($regex) use ($self) { +$self->wipeFilesFromCacheDir = function ($regex) use ($self) { return $self->deleteFilesFromCacheDir($regex); }; @@ -55,16 +55,16 @@ }; /* - * Purge files from the cache directory (for all hosts/blogs); + * Wurge (purge) files from the cache directory (for all hosts/blogs); * i.e., those that match a specific regex pattern. * - * @since 150422 Rewrite. Updated 15xxxx w/ multisite compat. improvements. + * @since 15xxxx While working on directory stats. * * @param string $regex A regex pattern; see {@link deleteFilesFromCacheDir()}. * - * @return integer Total files purged by this routine (if any). + * @return integer Total files wurged by this routine. */ -$self->purgeFilesFromCacheDir = function ($regex) use ($self) { +$self->wurgeFilesFromCacheDir = function ($regex) use ($self) { return $self->deleteFilesFromCacheDir($regex, true); }; @@ -141,7 +141,7 @@ } else { $cache_dir_tmp_regex = '/^'.preg_quote($cache_dir_tmp.'/', '/').$cache_dir_tmp_regex; } - # if(WP_DEBUG) file_put_contents(WP_CONTENT_DIR.'/zc-debug.log', print_r($regex, TRUE)."\n".print_r($cache_dir_tmp_regex, TRUE)."\n\n", FILE_APPEND); + # if(WP_DEBUG) file_put_contents(WP_CONTENT_DIR.'/'.strtolower(SHORT_NAME).'-debug.log', print_r($regex, TRUE)."\n".print_r($cache_dir_tmp_regex, TRUE)."\n\n", FILE_APPEND); // Uncomment the above line to debug regex pattern matching used by this routine; and others that call upon it. if (!rename($cache_dir, $cache_dir_tmp)) { @@ -153,7 +153,7 @@ $_path_name = $_resource->getPathname(); if ($_resource_type !== 'dir' && strpos($_sub_path_name, '/') === false) { - continue; // Don't delete links/files in the immediate directory; e.g. `zc-advanced-cache` or `.htaccess`, etc. + continue; // Don't delete links/files in the immediate directory; e.g. `[SHORT_NAME]-advanced-cache` or `.htaccess`, etc. // Actual `http|https/...` cache links/files are nested. Links/files in the immediate directory are for other purposes. } switch ($_resource_type) {// Based on type; i.e., `link`, `file`, `dir`. @@ -309,7 +309,7 @@ } else { $_host_cache_dir_tmp_regex = '/^'.preg_quote($_host_cache_dir_tmp.'/', '/').$_host_cache_dir_tmp_regex; } - #if(WP_DEBUG) file_put_contents(WP_CONTENT_DIR.'/zc-debug.log', print_r($regex, TRUE)."\n".print_r($_host_cache_dir_tmp_regex, TRUE)."\n\n", FILE_APPEND); + #if(WP_DEBUG) file_put_contents(WP_CONTENT_DIR.'/'.strtolower(SHORT_NAME).'-debug.log', print_r($regex, TRUE)."\n".print_r($_host_cache_dir_tmp_regex, TRUE)."\n\n", FILE_APPEND); // Uncomment the above line to debug regex pattern matching used by this routine; and others that call upon it. if (!rename($_host_cache_dir, $_host_cache_dir_tmp)) { @@ -321,7 +321,7 @@ $_path_name = $_resource->getPathname(); if ($_host_cache_dir === $cache_dir && $_resource_type !== 'dir' && strpos($_sub_path_name, '/') === false) { - continue; // Don't delete links/files in the immediate directory; e.g. `zc-advanced-cache` or `.htaccess`, etc. + continue; // Don't delete links/files in the immediate directory; e.g. `[SHORT_NAME]-advanced-cache` or `.htaccess`, etc. // Actual `http|https/...` cache links/files are nested. Links/files in the immediate directory are for other purposes. } switch ($_resource_type) {// Based on type; i.e., `link`, `file`, `dir`. @@ -424,7 +424,7 @@ /* * Delete all files/dirs from a directory (for all schemes/hosts); - * including `zc-` prefixed files; or anything else for that matter. + * including `[SHORT_NAME]-` prefixed files; or anything else for that matter. * * @since 150422 Rewrite. Updated 15xxxx w/ multisite compat. improvements. * @@ -499,7 +499,7 @@ $self->tryErasingAllFilesDirsIn($dir_temp, true); // Cleanup if possible. throw new \Exception(sprintf(__('Unable to delete dir: `%1$s`.', SLUG_TD), $_path_name)); } - ++$counter; // Increment counter for each directory we delete. + # ++$counter; // Increment counter for each directory we delete. ~ NO don't do that here. break; // Break switch handler. @@ -529,7 +529,7 @@ /* * Erase all files/dirs from a directory (for all schemes/hosts); - * including `zc-` prefixed files; or anything else for that matter. + * including `[SHORT_NAME]-` prefixed files; or anything else for that matter. * * WARNING: This does NO LOCKING and NO ATOMIC deletions. * @@ -595,7 +595,7 @@ if (!rmdir($_path_name)) { throw new \Exception(sprintf(__('Unable to erase dir: `%1$s`.', SLUG_TD), $_path_name)); } - ++$counter; // Increment counter for each directory we erase. + # ++$counter; // Increment counter for each directory we erase. ~ NO don't do that here. break; // Break switch handler. @@ -616,7 +616,7 @@ /* * Try to erase all files/dirs from a directory (for all schemes/hosts); - * including `zc-` prefixed files; or anything else for that matter. + * including `[SHORT_NAME]-` prefixed files; or anything else for that matter. * * WARNING: This does NO LOCKING and NO ATOMIC deletions. * diff --git a/src/includes/closures/Shared/DomainMappingUtils.php b/src/includes/closures/Shared/DomainMappingUtils.php index f2e8b66f..eaead680 100644 --- a/src/includes/closures/Shared/DomainMappingUtils.php +++ b/src/includes/closures/Shared/DomainMappingUtils.php @@ -140,7 +140,7 @@ return 0; // Not possible/applicable. } if ($url === 'network' || $domain === 'network') { - $domain = (string) $GLOBALS['current_site']->domain; + $domain = (string) get_current_site()->domain; } if (!$domain && $url && $url !== 'network') { $domain = $self->parseUrl($url, PHP_URL_HOST); @@ -188,7 +188,7 @@ return ''; // Not possible/applicable. } if (($blog_id = (integer) $blog_id) < 0) { - $blog_id = (integer) $GLOBALS['current_site']->blog_id; + $blog_id = (integer) get_current_site()->blog_id; } if (!$blog_id) { $blog_id = (integer) get_current_blog_id(); @@ -238,7 +238,7 @@ return array(); // Not possible/applicable. } if (($blog_id = (integer) $blog_id) < 0) { - $blog_id = (integer) $GLOBALS['current_site']->blog_id; + $blog_id = (integer) get_current_site()->blog_id; } if (!$blog_id) { $blog_id = (integer) get_current_blog_id(); diff --git a/src/includes/closures/Shared/FsUtils.php b/src/includes/closures/Shared/FsUtils.php index 84e0ad84..637548f9 100644 --- a/src/includes/closures/Shared/FsUtils.php +++ b/src/includes/closures/Shared/FsUtils.php @@ -218,6 +218,101 @@ return (float) $value; }; +/* + * Directory stats. + * + * @since 15xxxx Adding a few statistics. + * + * @param string $dir An absolute server directory path. + * @param string $regex A regex pattern; compares to each full file path. + * @param boolean $include_paths Include array of all scanned file paths? + * @param boolean $check_disk Also check disk statistics? + * @param boolean $no_cache Do not read/write cache? + * + * @return array Directory stats. + */ +$self->getDirRegexStats = function ($dir, $regex = '', $include_paths = false, $check_disk = true, $no_cache = false) use ($self) { + $dir = (string) $dir; // Force string. + $cache_keys = array($dir, $regex, $include_paths, $check_disk); + if (!$no_cache && !is_null($stats = &$self->staticKey('getDirRegexStats', $cache_keys))) { + return $stats; // Already cached this. + } + $stats = array( + 'total_size' => 0, + 'total_resources' => 0, + 'total_links_files' => 0, + + 'total_links' => 0, + 'link_subpaths' => array(), + + 'total_files' => 0, + 'file_subpaths' => array(), + + 'total_dirs' => 0, + 'dir_subpaths' => array(), + + 'disk_total_space' => 0, + 'disk_free_space' => 0, + ); + if (!$dir || !is_dir($dir)) { + return $stats; // Not possible. + } + $short_name_lc = strtolower(SHORT_NAME); // Once only. + + foreach ($self->dirRegexIteration($dir, $regex) as $_resource) { + $_resource_sub_path = $_resource->getSubpathname(); + $_resource_basename = basename($_resource_sub_path); + + if ($_resource_basename === '.DS_Store') { + continue; // Ignore `.htaccess`. + } + if ($_resource_basename === '.htaccess') { + continue; // Ignore `.htaccess`. + } + if (stripos($_resource_sub_path, $short_name_lc.'-') === 0) { + continue; // Ignore [SHORT_NAME] files in base. + } + switch ($_resource->getType()) { // `link`, `file`, `dir`. + case 'link': + if ($include_paths) { + $stats['link_subpaths'][] = $_sub_path; + } + ++$stats['total_resources']; + ++$stats['total_links_files']; + ++$stats['total_links']; + + break; // Break switch. + + case 'file': + if ($include_paths) { + $stats['file_subpaths'][] = $_sub_path; + } + $stats['total_size'] += $_resource->getSize(); + ++$stats['total_resources']; + ++$stats['total_links_files']; + ++$stats['total_files']; + + break; // Break switch. + + case 'dir': + if ($include_paths) { + $stats['dir_subpaths'][] = $_sub_path; + } + ++$stats['total_resources']; + ++$stats['total_dirs']; + + break; // Break switch. + } + } + unset($_resource, $_resource_sub_path, $_resource_basename); // Housekeeping. + + if ($check_disk) { // Check disk also? + $stats['disk_total_space'] = disk_total_space($dir); + $stats['disk_free_space'] = disk_free_space($dir); + } + return $stats; +}; + /* * Apache `.htaccess` rules that deny public access to the contents of a directory. * diff --git a/src/includes/closures/Shared/TokenUtils.php b/src/includes/closures/Shared/TokenUtils.php index c757cbf3..bef55150 100644 --- a/src/includes/closures/Shared/TokenUtils.php +++ b/src/includes/closures/Shared/TokenUtils.php @@ -191,11 +191,11 @@ $token = trim($token, '\\/'." \t\n\r\0\x0B"); $token = isset($token[0]) ? '/'.$token.'/' : '/'; - if ($token !== '/' // Perhaps NOT the main site? - && (!is_file(($cache_dir = $self->cacheDir()).'/zc-blog-paths') - || !in_array($token, unserialize(file_get_contents($cache_dir.'/zc-blog-paths')), true)) - ) { - $token = '/'; // NOT a real/valid child blog path. + if ($token !== '/') { // Perhaps NOT the main site? + $blog_paths_file = $self->cacheDir().'/'.strtolower(SHORT_NAME).'-blog-paths'; + if (!is_file($blog_paths_file) || !in_array($token, unserialize(file_get_contents($blog_paths_file)), true)) { + $token = '/'; // NOT a real/valid child blog path. + } } if ($token !== '/' && $dashify) { $token = preg_replace('/[^a-z0-9\/]/i', '-', $token); @@ -244,11 +244,11 @@ $token = trim($token, '\\/'." \t\n\r\0\x0B"); $token = isset($token[0]) ? '/'.$token.'/' : '/'; - if ($token !== '/' // Perhaps NOT the main site? - && (!is_file(($cache_dir = $self->cacheDir()).'/zc-blog-paths') - || !in_array($token, unserialize(file_get_contents($cache_dir.'/zc-blog-paths')), true)) - ) { - $token = '/'; // NOT a real/valid child blog path. + if ($token !== '/') { // Perhaps NOT the main site? + $blog_paths_file = $self->cacheDir().'/'.strtolower(SHORT_NAME).'-blog-paths'; + if (!is_file($blog_paths_file) || !in_array($token, unserialize(file_get_contents($blog_paths_file)), true)) { + $token = '/'; // NOT a real/valid child blog path. + } } if ($token !== '/' && $dashify) { $token = preg_replace('/[^a-z0-9\/]/i', '-', $token); diff --git a/src/includes/translations/zencache-pro.pot b/src/includes/translations/zencache-pro.pot index d9d2c2b9..4f309753 100644 --- a/src/includes/translations/zencache-pro.pot +++ b/src/includes/translations/zencache-pro.pot @@ -306,7 +306,7 @@ msgid "close" msgstr "" #: src/includes/classes/MenuPageOptions.php:115 -msgid "Pro Features (Preview) ~ New option panels below. Please explore before upgrading .
NOTE: the free version of %1$s (this lite version) is more-than-adequate for most sites. Please upgrade only if you desire advanced features or would like to support the developer." +msgid "Pro Features (Preview) ~ New option panels below. Please explore before upgrading .
NOTE: the free version of %1$s (this lite version) is more-than-adequate for most sites. Please upgrade only if you desire advanced features or would like to support the developer." msgstr "" #: src/includes/classes/MenuPageOptions.php:120 @@ -338,7 +338,7 @@ msgid "No, disable." msgstr "" #: src/includes/classes/MenuPageOptions.php:146 -msgid "HUGE Time-Saver: Approx. 95%% of all WordPress sites running %1$s, simply enable it here; and that's it :-) No further configuration is necessary (really). All of the other options (down below) are already tuned for the BEST performance on a typical WordPress installation. Simply enable %1$s here and click \"Save All Changes\". If you get any warnings please follow the instructions given. Otherwise, you're good . This plugin is designed to run just fine like it is. Take it for a spin right away; you can always fine-tune things later if you deem necessary." +msgid "HUGE Time-Saver: Approx. 95%% of all WordPress sites running %1$s, simply enable it here; and that's it :-) No further configuration is necessary (really). All of the other options (down below) are already tuned for the BEST performance on a typical WordPress installation. Simply enable %1$s here and click \"Save All Changes\". If you get any warnings please follow the instructions given. Otherwise, you're good . This plugin is designed to run just fine like it is. Take it for a spin right away; you can always fine-tune things later if you deem necessary." msgstr "" #: src/includes/classes/MenuPageOptions.php:149 @@ -354,7 +354,7 @@ msgid "Once %1$s has been enabled, you'll need to log out (and/or clear msgstr "" #: src/includes/classes/MenuPageOptions.php:152 -msgid "To verify that %1$s is working, navigate your site like a normal visitor would. Right-click on any page (choose View Source), then scroll to the very bottom of the document. At the bottom, you'll find comments that show %1$s stats and information. You should also notice that page-to-page navigation is lightning fast now that %1$s is running; and it gets faster over time!" +msgid "To verify that %1$s is working, navigate your site like a normal visitor would. Right-click on any page (choose View Source), then scroll to the very bottom of the document. At the bottom, you'll find comments that show %1$s stats and information. You should also notice that page-to-page navigation is lightning fast now that %1$s is running; and it gets faster over time!" msgstr "" #: src/includes/classes/MenuPageOptions.php:154 @@ -642,7 +642,7 @@ msgid "Keep in mind that your Expiration Time is only one part of the big pictur msgstr "" #: src/includes/classes/MenuPageOptions.php:340 -msgid "All of that being said, you could set this to just 60 seconds and you would still see huge differences in speed and performance. If you're just starting out with %1$s (perhaps a bit nervous about old cache files being served to your visitors); you could set this to something like 30 minutes, and experiment with it while you build confidence in %1$s. It's not necessary to do so, but many site owners have reported this makes them feel like they're more-in-control when the cache has a short expiration time. All-in-all, it's a matter of preference ." +msgid "All of that being said, you could set this to just 60 seconds and you would still see huge differences in speed and performance. If you're just starting out with %1$s (perhaps a bit nervous about old cache files being served to your visitors); you could set this to something like 30 minutes, and experiment with it while you build confidence in %1$s. It's not necessary to do so, but many site owners have reported this makes them feel like they're more-in-control when the cache has a short expiration time. All-in-all, it's a matter of preference ." msgstr "" #: src/includes/classes/MenuPageOptions.php:342 @@ -1063,7 +1063,7 @@ msgid "%1$s fully supports GZIP compression on its output. However, it does not msgstr "" #: src/includes/classes/MenuPageOptions.php:645 -msgid "If you want to enable GZIP, create an .htaccess file in your WordPress® installation directory, and put the following few lines in it. Alternatively, if you already have an .htaccess file, just add these lines to it, and that is all there is to it. GZIP is now enabled in the recommended way! See also: video about GZIP Compression." +msgid "If you want to enable GZIP, create an .htaccess file in your WordPress® installation directory, and put the following few lines in it. Alternatively, if you already have an .htaccess file, just add these lines to it, and that is all there is to it. GZIP is now enabled in the recommended way! See also: video about GZIP Compression." msgstr "" #: src/includes/classes/MenuPageOptions.php:659 @@ -1191,7 +1191,7 @@ msgid "Dynamic Version Salt" msgstr "" #: src/includes/classes/MenuPageOptions.php:759 -msgid " GEEK ALERT This is for VERY advanced users only..." +msgid " GEEK ALERT This is for VERY advanced users only..." msgstr "" #: src/includes/classes/MenuPageOptions.php:760 @@ -1306,7 +1306,7 @@ msgid "%1$s™ Authentication" msgstr "" #: src/includes/classes/MenuPageProUpdater.php:73 -msgid "From this page you can update to the latest version of %1$s Pro for WordPress. %1$s Pro is a premium product available for purchase @ zencache.com. In order to connect with our update servers, we ask that you supply your account login details for zencache.com. If you prefer not to provide your password, you can use your License Key in place of your password. Your License Key is located under \"My Account\" when you log in @ zencache.com. This will authenticate your copy of %1$s Pro; providing you with access to the latest version. You only need to enter these credentials once. %1$s Pro will save them in your WordPress database; making future upgrades even easier. " +msgid "From this page you can update to the latest version of %1$s Pro for WordPress. %1$s Pro is a premium product available for purchase @ zencache.com. In order to connect with our update servers, we ask that you supply your account login details for zencache.com. If you prefer not to provide your password, you can use your License Key in place of your password. Your License Key is located under \"My Account\" when you log in @ zencache.com. This will authenticate your copy of %1$s Pro; providing you with access to the latest version. You only need to enter these credentials once. %1$s Pro will save them in your WordPress database; making future upgrades even easier. " msgstr "" #: src/includes/classes/MenuPageProUpdater.php:75