diff options
Diffstat (limited to 'inc/parser/parser.php')
-rw-r--r-- | inc/parser/parser.php | 292 |
1 files changed, 146 insertions, 146 deletions
diff --git a/inc/parser/parser.php b/inc/parser/parser.php index 7a3342fbf..d5e8f4552 100644 --- a/inc/parser/parser.php +++ b/inc/parser/parser.php @@ -32,10 +32,10 @@ $PARSER_MODES = array( 'windowssharelink','filelink','notoc', 'nocache','multiplyentity','quotes','rss'), - // modes which have a start and end token but inside which + // modes which have a start and end token but inside which // no other modes should be applied 'protected' => array('preformatted','code','file','php','html'), - + // inside this mode no wiki markup should be applied but lineendings // and whitespace isn't preserved 'disabled' => array('unformatted'), @@ -51,15 +51,15 @@ $PARSER_MODES = array( * For an intro to the Lexer see: wiki:parser */ class Doku_Parser { - + var $Handler; - + var $Lexer; - + var $modes = array(); - + var $connected = FALSE; - + function addBaseMode(& $BaseMode) { $this->modes['base'] = & $BaseMode; if ( !$this->Lexer ) { @@ -67,7 +67,7 @@ class Doku_Parser { } $this->modes['base']->Lexer = & $this->Lexer; } - + /** * PHP preserves order of associative elements * Mode sequence is important @@ -79,36 +79,36 @@ class Doku_Parser { $Mode->Lexer = & $this->Lexer; $this->modes[$name] = & $Mode; } - + function connectModes() { - + if ( $this->connected ) { return; } - + foreach ( array_keys($this->modes) as $mode ) { - + // Base isn't connected to anything if ( $mode == 'base' ) { continue; } - + $this->modes[$mode]->preConnect(); - + foreach ( array_keys($this->modes) as $cm ) { - + if ( $this->modes[$cm]->accepts($mode) ) { $this->modes[$mode]->connectTo($cm); } - + } - + $this->modes[$mode]->postConnect(); } - + $this->connected = TRUE; } - + function parse($doc) { if ( $this->Lexer ) { $this->connectModes(); @@ -121,7 +121,7 @@ class Doku_Parser { return FALSE; } } - + } //------------------------------------------------------------------- @@ -136,9 +136,9 @@ class Doku_Parser { * @author Harry Fuecks <hfuecks@gmail.com> */ class Doku_Parser_Mode { - + var $Lexer; - + var $allowedModes = array(); // returns a number used to determine in which order modes are added @@ -149,24 +149,24 @@ class Doku_Parser_Mode { // Called before any calls to connectTo function preConnect() {} - // Connects the mode + // Connects the mode function connectTo($mode) {} // Called after all calls to connectTo function postConnect() {} - + function accepts($mode) { return in_array($mode, $this->allowedModes ); } - + } //------------------------------------------------------------------- class Doku_Parser_Mode_base extends Doku_Parser_Mode { - + function Doku_Parser_Mode_base() { global $PARSER_MODES; - + $this->allowedModes = array_merge ( $PARSER_MODES['container'], $PARSER_MODES['baseonly'], @@ -185,10 +185,10 @@ class Doku_Parser_Mode_base extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_footnote extends Doku_Parser_Mode { - + function Doku_Parser_Mode_footnote() { global $PARSER_MODES; - + $this->allowedModes = array_merge ( $PARSER_MODES['container'], $PARSER_MODES['formatting'], @@ -196,20 +196,20 @@ class Doku_Parser_Mode_footnote extends Doku_Parser_Mode { $PARSER_MODES['protected'], $PARSER_MODES['disabled'] ); - + } - + function connectTo($mode) { $this->Lexer->addEntryPattern( '\x28\x28(?=.*\x29\x29)',$mode,'footnote' ); } - + function postConnect() { $this->Lexer->addExitPattern( '\x29\x29','footnote' ); - + } function getSort() { @@ -219,17 +219,17 @@ class Doku_Parser_Mode_footnote extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_header extends Doku_Parser_Mode { - + function preConnect() { //we're not picky about the closing ones, two are enough - + // Header 1 is special case - match 6 or more $this->Lexer->addSpecialPattern( '[ \t]*={6,}[^\n]+={2,}[ \t]*(?=\n)', 'base', 'header' ); - + // For the rest, match exactly for ( $i = 5; $i > 1; $i--) { $this->Lexer->addSpecialPattern( @@ -239,7 +239,7 @@ class Doku_Parser_Mode_header extends Doku_Parser_Mode { ); } } - + function getSort() { return 50; } @@ -247,11 +247,11 @@ class Doku_Parser_Mode_header extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_notoc extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addSpecialPattern('~~NOTOC~~',$mode,'notoc'); } - + function getSort() { return 30; } @@ -259,19 +259,19 @@ class Doku_Parser_Mode_notoc extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_nocache extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addSpecialPattern('~~NOCACHE~~',$mode,'nocache'); - } - + } + function getSort() { return 40; } -} - +} + //------------------------------------------------------------------- class Doku_Parser_Mode_linebreak extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addSpecialPattern('\x5C{2}(?=\s)',$mode,'linebreak'); } @@ -283,7 +283,7 @@ class Doku_Parser_Mode_linebreak extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_eol extends Doku_Parser_Mode { - + function connectTo($mode) { $badModes = array('listblock','table'); if ( in_array($mode, $badModes) ) { @@ -306,64 +306,64 @@ class Doku_Parser_Mode_hr extends Doku_Parser_Mode { function getSort() { return 160; - } + } } //------------------------------------------------------------------- class Doku_Parser_Mode_formatting extends Doku_Parser_Mode { var $type; - + var $formatting = array ( 'strong' => array ( 'entry'=>'\*\*(?=.*\*\*)', 'exit'=>'\*\*', 'sort'=>70 ), - + 'emphasis'=> array ( - 'entry'=>'//(?=[^\x00]*[^:]//)', //hack for bug #384 + 'entry'=>'//(?=[^\x00]*[^:]//)', //hack for bug #384 'exit'=>'//', 'sort'=>80 ), - + 'underline'=> array ( 'entry'=>'__(?=.*__)', 'exit'=>'__', 'sort'=>90 ), - + 'monospace'=> array ( 'entry'=>'\x27\x27(?=.*\x27\x27)', 'exit'=>'\x27\x27', 'sort'=>100 ), - + 'subscript'=> array ( 'entry'=>'<sub>(?=.*\x3C/sub\x3E)', 'exit'=>'</sub>', 'sort'=>110 ), - + 'superscript'=> array ( 'entry'=>'<sup>(?=.*\x3C/sup\x3E)', 'exit'=>'</sup>', 'sort'=>120 ), - + 'deleted'=> array ( 'entry'=>'<del>(?=.*\x3C/del\x3E)', 'exit'=>'</del>', 'sort'=>130 ), ); - + function Doku_Parser_Mode_formatting($type) { global $PARSER_MODES; - + if ( !array_key_exists($type, $this->formatting) ) { trigger_error('Invalid formatting type '.$type, E_USER_WARNING); } - + $this->type = $type; // formatting may contain other formatting but not it self @@ -379,28 +379,28 @@ class Doku_Parser_Mode_formatting extends Doku_Parser_Mode { $PARSER_MODES['disabled'] ); } - + function connectTo($mode) { - + // Can't nest formatting in itself if ( $mode == $this->type ) { return; } - + $this->Lexer->addEntryPattern( $this->formatting[$this->type]['entry'], $mode, $this->type ); } - + function postConnect() { - + $this->Lexer->addExitPattern( $this->formatting[$this->type]['exit'], $this->type ); - + } function getSort() { @@ -413,7 +413,7 @@ class Doku_Parser_Mode_listblock extends Doku_Parser_Mode { function Doku_Parser_Mode_listblock() { global $PARSER_MODES; - + $this->allowedModes = array_merge ( $PARSER_MODES['formatting'], $PARSER_MODES['substition'], @@ -423,16 +423,16 @@ class Doku_Parser_Mode_listblock extends Doku_Parser_Mode { // $this->allowedModes[] = 'footnote'; } - + function connectTo($mode) { $this->Lexer->addEntryPattern('\n {2,}[\-\*]',$mode,'listblock'); $this->Lexer->addEntryPattern('\n\t{1,}[\-\*]',$mode,'listblock'); - + $this->Lexer->addPattern('\n {2,}[\-\*]','listblock'); $this->Lexer->addPattern('\n\t{1,}[\-\*]','listblock'); - + } - + function postConnect() { $this->Lexer->addExitPattern('\n','listblock'); } @@ -444,10 +444,10 @@ class Doku_Parser_Mode_listblock extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_table extends Doku_Parser_Mode { - + function Doku_Parser_Mode_table() { global $PARSER_MODES; - + $this->allowedModes = array_merge ( $PARSER_MODES['formatting'], $PARSER_MODES['substition'], @@ -455,12 +455,12 @@ class Doku_Parser_Mode_table extends Doku_Parser_Mode { $PARSER_MODES['protected'] ); } - + function connectTo($mode) { $this->Lexer->addEntryPattern('\n\^',$mode,'table'); $this->Lexer->addEntryPattern('\n\|',$mode,'table'); } - + function postConnect() { $this->Lexer->addPattern('\n\^','table'); $this->Lexer->addPattern('\n\|','table'); @@ -478,12 +478,12 @@ class Doku_Parser_Mode_table extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_unformatted extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addEntryPattern('<nowiki>(?=.*\x3C/nowiki\x3E)',$mode,'unformatted'); $this->Lexer->addEntryPattern('%%(?=.*%%)',$mode,'unformattedalt'); } - + function postConnect() { $this->Lexer->addExitPattern('</nowiki>','unformatted'); $this->Lexer->addExitPattern('%%','unformattedalt'); @@ -497,11 +497,11 @@ class Doku_Parser_Mode_unformatted extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_php extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addEntryPattern('<php>(?=.*\x3C/php\x3E)',$mode,'php'); } - + function postConnect() { $this->Lexer->addExitPattern('</php>','php'); } @@ -513,11 +513,11 @@ class Doku_Parser_Mode_php extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_html extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addEntryPattern('<html>(?=.*\x3C/html\x3E)',$mode,'html'); } - + function postConnect() { $this->Lexer->addExitPattern('</html>','html'); } @@ -529,38 +529,38 @@ class Doku_Parser_Mode_html extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_preformatted extends Doku_Parser_Mode { - + function connectTo($mode) { // Has hard coded awareness of lists... $this->Lexer->addEntryPattern('\n (?![\*\-])',$mode,'preformatted'); $this->Lexer->addEntryPattern('\n\t(?![\*\-])',$mode,'preformatted'); - + // How to effect a sub pattern with the Lexer! $this->Lexer->addPattern('\n ','preformatted'); $this->Lexer->addPattern('\n\t','preformatted'); } - + function postConnect() { $this->Lexer->addExitPattern('\n','preformatted'); } function getSort() { return 20; - } + } } //------------------------------------------------------------------- class Doku_Parser_Mode_code extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addEntryPattern('<code(?=.*\x3C/code\x3E)',$mode,'code'); } - + function postConnect() { $this->Lexer->addExitPattern('</code>','code'); } - + function getSort() { return 200; } @@ -568,15 +568,15 @@ class Doku_Parser_Mode_code extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_file extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addEntryPattern('<file>(?=.*\x3C/file\x3E)',$mode,'file'); } - + function postConnect() { $this->Lexer->addExitPattern('</file>','file'); } - + function getSort() { return 210; } @@ -584,10 +584,10 @@ class Doku_Parser_Mode_file extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_quote extends Doku_Parser_Mode { - + function Doku_Parser_Mode_quote() { global $PARSER_MODES; - + $this->allowedModes = array_merge ( $PARSER_MODES['formatting'], $PARSER_MODES['substition'], @@ -598,16 +598,16 @@ class Doku_Parser_Mode_quote extends Doku_Parser_Mode { #$this->allowedModes[] = 'preformatted'; #$this->allowedModes[] = 'unformatted'; } - + function connectTo($mode) { $this->Lexer->addEntryPattern('\n>{1,}',$mode,'quote'); } - + function postConnect() { $this->Lexer->addPattern('\n>{1,}','quote'); $this->Lexer->addExitPattern('\n','quote'); } - + function getSort() { return 220; } @@ -618,23 +618,23 @@ class Doku_Parser_Mode_acronym extends Doku_Parser_Mode { // A list var $acronyms = array(); var $pattern = ''; - + function Doku_Parser_Mode_acronym($acronyms) { $this->acronyms = $acronyms; } - + function preConnect() { $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]'; $acronyms = array_map('Doku_Lexer_Escape',$this->acronyms); $this->pattern = '(?<=^|'.$bound.')(?:'.join('|',$acronyms).')(?='.$bound.')'; } - + function connectTo($mode) { if ( strlen($this->pattern) > 0 ) { - $this->Lexer->addSpecialPattern($this->pattern,$mode,'acronym'); + $this->Lexer->addSpecialPattern($this->pattern,$mode,'acronym'); } } - + function getSort() { return 240; } @@ -645,11 +645,11 @@ class Doku_Parser_Mode_smiley extends Doku_Parser_Mode { // A list var $smileys = array(); var $pattern = ''; - + function Doku_Parser_Mode_smiley($smileys) { $this->smileys = $smileys; } - + function preConnect() { $sep = ''; foreach ( $this->smileys as $smiley ) { @@ -657,13 +657,13 @@ class Doku_Parser_Mode_smiley extends Doku_Parser_Mode { $sep = '|'; } } - + function connectTo($mode) { if ( strlen($this->pattern) > 0 ) { - $this->Lexer->addSpecialPattern($this->pattern,$mode,'smiley'); + $this->Lexer->addSpecialPattern($this->pattern,$mode,'smiley'); } } - + function getSort() { return 230; } @@ -674,31 +674,31 @@ class Doku_Parser_Mode_wordblock extends Doku_Parser_Mode { // A list var $badwords = array(); var $pattern = ''; - + function Doku_Parser_Mode_wordblock($badwords) { $this->badwords = $badwords; } - + function preConnect() { - + if ( count($this->badwords) == 0 ) { return; } - + $sep = ''; foreach ( $this->badwords as $badword ) { $this->pattern .= $sep.'(?<=\b)(?i)'.Doku_Lexer_Escape($badword).'(?-i)(?=\b)'; $sep = '|'; } - + } - + function connectTo($mode) { if ( strlen($this->pattern) > 0 ) { $this->Lexer->addSpecialPattern($this->pattern,$mode,'wordblock'); } } - + function getSort() { return 250; } @@ -712,11 +712,11 @@ class Doku_Parser_Mode_entity extends Doku_Parser_Mode { // A list var $entities = array(); var $pattern = ''; - + function Doku_Parser_Mode_entity($entities) { $this->entities = $entities; } - + function preConnect() { $sep = ''; foreach ( $this->entities as $entity ) { @@ -724,13 +724,13 @@ class Doku_Parser_Mode_entity extends Doku_Parser_Mode { $sep = '|'; } } - + function connectTo($mode) { if ( strlen($this->pattern) > 0 ) { $this->Lexer->addSpecialPattern($this->pattern,$mode,'entity'); } } - + function getSort() { return 260; } @@ -739,15 +739,15 @@ class Doku_Parser_Mode_entity extends Doku_Parser_Mode { //------------------------------------------------------------------- // Implements the 640x480 replacement class Doku_Parser_Mode_multiplyentity extends Doku_Parser_Mode { - + function connectTo($mode) { - + $this->Lexer->addSpecialPattern( '(?<=\b)\d+[xX]\d+(?=\b)',$mode,'multiplyentity' ); } - + function getSort() { return 270; } @@ -755,9 +755,9 @@ class Doku_Parser_Mode_multiplyentity extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_quotes extends Doku_Parser_Mode { - + function connectTo($mode) { - + $this->Lexer->addSpecialPattern( '(?<=^|\s)\'(?=\S)',$mode,'singlequoteopening' ); @@ -772,7 +772,7 @@ class Doku_Parser_Mode_quotes extends Doku_Parser_Mode { ); } - + function getSort() { return 280; } @@ -780,13 +780,13 @@ class Doku_Parser_Mode_quotes extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_camelcaselink extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addSpecialPattern( '\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b',$mode,'camelcaselink' ); } - + function getSort() { return 290; } @@ -794,12 +794,12 @@ class Doku_Parser_Mode_camelcaselink extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_internallink extends Doku_Parser_Mode { - + function connectTo($mode) { // Word boundaries? $this->Lexer->addSpecialPattern("\[\[.+?\]\]",$mode,'internallink'); } - + function getSort() { return 300; } @@ -807,12 +807,12 @@ class Doku_Parser_Mode_internallink extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_media extends Doku_Parser_Mode { - + function connectTo($mode) { // Word boundaries? $this->Lexer->addSpecialPattern("\{\{[^\}]+\}\}",$mode,'media'); } - + function getSort() { return 320; } @@ -831,33 +831,33 @@ class Doku_Parser_Mode_rss extends Doku_Parser_Mode { } //------------------------------------------------------------------- -class Doku_Parser_Mode_externallink extends Doku_Parser_Mode { +class Doku_Parser_Mode_externallink extends Doku_Parser_Mode { var $schemes = array('http','https','telnet','gopher','wais','ftp','ed2k','irc'); var $patterns = array(); - + function preConnect() { - + $ltrs = '\w'; $gunk = '/\#~:.?+=&%@!\-'; $punc = '.:?\-;,'; $host = $ltrs.$punc; $any = $ltrs.$gunk.$punc; - + foreach ( $this->schemes as $scheme ) { $this->patterns[] = '\b(?i)'.$scheme.'(?-i)://['.$any.']+?(?=['.$punc.']*[^'.$any.'])'; } - + $this->patterns[] = '\b(?i)www?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])'; $this->patterns[] = '\b(?i)ftp?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])'; - + } - + function connectTo($mode) { foreach ( $this->patterns as $pattern ) { $this->Lexer->addSpecialPattern($pattern,$mode,'externallink'); } } - + function getSort() { return 330; } @@ -865,21 +865,21 @@ class Doku_Parser_Mode_externallink extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_filelink extends Doku_Parser_Mode { - + var $pattern; - + function preConnect() { - + $ltrs = '\w'; $gunk = '/\#~:.?+=&%@!\-'; $punc = '.:?\-;,'; $host = $ltrs.$punc; $any = $ltrs.$gunk.$punc; - + $this->pattern = '\b(?i)file(?-i)://['.$any.']+?['. $punc.']*[^'.$any.']'; } - + function connectTo($mode) { $this->Lexer->addSpecialPattern( $this->pattern,$mode,'filelink'); @@ -892,18 +892,18 @@ class Doku_Parser_Mode_filelink extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_windowssharelink extends Doku_Parser_Mode { - + var $pattern; - + function preConnect() { $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w$]+)+"; } - + function connectTo($mode) { $this->Lexer->addSpecialPattern( $this->pattern,$mode,'windowssharelink'); } - + function getSort() { return 350; } @@ -911,11 +911,11 @@ class Doku_Parser_Mode_windowssharelink extends Doku_Parser_Mode { //------------------------------------------------------------------- class Doku_Parser_Mode_emaillink extends Doku_Parser_Mode { - + function connectTo($mode) { $this->Lexer->addSpecialPattern("<[\w0-9\-_.]+?@[\w\-]+\.[\w\-\.]+\.*[\w]+>",$mode,'emaillink'); } - + function getSort() { return 340; } |