xref: /plugin/strata/syntax/info.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
1*5153720fSfkaag71<?php
2*5153720fSfkaag71/**
3*5153720fSfkaag71 * DokuWiki Plugin strata (Syntax Component)
4*5153720fSfkaag71 *
5*5153720fSfkaag71 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6*5153720fSfkaag71 * @author  Brend Wanders <b.wanders@utwente.nl>
7*5153720fSfkaag71 */
8*5153720fSfkaag71
9*5153720fSfkaag71// must be run within Dokuwiki
10*5153720fSfkaag71if (!defined('DOKU_INC')) die('Meh.');
11*5153720fSfkaag71
12*5153720fSfkaag71/**
13*5153720fSfkaag71 * Simple plugin to list the available types. This plugin uses
14*5153720fSfkaag71 * the same syntax as the info plugin, but only accepts a specific
15*5153720fSfkaag71 * info category.
16*5153720fSfkaag71 */
17*5153720fSfkaag71class syntax_plugin_strata_info extends DokuWiki_Syntax_Plugin {
18*5153720fSfkaag71    public function __construct() {
19*5153720fSfkaag71        $this->util =& plugin_load('helper', 'strata_util');
20*5153720fSfkaag71    }
21*5153720fSfkaag71
22*5153720fSfkaag71    public function getType() {
23*5153720fSfkaag71        return 'substition';
24*5153720fSfkaag71    }
25*5153720fSfkaag71
26*5153720fSfkaag71    public function getPType() {
27*5153720fSfkaag71        return 'block';
28*5153720fSfkaag71    }
29*5153720fSfkaag71
30*5153720fSfkaag71    public function getSort() {
31*5153720fSfkaag71        // sort just before info plugin
32*5153720fSfkaag71        return 154;
33*5153720fSfkaag71    }
34*5153720fSfkaag71
35*5153720fSfkaag71
36*5153720fSfkaag71    public function connectTo($mode) {
37*5153720fSfkaag71        $this->Lexer->addSpecialPattern('~~INFO:stratatypes~~',$mode,'plugin_strata_info');
38*5153720fSfkaag71        $this->Lexer->addSpecialPattern('~~INFO:strataaggregates~~',$mode,'plugin_strata_info');
39*5153720fSfkaag71    }
40*5153720fSfkaag71
41*5153720fSfkaag71    public function handle($match, $state, $pos, Doku_Handler $handler){
42*5153720fSfkaag71        $data = array();
43*5153720fSfkaag71        preg_match('/~~INFO:strata(type|aggregate)s~~/',$match, $captures);
44*5153720fSfkaag71        list(,$kind) = $captures;
45*5153720fSfkaag71
46*5153720fSfkaag71        // get a list of all types...
47*5153720fSfkaag71        foreach(glob(DOKU_PLUGIN."*/${kind}s/*.php") as $type) {
48*5153720fSfkaag71            if(preg_match("@/([^/]+)/${kind}s/([^/]+)\.php@",$type,$matches)) {
49*5153720fSfkaag71                // ...load each type...
50*5153720fSfkaag71                switch($kind) {
51*5153720fSfkaag71                    case 'type': $meta = $this->util->loadType($matches[2])->getInfo(); break;
52*5153720fSfkaag71                    case 'aggregate': $meta = $this->util->loadAggregate($matches[2])->getInfo(); break;
53*5153720fSfkaag71                }
54*5153720fSfkaag71
55*5153720fSfkaag71                // ...and check if it's synthetic (i.e., not user-usable)
56*5153720fSfkaag71                if(!isset($meta['synthetic']) || !$meta['synthetic']) {
57*5153720fSfkaag71                    $data[] = array(
58*5153720fSfkaag71                        'name'=>$matches[2],
59*5153720fSfkaag71                        'plugin'=>$matches[1],
60*5153720fSfkaag71                        'meta'=>$meta
61*5153720fSfkaag71                    );
62*5153720fSfkaag71                }
63*5153720fSfkaag71            }
64*5153720fSfkaag71        }
65*5153720fSfkaag71
66*5153720fSfkaag71        usort($data, array($this,'_compareNames'));
67*5153720fSfkaag71
68*5153720fSfkaag71        return array($kind,$data);
69*5153720fSfkaag71    }
70*5153720fSfkaag71
71*5153720fSfkaag71    function _compareNames($a, $b) {
72*5153720fSfkaag71        return strcmp($a['name'], $b['name']);
73*5153720fSfkaag71    }
74*5153720fSfkaag71
75*5153720fSfkaag71    public function render($mode, Doku_Renderer $R, $data) {
76*5153720fSfkaag71        if($mode == 'xhtml' || $mode == 'odt') {
77*5153720fSfkaag71            list($kind, $items) = $data;
78*5153720fSfkaag71
79*5153720fSfkaag71            $R->listu_open();
80*5153720fSfkaag71            foreach($items as $data){
81*5153720fSfkaag71                $R->listitem_open(1);
82*5153720fSfkaag71                $R->listcontent_open();
83*5153720fSfkaag71
84*5153720fSfkaag71                $R->strong_open();
85*5153720fSfkaag71                $R->cdata($data['name']);
86*5153720fSfkaag71                $R->strong_close();
87*5153720fSfkaag71
88*5153720fSfkaag71                if($data['meta']['hint']) {
89*5153720fSfkaag71                    $R->cdata(' ('.$kind.' hint: '. $data['meta']['hint'] .')');
90*5153720fSfkaag71                }
91*5153720fSfkaag71                // $R->emphasis_open();
92*5153720fSfkaag71                // $R->cdata(' in '.$data['plugin'].' plugin');
93*5153720fSfkaag71                // $R->emphasis_close();
94*5153720fSfkaag71
95*5153720fSfkaag71                $R->linebreak();
96*5153720fSfkaag71                $R->cdata($data['meta']['desc']);
97*5153720fSfkaag71
98*5153720fSfkaag71                if(isset($data['meta']['tags']) && count($data['meta']['tags'])) {
99*5153720fSfkaag71                    $R->cdata(' (');
100*5153720fSfkaag71                    $R->emphasis_open();
101*5153720fSfkaag71                    $R->cdata(implode(', ',$data['meta']['tags']));
102*5153720fSfkaag71                    $R->emphasis_close();
103*5153720fSfkaag71                    $R->cdata(')');
104*5153720fSfkaag71                }
105*5153720fSfkaag71
106*5153720fSfkaag71                $R->listcontent_close();
107*5153720fSfkaag71                $R->listitem_close();
108*5153720fSfkaag71            }
109*5153720fSfkaag71            $R->listu_close();
110*5153720fSfkaag71            return true;
111*5153720fSfkaag71        }
112*5153720fSfkaag71
113*5153720fSfkaag71        return false;
114*5153720fSfkaag71    }
115*5153720fSfkaag71}
116