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