1*be906b56SAndreas Gohr<?php 2*be906b56SAndreas Gohr 3*be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode; 4*be906b56SAndreas Gohr 5*be906b56SAndreas Gohr/** 6*be906b56SAndreas Gohr * This class sets the markup for bold (=strong), 7*be906b56SAndreas Gohr * italic (=emphasis), underline etc. 8*be906b56SAndreas Gohr */ 9*be906b56SAndreas Gohrclass Formatting extends AbstractMode 10*be906b56SAndreas Gohr{ 11*be906b56SAndreas Gohr protected $type; 12*be906b56SAndreas Gohr 13*be906b56SAndreas Gohr protected $formatting = array( 14*be906b56SAndreas Gohr 'strong' => array( 15*be906b56SAndreas Gohr 'entry' => '\*\*(?=.*\*\*)', 16*be906b56SAndreas Gohr 'exit' => '\*\*', 17*be906b56SAndreas Gohr 'sort' => 70 18*be906b56SAndreas Gohr ), 19*be906b56SAndreas Gohr 20*be906b56SAndreas Gohr 'emphasis' => array( 21*be906b56SAndreas Gohr 'entry' => '//(?=[^\x00]*[^:])', //hack for bugs #384 #763 #1468 22*be906b56SAndreas Gohr 'exit' => '//', 23*be906b56SAndreas Gohr 'sort' => 80 24*be906b56SAndreas Gohr ), 25*be906b56SAndreas Gohr 26*be906b56SAndreas Gohr 'underline' => array( 27*be906b56SAndreas Gohr 'entry' => '__(?=.*__)', 28*be906b56SAndreas Gohr 'exit' => '__', 29*be906b56SAndreas Gohr 'sort' => 90 30*be906b56SAndreas Gohr ), 31*be906b56SAndreas Gohr 32*be906b56SAndreas Gohr 'monospace' => array( 33*be906b56SAndreas Gohr 'entry' => '\x27\x27(?=.*\x27\x27)', 34*be906b56SAndreas Gohr 'exit' => '\x27\x27', 35*be906b56SAndreas Gohr 'sort' => 100 36*be906b56SAndreas Gohr ), 37*be906b56SAndreas Gohr 38*be906b56SAndreas Gohr 'subscript' => array( 39*be906b56SAndreas Gohr 'entry' => '<sub>(?=.*</sub>)', 40*be906b56SAndreas Gohr 'exit' => '</sub>', 41*be906b56SAndreas Gohr 'sort' => 110 42*be906b56SAndreas Gohr ), 43*be906b56SAndreas Gohr 44*be906b56SAndreas Gohr 'superscript' => array( 45*be906b56SAndreas Gohr 'entry' => '<sup>(?=.*</sup>)', 46*be906b56SAndreas Gohr 'exit' => '</sup>', 47*be906b56SAndreas Gohr 'sort' => 120 48*be906b56SAndreas Gohr ), 49*be906b56SAndreas Gohr 50*be906b56SAndreas Gohr 'deleted' => array( 51*be906b56SAndreas Gohr 'entry' => '<del>(?=.*</del>)', 52*be906b56SAndreas Gohr 'exit' => '</del>', 53*be906b56SAndreas Gohr 'sort' => 130 54*be906b56SAndreas Gohr ), 55*be906b56SAndreas Gohr ); 56*be906b56SAndreas Gohr 57*be906b56SAndreas Gohr /** 58*be906b56SAndreas Gohr * @param string $type 59*be906b56SAndreas Gohr */ 60*be906b56SAndreas Gohr public function __construct($type) 61*be906b56SAndreas Gohr { 62*be906b56SAndreas Gohr global $PARSER_MODES; 63*be906b56SAndreas Gohr 64*be906b56SAndreas Gohr if (!array_key_exists($type, $this->formatting)) { 65*be906b56SAndreas Gohr trigger_error('Invalid formatting type ' . $type, E_USER_WARNING); 66*be906b56SAndreas Gohr } 67*be906b56SAndreas Gohr 68*be906b56SAndreas Gohr $this->type = $type; 69*be906b56SAndreas Gohr 70*be906b56SAndreas Gohr // formatting may contain other formatting but not it self 71*be906b56SAndreas Gohr $modes = $PARSER_MODES['formatting']; 72*be906b56SAndreas Gohr $key = array_search($type, $modes); 73*be906b56SAndreas Gohr if (is_int($key)) { 74*be906b56SAndreas Gohr unset($modes[$key]); 75*be906b56SAndreas Gohr } 76*be906b56SAndreas Gohr 77*be906b56SAndreas Gohr $this->allowedModes = array_merge( 78*be906b56SAndreas Gohr $modes, 79*be906b56SAndreas Gohr $PARSER_MODES['substition'], 80*be906b56SAndreas Gohr $PARSER_MODES['disabled'] 81*be906b56SAndreas Gohr ); 82*be906b56SAndreas Gohr } 83*be906b56SAndreas Gohr 84*be906b56SAndreas Gohr /** @inheritdoc */ 85*be906b56SAndreas Gohr public function connectTo($mode) 86*be906b56SAndreas Gohr { 87*be906b56SAndreas Gohr 88*be906b56SAndreas Gohr // Can't nest formatting in itself 89*be906b56SAndreas Gohr if ($mode == $this->type) { 90*be906b56SAndreas Gohr return; 91*be906b56SAndreas Gohr } 92*be906b56SAndreas Gohr 93*be906b56SAndreas Gohr $this->Lexer->addEntryPattern( 94*be906b56SAndreas Gohr $this->formatting[$this->type]['entry'], 95*be906b56SAndreas Gohr $mode, 96*be906b56SAndreas Gohr $this->type 97*be906b56SAndreas Gohr ); 98*be906b56SAndreas Gohr } 99*be906b56SAndreas Gohr 100*be906b56SAndreas Gohr /** @inheritdoc */ 101*be906b56SAndreas Gohr public function postConnect() 102*be906b56SAndreas Gohr { 103*be906b56SAndreas Gohr 104*be906b56SAndreas Gohr $this->Lexer->addExitPattern( 105*be906b56SAndreas Gohr $this->formatting[$this->type]['exit'], 106*be906b56SAndreas Gohr $this->type 107*be906b56SAndreas Gohr ); 108*be906b56SAndreas Gohr } 109*be906b56SAndreas Gohr 110*be906b56SAndreas Gohr /** @inheritdoc */ 111*be906b56SAndreas Gohr public function getSort() 112*be906b56SAndreas Gohr { 113*be906b56SAndreas Gohr return $this->formatting[$this->type]['sort']; 114*be906b56SAndreas Gohr } 115*be906b56SAndreas Gohr} 116