diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..050b5e0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/.* export-ignore +/_test export-ignore diff --git a/3rdparty/PHPIco.php b/3rdparty/PHPIco.php index 17b3b55..90ab2b9 100644 --- a/3rdparty/PHPIco.php +++ b/3rdparty/PHPIco.php @@ -1,23 +1,23 @@ add_image( $file, $sizes ); - } + if (false != $file) + $this->addImage($file, $sizes); + } - /** - * Add an image to the generator. - * - * This function adds a source image to the generator. It serves two main purposes: add a source image if one was - * not supplied to the constructor and to add additional source images so that different images can be supplied for - * different sized images in the resulting ICO file. For instance, a small source image can be used for the small - * resolutions while a larger source image can be used for large resolutions. - * - * @param string $file Path to the source image file. - * @param array $sizes Optional. An array of sizes (each size is an array with a width and height) that the source image should be rendered at in the generated ICO file. If sizes are not supplied, the size of the source image will be used. - * @return boolean true on success and false on failure. - */ - function add_image( $file, $sizes = array() ) { - if ( false === ( $im = $this->_load_image_file( $file ) ) ) - return false; + /** + * Add an image to the generator. + * + * This function adds a source image to the generator. It serves two main purposes: add a source image if one was + * not supplied to the constructor and to add additional source images so that different images can be supplied for + * different sized images in the resulting ICO file. For instance, a small source image can be used for the small + * resolutions while a larger source image can be used for large resolutions. + * + * @param string $file Path to the source image file. + * @param array $sizes Optional. An array of sizes (each size is an array with a width and height) that the + * source image should be rendered at in the generated ICO file. + * If sizes are not supplied, the size of the source image will be used. + * @return boolean true on success and false on failure. + */ + public function addImage($file, $sizes = []) + { + if (false === ($im = $this->loadImageFile($file))) + return false; - if ( empty( $sizes ) ) - $sizes = array( imagesx( $im ), imagesy( $im ) ); + if (empty($sizes)) + $sizes = [imagesx($im), imagesy($im)]; - // If just a single size was passed, put it in array. - if ( ! is_array( $sizes[0] ) ) - $sizes = array( $sizes ); + // If just a single size was passed, put it in array. + if (!is_array($sizes[0])) + $sizes = [$sizes]; - foreach ( (array) $sizes as $size ) { - list( $width, $height ) = $size; + foreach ((array)$sizes as $size) { + [$width, $height] = $size; - $new_im = imagecreatetruecolor( $width, $height ); + $new_im = imagecreatetruecolor($width, $height); - imagecolortransparent( $new_im, imagecolorallocatealpha( $new_im, 0, 0, 0, 127 ) ); - imagealphablending( $new_im, false ); - imagesavealpha( $new_im, true ); + imagecolortransparent($new_im, imagecolorallocatealpha($new_im, 0, 0, 0, 127)); + imagealphablending($new_im, false); + imagesavealpha($new_im, true); - $source_width = imagesx( $im ); - $source_height = imagesy( $im ); + $source_width = imagesx($im); + $source_height = imagesy($im); - if ( false === imagecopyresampled( $new_im, $im, 0, 0, 0, 0, $width, $height, $source_width, $source_height ) ) - continue; - - $this->_add_image_data( $new_im ); - } - - return true; - } - - /** - * Write the ICO file data to a file path. - * - * @param string $file Path to save the ICO file data into. - * @return boolean true on success and false on failure. - */ - function save_ico( $file ) { - if ( false === ( $data = $this->_get_ico_data() ) ) - return false; - - if ( false === ( $fh = fopen( $file, 'w' ) ) ) - return false; - - if ( false === ( fwrite( $fh, $data ) ) ) { - fclose( $fh ); - return false; - } - - fclose( $fh ); - - return true; - } - - /** - * Generate the final ICO data by creating a file header and adding the image data. - */ - protected function _get_ico_data() { - if ( ! is_array( $this->_images ) || empty( $this->_images ) ) - return false; + if ( + false === imagecopyresampled( + $new_im, + $im, + 0, + 0, + 0, + 0, + $width, + $height, + $source_width, + $source_height + ) + ) { + continue; + } - $data = pack( 'vvv', 0, 1, count( $this->_images ) ); - $pixel_data = ''; + $this->addImageData($new_im); + } - $icon_dir_entry_size = 16; + return true; + } - $offset = 6 + ( $icon_dir_entry_size * count( $this->_images ) ); + /** + * Write the ICO file data to a file path. + * + * @param string $file Path to save the ICO file data into. + * @return boolean true on success and false on failure. + */ + public function saveIco($file) + { + if (false === ($data = $this->getIcoData())) + return false; - foreach ( $this->_images as $image ) { - $data .= pack( 'CCCCvvVV', $image['width'], $image['height'], $image['color_palette_colors'], 0, 1, $image['bits_per_pixel'], $image['size'], $offset ); - $pixel_data .= $image['data']; + if (false === ($fh = fopen($file, 'w'))) + return false; - $offset += $image['size']; - } + if (false === (fwrite($fh, $data))) { + fclose($fh); + return false; + } - $data .= $pixel_data; - unset( $pixel_data ); + fclose($fh); + + return true; + } + + /** + * Generate the final ICO data by creating a file header and adding the image data. + */ + protected function getIcoData() + { + if (!is_array($this->images) || $this->images === []) + return false; - return $data; - } + $data = pack('vvv', 0, 1, count($this->images)); + $pixel_data = ''; + + $icon_dir_entry_size = 16; + + $offset = 6 + ($icon_dir_entry_size * count($this->images)); + + foreach ($this->images as $image) { + $data .= pack( + 'CCCCvvVV', + $image['width'], + $image['height'], + $image['color_palette_colors'], + 0, + 1, + $image['bits_per_pixel'], + $image['size'], + $offset + ); + $pixel_data .= $image['data']; + + $offset += $image['size']; + } + + $data .= $pixel_data; + unset($pixel_data); + + + return $data; + } /** * Take a GD image resource and change it into a raw BMP format. * * @param resource $im */ - protected function _add_image_data( $im ) { - $width = imagesx( $im ); - $height = imagesy( $im ); + protected function addImageData($im) + { + $width = imagesx($im); + $height = imagesy($im); - $pixel_data = array(); + $pixel_data = []; - $opacity_data = array(); - $current_opacity_val = 0; + $opacity_data = []; + $current_opacity_val = 0; - for ( $y = $height - 1; $y >= 0; $y-- ) { - for ( $x = 0; $x < $width; $x++ ) { - $color = imagecolorat( $im, $x, $y ); + for ($y = $height - 1; $y >= 0; $y--) { + for ($x = 0; $x < $width; $x++) { + $color = imagecolorat($im, $x, $y); - $alpha = ( $color & 0x7F000000 ) >> 24; - $alpha = ( 1 - ( $alpha / 127 ) ) * 255; + $alpha = ($color & 0x7F000000) >> 24; + $alpha = (1 - ($alpha / 127)) * 255; - $color &= 0xFFFFFF; - $color |= 0xFF000000 & ( $alpha << 24 ); + $color &= 0xFFFFFF; + $color |= 0xFF000000 & ($alpha << 24); - $pixel_data[] = $color; + $pixel_data[] = $color; - $opacity = ( $alpha <= 127 ) ? 1 : 0; + $opacity = ($alpha <= 127) ? 1 : 0; - $current_opacity_val = ( $current_opacity_val << 1 ) | $opacity; + $current_opacity_val = ($current_opacity_val << 1) | $opacity; - if ( ( ( $x + 1 ) % 32 ) == 0 ) { - $opacity_data[] = $current_opacity_val; - $current_opacity_val = 0; - } - } + if ((($x + 1) % 32) == 0) { + $opacity_data[] = $current_opacity_val; + $current_opacity_val = 0; + } + } - if ( ( $x % 32 ) > 0 ) { - while ( ( $x++ % 32 ) > 0 ) - $current_opacity_val = $current_opacity_val << 1; + if (($x % 32) > 0) { + while (($x++ % 32) > 0) + $current_opacity_val <<= 1; - $opacity_data[] = $current_opacity_val; - $current_opacity_val = 0; - } - } + $opacity_data[] = $current_opacity_val; + $current_opacity_val = 0; + } + } - $image_header_size = 40; - $color_mask_size = $width * $height * 4; - $opacity_mask_size = ( ceil( $width / 32 ) * 4 ) * $height; + $image_header_size = 40; + $color_mask_size = $width * $height * 4; + $opacity_mask_size = (ceil($width / 32) * 4) * $height; - $data = pack( 'VVVvvVVVVVV', 40, $width, ( $height * 2 ), 1, 32, 0, 0, 0, 0, 0, 0 ); + $data = pack('VVVvvVVVVVV', 40, $width, ($height * 2), 1, 32, 0, 0, 0, 0, 0, 0); - foreach ( $pixel_data as $color ) - $data .= pack( 'V', $color ); + foreach ($pixel_data as $color) + $data .= pack('V', $color); - foreach ( $opacity_data as $opacity ) - $data .= pack( 'N', $opacity ); + foreach ($opacity_data as $opacity) + $data .= pack('N', $opacity); - $image = array( - 'width' => $width, - 'height' => $height, - 'color_palette_colors' => 0, - 'bits_per_pixel' => 32, - 'size' => $image_header_size + $color_mask_size + $opacity_mask_size, - 'data' => $data, - ); + $image = [ + 'width' => $width, + 'height' => $height, + 'color_palette_colors' => 0, + 'bits_per_pixel' => 32, + 'size' => $image_header_size + $color_mask_size + $opacity_mask_size, + 'data' => $data + ]; - $this->_images[] = $image; - } + $this->images[] = $image; + } /** * Read in the source image file and convert it into a GD image resource. @@ -229,20 +268,21 @@ class PHPIco { * @param string $file * @return bool|resource */ - protected function _load_image_file( $file ) { - // Run a cheap check to verify that it is an image file. - if ( false === ( $size = getimagesize( $file ) ) ) - return false; + protected function loadImageFile($file) + { + // Run a cheap check to verify that it is an image file. + if (false === ($size = getimagesize($file))) + return false; - if ( false === ( $file_data = file_get_contents( $file ) ) ) - return false; + if (false === ($file_data = file_get_contents($file))) + return false; - if ( false === ( $im = imagecreatefromstring( $file_data ) ) ) - return false; + if (false === ($im = imagecreatefromstring($file_data))) + return false; - unset( $file_data ); + unset($file_data); - return $im; - } + return $im; + } } diff --git a/3rdparty/RingIcon.php b/3rdparty/RingIcon.php index c8dfdbc..00c09fc 100644 --- a/3rdparty/RingIcon.php +++ b/3rdparty/RingIcon.php @@ -14,15 +14,14 @@ namespace splitbrain\RingIcon; */ class RingIcon { - protected $size; protected $fullsize; - protected $rings; + protected $rings = 4; protected $center; protected $ringwidth; protected $seed; protected $ismono = false; - protected $monocolor = null; + protected $monocolor; /** * RingIcon constructor. @@ -33,12 +32,11 @@ class RingIcon { $this->size = $size; $this->fullsize = $this->size * 5; - $this->rings = 4; $this->center = floor($this->fullsize / 2); $this->ringwidth = floor($this->fullsize / $rings); - $this->seed = mt_rand() . time(); + $this->seed = random_int(0, mt_getrandmax()) . time(); } /** @@ -52,17 +50,13 @@ class RingIcon public function createImage($seed = '', $file = '') { if (!$seed) { - $seed = mt_rand() . time(); + $seed = random_int(0, mt_getrandmax()) . time(); } $this->seed = $seed; // monochrome wanted? - if($this->ismono) { - $this->monocolor = array( - $this->rand(20,255), - $this->rand(20,255), - $this->rand(20,255) - ); + if ($this->ismono) { + $this->monocolor = [$this->rand(20, 255), $this->rand(20, 255), $this->rand(20, 255)]; } else { $this->monocolor = null; } @@ -93,7 +87,8 @@ class RingIcon * * @param bool $ismono */ - public function setMono($ismono) { + public function setMono($ismono) + { $this->ismono = $ismono; } @@ -126,11 +121,17 @@ class RingIcon $start = $this->rand(20, 360); $stop = $this->rand(20, 360); - if($stop < $start) list($start, $stop) = array($stop, $start); + if ($stop < $start) [$start, $stop] = [$stop, $start]; imagefilledarc($image, $this->center, $this->center, $arcwidth, $arcwidth, $stop, $start, $color, IMG_ARC_PIE); - imagefilledellipse($image, $this->center, $this->center, $arcwidth - $this->ringwidth, - $arcwidth - $this->ringwidth, $transparency); + imagefilledellipse( + $image, + $this->center, + $this->center, + $arcwidth - $this->ringwidth, + $arcwidth - $this->ringwidth, + $transparency + ); imagecolordeallocate($image, $color); imagecolordeallocate($image, $transparency); @@ -155,10 +156,21 @@ class RingIcon */ protected function randomColor($image) { - if($this->ismono) { - return imagecolorallocatealpha($image, $this->monocolor[0], $this->monocolor[1], $this->monocolor[2], $this->rand(0, 96)); + if ($this->ismono) { + return imagecolorallocatealpha( + $image, + $this->monocolor[0], + $this->monocolor[1], + $this->monocolor[2], + $this->rand(0, 96) + ); } - return imagecolorallocate($image, $this->rand(0, 255), $this->rand(0, 255), $this->rand(0, 255)); + return imagecolorallocate( + $image, + $this->rand(0, 255), + $this->rand(0, 255), + $this->rand(0, 255) + ); } /** @@ -182,5 +194,4 @@ class RingIcon imagesavealpha($image, true); return $image; } - } diff --git a/DokuWikiFarmCore.php b/DokuWikiFarmCore.php index b33aade..7dcf18f 100644 --- a/DokuWikiFarmCore.php +++ b/DokuWikiFarmCore.php @@ -1,5 +1,6 @@ */ -class DokuWikiFarmCore { +class DokuWikiFarmCore +{ /** * @var array The default config - changed by loadConfig */ - protected $config = array( - 'base' => array( + protected $config = [ + 'base' => [ 'farmdir' => '', 'farmhost' => '', - 'basedomain' => '', - ), - 'notfound' => array( + 'basedomain' => '' + ], + 'notfound' => [ 'show' => 'farmer', 'url' => '' - ), - 'inherit' => array( + ], + 'inherit' => [ 'main' => 1, 'acronyms' => 1, 'entities' => 1, @@ -41,8 +43,8 @@ class DokuWikiFarmCore { 'userstyle' => 0, 'userscript' => 0, 'styleini' => 0 - ) - ); + ] + ]; /** @var string|false The current animal, false for farmer */ protected $animal = false; @@ -57,10 +59,11 @@ class DokuWikiFarmCore { * This initializes the whole farm by loading the configuration and setting * DOKU_CONF depending on the requested animal */ - public function __construct() { + public function __construct() + { $this->loadConfig(); - if($this->config['base']['farmdir'] === '') return; // farm setup not complete - $this->config['base']['farmdir'] = rtrim($this->config['base']['farmdir'], '/').'/'; // trailing slash always + if ($this->config['base']['farmdir'] === '') return; // farm setup not complete + $this->config['base']['farmdir'] = rtrim($this->config['base']['farmdir'], '/') . '/'; // trailing slash always define('DOKU_FARMDIR', $this->config['base']['farmdir']); // animal? @@ -68,7 +71,7 @@ class DokuWikiFarmCore { // setup defines define('DOKU_FARM_ANIMAL', $this->animal); - if($this->animal) { + if ($this->animal) { define('DOKU_CONF', DOKU_FARMDIR . $this->animal . '/conf/'); } else { define('DOKU_CONF', DOKU_INC . '/conf/'); @@ -81,43 +84,49 @@ class DokuWikiFarmCore { /** * @return array the current farm configuration */ - public function getConfig() { + public function getConfig() + { return $this->config; } /** * @return false|string */ - public function getAnimal() { + public function getAnimal() + { return $this->animal; } /** * @return boolean */ - public function isHostbased() { + public function isHostbased() + { return $this->hostbased; } /** * @return boolean */ - public function wasNotfound() { + public function wasNotfound() + { return $this->notfound; } /** * @return string */ - public function getAnimalDataDir() { + public function getAnimalDataDir() + { return DOKU_FARMDIR . $this->getAnimal() . '/data/'; } /** * @return string */ - public function getAnimalBaseDir() { - if($this->isHostbased()) return '/'; + public function getAnimalBaseDir() + { + if ($this->isHostbased()) return '/'; return getBaseURL() . '!' . $this->getAnimal(); } @@ -128,7 +137,8 @@ class DokuWikiFarmCore { * * This borrows form DokuWiki's inc/farm.php but does not support a default conf dir */ - protected function detectAnimal() { + protected function detectAnimal() + { $farmdir = $this->config['base']['farmdir']; $farmhost = $this->config['base']['farmhost']; @@ -144,17 +154,17 @@ class DokuWikiFarmCore { $_SERVER['QUERY_STRING'] = http_build_query($params); } // get animal from CLI parameter - if('cli' == php_sapi_name() && isset($_SERVER['animal'])) $animal = $_SERVER['animal']; - if($animal) { + if ('cli' == PHP_SAPI && isset($_SERVER['animal'])) $animal = $_SERVER['animal']; + if ($animal) { // check that $animal is a string and just a directory name and not a path - if(!is_string($animal) || strpbrk($animal, '\\/') !== false) { + if (!is_string($animal) || strpbrk($animal, '\\/') !== false) { $this->notfound = true; return; }; $animal = strtolower($animal); // check if animal exists - if(is_dir("$farmdir/$animal/conf")) { + if (is_dir("$farmdir/$animal/conf")) { $this->animal = $animal; return; } else { @@ -164,18 +174,18 @@ class DokuWikiFarmCore { } // no host - no host based setup. if we're still here then it's the farmer - if(!isset($_SERVER['HTTP_HOST'])) return; + if (!isset($_SERVER['HTTP_HOST'])) return; // is this the farmer? - if(strtolower($_SERVER['HTTP_HOST']) == $farmhost) { + if (strtolower($_SERVER['HTTP_HOST']) == $farmhost) { return; } // still here? check for host based $this->hostbased = true; $possible = $this->getAnimalNamesForHost($_SERVER['HTTP_HOST']); - foreach($possible as $animal) { - if(is_dir("$farmdir/$animal/conf/")) { + foreach ($possible as $animal) { + if (is_dir("$farmdir/$animal/conf/")) { $this->animal = $animal; return; } @@ -183,7 +193,6 @@ class DokuWikiFarmCore { // no hit $this->notfound = true; - return; } /** @@ -192,10 +201,11 @@ class DokuWikiFarmCore { * @param string $host the HTTP_HOST header * @return array */ - protected function getAnimalNamesForHost($host) { - $animals = array(); + protected function getAnimalNamesForHost($host) + { + $animals = []; $parts = explode('.', implode('.', explode(':', rtrim($host, '.')))); - for($j = count($parts); $j > 0; $j--) { + for ($j = count($parts); $j > 0; $j--) { // strip from the end $animals[] = implode('.', array_slice($parts, 0, $j)); // strip from the end without host part @@ -208,7 +218,7 @@ class DokuWikiFarmCore { // compare by length, then alphabet function ($a, $b) { $ret = strlen($b) - strlen($a); - if($ret != 0) return $ret; + if ($ret != 0) return $ret; return $a <=> $b; } ); @@ -218,82 +228,95 @@ class DokuWikiFarmCore { /** * This sets up the default farming config cascade */ - protected function setupCascade() { + protected function setupCascade() + { global $config_cascade; - $config_cascade = array( - 'main' => array( - 'default' => array(DOKU_INC . 'conf/dokuwiki.php',), - 'local' => array(DOKU_CONF . 'local.php',), - 'protected' => array(DOKU_CONF . 'local.protected.php',), - ), - 'acronyms' => array( - 'default' => array(DOKU_INC . 'conf/acronyms.conf',), - 'local' => array(DOKU_CONF . 'acronyms.local.conf',), - ), - 'entities' => array( - 'default' => array(DOKU_INC . 'conf/entities.conf',), - 'local' => array(DOKU_CONF . 'entities.local.conf',), - ), - 'interwiki' => array( - 'default' => array(DOKU_INC . 'conf/interwiki.conf',), - 'local' => array(DOKU_CONF . 'interwiki.local.conf',), - ), - 'license' => array( - 'default' => array(DOKU_INC . 'conf/license.php',), - 'local' => array(DOKU_CONF . 'license.local.php',), - ), - 'manifest' => array( - 'default' => array(DOKU_INC . 'conf/manifest.json',), - 'local' => array(DOKU_CONF . 'manifest.local.json',), - ), - 'mediameta' => array( - 'default' => array(DOKU_INC . 'conf/mediameta.php',), - 'local' => array(DOKU_CONF . 'mediameta.local.php',), - ), - 'mime' => array( - 'default' => array(DOKU_INC . 'conf/mime.conf',), - 'local' => array(DOKU_CONF . 'mime.local.conf',), - ), - 'scheme' => array( - 'default' => array(DOKU_INC . 'conf/scheme.conf',), - 'local' => array(DOKU_CONF . 'scheme.local.conf',), - ), - 'smileys' => array( - 'default' => array(DOKU_INC . 'conf/smileys.conf',), - 'local' => array(DOKU_CONF . 'smileys.local.conf',), - ), - 'wordblock' => array( - 'default' => array(DOKU_INC . 'conf/wordblock.conf',), - 'local' => array(DOKU_CONF . 'wordblock.local.conf',), - ), - 'acl' => array( - 'default' => DOKU_CONF . 'acl.auth.php', - ), - 'plainauth.users' => array( - 'default' => DOKU_CONF . 'users.auth.php', - ), - 'plugins' => array( - 'default' => array(DOKU_INC . 'conf/plugins.php',), - 'local' => array(DOKU_CONF . 'plugins.local.php',), - 'protected' => array( + $config_cascade = [ + 'main' => [ + 'default' => [DOKU_INC . 'conf/dokuwiki.php'], + 'local' => [DOKU_CONF . 'local.php'], + 'protected' => [DOKU_CONF . 'local.protected.php'] + ], + 'acronyms' => [ + 'default' => [DOKU_INC . 'conf/acronyms.conf'], + 'local' => [DOKU_CONF . 'acronyms.local.conf'] + ], + 'entities' => [ + 'default' => [DOKU_INC . 'conf/entities.conf'], + 'local' => [DOKU_CONF . 'entities.local.conf'] + ], + 'interwiki' => [ + 'default' => [DOKU_INC . 'conf/interwiki.conf'], + 'local' => [DOKU_CONF . 'interwiki.local.conf'] + ], + 'license' => [ + 'default' => [DOKU_INC . 'conf/license.php'], + 'local' => [DOKU_CONF . 'license.local.php'] + ], + 'manifest' => [ + 'default' => [DOKU_INC . 'conf/manifest.json'], + 'local' => [DOKU_CONF . 'manifest.local.json'] + ], + 'mediameta' => [ + 'default' => [DOKU_INC . 'conf/mediameta.php'], + 'local' => [DOKU_CONF . 'mediameta.local.php'] + ], + 'mime' => [ + 'default' => [DOKU_INC . 'conf/mime.conf'], + 'local' => [DOKU_CONF . 'mime.local.conf'] + ], + 'scheme' => [ + 'default' => [DOKU_INC . 'conf/scheme.conf'], + 'local' => [DOKU_CONF . 'scheme.local.conf'] + ], + 'smileys' => [ + 'default' => [DOKU_INC . 'conf/smileys.conf'], + 'local' => [DOKU_CONF . 'smileys.local.conf'] + ], + 'wordblock' => [ + 'default' => [DOKU_INC . 'conf/wordblock.conf'], + 'local' => [DOKU_CONF . 'wordblock.local.conf'] + ], + 'acl' => [ + 'default' => DOKU_CONF . 'acl.auth.php' + ], + 'plainauth.users' => [ + 'default' => DOKU_CONF . 'users.auth.php' + ], + 'plugins' => [ + 'default' => [DOKU_INC . 'conf/plugins.php'], + 'local' => [DOKU_CONF . 'plugins.local.php'], + 'protected' => [ DOKU_INC . 'conf/plugins.required.php', - DOKU_CONF . 'plugins.protected.php', - ), - ), - 'userstyle' => array( - 'screen' => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less',), - 'print' => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less',), - 'feed' => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less',), - 'all' => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less',), - ), - 'userscript' => array( - 'default' => array(DOKU_CONF . 'userscript.js',), - ), - 'styleini' => array( - 'default' => array(DOKU_INC . 'lib/tpl/%TEMPLATE%/' . 'style.ini'), - 'local' => array(DOKU_CONF . 'tpl/%TEMPLATE%/' . 'style.ini') - ), - ); + DOKU_CONF . 'plugins.protected.php' + ] + ], + 'userstyle' => [ + 'screen' => [ + DOKU_CONF . 'userstyle.css', + DOKU_CONF . 'userstyle.less' + ], + 'print' => [ + DOKU_CONF . 'userprint.css', + DOKU_CONF . 'userprint.less' + ], + 'feed' => [ + DOKU_CONF . 'userfeed.css', + DOKU_CONF . 'userfeed.less' + ], + 'all' => [ + DOKU_CONF . 'userall.css', + DOKU_CONF . 'userall.less' + ] + ], + 'userscript' => [ + 'default' => [DOKU_CONF . 'userscript.js'] + ], + 'styleini' => [ + 'default' => [DOKU_INC . 'lib/tpl/%TEMPLATE%/' . 'style.ini'], + 'local' => [DOKU_CONF . 'tpl/%TEMPLATE%/' . 'style.ini'] + ] + ]; } /** @@ -301,52 +324,71 @@ class DokuWikiFarmCore { * * These are only added for animals, not the farmer */ - protected function adjustCascade() { + protected function adjustCascade() + { // nothing to do when on the farmer: - if(!$this->animal) return; + if (!$this->animal) return; global $config_cascade; - foreach($this->config['inherit'] as $key => $val) { - if(!$val) continue; + foreach ($this->config['inherit'] as $key => $val) { + if (!$val) continue; // prepare what is to append or prepend - $append = array(); - $prepend = array(); - if($key == 'main') { - $append = array( - 'default' => array(DOKU_INC . 'conf/local.php'), - 'protected' => array(DOKU_INC . 'lib/plugins/farmer/includes/config.php') - ); - } elseif($key == 'license') { - $append = array('default' => array(DOKU_INC . 'conf/' . $key . '.local.php')); - } elseif($key == 'userscript') { - $prepend = array('default' => array(DOKU_INC . 'conf/userscript.js')); - } elseif($key == 'userstyle') { - $prepend = array( - 'screen' => array(DOKU_INC . 'conf/userstyle.css', DOKU_INC . 'conf/userstyle.less',), - 'print' => array(DOKU_INC . 'conf/userprint.css', DOKU_INC . 'conf/userprint.less',), - 'feed' => array(DOKU_INC . 'conf/userfeed.css', DOKU_INC . 'conf/userfeed.less',), - 'all' => array(DOKU_INC . 'conf/userall.css', DOKU_INC . 'conf/userall.less',), - ); + $append = []; + $prepend = []; + if ($key == 'main') { + $append = [ + 'default' => [DOKU_INC . 'conf/local.php'], + 'protected' => [DOKU_INC . 'lib/plugins/farmer/includes/config.php'] + ]; + } elseif ($key == 'license') { + $append = [ + 'default' => [DOKU_INC . 'conf/' . $key . '.local.php'] + ]; + } elseif ($key == 'userscript') { + $prepend = [ + 'default' => [DOKU_INC . 'conf/userscript.js'] + ]; + } elseif ($key == 'userstyle') { + $prepend = [ + 'screen' => [ + DOKU_INC . 'conf/userstyle.css', + DOKU_INC . 'conf/userstyle.less' + ], + 'print' => [ + DOKU_INC . 'conf/userprint.css', + DOKU_INC . 'conf/userprint.less' + ], + 'feed' => [ + DOKU_INC . 'conf/userfeed.css', + DOKU_INC . 'conf/userfeed.less' + ], + 'all' => [ + DOKU_INC . 'conf/userall.css', + DOKU_INC . 'conf/userall.less' + ] + ]; } elseif ($key == 'styleini') { - $append = array( - 'local' => array( - DOKU_INC . 'conf/tpl/%TEMPLATE%/style.ini' - ) - ); - } elseif($key == 'users') { + $append = [ + 'local' => [DOKU_INC . 'conf/tpl/%TEMPLATE%/style.ini'] + ]; + } elseif ($key == 'users') { $config_cascade['plainauth.users']['protected'] = DOKU_INC . 'conf/users.auth.php'; - } elseif($key == 'plugins') { - $append = array('default' => array(DOKU_INC . 'conf/plugins.local.php')); + } elseif ($key == 'plugins') { + $append = [ + 'default' => [DOKU_INC . 'conf/plugins.local.php'] + ]; } else { - $append = array('default' => array(DOKU_INC . 'conf/' . $key . '.local.conf')); + $append = [ + 'default' => [DOKU_INC . 'conf/' . $key . '.local.conf'] + ]; } // add to cascade - foreach($prepend as $section => $data) { + foreach ($prepend as $section => $data) { $config_cascade[$key][$section] = array_merge($data, $config_cascade[$key][$section]); } - foreach($append as $section => $data) { + foreach ($append as $section => $data) { $config_cascade[$key][$section] = array_merge($config_cascade[$key][$section], $data); } } @@ -358,12 +400,13 @@ class DokuWikiFarmCore { /** * Loads the farm config */ - protected function loadConfig() { + protected function loadConfig() + { $ini = DOKU_INC . 'conf/farm.ini'; - if(!file_exists($ini)) return; + if (!file_exists($ini)) return; $config = parse_ini_file($ini, true); - foreach(array_keys($this->config) as $section) { - if(isset($config[$section])) { + foreach (array_keys($this->config) as $section) { + if (isset($config[$section])) { $this->config[$section] = array_merge( $this->config[$section], $config[$section] @@ -374,11 +417,10 @@ class DokuWikiFarmCore { $this->config['base']['farmdir'] = trim($this->config['base']['farmdir']); $this->config['base']['farmhost'] = strtolower(trim($this->config['base']['farmhost'])); } - } // initialize it globally -if(!defined('DOKU_UNITTEST')) { +if (!defined('DOKU_UNITTEST')) { global $FARMCORE; $FARMCORE = new DokuWikiFarmCore(); } diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/_animal/conf/local.php b/_animal/conf/local.php index 109a33a..c4ffe52 100644 --- a/_animal/conf/local.php +++ b/_animal/conf/local.php @@ -1,6 +1,8 @@ * @author Andreas Gohr */ - -if(!defined('DOKU_INC')) die(); - -/** - * Manage AJAX features - */ -class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { - +class action_plugin_farmer_ajax extends ActionPlugin +{ /** * plugin should use this method to register its handlers with the DokuWiki's event controller * - * @param Doku_Event_Handler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER - * + * @param EventHandler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER */ - public function register(Doku_Event_Handler $controller) { - $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_ajax_call'); + public function register(EventHandler $controller) + { + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxCall'); } /** * handle ajax requests * - * @param Doku_Event $event + * @param Event $event * @param $param */ - public function _ajax_call(Doku_Event $event, $param) { - if(substr($event->data, 0, 13) !== 'plugin_farmer') { + public function handleAjaxCall(Event $event, $param) + { + if (substr($event->data, 0, 13) !== 'plugin_farmer') { return; } //no other ajax call handlers needed $event->stopPropagation(); $event->preventDefault(); - if(!auth_isadmin()) die('Only admins allowed'); + if (!auth_isadmin()) die('Only admins allowed'); - if(substr($event->data, 14) === 'getPluginMatrix') { - $this->get_plugin_matrix($event, $param); + if (substr($event->data, 14) === 'getPluginMatrix') { + $this->printPluginMatrix($event, $param); return; } - if(substr($event->data, 14) === 'modPlugin') { - $this->plugin_mod($event, $param); + if (substr($event->data, 14) === 'modPlugin') { + $this->togglePluginState($event, $param); return; } - if(substr($event->data, 14, 10) === 'getPlugins') { - $this->get_animal_plugins($event, $param); + if (substr($event->data, 14, 10) === 'getPlugins') { + $this->printAnimalPlugins($event, $param); return; } - if(substr($event->data, 14, 10) === 'checkSetup') { - $this->check_setup($event, $param); + if (substr($event->data, 14, 10) === 'checkSetup') { + $this->checkSetup($event, $param); } } /** - * This function exists in order to provide a positive (i.e. 200) response to an ajax request to a non-existing animal. + * Always return an empty response * - * @param Doku_Event $event - * @param $param + * This function exists in order to provide a positive (i.e. 200) response + * to an ajax request to a non-existing animal. + * + * @param Event $event + * @param $param */ - public function check_setup(Doku_Event $event, $param) { + public function checkSetup(Event $event, $param) + { $data = ''; - $json = new JSON(); header('Content-Type: application/json'); - echo $json->encode($data); + json_encode($data); } - public function plugin_mod(Doku_Event $event, $param) { + /** + * Turn a plugin on or off + * + * @param Event $event + * @param $param + */ + public function togglePluginState(Event $event, $param) + { global $INPUT; /** @var helper_plugin_farmer $helper */ @@ -81,11 +93,11 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { $plugins = $helper->getAnimalPluginRealState($animal); - if(!isset($plugins[$pname])) die('no such plugin'); + if (!isset($plugins[$pname])) die('no such plugin'); $plugin = $plugins[$pname]; // figure out what to toggle to - if($plugin['isdefault']) { + if ($plugin['isdefault']) { $new = (int) !$plugin['actual']; } else { $new = -1; @@ -96,16 +108,17 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { $plugins = $helper->getAnimalPluginRealState($animal); $plugin = $plugins[$pname]; header('Content-Type: text/html; charset=utf-8'); - echo $this->plugin_matrix_cell($plugin, $animal); + echo $this->createPluginMatrixCell($plugin, $animal); } /** * Create a matrix of all animals and plugin states * - * @param Doku_Event $event + * @param Event $event * @param $param */ - public function get_plugin_matrix(Doku_Event $event, $param) { + public function printPluginMatrix(Event $event, $param) + { /** @var helper_plugin_farmer $helper */ $helper = plugin_load('helper', 'farmer'); @@ -119,7 +132,7 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { echo ''; echo ''; echo ''; - foreach($plugins as $plugin) { + foreach ($plugins as $plugin) { echo '
' . hsc($plugin['name']) . '
'; } echo ''; @@ -129,17 +142,17 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { echo ''; echo 'Default'; - foreach($plugins as $plugin) { - echo $this->plugin_matrix_cell($plugin, $this->getLang('plugin_default'), true); + foreach ($plugins as $plugin) { + echo $this->createPluginMatrixCell($plugin, $this->getLang('plugin_default'), true); } echo ''; - foreach($animals as $animal) { + foreach ($animals as $animal) { $plugins = $helper->getAnimalPluginRealState($animal); echo ''; echo '' . hsc($animal) . ''; - foreach($plugins as $plugin) { - echo $this->plugin_matrix_cell($plugin, $animal); + foreach ($plugins as $plugin) { + echo $this->createPluginMatrixCell($plugin, $animal); } echo ''; } @@ -156,8 +169,9 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { * @param bool $defaults show the defaults * @return string */ - protected function plugin_matrix_cell($plugin, $animal, $defaults=false) { - if($defaults) { + protected function createPluginMatrixCell($plugin, $animal, $defaults = false) + { + if ($defaults) { $current = $plugin['default']; $isdefault = true; $td = 'th'; @@ -167,32 +181,35 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { $td = 'td'; } - if($current) { + if ($current) { $class = 'on'; $lbl = '✓'; } else { $class = 'off'; $lbl = '✗'; } - if($isdefault) $class .= ' default'; + if ($isdefault) $class .= ' default'; - $attrs = array( + $attrs = [ 'class' => $class, 'title' => $animal . ': ' . $plugin['name'], 'data-animal' => $animal, 'data-plugin' => $plugin['name'] - ); + ]; $attr = buildAttributes($attrs); return "<$td $attr>$lbl"; } /** - * @param Doku_Event $event - * @param $param + * Create an overview on all plugins for a given animal + * + * @param Event $event + * @param $param */ - public function get_animal_plugins(Doku_Event $event, $param) { + public function printAnimalPlugins(Event $event, $param) + { $animal = substr($event->data, 25); /** @var helper_plugin_farmer $helper */ $helper = plugin_load('helper', 'farmer'); @@ -209,21 +226,21 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin { echo '' . $this->getLang('plugin_disabled') . ''; echo ''; - foreach($plugins as $plugin) { + foreach ($plugins as $plugin) { echo ''; echo '' . hsc($plugin['name']) . ''; echo ''; - $attr = array(); + $attr = []; $attr['type'] = 'radio'; $attr['name'] = 'bulk_plugins[' . $plugin['name'] . ']'; $attr['value'] = '-1'; - if($plugin['isdefault']) { + if ($plugin['isdefault']) { $attr['checked'] = 'checked'; } echo '