325 lines
10 KiB
PHP
325 lines
10 KiB
PHP
<?php
|
|
|
|
namespace dokuwiki\template\sprintdoc;
|
|
|
|
/**
|
|
* Class Template
|
|
*
|
|
* provides additional logic for the sprintdoc template
|
|
*
|
|
* @package dokuwiki\template\sprintdoc
|
|
*/
|
|
class Template {
|
|
|
|
/** @var array loaded plugins */
|
|
protected $plugins = array(
|
|
'sqlite' => null,
|
|
'tagging' => null,
|
|
'magicmatcher' => null,
|
|
'tplinc' => null,
|
|
'sitemapnavi' => null,
|
|
);
|
|
|
|
/** @var string the type of special navigation to use */
|
|
protected $nav = '';
|
|
|
|
|
|
/**
|
|
* Get the singleton instance
|
|
*
|
|
* @return Template
|
|
*/
|
|
public static function getInstance() {
|
|
static $instance = null;
|
|
if($instance === null) $instance = new Template();
|
|
return $instance;
|
|
}
|
|
|
|
/**
|
|
* Template constructor.
|
|
*/
|
|
protected function __construct() {
|
|
$this->initializePlugins();
|
|
$this->initNavigationCookie();
|
|
|
|
/** @var \Doku_Event_Handler */
|
|
global $EVENT_HANDLER;
|
|
$EVENT_HANDLER->register_hook('PLUGIN_TPLINC_LOCATIONS_SET', 'BEFORE', $this, 'registerIncludes');
|
|
}
|
|
|
|
/**
|
|
* Load all the plugins we support directly
|
|
*/
|
|
protected function initializePlugins() {
|
|
$this->plugins['sqlite'] = plugin_load('helper', 'sqlite');
|
|
if($this->plugins['sqlite']) {
|
|
$this->plugins['tagging'] = plugin_load('helper', 'tagging');
|
|
$this->plugins['magicmatcher'] = plugin_load('syntax', 'magicmatcher_issuelist');
|
|
}
|
|
$this->plugins['tplinc'] = plugin_load('helper', 'tplinc');
|
|
$this->plugins['sitemapnavi'] = plugin_load('helper', 'sitemapnavi');
|
|
}
|
|
|
|
/**
|
|
* Makes include position info available to the tplinc plugin
|
|
*
|
|
* @param \Doku_Event $event
|
|
*/
|
|
public function registerIncludes(\Doku_Event $event) {
|
|
$event->data['footer'] = 'Footer below the page content';
|
|
$event->data['sidebarfooter'] = 'Footer below the sidebar';
|
|
$event->data['sidebarheader'] = 'Header above the sidebar';
|
|
$event->data['navtop'] = 'Additional navigation items at the top';
|
|
$event->data['navbottom'] = 'Additional navigation items at the bottom';
|
|
}
|
|
|
|
/**
|
|
* Get the content to include from the tplinc plugin
|
|
*
|
|
* prefix and postfix are only added when there actually is any content
|
|
*
|
|
* @param string $location
|
|
* @param string $pre prepend this before the content
|
|
* @param string $post append this to the content
|
|
* @return string
|
|
*/
|
|
public function getInclude($location, $pre = '', $post = '') {
|
|
if(!$this->plugins['tplinc']) return '';
|
|
$content = $this->plugins['tplinc']->renderIncludes($location);
|
|
if($content === '') return '';
|
|
return $pre . $content . $post;
|
|
}
|
|
|
|
/**
|
|
* Sets a cookie to remember the requested special navigation
|
|
*/
|
|
protected function initNavigationCookie() {
|
|
if ($this->plugins['sitemapnavi'] === null) return;
|
|
global $INPUT;
|
|
|
|
$nav = $INPUT->str('nav');
|
|
if($nav) {
|
|
set_doku_pref('nav', $nav);
|
|
$this->nav = $INPUT->str('nav');
|
|
} else {
|
|
$this->nav = get_doku_pref('nav', 'sidebar');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return the navigation for the sidebar
|
|
*
|
|
* Defaults to the standard sidebar mechanism, but supports also the sitemapnavi plugin
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getNavigation() {
|
|
global $ID;
|
|
global $conf;
|
|
|
|
// id of the current sidebar, each sidebar must have its own state
|
|
$header = sprintf('<div id="sidebarId" class="%s"></div>', md5(page_findnearest($conf['sidebar'])));
|
|
// add tabs if multiple navigation types available
|
|
if ($this->plugins['sitemapnavi'] !== null) {
|
|
$header .= '<ul class="sidebar-tabs">';
|
|
$header .= '<li class="' . ($this->nav === 'sidebar' ? 'active' : '') . '">' .
|
|
'<a href="' . wl($ID, ['nav' => 'sidebar']) . '">'.tpl_getLang('nav_sidebar').'</a></li>';
|
|
$header .= '<li class="' . ($this->nav === 'sitemap' ? 'active' : '') . '">' .
|
|
'<a href="' . wl($ID, ['nav' => 'sitemap']) . '">'.tpl_getLang('nav_sitemap').'</a></li>';
|
|
$header .= '</ul>';
|
|
}
|
|
|
|
// decide what to show
|
|
if ($this->nav === 'sitemap') {
|
|
// site tree created by sitemapnavi plugin
|
|
$nav = '<nav class="nav-sitemapnavi" id="plugin__sitemapnavi">';
|
|
$nav .= $this->plugins['sitemapnavi']->getSiteMap(':');
|
|
$nav .= '</nav>';
|
|
} else {
|
|
// main navigation, loaded from standard sidebar, fixed up by javascript
|
|
$nav = '<nav class="nav-main">';
|
|
// immeadiately hide the navigation (if javascript available)
|
|
// it will be restyled and made visible again by our script later
|
|
$nav .= '<script type="application/javascript">
|
|
document.getElementsByClassName("nav-main")[0].style.visibility = "hidden";
|
|
</script>';
|
|
|
|
$nav .= $this->getInclude('navtop');
|
|
$nav .= tpl_include_page($conf['sidebar'], false, true);
|
|
$nav .= $this->getInclude('navbottom');
|
|
$nav .= '</nav>';
|
|
}
|
|
|
|
return $header . $nav;
|
|
}
|
|
|
|
/**
|
|
* Default class defining is the sidebar should collapse
|
|
*
|
|
* @return string
|
|
*/
|
|
public function fullWidthClass() {
|
|
global $ACT;
|
|
// no auto collapsing? empty class
|
|
if (!tpl_getConf('autocollapse')) return '';
|
|
// mode show? empty class
|
|
if ($ACT === "show") return '';
|
|
// anything else? wide content
|
|
return 'wide-content ';
|
|
}
|
|
|
|
/**
|
|
* Get all the tabs to display
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getMetaBoxTabs() {
|
|
global $lang, $INFO;
|
|
$tabs = array();
|
|
|
|
$toc = tpl_toc(true);
|
|
if($toc) {
|
|
$tabs[] = array(
|
|
'id' => 'spr__tab-toc',
|
|
'label' => $lang['toc'],
|
|
'tab' => $toc,
|
|
'count' => null,
|
|
);
|
|
}
|
|
|
|
if($this->plugins['tagging']) {
|
|
$tabs[] = array(
|
|
'id' => 'spr__tab-tags',
|
|
'label' => tpl_getLang('tab_tags'),
|
|
'tab' => $this->plugins['tagging']->tpl_tags(false),
|
|
'count' => count($this->plugins['tagging']->findItems(array('pid' => $INFO['id']), 'tag')),
|
|
);
|
|
}
|
|
|
|
if ($this->plugins['magicmatcher']) {
|
|
$tabs[] = array(
|
|
'id' => 'spr__tab-issues',
|
|
'label' => tpl_getLang('tab_issues'),
|
|
'tab' => $this->plugins['magicmatcher']->getIssueListHTML(),
|
|
'count' => $this->plugins['magicmatcher']->getCountIssues(),
|
|
);
|
|
}
|
|
|
|
return $tabs;
|
|
}
|
|
|
|
/**
|
|
* Creates an image tag and includes the first found image correctly resized
|
|
*
|
|
* @param string $tag
|
|
* @param array $attributes
|
|
* @param int $w
|
|
* @param int $h
|
|
* @param bool $crop
|
|
* @return string
|
|
*/
|
|
public static function getResizedImgTag($tag, $attributes, $w, $h, $crop = true) {
|
|
$attr = '';
|
|
$medias = array();
|
|
|
|
// the attribute having an array defines where the image goes
|
|
foreach($attributes as $attribute => $data) {
|
|
if(is_array($data)) {
|
|
$medias = $data;
|
|
$attr = $attribute;
|
|
}
|
|
}
|
|
// if the image attribute could not be found return
|
|
if(!$attr || !$medias) return '';
|
|
|
|
// try all medias until an existing one is found
|
|
$media = '';
|
|
foreach($medias as $media) {
|
|
if(file_exists(mediaFN($media))) break;
|
|
$media = '';
|
|
}
|
|
if($media === '') return '';
|
|
|
|
// replace the array
|
|
$media = ml($media, array('w' => $w, 'h' => $h, 'crop' => (int) $crop), true, '&');
|
|
$attributes[$attr] = $media;
|
|
|
|
// return the full tag
|
|
return '<' . $tag . ' ' . buildAttributes($attributes) . ' />' . "\n";
|
|
}
|
|
|
|
/**
|
|
* Embed the main logo
|
|
*
|
|
* Tries a few different locations
|
|
*/
|
|
public function mainLogo() {
|
|
global $conf;
|
|
|
|
// homepage logo should not link to itself (BITV accessibility requirement)
|
|
$linkit = (strcmp(wl(), $_SERVER['REQUEST_URI']) !== 0);
|
|
if($linkit) {
|
|
$title = $conf['title'] . tpl_getLang('adjunct_linked_logo_text');
|
|
} else {
|
|
$title = tpl_getLang('adjunct_start_logo_text') . $conf['title'];
|
|
}
|
|
|
|
$logo = <<<HTML
|
|
<img class="mobile-hide dark-only" src="/_media/wiki:logo-on.svg" alt="EH22 DEMO">
|
|
<img class="mobile-hide light-only" src="/_media/wiki:logo-off.svg" alt="EH22 DEMO">
|
|
HTML;
|
|
|
|
// homepage logo should not link to itself (BITV accessibility requirement)
|
|
if($linkit) {
|
|
tpl_link(wl(), $logo, 'accesskey="h" title="[H]"');
|
|
} else {
|
|
echo $logo;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add the current mode information to the hierarchical breadcrumbs
|
|
*/
|
|
public function breadcrumbSuffix() {
|
|
global $ACT;
|
|
global $lang;
|
|
global $INPUT;
|
|
global $ID;
|
|
global $conf;
|
|
global $IMG;
|
|
if($ACT == 'show') return;
|
|
|
|
// find an apropriate label for the current mode
|
|
if($ACT) {
|
|
$label = tpl_getLang('mode_' . $ACT);
|
|
if(!$label) {
|
|
if(isset($lang['btn_' . $ACT])) {
|
|
$label = $lang['btn_' . $ACT];
|
|
} else {
|
|
$label = $ACT;
|
|
}
|
|
}
|
|
} else {
|
|
// actually we would need to create a proper namespace breadcrumb path here,
|
|
// but this is the most simplest thing we can do for now
|
|
if(defined('DOKU_MEDIADETAIL')) {
|
|
$label = hsc(noNS($IMG));
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if($ACT == 'admin' && $INPUT->has('page')) {
|
|
$link = wl($ID, array('do' => 'admin'));
|
|
echo '<bdi> : <a href="' . $link . '"><strong>' . $label . '</strong></a></bdi>';
|
|
|
|
/** @var \DokuWiki_Admin_Plugin $plugin */
|
|
$plugin = plugin_load('admin', $INPUT->str('page'));
|
|
if(!$plugin) return;
|
|
|
|
$label = $plugin->getMenuText($conf['lang']);
|
|
}
|
|
|
|
echo '<bdi><span class="curid"> : <strong>' . $label . '</strong></span></bdi>';
|
|
}
|
|
}
|