author | Dan |
Fri, 21 Aug 2009 20:30:52 -0400 | |
changeset 1098 | be6cfe79128c |
parent 1081 | 745200a9cc2a |
child 1106 | 01315acbc22b |
permissions | -rw-r--r-- |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
1 |
<?php |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
2 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
3 |
/* |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
4 |
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between |
1081
745200a9cc2a
Fixed some upgrade bugs; added support for choosing one's own date/time formats; rebrand as 1.1.7
Dan
parents:
1078
diff
changeset
|
5 |
* Copyright (C) 2006-2009 Dan Fuhry |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
6 |
* |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
7 |
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
8 |
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
9 |
* |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
10 |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
11 |
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
12 |
*/ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
13 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
14 |
class Carpenter_Parse_MediaWiki |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
15 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
16 |
public $rules = array( |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
17 |
'bold' => "/'''(.+?)'''/", |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
18 |
'italic' => "/''(.+?)''/", |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
19 |
'underline' => '/__(.+?)__/', |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
20 |
'externalwithtext' => '#\[((?:https?|irc|ftp)://.+?) (.+?)\]#', |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
21 |
'externalnotext' => '#\[((?:https?|irc|ftp)://.+?)\]#' |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
22 |
); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
23 |
|
1078
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
24 |
private $blockquote_rand_id; |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
25 |
|
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
26 |
public function lang(&$text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
27 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
28 |
global $lang; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
29 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
30 |
preg_match_all('/<lang (?:code|id)="([a-z0-9_-]+)">([\w\W]+?)<\/lang>/', $text, $langmatch); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
31 |
foreach ( $langmatch[0] as $i => $match ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
32 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
33 |
if ( $langmatch[1][$i] == $lang->lang_code ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
34 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
35 |
$text = str_replace_once($match, $langmatch[2][$i], $text); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
36 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
37 |
else |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
38 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
39 |
$text = str_replace_once($match, '', $text); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
40 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
41 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
42 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
43 |
return array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
44 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
45 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
46 |
public function templates(&$text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
47 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
48 |
$template_regex = "/\{\{(.+)((\n|\|[ ]*([A-z0-9]+)[ ]*=[ ]*(.+))*)\}\}/isU"; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
49 |
$i = 0; |
1054
e6b14d33ac55
Renderer: added "smart paragraphs" for templates. <p><b>Foo</b> {bar}</p> where bar is multiline is basically turned into proper XHTML paragraphs.
Dan
parents:
1044
diff
changeset
|
50 |
while ( preg_match($template_regex, $text, $match) ) |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
51 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
52 |
$i++; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
53 |
if ( $i == 5 ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
54 |
break; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
55 |
$text = RenderMan::include_templates($text); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
56 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
57 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
58 |
return array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
59 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
60 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
61 |
public function heading(&$text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
62 |
{ |
1031
8a4b75e73137
Wiki formatting: Headings: tolerate spaces after line; added disable_rule method (required for rev. 1029)
Dan
parents:
1027
diff
changeset
|
63 |
if ( !preg_match_all('/^(={1,6}) *(.+?) *\\1 *$/m', $text, $results) ) |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
64 |
return array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
65 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
66 |
$headings = array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
67 |
foreach ( $results[0] as $i => $match ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
68 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
69 |
$headings[] = array( |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
70 |
'level' => strlen($results[1][$i]), |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
71 |
'text' => $results[2][$i] |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
72 |
); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
73 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
74 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
75 |
$text = Carpenter::tokenize($text, $results[0]); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
76 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
77 |
return $headings; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
78 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
79 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
80 |
public function multilist(&$text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
81 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
82 |
// Match entire lists |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
83 |
$regex = '/^ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
84 |
([:#\*])+ # Initial list delimiter |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
85 |
[ ]* |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
86 |
.+? |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
87 |
(?: |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
88 |
\r?\n |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
89 |
(?:\\1|[ ]{2,}) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
90 |
[ ]* |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
91 |
.+?)* |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
92 |
$/mx'; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
93 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
94 |
if ( !preg_match_all($regex, $text, $lists) ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
95 |
return array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
96 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
97 |
$types = array( |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
98 |
'*' => 'unordered', |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
99 |
'#' => 'ordered', |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
100 |
':' => 'indent' |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
101 |
); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
102 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
103 |
$pieces = array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
104 |
foreach ( $lists[0] as $i => $list ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
105 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
106 |
$token = $lists[1][$i]; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
107 |
$piece = array( |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
108 |
'type' => $types[$token], |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
109 |
'items' => array() |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
110 |
); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
111 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
112 |
// convert windows newlines to unix |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
113 |
$list = str_replace("\r\n", "\n", $list); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
114 |
$items_pre = explode("\n", $list); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
115 |
$items = array(); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
116 |
// first pass, go through and combine items that are newlined |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
117 |
foreach ( $items_pre as $item ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
118 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
119 |
if ( substr($item, 0, 1) == $token ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
120 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
121 |
$items[] = $item; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
122 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
123 |
else |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
124 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
125 |
// it's a continuation of the previous LI. Don't need to worry about |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
126 |
// undefined indices here since the regex should filter out all invalid |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
127 |
// markup. Just append this line to the previous. |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
128 |
$items[ count($items) - 1 ] .= "\n" . trim($item); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
129 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
130 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
131 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
132 |
// second pass, separate items and tokens |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
133 |
unset($items_pre); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
134 |
foreach ( $items as $item ) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
135 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
136 |
// get the depth |
1073
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
137 |
$itemtoken = preg_replace('/^([#:\*]+).*$/s', '$1', $item); |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
138 |
// get the text |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
139 |
$itemtext = trim(substr($item, strlen($itemtoken))); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
140 |
$piece['items'][] = array( |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
141 |
// depth starts at 1 |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
142 |
'depth' => strlen($itemtoken), |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
143 |
'text' => $itemtext |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
144 |
); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
145 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
146 |
$pieces[] = $piece; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
147 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
148 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
149 |
$text = Carpenter::tokenize($text, $lists[0]); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
150 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
151 |
return $pieces; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
152 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
153 |
|
1073
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
154 |
public function blockquote(&$text) |
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
155 |
{ |
1078
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
156 |
$rand_id = hexencode(AESCrypt::randkey(16), '', ''); |
1073
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
157 |
|
1078
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
158 |
while ( preg_match_all('/^(?:(>+) *.+(?:\r?\n|$))+/m', $text, $quotes) ) |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
159 |
{ |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
160 |
foreach ( $quotes[0] as $quote ) |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
161 |
{ |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
162 |
$piece = trim(preg_replace('/^> */m', '', $quote)); |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
163 |
$text = str_replace_once($quote, "{blockquote:$rand_id}\n$piece\n{/blockquote:$rand_id}\n", $text); |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
164 |
} |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
165 |
} |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
166 |
//die('<pre>' . htmlspecialchars($text) . '</pre>'); |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
167 |
|
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
168 |
$this->blockquote_rand_id = $rand_id; |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
169 |
} |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
170 |
|
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
171 |
public function blockquotepost(&$text) |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
172 |
{ |
67a4c839c7e1
Blockquote functionality in wikitext parser now allows rendering of other block level elements properly
Dan
parents:
1073
diff
changeset
|
173 |
return $this->blockquote_rand_id; |
1073
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
174 |
} |
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
175 |
|
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
176 |
public function paragraph(&$text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
177 |
{ |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
178 |
// The trick with paragraphs is to not turn things into them when a block level element already wraps the block of text. |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
179 |
// First we need a list of block level elements (http://htmlhelp.com/reference/html40/block.html + some Enano extensions) |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
180 |
$blocklevel = 'address|blockquote|center|code|div|dl|fieldset|form|h1|h2|h3|h4|h5|h6|hr|li|ol|p|pre|table|ul|tr|td|th|tbody|thead|tfoot'; |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
181 |
|
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
182 |
// Wrap all block level tags |
1073
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
183 |
RenderMan::tag_strip('_paragraph_bypass', $text, $_nw); |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
184 |
$text = preg_replace("/<($blocklevel)(?: .+?>|>)(?:(?R)|.*?)<\/\\1>/s", '<_paragraph_bypass>$0</_paragraph_bypass>', $text); |
1073
b19a9bcb6a45
More work on rendering engine. Fixed some bugs with paragraph skipping and added (incomplete) support for blockquotes.
Dan
parents:
1054
diff
changeset
|
185 |
RenderMan::tag_unstrip('_paragraph_bypass', $text, $_nw, true); |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
186 |
|
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
187 |
// This is potentially a hack. It allows the parser to stick in <_paragraph_bypass> tags |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
188 |
// to prevent the paragraph parser from interfering with pretty HTML generated elsewhere. |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
189 |
RenderMan::tag_strip('_paragraph_bypass', $text, $_nw); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
190 |
|
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
191 |
$startcond = "(?!(?:[\\r\\n]|\{_paragraph_bypass:[a-f0-9]{32}:[0-9]+\}|[ ]*<\/?(?:$blocklevel)(?: .+>|>)))"; |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
192 |
$regex = "/^ |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
193 |
$startcond # line start condition - do not match if the line starts with the condition above |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
194 |
.+? # body text |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
195 |
(?: |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
196 |
\\n # additional lines |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
197 |
$startcond # make sure of only one newline in a row, and end the paragraph if a new line fails the start condition |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
198 |
.*? |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
199 |
)* # keep going until it fails |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
200 |
$ |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
201 |
/mx"; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
202 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
203 |
if ( !preg_match_all($regex, $text, $matches) ) |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
204 |
{ |
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
205 |
RenderMan::tag_unstrip('_paragraph_bypass', $text, $_nw); |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
206 |
return array(); |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
207 |
} |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
208 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
209 |
// Debugging :) |
1044
ad6a22377507
Wiki engine: improved behavior in block level element finding/wrapping algorithm
Dan
parents:
1031
diff
changeset
|
210 |
// die('<pre>' . htmlspecialchars($text) . "\n-----------------------------------------------------------\n" . htmlspecialchars(print_r($matches, true)) . '</pre>'); |
1027
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
211 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
212 |
// restore stripped |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
213 |
RenderMan::tag_unstrip('_paragraph_bypass', $text, $_nw); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
214 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
215 |
// tokenize |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
216 |
$text = Carpenter::tokenize($text, $matches[0]); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
217 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
218 |
return $matches[0]; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
219 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
220 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
221 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
222 |
function parser_mediawiki_xhtml_image($text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
223 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
224 |
$text = RenderMan::process_image_tags($text, $taglist); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
225 |
$text = RenderMan::process_imgtags_stage2($text, $taglist); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
226 |
return $text; |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
227 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
228 |
|
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
229 |
function parser_mediawiki_xhtml_tables($text) |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
230 |
{ |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
231 |
return process_tables($text); |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
232 |
} |
98c052fc3337
First implementation of new parser; Text_Wiki is now gone. VERY BETA! WiP.
Dan
parents:
diff
changeset
|
233 |