xref: /plugin/mikioplugin/syntax/carousel.php (revision 3a0ad8d394ede994db68f1ed17eff796c659fc4a)
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