summaryrefslogtreecommitdiff
path: root/inc/parser/parser.php
diff options
context:
space:
mode:
Diffstat (limited to 'inc/parser/parser.php')
-rw-r--r--inc/parser/parser.php292
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;
}