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