1<?php 2/** 3 * DokuWiki plugin PageTitle Shorter; Syntax component 4 * Macro to set the short title of the page in metadata 5 * 6 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 7 * @author Satoshi Sahara <sahara.satoshi@gmail.com> 8 */ 9class syntax_plugin_pagetitle_shorter extends DokuWiki_Syntax_Plugin 10{ 11 /** syntax type */ 12 public function getType() 13 { 14 return 'substition'; 15 } 16 17 /** paragraph type */ 18 public function getPType() 19 { 20 return 'normal'; 21 } 22 23 /** 24 * Connect pattern to lexer 25 */ 26 protected $mode, $pattern; 27 28 /** sort number used to determine priority of this mode */ 29 public function getSort() 30 { 31 return 990; 32 } 33 34 public function preConnect() 35 { 36 // syntax mode, drop 'syntax_' from class name 37 $this->mode = substr(__CLASS__, 7); 38 39 //syntax patterns 40 $this->pattern[5] = '~~ShortTitle:[^\n~]*~~'; 41 } 42 43 public function connectTo($mode) 44 { 45 $this->Lexer->addSpecialPattern($this->pattern[5], $mode, $this->mode); 46 } 47 48 /** 49 * Handle the match 50 */ 51 public function handle($match, $state, $pos, Doku_Handler $handler) 52 { 53 global $ID; 54 static $counter = []; 55 56 // ensure first matched pattern only effective 57 if (!isset($counter[$ID])) $counter[$ID] = 0; 58 if ($counter[$ID]++ > 0) return false; 59 60 // get short title 61 $short_title = trim(substr($match, 13, -2)); 62 return $data = [$state, $short_title, $ID]; 63 } 64 65 /** 66 * Create output 67 */ 68 public function render($format, Doku_Renderer $renderer, $data) 69 { 70 global $ID; 71 72 list($state, $short_title, $id) = $data; 73 74 // skip calls that belong to different pages (eg. title of included page) 75 if ($id !== $ID) return false; 76 77 switch ($format) { 78 case 'metadata': 79 $renderer->meta['shorttitle'] = $short_title; 80 return true; 81 default: 82 return false; 83 } 84 } 85 86} 87