| 
							- <?php
 - 
 - namespace dokuwiki\Extension;
 - 
 - use dokuwiki\Logger;
 - 
 - /**
 -  * Provides standard DokuWiki plugin behaviour
 -  */
 - trait PluginTrait
 - {
 -     protected $localised = false;        // set to true by setupLocale() after loading language dependent strings
 -     protected $lang = [];           // array to hold language dependent strings, best accessed via ->getLang()
 -     protected $configloaded = false;     // set to true by loadConfig() after loading plugin configuration variables
 -     protected $conf = [];           // array to hold plugin settings, best accessed via ->getConf()
 - 
 -     /**
 -      * @see PluginInterface::getInfo()
 -      */
 -     public function getInfo()
 -     {
 -         $class = get_class($this);
 -         $parts = sexplode('_', $class, 3);
 -         $ext = $parts[2];
 - 
 -         if (empty($ext)) {
 -             throw new \RuntimeException('Class does not follow the plugin naming convention');
 -         }
 - 
 -         // class like action_plugin_myplugin_ajax belongs to plugin 'myplugin'
 -         $ext = strtok($ext, '_');
 - 
 -         $base = [
 -             'base' => $ext,
 -             'author' => 'Unknown',
 -             'email' => 'unknown@example.com',
 -             'date' => '0000-00-00',
 -             'name' => $ext . ' plugin',
 -             'desc' => 'Unknown purpose - bad plugin.info.txt',
 -             'url' => 'https://www.dokuwiki.org/plugins/' . $ext,
 -         ];
 - 
 -         $file = DOKU_PLUGIN . '/' . $ext . '/plugin.info.txt';
 -         if (file_exists($file)) {
 -             $raw = confToHash($file);
 - 
 -             // check if all required fields are present
 -             $msg = 'Extension %s does not provide a valid %s in %s';
 -             foreach (array_keys($base) as $line) {
 -                 if (empty($raw[$line])) Logger::error(sprintf($msg, $ext, $line, $file));
 -             }
 - 
 -             return array_merge($base, $raw);
 -         }
 - 
 -         Logger::error(sprintf('Extension %s does not provide a plugin.info.txt in %s', $ext, $file));
 -         return $base;
 -     }
 - 
 -     /**
 -      * @see PluginInterface::isSingleton()
 -      */
 -     public function isSingleton()
 -     {
 -         return true;
 -     }
 - 
 -     /**
 -      * @see PluginInterface::loadHelper()
 -      */
 -     public function loadHelper($name, $msg = true)
 -     {
 -         $obj = plugin_load('helper', $name);
 -         if (is_null($obj) && $msg) msg("Helper plugin $name is not available or invalid.", -1);
 -         return $obj;
 -     }
 - 
 -     // region introspection methods
 - 
 -     /**
 -      * @see PluginInterface::getPluginType()
 -      */
 -     public function getPluginType()
 -     {
 -         [$t] = explode('_', get_class($this), 2);
 -         return $t;
 -     }
 - 
 -     /**
 -      * @see PluginInterface::getPluginName()
 -      */
 -     public function getPluginName()
 -     {
 -         [/* t */, /* p */, $n] = sexplode('_', get_class($this), 4, '');
 -         return $n;
 -     }
 - 
 -     /**
 -      * @see PluginInterface::getPluginComponent()
 -      */
 -     public function getPluginComponent()
 -     {
 -         [/* t */, /* p */, /* n */, $c] = sexplode('_', get_class($this), 4, '');
 -         return $c;
 -     }
 - 
 -     // endregion
 -     // region localization methods
 - 
 -     /**
 -      * @see PluginInterface::getLang()
 -      */
 -     public function getLang($id)
 -     {
 -         if (!$this->localised) $this->setupLocale();
 - 
 -         return ($this->lang[$id] ?? '');
 -     }
 - 
 -     /**
 -      * @see PluginInterface::locale_xhtml()
 -      */
 -     public function locale_xhtml($id)
 -     {
 -         return p_cached_output($this->localFN($id));
 -     }
 - 
 -     /**
 -      * @see PluginInterface::localFN()
 -      */
 -     public function localFN($id, $ext = 'txt')
 -     {
 -         global $conf;
 -         $plugin = $this->getPluginName();
 -         $file = DOKU_CONF . 'plugin_lang/' . $plugin . '/' . $conf['lang'] . '/' . $id . '.' . $ext;
 -         if (!file_exists($file)) {
 -             $file = DOKU_PLUGIN . $plugin . '/lang/' . $conf['lang'] . '/' . $id . '.' . $ext;
 -             if (!file_exists($file)) {
 -                 //fall back to english
 -                 $file = DOKU_PLUGIN . $plugin . '/lang/en/' . $id . '.' . $ext;
 -             }
 -         }
 -         return $file;
 -     }
 - 
 -     /**
 -      * @see PluginInterface::setupLocale()
 -      */
 -     public function setupLocale()
 -     {
 -         if ($this->localised) return;
 - 
 -         global $conf, $config_cascade; // definitely don't invoke "global $lang"
 -         $path = DOKU_PLUGIN . $this->getPluginName() . '/lang/';
 - 
 -         $lang = [];
 - 
 -         // don't include once, in case several plugin components require the same language file
 -         @include($path . 'en/lang.php');
 -         foreach ($config_cascade['lang']['plugin'] as $config_file) {
 -             if (file_exists($config_file . $this->getPluginName() . '/en/lang.php')) {
 -                 include($config_file . $this->getPluginName() . '/en/lang.php');
 -             }
 -         }
 - 
 -         if ($conf['lang'] != 'en') {
 -             @include($path . $conf['lang'] . '/lang.php');
 -             foreach ($config_cascade['lang']['plugin'] as $config_file) {
 -                 if (file_exists($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php')) {
 -                     include($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php');
 -                 }
 -             }
 -         }
 - 
 -         $this->lang = $lang;
 -         $this->localised = true;
 -     }
 - 
 -     // endregion
 -     // region configuration methods
 - 
 -     /**
 -      * @see PluginInterface::getConf()
 -      */
 -     public function getConf($setting, $notset = false)
 -     {
 - 
 -         if (!$this->configloaded) {
 -             $this->loadConfig();
 -         }
 - 
 -         if (isset($this->conf[$setting])) {
 -             return $this->conf[$setting];
 -         } else {
 -             return $notset;
 -         }
 -     }
 - 
 -     /**
 -      * @see PluginInterface::loadConfig()
 -      */
 -     public function loadConfig()
 -     {
 -         global $conf;
 - 
 -         $defaults = $this->readDefaultSettings();
 -         $plugin = $this->getPluginName();
 - 
 -         foreach ($defaults as $key => $value) {
 -             if (isset($conf['plugin'][$plugin][$key])) continue;
 -             $conf['plugin'][$plugin][$key] = $value;
 -         }
 - 
 -         $this->configloaded = true;
 -         $this->conf =& $conf['plugin'][$plugin];
 -     }
 - 
 -     /**
 -      * read the plugin's default configuration settings from conf/default.php
 -      * this function is automatically called through getConf()
 -      *
 -      * @return    array    setting => value
 -      */
 -     protected function readDefaultSettings()
 -     {
 - 
 -         $path = DOKU_PLUGIN . $this->getPluginName() . '/conf/';
 -         $conf = [];
 - 
 -         if (file_exists($path . 'default.php')) {
 -             include($path . 'default.php');
 -         }
 - 
 -         return $conf;
 -     }
 - 
 -     // endregion
 -     // region output methods
 - 
 -     /**
 -      * @see PluginInterface::email()
 -      */
 -     public function email($email, $name = '', $class = '', $more = '')
 -     {
 -         if (!$email) return $name;
 -         $email = obfuscate($email);
 -         if (!$name) $name = $email;
 -         $class = "class='" . ($class ?: 'mail') . "'";
 -         return "<a href='mailto:$email' $class title='$email' $more>$name</a>";
 -     }
 - 
 -     /**
 -      * @see PluginInterface::external_link()
 -      */
 -     public function external_link($link, $title = '', $class = '', $target = '', $more = '')
 -     {
 -         global $conf;
 - 
 -         $link = htmlentities($link);
 -         if (!$title) $title = $link;
 -         if (!$target) $target = $conf['target']['extern'];
 -         if ($conf['relnofollow']) $more .= ' rel="nofollow"';
 - 
 -         if ($class) $class = " class='$class'";
 -         if ($target) $target = " target='$target'";
 -         if ($more) $more = " " . trim($more);
 - 
 -         return "<a href='$link'$class$target$more>$title</a>";
 -     }
 - 
 -     /**
 -      * @see PluginInterface::render_text()
 -      */
 -     public function render_text($text, $format = 'xhtml')
 -     {
 -         return p_render($format, p_get_instructions($text), $info);
 -     }
 - 
 -     // endregion
 - }
 
 
  |