*/ // must be run within Dokuwiki if(!defined('DOKU_INC')) die(); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); if(!defined('DOKU_LF')) define('DOKU_LF', "\n"); require_once(DOKU_PLUGIN.'action.php'); /** * All DokuWiki plugins to interfere with the event system * need to inherit from this class */ class action_plugin_editions extends DokuWiki_Action_Plugin { // register hooks function register(Doku_Event_Handler $controller) { $controller->register_hook('TPL_METAHEADER_OUTPUT','BEFORE', $this, 'addIcons'); $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'openContent'); $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'closeContent'); $controller->register_hook('PLUGIN_PURPLENUMBERS_P_OPENED', 'BEFORE', $this, 'openSection'); $controller->register_hook('PLUGIN_PURPLENUMBERS_P_CLOSED', 'AFTER', $this, 'closeSection'); $controller->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', $this, 'cleanDocument'); } /** * Add lang and class around all content if in edition */ function openContent(&$event, $param){ if ($this->_isEdition()) { echo '
_getLang().' class="editions_edition">'; } } /** * Close content div from openContent() */ function closeContent(&$event, $param){ if ($this->_isEdition()) { echo '
'; } } /** * Add div around each paragraph */ function openSection(&$event, $param) { $pid = $event->data['pid']; if ($this->_isEdition() && $pid) { $event->data['doc'] .= '
'; } } /** * Add edition links below each paragraph and close div from openSection() */ function closeSection(&$event, $param){ $pid = $event->data['pid']; if ($this->_isEdition() && $pid) { $event->data['doc'] .= $this->_getEditionLinks($pid) . '
'; } } /** * Remove open divs from empty paragraphs */ function cleanDocument(&$event, $param){ if ($this->_isEdition()) { $event->data = preg_replace('/(
\s*){2}/','
',$event->data); } } /** * Add icons to edition links */ function addIcons(&$event, $param) { $pluginDir = DOKU_BASE.'lib/plugins/editions/'; $CSS = ''; foreach ($this->_getEditions() as $edition => $lang) { $CSS .= '.editions_editionlist a.'.$edition.' { background-image: url('.$pluginDir.'images/'.$edition.'.png); }'.DOKU_LF; } if (!empty($CSS)){ $event->data['style'][] = array( 'type' => 'text/css', 'media' => 'screen', '_data' => $CSS ); } } /** * Get links to same paragraph in all editions */ function _getEditionLinks($pid) { global $ID; $editionLinks = '
'; // links to other editions $editionLinks .= '
    '; foreach ($this->_getEditions() as $edition => $lang) { if (curNS($ID)!=$edition) { $eLink = wl($this->getConf('editionNamespace').':'.$edition.':'.noNS($ID)).'#'.$pid; $editionLinkTitle = sprintf($this->getLang('editionLinkTitle'), ucfirst($edition)); $editionLinks .= '
  • '.tpl_link($eLink,ucfirst($edition),'class="'.$edition.'" title="'.$editionLinkTitle.'"',1).'
  • '; } } $editionLinks .= '
'; // where to load the snippet $editionLinks .= '
'; $editionLinks .= '
'; return $editionLinks; } /** * Get editions (and their language) from config file */ function _getEditions() { $editionFile = DOKU_CONF.'editions.conf'; if (@file_exists($editionFile)) { return confToHash($editionFile); } return array(); } /** * Check if current page is part of an edition */ function _isEdition() { global $ID; global $ACT; global $conf; $includeStartpage = $this->_getPurpleNumbersConf(); if (!$includeStartpage && (noNS($ID) == $conf['start'])) return false; $curRootNS = substr($ID, 0, strpos($ID,':')); if ( ($curRootNS == $this->getConf('editionNamespace')) && ($ACT=='show') ) return true; return false; } /** * Get language string for current edition */ function _getLang() { global $ID; if ($this->_isEdition()) { $editions = $this->_getEditions(); if (array_key_exists(curNS($ID), $editions)) { $lang = $editions[curNS($ID)]; return ' lang="'.$lang.'" xml:lang="'.$lang.'"'; } } return ''; } /** * Get 'includeStartpage' config setting from purplenumbers plugin */ function _getPurpleNumbersConf() { if(!plugin_isdisabled('purplenumbers')) { $purplenumbers =& plugin_load('renderer', 'purplenumbers'); return $purplenumbers->getConf('includeStartpage'); } return false; } } // vim:ts=4:sw=4: