10cecf9d5Sandi<?php 2fa8adffeSAndreas Gohrif(!defined('DOKU_INC')) die('meh.'); 30cecf9d5Sandirequire_once DOKU_INC . 'inc/parser/lexer.php'; 40cecf9d5Sandirequire_once DOKU_INC . 'inc/parser/handler.php'; 50cecf9d5Sandi 6ee20e7d1Sandi 7ee20e7d1Sandi/** 8ee20e7d1Sandi * Define various types of modes used by the parser - they are used to 9ee20e7d1Sandi * populate the list of modes another mode accepts 10ee20e7d1Sandi */ 11ee20e7d1Sandiglobal $PARSER_MODES; 12ee20e7d1Sandi$PARSER_MODES = array( 13ee20e7d1Sandi // containers are complex modes that can contain many other modes 14ee20e7d1Sandi // hr breaks the principle but they shouldn't be used in tables / lists 15ee20e7d1Sandi // so they are put here 16ee20e7d1Sandi 'container' => array('listblock','table','quote','hr'), 17ee20e7d1Sandi 18ee20e7d1Sandi // some mode are allowed inside the base mode only 19ee20e7d1Sandi 'baseonly' => array('header'), 20ee20e7d1Sandi 21ee20e7d1Sandi // modes for styling text -- footnote behaves similar to styling 22ee20e7d1Sandi 'formatting' => array('strong', 'emphasis', 'underline', 'monospace', 23ee20e7d1Sandi 'subscript', 'superscript', 'deleted', 'footnote'), 24ee20e7d1Sandi 25ee20e7d1Sandi // modes where the token is simply replaced - they can not contain any 26ee20e7d1Sandi // other modes 27ee20e7d1Sandi 'substition' => array('acronym','smiley','wordblock','entity', 28ee20e7d1Sandi 'camelcaselink', 'internallink','media', 29ee20e7d1Sandi 'externallink','linebreak','emaillink', 30ee20e7d1Sandi 'windowssharelink','filelink','notoc', 31ee20e7d1Sandi 'nocache','multiplyentity','quotes','rss'), 32ee20e7d1Sandi 33ee20e7d1Sandi // modes which have a start and end token but inside which 34ee20e7d1Sandi // no other modes should be applied 3507f89c3cSAnika Henke 'protected' => array('preformatted','code','file','php','html','htmlblock','phpblock'), 36ee20e7d1Sandi 37ee20e7d1Sandi // inside this mode no wiki markup should be applied but lineendings 38ee20e7d1Sandi // and whitespace isn't preserved 39ee20e7d1Sandi 'disabled' => array('unformatted'), 40ee20e7d1Sandi 41ee20e7d1Sandi // used to mark paragraph boundaries 42ee20e7d1Sandi 'paragraphs' => array('eol') 43ee20e7d1Sandi); 44ee20e7d1Sandi 450cecf9d5Sandi//------------------------------------------------------------------- 460cecf9d5Sandi 470cecf9d5Sandi/** 480cecf9d5Sandi* Sets up the Lexer with modes and points it to the Handler 490cecf9d5Sandi* For an intro to the Lexer see: wiki:parser 500cecf9d5Sandi*/ 510cecf9d5Sandiclass Doku_Parser { 520cecf9d5Sandi 530cecf9d5Sandi var $Handler; 540cecf9d5Sandi 55e3ab6fc5SMichael Hamann /** 56e3ab6fc5SMichael Hamann * @var Doku_Lexer $Lexer 57e3ab6fc5SMichael Hamann */ 580cecf9d5Sandi var $Lexer; 590cecf9d5Sandi 600cecf9d5Sandi var $modes = array(); 610cecf9d5Sandi 6244881bd0Shenning.noren var $connected = false; 630cecf9d5Sandi 64b7c441b9SHarry Fuecks function addBaseMode(& $BaseMode) { 65b7c441b9SHarry Fuecks $this->modes['base'] =& $BaseMode; 660cecf9d5Sandi if ( !$this->Lexer ) { 6767f9913dSAndreas Gohr $this->Lexer = new Doku_Lexer($this->Handler,'base', true); 680cecf9d5Sandi } 690cecf9d5Sandi $this->modes['base']->Lexer =& $this->Lexer; 700cecf9d5Sandi } 710cecf9d5Sandi 720cecf9d5Sandi /** 730cecf9d5Sandi * PHP preserves order of associative elements 740cecf9d5Sandi * Mode sequence is important 750cecf9d5Sandi */ 760cecf9d5Sandi function addMode($name, & $Mode) { 770cecf9d5Sandi if ( !isset($this->modes['base']) ) { 78107b01d6Sandi $this->addBaseMode(new Doku_Parser_Mode_base()); 790cecf9d5Sandi } 800cecf9d5Sandi $Mode->Lexer = & $this->Lexer; 810cecf9d5Sandi $this->modes[$name] =& $Mode; 820cecf9d5Sandi } 830cecf9d5Sandi 840cecf9d5Sandi function connectModes() { 850cecf9d5Sandi 860cecf9d5Sandi if ( $this->connected ) { 870cecf9d5Sandi return; 880cecf9d5Sandi } 890cecf9d5Sandi 900cecf9d5Sandi foreach ( array_keys($this->modes) as $mode ) { 910cecf9d5Sandi 920cecf9d5Sandi // Base isn't connected to anything 930cecf9d5Sandi if ( $mode == 'base' ) { 940cecf9d5Sandi continue; 950cecf9d5Sandi } 960cecf9d5Sandi $this->modes[$mode]->preConnect(); 970cecf9d5Sandi 980cecf9d5Sandi foreach ( array_keys($this->modes) as $cm ) { 990cecf9d5Sandi 1000cecf9d5Sandi if ( $this->modes[$cm]->accepts($mode) ) { 1010cecf9d5Sandi $this->modes[$mode]->connectTo($cm); 1020cecf9d5Sandi } 1030cecf9d5Sandi 1040cecf9d5Sandi } 1050cecf9d5Sandi 1060cecf9d5Sandi $this->modes[$mode]->postConnect(); 1070cecf9d5Sandi } 1080cecf9d5Sandi 10944881bd0Shenning.noren $this->connected = true; 1100cecf9d5Sandi } 1110cecf9d5Sandi 1120cecf9d5Sandi function parse($doc) { 1130cecf9d5Sandi if ( $this->Lexer ) { 1140cecf9d5Sandi $this->connectModes(); 1150cecf9d5Sandi // Normalize CRs and pad doc 1160cecf9d5Sandi $doc = "\n".str_replace("\r\n","\n",$doc)."\n"; 1170cecf9d5Sandi $this->Lexer->parse($doc); 118433bef32Sandi $this->Handler->_finalize(); 1190cecf9d5Sandi return $this->Handler->calls; 1200cecf9d5Sandi } else { 12144881bd0Shenning.noren return false; 1220cecf9d5Sandi } 1230cecf9d5Sandi } 1240cecf9d5Sandi 1250cecf9d5Sandi} 1260cecf9d5Sandi 1270cecf9d5Sandi//------------------------------------------------------------------- 1280cecf9d5Sandi/** 1290cecf9d5Sandi * This class and all the subclasses below are 1300cecf9d5Sandi * used to reduce the effort required to register 1310cecf9d5Sandi * modes with the Lexer. For performance these 1320cecf9d5Sandi * could all be eliminated later perhaps, or 1330cecf9d5Sandi * the Parser could be serialized to a file once 1340cecf9d5Sandi * all modes are registered 135702eb898Sandi * 1360b7c14c2Sandi * @author Harry Fuecks <hfuecks@gmail.com> 1370cecf9d5Sandi*/ 1380cecf9d5Sandiclass Doku_Parser_Mode { 1390cecf9d5Sandi 140e3ab6fc5SMichael Hamann /** 141e3ab6fc5SMichael Hamann * @var Doku_Lexer $Lexer 142e3ab6fc5SMichael Hamann */ 1430cecf9d5Sandi var $Lexer; 1440cecf9d5Sandi 1450cecf9d5Sandi var $allowedModes = array(); 1460cecf9d5Sandi 147107b01d6Sandi // returns a number used to determine in which order modes are added 148107b01d6Sandi function getSort() { 149107b01d6Sandi trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING); 150107b01d6Sandi } 151107b01d6Sandi 1520cecf9d5Sandi // Called before any calls to connectTo 1530cecf9d5Sandi function preConnect() {} 1540cecf9d5Sandi 155107b01d6Sandi // Connects the mode 1560cecf9d5Sandi function connectTo($mode) {} 1570cecf9d5Sandi 1580cecf9d5Sandi // Called after all calls to connectTo 1590cecf9d5Sandi function postConnect() {} 1600cecf9d5Sandi 1610cecf9d5Sandi function accepts($mode) { 1626f9bd982SAndreas Gohr return in_array($mode, (array) $this->allowedModes ); 1630cecf9d5Sandi } 1640cecf9d5Sandi 1650cecf9d5Sandi} 1660cecf9d5Sandi 1670cecf9d5Sandi//------------------------------------------------------------------- 168107b01d6Sandiclass Doku_Parser_Mode_base extends Doku_Parser_Mode { 1690cecf9d5Sandi 170107b01d6Sandi function Doku_Parser_Mode_base() { 171ee20e7d1Sandi global $PARSER_MODES; 1720cecf9d5Sandi 1730cecf9d5Sandi $this->allowedModes = array_merge ( 174ee20e7d1Sandi $PARSER_MODES['container'], 175ee20e7d1Sandi $PARSER_MODES['baseonly'], 176ee20e7d1Sandi $PARSER_MODES['paragraphs'], 177ee20e7d1Sandi $PARSER_MODES['formatting'], 178ee20e7d1Sandi $PARSER_MODES['substition'], 179ee20e7d1Sandi $PARSER_MODES['protected'], 180ee20e7d1Sandi $PARSER_MODES['disabled'] 1810cecf9d5Sandi ); 1820cecf9d5Sandi } 183107b01d6Sandi 184107b01d6Sandi function getSort() { 185107b01d6Sandi return 0; 186107b01d6Sandi } 1870cecf9d5Sandi} 1880cecf9d5Sandi 1890cecf9d5Sandi//------------------------------------------------------------------- 190107b01d6Sandiclass Doku_Parser_Mode_footnote extends Doku_Parser_Mode { 1910cecf9d5Sandi 192107b01d6Sandi function Doku_Parser_Mode_footnote() { 193ee20e7d1Sandi global $PARSER_MODES; 1940cecf9d5Sandi 1950cecf9d5Sandi $this->allowedModes = array_merge ( 196ee20e7d1Sandi $PARSER_MODES['container'], 197ee20e7d1Sandi $PARSER_MODES['formatting'], 198ee20e7d1Sandi $PARSER_MODES['substition'], 199ee20e7d1Sandi $PARSER_MODES['protected'], 200ee20e7d1Sandi $PARSER_MODES['disabled'] 2010cecf9d5Sandi ); 2020cecf9d5Sandi 2032fe7363dSchris unset($this->allowedModes[array_search('footnote', $this->allowedModes)]); 2040cecf9d5Sandi } 2050cecf9d5Sandi 2060cecf9d5Sandi function connectTo($mode) { 2070cecf9d5Sandi $this->Lexer->addEntryPattern( 2080cecf9d5Sandi '\x28\x28(?=.*\x29\x29)',$mode,'footnote' 2090cecf9d5Sandi ); 2100cecf9d5Sandi } 2110cecf9d5Sandi 2120cecf9d5Sandi function postConnect() { 2130cecf9d5Sandi $this->Lexer->addExitPattern( 2140cecf9d5Sandi '\x29\x29','footnote' 2150cecf9d5Sandi ); 2160cecf9d5Sandi } 2170cecf9d5Sandi 218107b01d6Sandi function getSort() { 219107b01d6Sandi return 150; 220107b01d6Sandi } 2210cecf9d5Sandi} 2220cecf9d5Sandi 2230cecf9d5Sandi//------------------------------------------------------------------- 224107b01d6Sandiclass Doku_Parser_Mode_header extends Doku_Parser_Mode { 2250cecf9d5Sandi 2269fa736b0SAndreas Gohr function connectTo($mode) { 227506ae684Sandi //we're not picky about the closing ones, two are enough 2280cecf9d5Sandi $this->Lexer->addSpecialPattern( 22930fe9cd6SAndreas Gohr '[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)', 2309fa736b0SAndreas Gohr $mode, 2310cecf9d5Sandi 'header' 2320cecf9d5Sandi ); 2330cecf9d5Sandi } 2340cecf9d5Sandi 235107b01d6Sandi function getSort() { 236107b01d6Sandi return 50; 237107b01d6Sandi } 2380cecf9d5Sandi} 2390cecf9d5Sandi 2400cecf9d5Sandi//------------------------------------------------------------------- 241107b01d6Sandiclass Doku_Parser_Mode_notoc extends Doku_Parser_Mode { 2420cecf9d5Sandi 2430cecf9d5Sandi function connectTo($mode) { 2440cecf9d5Sandi $this->Lexer->addSpecialPattern('~~NOTOC~~',$mode,'notoc'); 2450cecf9d5Sandi } 2460cecf9d5Sandi 247107b01d6Sandi function getSort() { 248107b01d6Sandi return 30; 249107b01d6Sandi } 2500cecf9d5Sandi} 2510cecf9d5Sandi 2520cecf9d5Sandi//------------------------------------------------------------------- 253107b01d6Sandiclass Doku_Parser_Mode_nocache extends Doku_Parser_Mode { 2549dc2c2afSandi 2559dc2c2afSandi function connectTo($mode) { 2569dc2c2afSandi $this->Lexer->addSpecialPattern('~~NOCACHE~~',$mode,'nocache'); 2579dc2c2afSandi } 2589dc2c2afSandi 259107b01d6Sandi function getSort() { 260107b01d6Sandi return 40; 261107b01d6Sandi } 2629dc2c2afSandi} 2639dc2c2afSandi 2649dc2c2afSandi//------------------------------------------------------------------- 265107b01d6Sandiclass Doku_Parser_Mode_linebreak extends Doku_Parser_Mode { 2660cecf9d5Sandi 2670cecf9d5Sandi function connectTo($mode) { 26830897fecSChris Smith $this->Lexer->addSpecialPattern('\x5C{2}(?:[ \t]|(?=\n))',$mode,'linebreak'); 2690cecf9d5Sandi } 270107b01d6Sandi 271107b01d6Sandi function getSort() { 272107b01d6Sandi return 140; 273107b01d6Sandi } 2740cecf9d5Sandi} 2750cecf9d5Sandi 2760cecf9d5Sandi//------------------------------------------------------------------- 277107b01d6Sandiclass Doku_Parser_Mode_eol extends Doku_Parser_Mode { 2780cecf9d5Sandi 2790cecf9d5Sandi function connectTo($mode) { 2800cecf9d5Sandi $badModes = array('listblock','table'); 2810cecf9d5Sandi if ( in_array($mode, $badModes) ) { 2820cecf9d5Sandi return; 2830cecf9d5Sandi } 28495c19ce7SChris Smith // see FS#1652, pattern extended to swallow preceding whitespace to avoid issues with lines that only contain whitespace 28595c19ce7SChris Smith $this->Lexer->addSpecialPattern('(?:^[ \t]*)?\n',$mode,'eol'); 2860cecf9d5Sandi } 287107b01d6Sandi 288107b01d6Sandi function getSort() { 289107b01d6Sandi return 370; 290107b01d6Sandi } 2910cecf9d5Sandi} 2920cecf9d5Sandi 2930cecf9d5Sandi//------------------------------------------------------------------- 294107b01d6Sandiclass Doku_Parser_Mode_hr extends Doku_Parser_Mode { 2950cecf9d5Sandi 2960cecf9d5Sandi function connectTo($mode) { 2976f0c5dbfSandi $this->Lexer->addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)',$mode,'hr'); 2980cecf9d5Sandi } 2990cecf9d5Sandi 300107b01d6Sandi function getSort() { 301107b01d6Sandi return 160; 302107b01d6Sandi } 3030cecf9d5Sandi} 3040cecf9d5Sandi 3050cecf9d5Sandi//------------------------------------------------------------------- 30603b54bb0SThorsten Staerk/** 30703b54bb0SThorsten Staerk * This class sets the markup for bold (=strong), 30803b54bb0SThorsten Staerk * italic (=emphasis), underline etc. 30903b54bb0SThorsten Staerk */ 310107b01d6Sandiclass Doku_Parser_Mode_formatting extends Doku_Parser_Mode { 3110cecf9d5Sandi var $type; 3120cecf9d5Sandi 3130cecf9d5Sandi var $formatting = array ( 3140cecf9d5Sandi 'strong' => array ( 3150cecf9d5Sandi 'entry'=>'\*\*(?=.*\*\*)', 3160cecf9d5Sandi 'exit'=>'\*\*', 317107b01d6Sandi 'sort'=>70 3180cecf9d5Sandi ), 3190cecf9d5Sandi 3200cecf9d5Sandi 'emphasis'=> array ( 32124b0ff2aSAndreas Gohr 'entry'=>'//(?=[^\x00]*[^:])', //hack for bugs #384 #763 #1468 3220cecf9d5Sandi 'exit'=>'//', 323107b01d6Sandi 'sort'=>80 3240cecf9d5Sandi ), 3250cecf9d5Sandi 3260cecf9d5Sandi 'underline'=> array ( 3270cecf9d5Sandi 'entry'=>'__(?=.*__)', 3280cecf9d5Sandi 'exit'=>'__', 329107b01d6Sandi 'sort'=>90 3300cecf9d5Sandi ), 3310cecf9d5Sandi 3320cecf9d5Sandi 'monospace'=> array ( 3330cecf9d5Sandi 'entry'=>'\x27\x27(?=.*\x27\x27)', 3340cecf9d5Sandi 'exit'=>'\x27\x27', 335107b01d6Sandi 'sort'=>100 3360cecf9d5Sandi ), 3370cecf9d5Sandi 3380cecf9d5Sandi 'subscript'=> array ( 33987858f84Schris 'entry'=>'<sub>(?=.*</sub>)', 3400cecf9d5Sandi 'exit'=>'</sub>', 341107b01d6Sandi 'sort'=>110 3420cecf9d5Sandi ), 3430cecf9d5Sandi 3440cecf9d5Sandi 'superscript'=> array ( 34587858f84Schris 'entry'=>'<sup>(?=.*</sup>)', 3460cecf9d5Sandi 'exit'=>'</sup>', 347107b01d6Sandi 'sort'=>120 3480cecf9d5Sandi ), 3490cecf9d5Sandi 3500cecf9d5Sandi 'deleted'=> array ( 35187858f84Schris 'entry'=>'<del>(?=.*</del>)', 3520cecf9d5Sandi 'exit'=>'</del>', 353107b01d6Sandi 'sort'=>130 3540cecf9d5Sandi ), 3550cecf9d5Sandi ); 3560cecf9d5Sandi 357107b01d6Sandi function Doku_Parser_Mode_formatting($type) { 358ee20e7d1Sandi global $PARSER_MODES; 3590cecf9d5Sandi 3600cecf9d5Sandi if ( !array_key_exists($type, $this->formatting) ) { 3610cecf9d5Sandi trigger_error('Invalid formatting type '.$type, E_USER_WARNING); 3620cecf9d5Sandi } 3630cecf9d5Sandi 3640cecf9d5Sandi $this->type = $type; 3650cecf9d5Sandi 366ee20e7d1Sandi // formatting may contain other formatting but not it self 367ee20e7d1Sandi $modes = $PARSER_MODES['formatting']; 368ee20e7d1Sandi $key = array_search($type, $modes); 369ee20e7d1Sandi if ( is_int($key) ) { 370ee20e7d1Sandi unset($modes[$key]); 371ee20e7d1Sandi } 3720cecf9d5Sandi 373ee20e7d1Sandi $this->allowedModes = array_merge ( 374ee20e7d1Sandi $modes, 375ee20e7d1Sandi $PARSER_MODES['substition'], 376ee20e7d1Sandi $PARSER_MODES['disabled'] 377ee20e7d1Sandi ); 3780cecf9d5Sandi } 3790cecf9d5Sandi 3800cecf9d5Sandi function connectTo($mode) { 3810cecf9d5Sandi 3820cecf9d5Sandi // Can't nest formatting in itself 3830cecf9d5Sandi if ( $mode == $this->type ) { 3840cecf9d5Sandi return; 3850cecf9d5Sandi } 3860cecf9d5Sandi 3870cecf9d5Sandi $this->Lexer->addEntryPattern( 3880cecf9d5Sandi $this->formatting[$this->type]['entry'], 3890cecf9d5Sandi $mode, 3900cecf9d5Sandi $this->type 3910cecf9d5Sandi ); 3920cecf9d5Sandi } 3930cecf9d5Sandi 3940cecf9d5Sandi function postConnect() { 3950cecf9d5Sandi 3960cecf9d5Sandi $this->Lexer->addExitPattern( 3970cecf9d5Sandi $this->formatting[$this->type]['exit'], 3980cecf9d5Sandi $this->type 3990cecf9d5Sandi ); 4000cecf9d5Sandi 4010cecf9d5Sandi } 402107b01d6Sandi 403107b01d6Sandi function getSort() { 404107b01d6Sandi return $this->formatting[$this->type]['sort']; 405107b01d6Sandi } 4060cecf9d5Sandi} 4070cecf9d5Sandi 4080cecf9d5Sandi//------------------------------------------------------------------- 409107b01d6Sandiclass Doku_Parser_Mode_listblock extends Doku_Parser_Mode { 4100cecf9d5Sandi 411107b01d6Sandi function Doku_Parser_Mode_listblock() { 412ee20e7d1Sandi global $PARSER_MODES; 4130cecf9d5Sandi 4140cecf9d5Sandi $this->allowedModes = array_merge ( 415ee20e7d1Sandi $PARSER_MODES['formatting'], 416ee20e7d1Sandi $PARSER_MODES['substition'], 417ee20e7d1Sandi $PARSER_MODES['disabled'], 418ee20e7d1Sandi $PARSER_MODES['protected'] #XXX new 4190cecf9d5Sandi ); 420702eb898Sandi 421ee20e7d1Sandi // $this->allowedModes[] = 'footnote'; 4220cecf9d5Sandi } 4230cecf9d5Sandi 4240cecf9d5Sandi function connectTo($mode) { 42513ebcbe5SChristopher Smith $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]',$mode,'listblock'); 42613ebcbe5SChristopher Smith $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]',$mode,'listblock'); 4270cecf9d5Sandi 4280cecf9d5Sandi $this->Lexer->addPattern('\n {2,}[\-\*]','listblock'); 4290cecf9d5Sandi $this->Lexer->addPattern('\n\t{1,}[\-\*]','listblock'); 4300cecf9d5Sandi 4310cecf9d5Sandi } 4320cecf9d5Sandi 4330cecf9d5Sandi function postConnect() { 4340cecf9d5Sandi $this->Lexer->addExitPattern('\n','listblock'); 4350cecf9d5Sandi } 436107b01d6Sandi 437107b01d6Sandi function getSort() { 438107b01d6Sandi return 10; 439107b01d6Sandi } 4400cecf9d5Sandi} 4410cecf9d5Sandi 4420cecf9d5Sandi//------------------------------------------------------------------- 443107b01d6Sandiclass Doku_Parser_Mode_table extends Doku_Parser_Mode { 4440cecf9d5Sandi 445107b01d6Sandi function Doku_Parser_Mode_table() { 446ee20e7d1Sandi global $PARSER_MODES; 4470cecf9d5Sandi 4480cecf9d5Sandi $this->allowedModes = array_merge ( 449ee20e7d1Sandi $PARSER_MODES['formatting'], 450ee20e7d1Sandi $PARSER_MODES['substition'], 451ee20e7d1Sandi $PARSER_MODES['disabled'], 452107b01d6Sandi $PARSER_MODES['protected'] 4530cecf9d5Sandi ); 4540cecf9d5Sandi } 4550cecf9d5Sandi 4560cecf9d5Sandi function connectTo($mode) { 457627fc03fSGuy Brand $this->Lexer->addEntryPattern('\s*\n\^',$mode,'table'); 458627fc03fSGuy Brand $this->Lexer->addEntryPattern('\s*\n\|',$mode,'table'); 4590cecf9d5Sandi } 4600cecf9d5Sandi 4610cecf9d5Sandi function postConnect() { 4620cecf9d5Sandi $this->Lexer->addPattern('\n\^','table'); 4630cecf9d5Sandi $this->Lexer->addPattern('\n\|','table'); 46425b97867Shakan.sandell $this->Lexer->addPattern('[\t ]*:::[\t ]*(?=[\|\^])','table'); 4659ab75d9eSAndreas Gohr $this->Lexer->addPattern('[\t ]+','table'); 4660cecf9d5Sandi $this->Lexer->addPattern('\^','table'); 4670cecf9d5Sandi $this->Lexer->addPattern('\|','table'); 4680cecf9d5Sandi $this->Lexer->addExitPattern('\n','table'); 4690cecf9d5Sandi } 470107b01d6Sandi 471107b01d6Sandi function getSort() { 472107b01d6Sandi return 60; 473107b01d6Sandi } 4740cecf9d5Sandi} 4750cecf9d5Sandi 4760cecf9d5Sandi//------------------------------------------------------------------- 477107b01d6Sandiclass Doku_Parser_Mode_unformatted extends Doku_Parser_Mode { 4780cecf9d5Sandi 4790cecf9d5Sandi function connectTo($mode) { 48087858f84Schris $this->Lexer->addEntryPattern('<nowiki>(?=.*</nowiki>)',$mode,'unformatted'); 4810cecf9d5Sandi $this->Lexer->addEntryPattern('%%(?=.*%%)',$mode,'unformattedalt'); 4820cecf9d5Sandi } 4830cecf9d5Sandi 4840cecf9d5Sandi function postConnect() { 4850cecf9d5Sandi $this->Lexer->addExitPattern('</nowiki>','unformatted'); 4860cecf9d5Sandi $this->Lexer->addExitPattern('%%','unformattedalt'); 4870cecf9d5Sandi $this->Lexer->mapHandler('unformattedalt','unformatted'); 4880cecf9d5Sandi } 4890cecf9d5Sandi 490107b01d6Sandi function getSort() { 491107b01d6Sandi return 170; 492107b01d6Sandi } 4930cecf9d5Sandi} 4940cecf9d5Sandi 4950cecf9d5Sandi//------------------------------------------------------------------- 496107b01d6Sandiclass Doku_Parser_Mode_php extends Doku_Parser_Mode { 4970cecf9d5Sandi 4980cecf9d5Sandi function connectTo($mode) { 49987858f84Schris $this->Lexer->addEntryPattern('<php>(?=.*</php>)',$mode,'php'); 50007f89c3cSAnika Henke $this->Lexer->addEntryPattern('<PHP>(?=.*</PHP>)',$mode,'phpblock'); 5010cecf9d5Sandi } 5020cecf9d5Sandi 5030cecf9d5Sandi function postConnect() { 5040cecf9d5Sandi $this->Lexer->addExitPattern('</php>','php'); 50507f89c3cSAnika Henke $this->Lexer->addExitPattern('</PHP>','phpblock'); 5060cecf9d5Sandi } 5070cecf9d5Sandi 508107b01d6Sandi function getSort() { 509107b01d6Sandi return 180; 510107b01d6Sandi } 5110cecf9d5Sandi} 5120cecf9d5Sandi 5130cecf9d5Sandi//------------------------------------------------------------------- 514107b01d6Sandiclass Doku_Parser_Mode_html extends Doku_Parser_Mode { 5150cecf9d5Sandi 5160cecf9d5Sandi function connectTo($mode) { 51787858f84Schris $this->Lexer->addEntryPattern('<html>(?=.*</html>)',$mode,'html'); 51807f89c3cSAnika Henke $this->Lexer->addEntryPattern('<HTML>(?=.*</HTML>)',$mode,'htmlblock'); 5190cecf9d5Sandi } 5200cecf9d5Sandi 5210cecf9d5Sandi function postConnect() { 5220cecf9d5Sandi $this->Lexer->addExitPattern('</html>','html'); 52307f89c3cSAnika Henke $this->Lexer->addExitPattern('</HTML>','htmlblock'); 5240cecf9d5Sandi } 5250cecf9d5Sandi 526107b01d6Sandi function getSort() { 527107b01d6Sandi return 190; 528107b01d6Sandi } 5290cecf9d5Sandi} 5300cecf9d5Sandi 5310cecf9d5Sandi//------------------------------------------------------------------- 532107b01d6Sandiclass Doku_Parser_Mode_preformatted extends Doku_Parser_Mode { 5330cecf9d5Sandi 5340cecf9d5Sandi function connectTo($mode) { 5350cecf9d5Sandi // Has hard coded awareness of lists... 5360cecf9d5Sandi $this->Lexer->addEntryPattern('\n (?![\*\-])',$mode,'preformatted'); 5370cecf9d5Sandi $this->Lexer->addEntryPattern('\n\t(?![\*\-])',$mode,'preformatted'); 5380cecf9d5Sandi 5390cecf9d5Sandi // How to effect a sub pattern with the Lexer! 5400cecf9d5Sandi $this->Lexer->addPattern('\n ','preformatted'); 5410cecf9d5Sandi $this->Lexer->addPattern('\n\t','preformatted'); 5420cecf9d5Sandi 5430cecf9d5Sandi } 5440cecf9d5Sandi 5450cecf9d5Sandi function postConnect() { 5460cecf9d5Sandi $this->Lexer->addExitPattern('\n','preformatted'); 5470cecf9d5Sandi } 5480cecf9d5Sandi 549107b01d6Sandi function getSort() { 550107b01d6Sandi return 20; 551107b01d6Sandi } 5520cecf9d5Sandi} 5530cecf9d5Sandi 5540cecf9d5Sandi//------------------------------------------------------------------- 555107b01d6Sandiclass Doku_Parser_Mode_code extends Doku_Parser_Mode { 5560cecf9d5Sandi 5570cecf9d5Sandi function connectTo($mode) { 558*fc498a42SChristopher Smith $this->Lexer->addEntryPattern('<code\b(?=.*</code>)',$mode,'code'); 5590cecf9d5Sandi } 5600cecf9d5Sandi 5610cecf9d5Sandi function postConnect() { 5620cecf9d5Sandi $this->Lexer->addExitPattern('</code>','code'); 5630cecf9d5Sandi } 5640cecf9d5Sandi 565107b01d6Sandi function getSort() { 566107b01d6Sandi return 200; 567107b01d6Sandi } 5680cecf9d5Sandi} 5690cecf9d5Sandi 5700cecf9d5Sandi//------------------------------------------------------------------- 571107b01d6Sandiclass Doku_Parser_Mode_file extends Doku_Parser_Mode { 5720cecf9d5Sandi 5730cecf9d5Sandi function connectTo($mode) { 574*fc498a42SChristopher Smith $this->Lexer->addEntryPattern('<file\b(?=.*</file>)',$mode,'file'); 5750cecf9d5Sandi } 5760cecf9d5Sandi 5770cecf9d5Sandi function postConnect() { 5780cecf9d5Sandi $this->Lexer->addExitPattern('</file>','file'); 5790cecf9d5Sandi } 5800cecf9d5Sandi 581107b01d6Sandi function getSort() { 582107b01d6Sandi return 210; 583107b01d6Sandi } 5840cecf9d5Sandi} 5850cecf9d5Sandi 5860cecf9d5Sandi//------------------------------------------------------------------- 587107b01d6Sandiclass Doku_Parser_Mode_quote extends Doku_Parser_Mode { 5880cecf9d5Sandi 589107b01d6Sandi function Doku_Parser_Mode_quote() { 590ee20e7d1Sandi global $PARSER_MODES; 5910cecf9d5Sandi 5920cecf9d5Sandi $this->allowedModes = array_merge ( 593ee20e7d1Sandi $PARSER_MODES['formatting'], 594ee20e7d1Sandi $PARSER_MODES['substition'], 595ee20e7d1Sandi $PARSER_MODES['disabled'], 596ee20e7d1Sandi $PARSER_MODES['protected'] #XXX new 5970cecf9d5Sandi ); 598ee20e7d1Sandi #$this->allowedModes[] = 'footnote'; 599ee20e7d1Sandi #$this->allowedModes[] = 'preformatted'; 600ee20e7d1Sandi #$this->allowedModes[] = 'unformatted'; 6010cecf9d5Sandi } 6020cecf9d5Sandi 6030cecf9d5Sandi function connectTo($mode) { 6040cecf9d5Sandi $this->Lexer->addEntryPattern('\n>{1,}',$mode,'quote'); 6050cecf9d5Sandi } 6060cecf9d5Sandi 6070cecf9d5Sandi function postConnect() { 6080cecf9d5Sandi $this->Lexer->addPattern('\n>{1,}','quote'); 6090cecf9d5Sandi $this->Lexer->addExitPattern('\n','quote'); 6100cecf9d5Sandi } 6110cecf9d5Sandi 612107b01d6Sandi function getSort() { 613107b01d6Sandi return 220; 614107b01d6Sandi } 6150cecf9d5Sandi} 6160cecf9d5Sandi 6170cecf9d5Sandi//------------------------------------------------------------------- 618107b01d6Sandiclass Doku_Parser_Mode_acronym extends Doku_Parser_Mode { 6190cecf9d5Sandi // A list 6200cecf9d5Sandi var $acronyms = array(); 6210cecf9d5Sandi var $pattern = ''; 6220cecf9d5Sandi 623107b01d6Sandi function Doku_Parser_Mode_acronym($acronyms) { 6247cc4b757SChris Smith usort($acronyms,array($this,'_compare')); 6250cecf9d5Sandi $this->acronyms = $acronyms; 6260cecf9d5Sandi } 6270cecf9d5Sandi 6280cecf9d5Sandi function preConnect() { 629901c1c87SAndreas Gohr if(!count($this->acronyms)) return; 630901c1c87SAndreas Gohr 6318e266198SAndreas Gohr $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]'; 632e6258e07SAndreas Gohr $acronyms = array_map('Doku_Lexer_Escape',$this->acronyms); 6338e266198SAndreas Gohr $this->pattern = '(?<=^|'.$bound.')(?:'.join('|',$acronyms).')(?='.$bound.')'; 6340cecf9d5Sandi } 6350cecf9d5Sandi 6360cecf9d5Sandi function connectTo($mode) { 637901c1c87SAndreas Gohr if(!count($this->acronyms)) return; 638901c1c87SAndreas Gohr 6390cecf9d5Sandi if ( strlen($this->pattern) > 0 ) { 6400cecf9d5Sandi $this->Lexer->addSpecialPattern($this->pattern,$mode,'acronym'); 6410cecf9d5Sandi } 6420cecf9d5Sandi } 6430cecf9d5Sandi 644107b01d6Sandi function getSort() { 645107b01d6Sandi return 240; 646107b01d6Sandi } 6477cc4b757SChris Smith 6487cc4b757SChris Smith /** 6497cc4b757SChris Smith * sort callback to order by string length descending 6507cc4b757SChris Smith */ 6517cc4b757SChris Smith function _compare($a,$b) { 6527cc4b757SChris Smith $a_len = strlen($a); 6537cc4b757SChris Smith $b_len = strlen($b); 6547cc4b757SChris Smith if ($a_len > $b_len) { 6557cc4b757SChris Smith return -1; 6567cc4b757SChris Smith } else if ($a_len < $b_len) { 6577cc4b757SChris Smith return 1; 6587cc4b757SChris Smith } 6597cc4b757SChris Smith 6607cc4b757SChris Smith return 0; 6617cc4b757SChris Smith } 6620cecf9d5Sandi} 6630cecf9d5Sandi 6640cecf9d5Sandi//------------------------------------------------------------------- 665107b01d6Sandiclass Doku_Parser_Mode_smiley extends Doku_Parser_Mode { 6660cecf9d5Sandi // A list 6670cecf9d5Sandi var $smileys = array(); 6680cecf9d5Sandi var $pattern = ''; 6690cecf9d5Sandi 670107b01d6Sandi function Doku_Parser_Mode_smiley($smileys) { 6710cecf9d5Sandi $this->smileys = $smileys; 6720cecf9d5Sandi } 6730cecf9d5Sandi 6740cecf9d5Sandi function preConnect() { 675d4834a19SStephane Chazelas if(!count($this->smileys) || $this->pattern != '') return; 676901c1c87SAndreas Gohr 6770cecf9d5Sandi $sep = ''; 6780cecf9d5Sandi foreach ( $this->smileys as $smiley ) { 6791b26635bSAndreas Gohr $this->pattern .= $sep.'(?<=\W|^)'.Doku_Lexer_Escape($smiley).'(?=\W|$)'; 6800cecf9d5Sandi $sep = '|'; 6810cecf9d5Sandi } 6820cecf9d5Sandi } 6830cecf9d5Sandi 6840cecf9d5Sandi function connectTo($mode) { 685901c1c87SAndreas Gohr if(!count($this->smileys)) return; 686901c1c87SAndreas Gohr 6870cecf9d5Sandi if ( strlen($this->pattern) > 0 ) { 6880cecf9d5Sandi $this->Lexer->addSpecialPattern($this->pattern,$mode,'smiley'); 6890cecf9d5Sandi } 6900cecf9d5Sandi } 6910cecf9d5Sandi 692107b01d6Sandi function getSort() { 693107b01d6Sandi return 230; 694107b01d6Sandi } 6950cecf9d5Sandi} 6960cecf9d5Sandi 6970cecf9d5Sandi//------------------------------------------------------------------- 698107b01d6Sandiclass Doku_Parser_Mode_wordblock extends Doku_Parser_Mode { 6990cecf9d5Sandi // A list 7000cecf9d5Sandi var $badwords = array(); 7010cecf9d5Sandi var $pattern = ''; 7020cecf9d5Sandi 703107b01d6Sandi function Doku_Parser_Mode_wordblock($badwords) { 7040cecf9d5Sandi $this->badwords = $badwords; 7050cecf9d5Sandi } 7060cecf9d5Sandi 7070cecf9d5Sandi function preConnect() { 7080cecf9d5Sandi 709d4834a19SStephane Chazelas if ( count($this->badwords) == 0 || $this->pattern != '') { 7100cecf9d5Sandi return; 7110cecf9d5Sandi } 7120cecf9d5Sandi 7130cecf9d5Sandi $sep = ''; 7140cecf9d5Sandi foreach ( $this->badwords as $badword ) { 7150cecf9d5Sandi $this->pattern .= $sep.'(?<=\b)(?i)'.Doku_Lexer_Escape($badword).'(?-i)(?=\b)'; 7160cecf9d5Sandi $sep = '|'; 7170cecf9d5Sandi } 7180cecf9d5Sandi 7190cecf9d5Sandi } 7200cecf9d5Sandi 7210cecf9d5Sandi function connectTo($mode) { 7220cecf9d5Sandi if ( strlen($this->pattern) > 0 ) { 7230cecf9d5Sandi $this->Lexer->addSpecialPattern($this->pattern,$mode,'wordblock'); 7240cecf9d5Sandi } 7250cecf9d5Sandi } 7260cecf9d5Sandi 727107b01d6Sandi function getSort() { 728107b01d6Sandi return 250; 729107b01d6Sandi } 7300cecf9d5Sandi} 7310cecf9d5Sandi 7320cecf9d5Sandi//------------------------------------------------------------------- 733107b01d6Sandiclass Doku_Parser_Mode_entity extends Doku_Parser_Mode { 7340cecf9d5Sandi // A list 7350cecf9d5Sandi var $entities = array(); 7360cecf9d5Sandi var $pattern = ''; 7370cecf9d5Sandi 738107b01d6Sandi function Doku_Parser_Mode_entity($entities) { 7390cecf9d5Sandi $this->entities = $entities; 7400cecf9d5Sandi } 7410cecf9d5Sandi 7420cecf9d5Sandi function preConnect() { 743d4834a19SStephane Chazelas if(!count($this->entities) || $this->pattern != '') return; 744901c1c87SAndreas Gohr 7450cecf9d5Sandi $sep = ''; 7460cecf9d5Sandi foreach ( $this->entities as $entity ) { 7470cecf9d5Sandi $this->pattern .= $sep.Doku_Lexer_Escape($entity); 7480cecf9d5Sandi $sep = '|'; 7490cecf9d5Sandi } 7500cecf9d5Sandi } 7510cecf9d5Sandi 7520cecf9d5Sandi function connectTo($mode) { 753901c1c87SAndreas Gohr if(!count($this->entities)) return; 754901c1c87SAndreas Gohr 7550cecf9d5Sandi if ( strlen($this->pattern) > 0 ) { 7560cecf9d5Sandi $this->Lexer->addSpecialPattern($this->pattern,$mode,'entity'); 7570cecf9d5Sandi } 7580cecf9d5Sandi } 7590cecf9d5Sandi 760107b01d6Sandi function getSort() { 761107b01d6Sandi return 260; 762107b01d6Sandi } 7630cecf9d5Sandi} 7640cecf9d5Sandi 7650cecf9d5Sandi//------------------------------------------------------------------- 7660cecf9d5Sandi// Implements the 640x480 replacement 767107b01d6Sandiclass Doku_Parser_Mode_multiplyentity extends Doku_Parser_Mode { 7680cecf9d5Sandi 7690cecf9d5Sandi function connectTo($mode) { 7700cecf9d5Sandi 7710cecf9d5Sandi $this->Lexer->addSpecialPattern( 77268df1afcSChris Smith '(?<=\b)(?:[1-9]|\d{2,})[xX]\d+(?=\b)',$mode,'multiplyentity' 7730cecf9d5Sandi ); 7740cecf9d5Sandi 7750cecf9d5Sandi } 7760cecf9d5Sandi 777107b01d6Sandi function getSort() { 778107b01d6Sandi return 270; 779107b01d6Sandi } 7800cecf9d5Sandi} 7810cecf9d5Sandi 7820cecf9d5Sandi//------------------------------------------------------------------- 783107b01d6Sandiclass Doku_Parser_Mode_quotes extends Doku_Parser_Mode { 7840cecf9d5Sandi 7850cecf9d5Sandi function connectTo($mode) { 7869426a41aSAndreas Gohr global $conf; 7879426a41aSAndreas Gohr 7885fc8a925SAndreas Gohr $ws = '\s/\#~:+=&%@\-\x28\x29\]\[{}><"\''; // whitespace 7895fc8a925SAndreas Gohr $punc = ';,\.?!'; 7900cecf9d5Sandi 7919426a41aSAndreas Gohr if($conf['typography'] == 2){ 7920cecf9d5Sandi $this->Lexer->addSpecialPattern( 7935fc8a925SAndreas Gohr "(?<=^|[$ws])'(?=[^$ws$punc])",$mode,'singlequoteopening' 7940cecf9d5Sandi ); 7950cecf9d5Sandi $this->Lexer->addSpecialPattern( 7965fc8a925SAndreas Gohr "(?<=^|[^$ws]|[$punc])'(?=$|[$ws$punc])",$mode,'singlequoteclosing' 7970cecf9d5Sandi ); 7980cecf9d5Sandi $this->Lexer->addSpecialPattern( 7995fc8a925SAndreas Gohr "(?<=^|[^$ws$punc])'(?=$|[^$ws$punc])",$mode,'apostrophe' 8000cecf9d5Sandi ); 8019426a41aSAndreas Gohr } 8029426a41aSAndreas Gohr 8030cecf9d5Sandi $this->Lexer->addSpecialPattern( 8045fc8a925SAndreas Gohr "(?<=^|[$ws])\"(?=[^$ws$punc])",$mode,'doublequoteopening' 8050cecf9d5Sandi ); 80657d757d1SAndreas Gohr $this->Lexer->addSpecialPattern( 8075fc8a925SAndreas Gohr "\"",$mode,'doublequoteclosing' 80857d757d1SAndreas Gohr ); 80957d757d1SAndreas Gohr 8100cecf9d5Sandi 8110cecf9d5Sandi } 8120cecf9d5Sandi 813107b01d6Sandi function getSort() { 814107b01d6Sandi return 280; 815107b01d6Sandi } 8160cecf9d5Sandi} 8170cecf9d5Sandi 8180cecf9d5Sandi//------------------------------------------------------------------- 819107b01d6Sandiclass Doku_Parser_Mode_camelcaselink extends Doku_Parser_Mode { 8200cecf9d5Sandi 8210cecf9d5Sandi function connectTo($mode) { 8220cecf9d5Sandi $this->Lexer->addSpecialPattern( 8230cecf9d5Sandi '\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b',$mode,'camelcaselink' 8240cecf9d5Sandi ); 8250cecf9d5Sandi } 8260cecf9d5Sandi 827107b01d6Sandi function getSort() { 828107b01d6Sandi return 290; 829107b01d6Sandi } 8300cecf9d5Sandi} 8310cecf9d5Sandi 8320cecf9d5Sandi//------------------------------------------------------------------- 833107b01d6Sandiclass Doku_Parser_Mode_internallink extends Doku_Parser_Mode { 8340cecf9d5Sandi 8350cecf9d5Sandi function connectTo($mode) { 8360cecf9d5Sandi // Word boundaries? 83745a0fa15SAdrian Lang $this->Lexer->addSpecialPattern("\[\[(?:(?:[^[\]]*?\[.*?\])|.*?)\]\]",$mode,'internallink'); 8380cecf9d5Sandi } 8390cecf9d5Sandi 840107b01d6Sandi function getSort() { 841107b01d6Sandi return 300; 842107b01d6Sandi } 8430cecf9d5Sandi} 8440cecf9d5Sandi 8450cecf9d5Sandi//------------------------------------------------------------------- 846107b01d6Sandiclass Doku_Parser_Mode_media extends Doku_Parser_Mode { 8470cecf9d5Sandi 8480cecf9d5Sandi function connectTo($mode) { 8490cecf9d5Sandi // Word boundaries? 8500cecf9d5Sandi $this->Lexer->addSpecialPattern("\{\{[^\}]+\}\}",$mode,'media'); 8510cecf9d5Sandi } 8520cecf9d5Sandi 853107b01d6Sandi function getSort() { 854107b01d6Sandi return 320; 855107b01d6Sandi } 8560cecf9d5Sandi} 8570cecf9d5Sandi 8580cecf9d5Sandi//------------------------------------------------------------------- 859107b01d6Sandiclass Doku_Parser_Mode_rss extends Doku_Parser_Mode { 860b625487dSandi 861b625487dSandi function connectTo($mode) { 862b625487dSandi $this->Lexer->addSpecialPattern("\{\{rss>[^\}]+\}\}",$mode,'rss'); 863b625487dSandi } 864b625487dSandi 865107b01d6Sandi function getSort() { 866107b01d6Sandi return 310; 867107b01d6Sandi } 868b625487dSandi} 869b625487dSandi 870b625487dSandi//------------------------------------------------------------------- 871107b01d6Sandiclass Doku_Parser_Mode_externallink extends Doku_Parser_Mode { 87236f2d7c1SGina Haeussge var $schemes = array(); 8730cecf9d5Sandi var $patterns = array(); 8740cecf9d5Sandi 8750cecf9d5Sandi function preConnect() { 876d4834a19SStephane Chazelas if(count($this->patterns)) return; 8770cecf9d5Sandi 8780cecf9d5Sandi $ltrs = '\w'; 8795d190f12SAndreas Gohr $gunk = '/\#~:.?+=&%@!\-\[\]'; 8800cecf9d5Sandi $punc = '.:?\-;,'; 8810cecf9d5Sandi $host = $ltrs.$punc; 8820cecf9d5Sandi $any = $ltrs.$gunk.$punc; 8830cecf9d5Sandi 88436f2d7c1SGina Haeussge $this->schemes = getSchemes(); 8850cecf9d5Sandi foreach ( $this->schemes as $scheme ) { 8866f0c5dbfSandi $this->patterns[] = '\b(?i)'.$scheme.'(?-i)://['.$any.']+?(?=['.$punc.']*[^'.$any.'])'; 8870cecf9d5Sandi } 8880cecf9d5Sandi 8896f0c5dbfSandi $this->patterns[] = '\b(?i)www?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])'; 8906f0c5dbfSandi $this->patterns[] = '\b(?i)ftp?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])'; 8910cecf9d5Sandi } 8920cecf9d5Sandi 8930cecf9d5Sandi function connectTo($mode) { 894d4834a19SStephane Chazelas 8950cecf9d5Sandi foreach ( $this->patterns as $pattern ) { 8960cecf9d5Sandi $this->Lexer->addSpecialPattern($pattern,$mode,'externallink'); 8970cecf9d5Sandi } 8980cecf9d5Sandi } 8990cecf9d5Sandi 900107b01d6Sandi function getSort() { 901107b01d6Sandi return 330; 902107b01d6Sandi } 9030cecf9d5Sandi} 9040cecf9d5Sandi 9050cecf9d5Sandi//------------------------------------------------------------------- 906107b01d6Sandiclass Doku_Parser_Mode_filelink extends Doku_Parser_Mode { 9070cecf9d5Sandi 9080cecf9d5Sandi var $pattern; 9090cecf9d5Sandi 9100cecf9d5Sandi function preConnect() { 9110cecf9d5Sandi 9120cecf9d5Sandi $ltrs = '\w'; 9130cecf9d5Sandi $gunk = '/\#~:.?+=&%@!\-'; 9140cecf9d5Sandi $punc = '.:?\-;,'; 9150cecf9d5Sandi $host = $ltrs.$punc; 9160cecf9d5Sandi $any = $ltrs.$gunk.$punc; 9170cecf9d5Sandi 9180cecf9d5Sandi $this->pattern = '\b(?i)file(?-i)://['.$any.']+?['. 9190cecf9d5Sandi $punc.']*[^'.$any.']'; 9200cecf9d5Sandi } 9210cecf9d5Sandi 9220cecf9d5Sandi function connectTo($mode) { 9230cecf9d5Sandi $this->Lexer->addSpecialPattern( 9240cecf9d5Sandi $this->pattern,$mode,'filelink'); 9250cecf9d5Sandi } 9260cecf9d5Sandi 927107b01d6Sandi function getSort() { 928107b01d6Sandi return 360; 929107b01d6Sandi } 9300cecf9d5Sandi} 9310cecf9d5Sandi 9320cecf9d5Sandi//------------------------------------------------------------------- 933107b01d6Sandiclass Doku_Parser_Mode_windowssharelink extends Doku_Parser_Mode { 9340cecf9d5Sandi 9350cecf9d5Sandi var $pattern; 9360cecf9d5Sandi 9370cecf9d5Sandi function preConnect() { 938bfdeb23fSlupo49 $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w-$]+)+"; 9390cecf9d5Sandi } 9400cecf9d5Sandi 9410cecf9d5Sandi function connectTo($mode) { 9420cecf9d5Sandi $this->Lexer->addSpecialPattern( 9430cecf9d5Sandi $this->pattern,$mode,'windowssharelink'); 9440cecf9d5Sandi } 9450cecf9d5Sandi 946107b01d6Sandi function getSort() { 947107b01d6Sandi return 350; 948107b01d6Sandi } 9490cecf9d5Sandi} 9500cecf9d5Sandi 9510cecf9d5Sandi//------------------------------------------------------------------- 952107b01d6Sandiclass Doku_Parser_Mode_emaillink extends Doku_Parser_Mode { 9530cecf9d5Sandi 9540cecf9d5Sandi function connectTo($mode) { 9550a1d30bfSchris // pattern below is defined in inc/mail.php 9560a1d30bfSchris $this->Lexer->addSpecialPattern('<'.PREG_PATTERN_VALID_EMAIL.'>',$mode,'emaillink'); 9570cecf9d5Sandi } 9580cecf9d5Sandi 959107b01d6Sandi function getSort() { 960107b01d6Sandi return 340; 961107b01d6Sandi } 9620cecf9d5Sandi} 9630cecf9d5Sandi 964340756e4Sandi 965e3776c06SMichael Hamann//Setup VIM: ex: et ts=4 : 966