1<?php 2 3use dokuwiki\Extension\SyntaxPlugin; 4use dokuwiki\Parsing\Handler; 5 6/** 7 * BBCode plugin: allows BBCode markup familiar from forum software 8 * 9 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 10 * @author Esther Brunner <esther@kaffeehaus.ch> 11 */ 12class syntax_plugin_bbcode_olist extends SyntaxPlugin 13{ 14 /** @inheritdoc */ 15 public function getType() 16 { 17 return 'container'; 18 } 19 /** @inheritdoc */ 20 public function getPType() 21 { 22 return 'block'; 23 } 24 /** @inheritdoc */ 25 public function getAllowedTypes() 26 { 27 return ['formatting', 'substition', 'disabled', 'protected']; 28 } 29 /** @inheritdoc */ 30 public function getSort() 31 { 32 return 105; 33 } 34 /** @inheritdoc */ 35 public function connectTo($mode) 36 { 37 $this->Lexer->addEntryPattern('\[list=.*?\]\s*?\[\*\](?=.*?\x5B/list\x5D)', $mode, 'plugin_bbcode_olist'); 38 } 39 /** @inheritdoc */ 40 public function postConnect() 41 { 42 $this->Lexer->addExitPattern('\[/list\]', 'plugin_bbcode_olist'); 43 } 44 45 /** @inheritdoc */ 46 public function handle($match, $state, $pos, Handler $handler) 47 { 48 switch ($state) { 49 case DOKU_LEXER_ENTER: 50 // get the list type 51 $match = substr($match, 6, -4); 52 $match = explode(']', $match, 2); 53 return [$state, $match[0]]; 54 55 case DOKU_LEXER_UNMATCHED: 56 return [$state, $match]; 57 58 case DOKU_LEXER_EXIT: 59 return [$state, '']; 60 } 61 return []; 62 } 63 64 /** @inheritdoc */ 65 public function render($format, Doku_Renderer $renderer, $data) 66 { 67 if ($format == 'xhtml') { 68 [$state, $match] = $data; 69 switch ($state) { 70 case DOKU_LEXER_ENTER: 71 switch ($match) { 72 case 'i': 73 $type = 'lower-roman'; 74 break; 75 case 'I': 76 $type = 'upper-roman'; 77 break; 78 case 'a': 79 $type = 'lower-alpha'; 80 break; 81 case 'A': 82 $type = 'upper-alpha'; 83 break; 84 default: 85 $type = 'decimal'; 86 } 87 $renderer->doc .= '<ol style="list-style-type:' . $type . '"><li class="level1"><div class="li">'; 88 break; 89 90 case DOKU_LEXER_UNMATCHED: 91 $match = $renderer->_xmlEntities($match); 92 $renderer->doc .= str_replace('[*]', '</div></li><li class="level1"><div class="li">', $match); 93 break; 94 95 case DOKU_LEXER_EXIT: 96 $renderer->doc .= '</div></li></ol>'; 97 break; 98 } 99 return true; 100 } 101 return false; 102 } 103} 104