117e6d639SJames Collins<?php 294f363a8Snomadjimbob 317e6d639SJames Collins/** 417e6d639SJames Collins * Mikio Syntax Plugin: Carousel 517e6d639SJames Collins * 67935713eSJames Collins * @link http://github.com/nomadjimbob/mikioplugin 717e6d639SJames Collins * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 817e6d639SJames Collins * @author James Collins <james.collins@outlook.com.au> 917e6d639SJames Collins */ 1017e6d639SJames Collinsif (!defined('DOKU_INC')) die(); 1117e6d639SJames Collinsif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 12*3a0ad8d3SJames Collinsrequire_once(__DIR__ . '/core.php'); 1317e6d639SJames Collins 1494f363a8Snomadjimbobclass syntax_plugin_mikioplugin_carousel extends syntax_plugin_mikioplugin_core 1594f363a8Snomadjimbob{ 1617e6d639SJames Collins public $tag = 'carousel'; 177935713eSJames Collins public $hasEndTag = true; 187935713eSJames Collins public $options = array( 1994f363a8Snomadjimbob 'transition' => array( 2094f363a8Snomadjimbob 'type' => 'choice', 217935713eSJames Collins 'data' => array('slide', 'fade'), 2294f363a8Snomadjimbob 'default' => '' 2394f363a8Snomadjimbob ), 24ee3901e1Snomadjimbob 'indicators' => array( 25ee3901e1Snomadjimbob 'type' => 'choice', 26ee3901e1Snomadjimbob 'data' => array('true', 'false', 'circle'), 27ee3901e1Snomadjimbob 'default' => 'true' 28ee3901e1Snomadjimbob ), 297935713eSJames Collins 'controls' => array('type' => 'boolean', 'default' => 'true'), 307935713eSJames Collins 'start' => array('type' => 'boolean', 'default' => 'false'), 31062e2726SJames Collins 'cover' => array('type' => 'boolean', 'default' => 'false'), 3294f363a8Snomadjimbob 'control-color' => array('type' => 'color', 'default' => '#fff'), 3394f363a8Snomadjimbob 'control-outline-color' => array('type' => 'color', 'default' => ''), 3494f363a8Snomadjimbob 'control-outline-width' => array('type' => 'multisize', 'default' => ''), 3584838f32Snomadjimbob 'dynamic' => array('type' => 'text', 'default' => ''), 3684838f32Snomadjimbob 'dynamic-prefix' => array('type' => 'text', 'default' => ''), 3784838f32Snomadjimbob 'dynamic-start' => array('type' => 'number', 'default' => '-1'), 3884838f32Snomadjimbob 'dynamic-count' => array('type' => 'number', 'default' => '-1'), 397935713eSJames Collins ); 4017e6d639SJames Collins 4194f363a8Snomadjimbob public function __construct() 4294f363a8Snomadjimbob { 436b66a10dSJames Collins $this->addCommonOptions('height'); 446b66a10dSJames Collins } 456b66a10dSJames Collins 4617e6d639SJames Collins 4794f363a8Snomadjimbob public function render_lexer_enter(Doku_Renderer $renderer, $data) 4894f363a8Snomadjimbob { 497935713eSJames Collins $classes = $this->buildClass($data, array('transition')); 508127a956SJames Collins $styles = $this->buildStyle(array('height' => $data['height'] ?? ''), TRUE); 5117e6d639SJames Collins 52062e2726SJames Collins $renderer->doc .= '<div class="' . $this->elemClass . ' ' . $this->classPrefix . 'carousel' . ($data['cover'] ? ' ' . $this->classPrefix . 'image-cover' : '') . $classes . '" data-auto-start="' . ($data['start'] ? 'true' : 'false') . '"' . $styles . '>'; 537935713eSJames Collins $renderer->doc .= '<div class="' . $this->elemClass . ' ' . $this->classPrefix . 'carousel-inner">'; 5484838f32Snomadjimbob 5584838f32Snomadjimbob if (strlen($data['dynamic']) > 0) { 5684838f32Snomadjimbob global $conf; 5784838f32Snomadjimbob 5884838f32Snomadjimbob $namespace = $data['dynamic']; 59f51f4f12SJames Collins if (substr($namespace, -1) === ':') { 6084838f32Snomadjimbob $namespace = substr($namespace, 0, -1); 6184838f32Snomadjimbob } 6284838f32Snomadjimbob 6384838f32Snomadjimbob $path = str_replace(':', '/', $namespace); 6484838f32Snomadjimbob 6584838f32Snomadjimbob $pages = array(); 66f51f4f12SJames Collins $count = count($pages); 67f51f4f12SJames Collins 6884838f32Snomadjimbob search($pages, $conf['datadir'] . '/' . $path, 'search_allpages', array('depth' => 1, 'skipacl' => true)); 69f51f4f12SJames Collins 70f51f4f12SJames Collins for ($i = 0; $i < $count; $i++) { 7184838f32Snomadjimbob $page = $pages[$i]; 7284838f32Snomadjimbob if ($data['dynamic-start'] == -1 || $data['dynamic-start'] <= ($i + 1)) { 7384838f32Snomadjimbob if ($data['dynamic-start'] != -1 && $data['dynamic-count'] != -1 && $data['dynamic-start'] + $data['dynamic-count'] >= $i) { 7484838f32Snomadjimbob break; 7584838f32Snomadjimbob } 7684838f32Snomadjimbob 7784838f32Snomadjimbob $item_data = array(); 7884838f32Snomadjimbob 7984838f32Snomadjimbob $page_id = $namespace . ':' . $page['id']; 8084838f32Snomadjimbob preg_match('/{{([^>|}]+(\.jpg|\.gif|\.png))\|?.*}}/', rawWiki($page_id), $image_matches); 8184838f32Snomadjimbob if (count($image_matches) > 1) { 8284838f32Snomadjimbob $item_data['image'] = $image_matches[1]; 8384838f32Snomadjimbob } 8484838f32Snomadjimbob 8584838f32Snomadjimbob $item_data['title'] = (strlen($data['dynamic-prefix']) > 0 ? $data['dynamic-prefix'] . ' ' : '') . p_get_first_heading($page_id); 8684838f32Snomadjimbob $item_data['url'] = $page_id; 8784838f32Snomadjimbob 8884838f32Snomadjimbob $this->syntaxRender($renderer, 'carouselitem', '', $item_data, MIKIO_LEXER_SPECIAL); 8984838f32Snomadjimbob } 9084838f32Snomadjimbob } 9184838f32Snomadjimbob } 9217e6d639SJames Collins } 9317e6d639SJames Collins 9417e6d639SJames Collins 9594f363a8Snomadjimbob public function render_lexer_exit(Doku_Renderer $renderer, $data) 9694f363a8Snomadjimbob { 9757ae4893SJames Collins $renderer->doc .= '</div>'; 9857ae4893SJames Collins 997935713eSJames Collins if ($data['controls'] === TRUE) { 1008127a956SJames Collins $svg_styles = $this->buildStyle(array('fill' => $data['control-color'] ?? '', 'stroke' => $data['control-outline-color'] ?? '', 'stroke-width' => $data['control-outline-width'] ?? ''), TRUE); 10194f363a8Snomadjimbob 10294f363a8Snomadjimbob $renderer->doc .= '<a href="#" class="' . $this->elemClass . ' ' . $this->classPrefix . 'carousel-control ' . $this->classPrefix . 'carousel-control-prev" role="button"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 8 8"' . $svg_styles . '><path d="M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z"/></svg></a>'; 10394f363a8Snomadjimbob $renderer->doc .= '<a href="#" class="' . $this->elemClass . ' ' . $this->classPrefix . 'carousel-control ' . $this->classPrefix . 'carousel-control-next" role="button"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 8 8"' . $svg_styles . '><path d="M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z"/></svg></a>'; 1047935713eSJames Collins } 10557ae4893SJames Collins 106ee3901e1Snomadjimbob if (strcasecmp($data['indicators'], 'false') != 0) { 107ee3901e1Snomadjimbob $renderer->doc .= '<ul class="' . $this->elemClass . ' ' . $this->classPrefix . 'carousel-indicators' . (strcasecmp($data['indicators'], 'circle') == 0 ? ' ' . $this->classPrefix . 'carousel-indicators-circle' : '') . '"></ul>'; 10857ae4893SJames Collins } 10957ae4893SJames Collins 11057ae4893SJames Collins $renderer->doc .= '</div>'; 11117e6d639SJames Collins } 11217e6d639SJames Collins} 113