Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php namespace Typecho; use Typecho\Plugin\Exception as PluginException; /** * * *..
Decoded Output download
<?php
namespace Typecho;
use Typecho\Plugin\Exception as PluginException;
/**
*
*
* @category typecho
* @package Plugin
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
* @license GNU General Public License 2.0
*/
class Plugin
{
/**
*
*
* @var array
*/
private static array $plugin = [];
/**
*
*
* @var array
*/
private static array $instances;
/**
*
*
* @var array
*/
private static array $tmp = [];
/**
*
*
* @var string
*/
private string $handle;
/**
*
*
* @var string
*/
private $component;
/**
*
*
* @var boolean
*/
private bool $signal = false;
/**
*
*
* @param string $handle
*/
public function __construct(string $handle)
{
if (defined('__TYPECHO_CLASS_ALIASES__')) {
$alias = array_search('\' . ltrim($handle, '\'), __TYPECHO_CLASS_ALIASES__);
$handle = $alias ?: $handle;
}
$this->handle = Common::nativeClassName($handle);
}
/**
*
*
* @param array $plugins
*/
public static function init(array $plugins)
{
$plugins['activated'] = array_key_exists('activated', $plugins) ? $plugins['activated'] : [];
$plugins['handles'] = array_key_exists('handles', $plugins) ? $plugins['handles'] : [];
/** */
self::$plugin = $plugins;
}
/**
*
*
* @param string $handle
* @return Plugin
*/
public static function factory(string $handle): Plugin
{
return self::$instances[$handle] ?? (self::$instances[$handle] = new self($handle));
}
/**
*
*
* @param string $pluginName
*/
public static function activate(string $pluginName)
{
self::$plugin['activated'][$pluginName] = self::$tmp;
self::$tmp = [];
}
/**
*
*
* @param string $pluginName
*/
public static function deactivate(string $pluginName)
{
/** */
if (
isset(self::$plugin['activated'][$pluginName]['handles'])
&& is_array(self::$plugin['activated'][$pluginName]['handles'])
) {
foreach (self::$plugin['activated'][$pluginName]['handles'] as $handle => $handles) {
self::$plugin['handles'][$handle] = self::pluginHandlesDiff(
empty(self::$plugin['handles'][$handle]) ? [] : self::$plugin['handles'][$handle],
empty($handles) ? [] : $handles
);
if (empty(self::$plugin['handles'][$handle])) {
unset(self::$plugin['handles'][$handle]);
}
}
}
/** */
unset(self::$plugin['activated'][$pluginName]);
}
/**
* handle
*
* @param array $pluginHandles
* @param array $otherPluginHandles
* @return array
*/
private static function pluginHandlesDiff(array $pluginHandles, array $otherPluginHandles): array
{
foreach ($otherPluginHandles as $handle) {
while (false !== ($index = array_search($handle, $pluginHandles))) {
unset($pluginHandles[$index]);
}
}
return $pluginHandles;
}
/**
*
*
* @return array
*/
public static function export(): array
{
return self::$plugin;
}
/**
*
*
* @param string $pluginFile
* @return array
*/
public static function parseInfo(string $pluginFile): array
{
$tokens = token_get_all(file_get_contents($pluginFile));
$isDoc = false;
$isFunction = false;
$isClass = false;
$isInClass = false;
$isInFunction = false;
$isDefined = false;
$current = null;
/** */
$info = [
'description' => '',
'title' => '',
'author' => '',
'homepage' => '',
'version' => '',
'since' => '',
'activate' => false,
'deactivate' => false,
'config' => false,
'personalConfig' => false
];
$map = [
'package' => 'title',
'author' => 'author',
'link' => 'homepage',
'since' => 'since',
'version' => 'version'
];
foreach ($tokens as $token) {
/** doc comment */
if (!$isDoc && is_array($token) && T_DOC_COMMENT == $token[0]) {
/** */
$described = false;
$lines = preg_split("([
])", $token[1]);
foreach ($lines as $line) {
$line = trim($line);
if (!empty($line) && '*' == $line[0]) {
$line = trim(substr($line, 1));
if (!$described && !empty($line) && '@' == $line[0]) {
$described = true;
}
if (!$described && !empty($line)) {
$info['description'] .= $line . "
";
} elseif ($described && !empty($line) && '@' == $line[0]) {
$info['description'] = trim($info['description']);
$line = trim(substr($line, 1));
$args = explode(' ', $line);
$key = array_shift($args);
if (isset($map[$key])) {
$info[$map[$key]] = trim(implode(' ', $args));
}
}
}
}
$isDoc = true;
}
if (is_array($token)) {
switch ($token[0]) {
case T_FUNCTION:
$isFunction = true;
break;
case T_IMPLEMENTS:
$isClass = true;
break;
case T_WHITESPACE:
case T_COMMENT:
case T_DOC_COMMENT:
break;
case T_STRING:
$string = strtolower($token[1]);
switch ($string) {
case 'typecho_plugin_interface':
case 'plugininterface':
$isInClass = $isClass;
break;
case 'activate':
case 'deactivate':
case 'config':
case 'personalconfig':
if ($isFunction) {
$current = ('personalconfig' == $string ? 'personalConfig' : $string);
}
break;
default:
if (!empty($current) && $isInFunction && $isInClass) {
$info[$current] = true;
}
break;
}
break;
default:
if (!empty($current) && $isInFunction && $isInClass) {
$info[$current] = true;
}
break;
}
} else {
$token = strtolower($token);
switch ($token) {
case '{':
if ($isDefined) {
$isInFunction = true;
}
break;
case '(':
if ($isFunction && !$isDefined) {
$isDefined = true;
}
break;
case '}':
case ';':
$isDefined = false;
$isFunction = false;
$isInFunction = false;
$current = null;
break;
default:
if (!empty($current) && $isInFunction && $isInClass) {
$info[$current] = true;
}
break;
}
}
}
return $info;
}
/**
*
*
* ,
*
* @param string $pluginName
* @param string $path
* @return array
* @throws PluginException
*/
public static function portal(string $pluginName, string $path): array
{
switch (true) {
case file_exists($pluginFileName = $path . '/' . $pluginName . '/Plugin.php'):
$className = "\" . PLUGIN_NAMESPACE . "\{$pluginName}\Plugin";
break;
case file_exists($pluginFileName = $path . '/' . $pluginName . '.php'):
$className = "\" . PLUGIN_NAMESPACE . "\" . $pluginName;
break;
default:
throw new PluginException('Missing Plugin ' . $pluginName, 404);
}
return [$pluginFileName, $className];
}
/**
*
*
* @param string|null $version
* @return boolean
*/
public static function checkDependence(?string $version): bool
{
//,
if (empty($version)) {
return true;
}
return version_compare(Common::VERSION, $version, '>=');
}
/**
*
*
* @param string $pluginName
* @return bool
*/
public static function exists(string $pluginName): bool
{
return array_key_exists($pluginName, self::$plugin['activated']);
}
/**
*
*
* @param boolean|null $signal
* @return Plugin
*/
public function trigger(?bool &$signal): Plugin
{
$signal = false;
$this->signal = &$signal;
return $this;
}
/**
*
*
* @param string $component
* @return Plugin
*/
public function __get(string $component)
{
$this->component = $component;
return $this;
}
/**
*
*
* @param string $component
* @param callable $value
*/
public function __set(string $component, callable $value)
{
$weight = 0;
if (strpos($component, '_') > 0) {
$parts = explode('_', $component, 2);
[$component, $weight] = $parts;
$weight = intval($weight) - 10;
}
$component = $this->handle . ':' . $component;
if (!isset(self::$plugin['handles'][$component])) {
self::$plugin['handles'][$component] = [];
}
if (!isset(self::$tmp['handles'][$component])) {
self::$tmp['handles'][$component] = [];
}
foreach (self::$plugin['handles'][$component] as $key => $val) {
$key = floatval($key);
if ($weight > $key) {
break;
} elseif ($weight == $key) {
$weight += 0.001;
}
}
self::$plugin['handles'][$component][strval($weight)] = $value;
self::$tmp['handles'][$component][] = $value;
ksort(self::$plugin['handles'][$component], SORT_NUMERIC);
}
/**
*
*
* @param string $component
* @param array $args
* @return mixed
*/
public function call(string $component, ...$args)
{
$component = $this->handle . ':' . $component;
$last = count($args);
$args[$last] = $last > 0 ? $args[0] : false;
if (isset(self::$plugin['handles'][$component])) {
$args[$last] = null;
$this->signal = true;
foreach (self::$plugin['handles'][$component] as $callback) {
$args[$last] = call_user_func_array($callback, $args);
}
}
return $args[$last];
}
/**
* @deprecated ^1.3.0
* @param string $component
* @param array $args
* @return false|mixed|null
*/
public function __call(string $component, array $args)
{
return $this->call($component, ... $args);
}
}
?>
Did this file decode correctly?
Original Code
<?php
namespace Typecho;
use Typecho\Plugin\Exception as PluginException;
/**
*
*
* @category typecho
* @package Plugin
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
* @license GNU General Public License 2.0
*/
class Plugin
{
/**
*
*
* @var array
*/
private static array $plugin = [];
/**
*
*
* @var array
*/
private static array $instances;
/**
*
*
* @var array
*/
private static array $tmp = [];
/**
*
*
* @var string
*/
private string $handle;
/**
*
*
* @var string
*/
private $component;
/**
*
*
* @var boolean
*/
private bool $signal = false;
/**
*
*
* @param string $handle
*/
public function __construct(string $handle)
{
if (defined('__TYPECHO_CLASS_ALIASES__')) {
$alias = array_search('\\' . ltrim($handle, '\\'), __TYPECHO_CLASS_ALIASES__);
$handle = $alias ?: $handle;
}
$this->handle = Common::nativeClassName($handle);
}
/**
*
*
* @param array $plugins
*/
public static function init(array $plugins)
{
$plugins['activated'] = array_key_exists('activated', $plugins) ? $plugins['activated'] : [];
$plugins['handles'] = array_key_exists('handles', $plugins) ? $plugins['handles'] : [];
/** */
self::$plugin = $plugins;
}
/**
*
*
* @param string $handle
* @return Plugin
*/
public static function factory(string $handle): Plugin
{
return self::$instances[$handle] ?? (self::$instances[$handle] = new self($handle));
}
/**
*
*
* @param string $pluginName
*/
public static function activate(string $pluginName)
{
self::$plugin['activated'][$pluginName] = self::$tmp;
self::$tmp = [];
}
/**
*
*
* @param string $pluginName
*/
public static function deactivate(string $pluginName)
{
/** */
if (
isset(self::$plugin['activated'][$pluginName]['handles'])
&& is_array(self::$plugin['activated'][$pluginName]['handles'])
) {
foreach (self::$plugin['activated'][$pluginName]['handles'] as $handle => $handles) {
self::$plugin['handles'][$handle] = self::pluginHandlesDiff(
empty(self::$plugin['handles'][$handle]) ? [] : self::$plugin['handles'][$handle],
empty($handles) ? [] : $handles
);
if (empty(self::$plugin['handles'][$handle])) {
unset(self::$plugin['handles'][$handle]);
}
}
}
/** */
unset(self::$plugin['activated'][$pluginName]);
}
/**
* handle
*
* @param array $pluginHandles
* @param array $otherPluginHandles
* @return array
*/
private static function pluginHandlesDiff(array $pluginHandles, array $otherPluginHandles): array
{
foreach ($otherPluginHandles as $handle) {
while (false !== ($index = array_search($handle, $pluginHandles))) {
unset($pluginHandles[$index]);
}
}
return $pluginHandles;
}
/**
*
*
* @return array
*/
public static function export(): array
{
return self::$plugin;
}
/**
*
*
* @param string $pluginFile
* @return array
*/
public static function parseInfo(string $pluginFile): array
{
$tokens = token_get_all(file_get_contents($pluginFile));
$isDoc = false;
$isFunction = false;
$isClass = false;
$isInClass = false;
$isInFunction = false;
$isDefined = false;
$current = null;
/** */
$info = [
'description' => '',
'title' => '',
'author' => '',
'homepage' => '',
'version' => '',
'since' => '',
'activate' => false,
'deactivate' => false,
'config' => false,
'personalConfig' => false
];
$map = [
'package' => 'title',
'author' => 'author',
'link' => 'homepage',
'since' => 'since',
'version' => 'version'
];
foreach ($tokens as $token) {
/** doc comment */
if (!$isDoc && is_array($token) && T_DOC_COMMENT == $token[0]) {
/** */
$described = false;
$lines = preg_split("([\r\n])", $token[1]);
foreach ($lines as $line) {
$line = trim($line);
if (!empty($line) && '*' == $line[0]) {
$line = trim(substr($line, 1));
if (!$described && !empty($line) && '@' == $line[0]) {
$described = true;
}
if (!$described && !empty($line)) {
$info['description'] .= $line . "\n";
} elseif ($described && !empty($line) && '@' == $line[0]) {
$info['description'] = trim($info['description']);
$line = trim(substr($line, 1));
$args = explode(' ', $line);
$key = array_shift($args);
if (isset($map[$key])) {
$info[$map[$key]] = trim(implode(' ', $args));
}
}
}
}
$isDoc = true;
}
if (is_array($token)) {
switch ($token[0]) {
case T_FUNCTION:
$isFunction = true;
break;
case T_IMPLEMENTS:
$isClass = true;
break;
case T_WHITESPACE:
case T_COMMENT:
case T_DOC_COMMENT:
break;
case T_STRING:
$string = strtolower($token[1]);
switch ($string) {
case 'typecho_plugin_interface':
case 'plugininterface':
$isInClass = $isClass;
break;
case 'activate':
case 'deactivate':
case 'config':
case 'personalconfig':
if ($isFunction) {
$current = ('personalconfig' == $string ? 'personalConfig' : $string);
}
break;
default:
if (!empty($current) && $isInFunction && $isInClass) {
$info[$current] = true;
}
break;
}
break;
default:
if (!empty($current) && $isInFunction && $isInClass) {
$info[$current] = true;
}
break;
}
} else {
$token = strtolower($token);
switch ($token) {
case '{':
if ($isDefined) {
$isInFunction = true;
}
break;
case '(':
if ($isFunction && !$isDefined) {
$isDefined = true;
}
break;
case '}':
case ';':
$isDefined = false;
$isFunction = false;
$isInFunction = false;
$current = null;
break;
default:
if (!empty($current) && $isInFunction && $isInClass) {
$info[$current] = true;
}
break;
}
}
}
return $info;
}
/**
*
*
* ,
*
* @param string $pluginName
* @param string $path
* @return array
* @throws PluginException
*/
public static function portal(string $pluginName, string $path): array
{
switch (true) {
case file_exists($pluginFileName = $path . '/' . $pluginName . '/Plugin.php'):
$className = "\\" . PLUGIN_NAMESPACE . "\\{$pluginName}\\Plugin";
break;
case file_exists($pluginFileName = $path . '/' . $pluginName . '.php'):
$className = "\\" . PLUGIN_NAMESPACE . "\\" . $pluginName;
break;
default:
throw new PluginException('Missing Plugin ' . $pluginName, 404);
}
return [$pluginFileName, $className];
}
/**
*
*
* @param string|null $version
* @return boolean
*/
public static function checkDependence(?string $version): bool
{
//,
if (empty($version)) {
return true;
}
return version_compare(Common::VERSION, $version, '>=');
}
/**
*
*
* @param string $pluginName
* @return bool
*/
public static function exists(string $pluginName): bool
{
return array_key_exists($pluginName, self::$plugin['activated']);
}
/**
*
*
* @param boolean|null $signal
* @return Plugin
*/
public function trigger(?bool &$signal): Plugin
{
$signal = false;
$this->signal = &$signal;
return $this;
}
/**
*
*
* @param string $component
* @return Plugin
*/
public function __get(string $component)
{
$this->component = $component;
return $this;
}
/**
*
*
* @param string $component
* @param callable $value
*/
public function __set(string $component, callable $value)
{
$weight = 0;
if (strpos($component, '_') > 0) {
$parts = explode('_', $component, 2);
[$component, $weight] = $parts;
$weight = intval($weight) - 10;
}
$component = $this->handle . ':' . $component;
if (!isset(self::$plugin['handles'][$component])) {
self::$plugin['handles'][$component] = [];
}
if (!isset(self::$tmp['handles'][$component])) {
self::$tmp['handles'][$component] = [];
}
foreach (self::$plugin['handles'][$component] as $key => $val) {
$key = floatval($key);
if ($weight > $key) {
break;
} elseif ($weight == $key) {
$weight += 0.001;
}
}
self::$plugin['handles'][$component][strval($weight)] = $value;
self::$tmp['handles'][$component][] = $value;
ksort(self::$plugin['handles'][$component], SORT_NUMERIC);
}
/**
*
*
* @param string $component
* @param array $args
* @return mixed
*/
public function call(string $component, ...$args)
{
$component = $this->handle . ':' . $component;
$last = count($args);
$args[$last] = $last > 0 ? $args[0] : false;
if (isset(self::$plugin['handles'][$component])) {
$args[$last] = null;
$this->signal = true;
foreach (self::$plugin['handles'][$component] as $callback) {
$args[$last] = call_user_func_array($callback, $args);
}
}
return $args[$last];
}
/**
* @deprecated ^1.3.0
* @param string $component
* @param array $args
* @return false|mixed|null
*/
public function __call(string $component, array $args)
{
return $this->call($component, ... $args);
}
}
Function Calls
None |
Stats
MD5 | b60151b92f390a2b3e5d57af2eb86d39 |
Eval Count | 0 |
Decode Time | 100 ms |