author | Dan |
Mon, 21 Apr 2008 19:37:31 -0400 | |
changeset 539 | 1beddd693f2d |
parent 536 | 218a627eb53e |
child 569 | 6ba792bc9071 |
permissions | -rw-r--r-- |
1 | 1 |
<?php |
73
0a74676a2f2f
Made the move to Loch Ness, and got some basic page grouping functionality working. TODO: fix some UI issues in Javascript ACL editor and change non-JS ACL editor to work with page groups too
Dan
parents:
67
diff
changeset
|
2 |
|
1 | 3 |
/* |
4 |
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between |
|
536 | 5 |
* Version 1.1.4 (Caoineag alpha 4) |
6 |
* Copyright (C) 2006-2008 Dan Fuhry |
|
1 | 7 |
* render.php - handles fetching pages and parsing them into HTML |
8 |
* |
|
9 |
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License |
|
10 |
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. |
|
11 |
* |
|
12 |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
|
13 |
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. |
|
14 |
*/ |
|
15 |
||
16 |
class RenderMan { |
|
17 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
18 |
public static function strToPageID($string) |
1 | 19 |
{ |
20 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
21 |
$k = array_keys($paths->nslist); |
|
136
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
22 |
$proj_alt = 'Project:'; |
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
23 |
if ( substr($string, 0, (strlen($proj_alt))) == $proj_alt ) |
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
24 |
{ |
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
25 |
$ns = 'Project'; |
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
26 |
$pg = substr($string, strlen($proj_alt), strlen($string)); |
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
27 |
return Array($pg, $ns); |
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
28 |
} |
1 | 29 |
for($i=0;$i<sizeof($paths->nslist);$i++) |
30 |
{ |
|
31 |
$ln = strlen($paths->nslist[$k[$i]]); |
|
32 |
if(substr($string, 0, $ln) == $paths->nslist[$k[$i]]) |
|
33 |
{ |
|
34 |
$ns = $k[$i]; |
|
35 |
$pg = substr($string, strlen($paths->nslist[$ns]), strlen($string)); |
|
36 |
} |
|
37 |
} |
|
38 |
return Array($pg, $ns); |
|
39 |
} |
|
40 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
41 |
public static function getPage($page_id, $namespace, $wiki = 1, $smilies = true, $filter_links = true, $redir = true, $render = true) |
1 | 42 |
{ |
43 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
44 |
||
45 |
$perms =& $session; |
|
46 |
||
322
5f1cd51bf1be
Many changes. Installer with PostgreSQL is broken badly and will be for some time.
Dan
parents:
320
diff
changeset
|
47 |
if ( $page_id != $paths->page_id || $namespace != $paths->namespace ) |
1 | 48 |
{ |
49 |
unset($perms); |
|
50 |
unset($perms); // PHP <5.1.5 Zend bug |
|
51 |
$perms = $session->fetch_page_acl($page_id, $namespace); |
|
52 |
} |
|
53 |
||
54 |
if(!$perms->get_permissions('read')) |
|
55 |
return 'Access denied ('.$paths->nslist[$namespace].$page_id.')'; |
|
56 |
||
457
d823e49e2e4e
Fixed: RenderMan::getPage() failing with access denial when fetching template and view_source results in deny
Dan
parents:
322
diff
changeset
|
57 |
if($namespace != 'Template' && ($wiki == 0 || $render == false)) |
1 | 58 |
{ |
59 |
if(!$perms->get_permissions('view_source')) |
|
60 |
{ |
|
61 |
return 'Access denied ('.$paths->nslist[$namespace].$page_id.')'; |
|
62 |
} |
|
63 |
} |
|
64 |
||
65 |
$q = $db->sql_query('SELECT page_text,char_tag FROM '.table_prefix.'page_text WHERE page_id=\''.$db->escape($page_id).'\' AND namespace=\''.$db->escape($namespace).'\';'); |
|
66 |
if ( !$q ) |
|
67 |
{ |
|
68 |
$db->_die('Method called was: RenderMan::getPage(\''.$page_id.'\', \''.$namespace.'\');.'); |
|
69 |
} |
|
70 |
if ( $db->numrows() < 1 ) |
|
71 |
{ |
|
72 |
return false; |
|
73 |
} |
|
74 |
$row = $db->fetchrow(); |
|
75 |
$db->free_result(); |
|
76 |
||
77 |
$message = $row['page_text']; |
|
78 |
$chartag = $row['char_tag']; |
|
79 |
unset($row); // Free some memory |
|
80 |
||
133
af0f6ec48de3
Fully implemented password complexity enforcement; added encryption for passwords on registration form; some baby steps taken towards supporting international usernames - this is not working very well, we might need a hackish fix; TODO: implement password strength meter into installer UI and get international usernames 100% working
Dan
parents:
91
diff
changeset
|
81 |
if ( preg_match("#^\#redirect \[\[([^\]\r\n\a\t]+?)\]\]#", $message, $m) && $redir && ( !isset($_GET['redirect']) || ( isset($_GET['redirect']) && $_GET['redirect'] != 'no' ) ) ) |
1 | 82 |
{ |
83 |
$old = $paths->cpage; |
|
84 |
$a = RenderMan::strToPageID($m[1]); |
|
85 |
$a[0] = str_replace(' ', '_', $a[0]); |
|
86 |
||
87 |
$pageid = str_replace(' ', '_', $paths->nslist[$a[1]] . $a[0]); |
|
88 |
$paths->page = $pageid; |
|
89 |
$paths->cpage = $paths->pages[$pageid]; |
|
90 |
//die('<pre>'.print_r($paths->cpage,true).'</pre>'); |
|
91 |
||
92 |
unset($template); |
|
93 |
unset($GLOBALS['template']); |
|
94 |
||
95 |
$GLOBALS['template'] = new template(); |
|
96 |
global $template; |
|
97 |
||
98 |
$template->template(); // Tear down and rebuild the template parser |
|
99 |
$template->load_theme($session->theme, $session->style); |
|
100 |
||
101 |
$data = '<div><small>(Redirected from <a href="'.makeUrlNS($old['namespace'], $old['urlname_nons'], 'redirect=no', true).'">'.$old['name'].'</a>)</small></div>'.RenderMan::getPage($a[0], $a[1], $wiki, $smilies, $filter_links, false /* Enforces a maximum of one redirect */); |
|
102 |
||
103 |
return $data; |
|
104 |
} |
|
105 |
else if(preg_match('#^\#redirect \[\[(.+?)\]\]#', $message, $m) && isset($_GET['redirect']) && $_GET['redirect'] == 'no') |
|
106 |
{ |
|
107 |
preg_match('#^\#redirect \[\[(.+)\]\]#', $message, $m); |
|
108 |
$m[1] = str_replace(' ', '_', $m[1]); |
|
109 |
$message = preg_replace('#\#redirect \[\[(.+)\]\]#', '<nowiki><div class="mdg-infobox"><table border="0" width="100%" cellspacing="0" cellpadding="0"><tr><td valign="top"><img alt="Cute wet-floor icon" src="'.scriptPath.'/images/redirector.png" /></td><td valign="top" style="padding-left: 10px;"><b>This page is a <i>redirector</i>.</b><br />This means that this page will not show its own content by default. Instead it will display the contents of the page it redirects to.<br /><br />To create a redirect page, make the <i>first characters</i> in the page content <tt>#redirect [[Page_ID]]</tt>. For more information, see the Enano <a href="http://enanocms.org/Help:Wiki_formatting">Wiki formatting guide</a>.<br /><br />This page redirects to <a href="'.makeUrl($m[1]).'">'.$paths->pages[$m[1]]['name'].'</a>.</td></tr></table></div><br /><hr style="margin-left: 1em; width: 200px;" /></nowiki>', $message); |
|
110 |
} |
|
111 |
$session->disallow_password_grab(); |
|
112 |
return ($render) ? RenderMan::render($message, $wiki, $smilies, $filter_links) : $message; |
|
113 |
} |
|
114 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
115 |
public static function getTemplate($id, $parms) |
1 | 116 |
{ |
117 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
118 |
if(!isset($paths->pages[$paths->nslist['Template'].$id])) |
|
119 |
{ |
|
120 |
return '[['.$paths->nslist['Template'].$id.']]'; |
|
121 |
} |
|
122 |
if(isset($paths->template_cache[$id])) |
|
123 |
{ |
|
124 |
$text = $paths->template_cache[$id]; |
|
125 |
} |
|
126 |
else |
|
127 |
{ |
|
128 |
$text = RenderMan::getPage($id, 'Template', 0, true, true, 0); |
|
129 |
$paths->template_cache[$id] = $text; |
|
130 |
} |
|
131 |
||
132 |
$text = preg_replace('/<noinclude>(.*?)<\/noinclude>/is', '', $text); |
|
133 |
$text = preg_replace('/<nodisplay>(.*?)<\/nodisplay>/is', '\\1', $text); |
|
134 |
||
135 |
preg_match_all('#\(_([0-9]+)_\)#', $text, $matchlist); |
|
136 |
||
137 |
foreach($matchlist[1] as $m) |
|
138 |
{ |
|
139 |
if(isset($parms[((int)$m)+1])) |
|
140 |
{ |
|
141 |
$p = $parms[((int)$m)+1]; |
|
142 |
} |
|
143 |
else |
|
144 |
{ |
|
145 |
$p = '<b>Notice:</b> RenderMan::getTemplate(): Parameter '.$m.' is not set'; |
|
146 |
} |
|
147 |
$text = str_replace('(_'.$m.'_)', $p, $text); |
|
148 |
} |
|
149 |
$text = RenderMan::include_templates($text); |
|
150 |
return $text; |
|
151 |
} |
|
152 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
153 |
public static function fetch_template_text($id) |
1 | 154 |
{ |
155 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
156 |
if(!isset($paths->pages[$paths->nslist['Template'].$id])) |
|
157 |
{ |
|
158 |
return '[['.$paths->nslist['Template'].$id.']]'; |
|
159 |
} |
|
160 |
if(isset($paths->template_cache[$id])) |
|
161 |
{ |
|
162 |
$text = $paths->template_cache[$id]; |
|
163 |
} |
|
164 |
else |
|
165 |
{ |
|
166 |
$text = RenderMan::getPage($id, 'Template', 0, false, false, false, false); |
|
167 |
$paths->template_cache[$id] = $text; |
|
168 |
} |
|
169 |
||
170 |
if ( is_string($text) ) |
|
171 |
{ |
|
172 |
$text = preg_replace('/<noinclude>(.*?)<\/noinclude>/is', '', $text); |
|
173 |
$text = preg_replace('/<nodisplay>(.*?)<\/nodisplay>/is', '\\1', $text); |
|
174 |
} |
|
175 |
||
176 |
return $text; |
|
177 |
} |
|
178 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
179 |
public static function render($text, $wiki = 1, $smilies = true, $filter_links = true) |
1 | 180 |
{ |
181 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
182 |
if($smilies) |
|
183 |
{ |
|
184 |
$text = RenderMan::smilieyize($text); |
|
185 |
} |
|
186 |
if($wiki == 1) |
|
187 |
{ |
|
188 |
$text = RenderMan::next_gen_wiki_format($text); |
|
189 |
} |
|
190 |
elseif($wiki == 2) |
|
191 |
{ |
|
192 |
$text = $template->tplWikiFormat($text); |
|
193 |
} |
|
194 |
return $text; |
|
195 |
} |
|
196 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
197 |
public static function PlainTextRender($text, $wiki = 1, $smilies = false, $filter_links = true) |
1 | 198 |
{ |
199 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
200 |
if($smilies) |
|
201 |
{ |
|
202 |
$text = RenderMan::smilieyize($text); |
|
203 |
} |
|
204 |
if($wiki == 1) |
|
205 |
{ |
|
206 |
$text = RenderMan::next_gen_wiki_format($text, true); |
|
207 |
} |
|
208 |
elseif($wiki == 2) |
|
209 |
{ |
|
210 |
$text = $template->tplWikiFormat($text); |
|
211 |
} |
|
212 |
return $text; |
|
213 |
} |
|
214 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
215 |
public static function next_gen_wiki_format($text, $plaintext = false, $filter_links = true, $do_params = false) |
1 | 216 |
{ |
217 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
218 |
global $lang; |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
219 |
|
382
2ccb55995aef
Profiling enabled for RenderMan's wikiformat routine; [minor] made HTML from profiler more pretty
Dan
parents:
377
diff
changeset
|
220 |
profiler_log("RenderMan: starting wikitext render"); |
2ccb55995aef
Profiling enabled for RenderMan's wikiformat routine; [minor] made HTML from profiler more pretty
Dan
parents:
377
diff
changeset
|
221 |
|
1 | 222 |
$random_id = md5( time() . mt_rand() ); |
223 |
||
224 |
// Strip out <nowiki> sections and PHP code |
|
225 |
||
407
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
226 |
$nw = preg_match_all('#<nowiki>(.*?)<\/nowiki>#is', $text, $nowiki); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
227 |
|
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
228 |
for($i=0;$i<sizeof($nowiki[1]);$i++) |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
229 |
{ |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
230 |
$text = str_replace('<nowiki>'.$nowiki[1][$i].'</nowiki>', '{NOWIKI:'.$random_id.':'.$i.'}', $text); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
231 |
} |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
232 |
|
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
233 |
$code = $plugins->setHook('render_wikiformat_veryearly'); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
234 |
foreach ( $code as $cmd ) |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
235 |
{ |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
236 |
eval($cmd); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
237 |
} |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
238 |
|
1 | 239 |
$php = preg_match_all('#<\?php(.*?)\?>#is', $text, $phpsec); |
240 |
||
241 |
for($i=0;$i<sizeof($phpsec[1]);$i++) |
|
242 |
{ |
|
243 |
$text = str_replace('<?php'.$phpsec[1][$i].'?>', '{PHP:'.$random_id.':'.$i.'}', $text); |
|
244 |
} |
|
245 |
||
246 |
$text = preg_replace('/<noinclude>(.*?)<\/noinclude>/is', '\\1', $text); |
|
247 |
if ( $paths->namespace == 'Template' ) |
|
248 |
{ |
|
249 |
$text = preg_replace('/<nodisplay>(.*?)<\/nodisplay>/is', '', $text); |
|
250 |
} |
|
251 |
||
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
252 |
preg_match_all('/<lang code="([a-z0-9_]+)">([\w\W]+?)<\/lang>/', $text, $langmatch); |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
253 |
foreach ( $langmatch[0] as $i => $match ) |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
254 |
{ |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
255 |
if ( $langmatch[1][$i] == $lang->lang_code ) |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
256 |
{ |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
257 |
$text = str_replace_once($match, $langmatch[2][$i], $text); |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
258 |
} |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
259 |
else |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
260 |
{ |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
261 |
$text = str_replace_once($match, '', $text); |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
262 |
} |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
263 |
} |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
264 |
|
163 | 265 |
$code = $plugins->setHook('render_wikiformat_pre'); |
266 |
foreach ( $code as $cmd ) |
|
267 |
{ |
|
268 |
eval($cmd); |
|
269 |
} |
|
270 |
||
1 | 271 |
if ( !$plaintext ) |
272 |
{ |
|
273 |
// Process images |
|
142
ca9118d9c0f2
Rebrand as 1.0.2 (Coblynau); internal links are now parsed by RenderMan::parse_internal_links()
Dan
parents:
136
diff
changeset
|
274 |
$text = RenderMan::process_image_tags($text, $taglist); |
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
275 |
$text = RenderMan::process_imgtags_stage2($text, $taglist); |
1 | 276 |
} |
277 |
||
278 |
if($do_params) |
|
279 |
{ |
|
280 |
preg_match_all('#\(_([0-9]+)_\)#', $text, $matchlist); |
|
281 |
foreach($matchlist[1] as $m) |
|
282 |
{ |
|
283 |
$text = str_replace('(_'.$m.'_)', $paths->getParam((int)$m), $text); |
|
284 |
} |
|
285 |
} |
|
286 |
||
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
287 |
//$template_regex = "/\{\{([^\]]+?)((\n([ ]*?)[A-z0-9]+([ ]*?)=([ ]*?)(.+?))*)\}\}/is"; |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
288 |
$template_regex = "/\{\{(.+)((\n|\|[ ]*([A-z0-9]+)[ ]*=[ ]*(.+))*)\}\}/isU"; |
63
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
289 |
$i = 0; |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
290 |
while ( preg_match($template_regex, $text) ) |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
291 |
{ |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
292 |
$i++; |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
293 |
if ( $i == 5 ) |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
294 |
break; |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
295 |
$text = RenderMan::include_templates($text); |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
296 |
} |
1 | 297 |
|
335
67bd3121a12e
Replaced TinyMCE 2.x with 3.0 beta 3. Supports everything but IE. Also rewrote the editor interface completely from the ground up.
Dan
parents:
326
diff
changeset
|
298 |
// Before shipping it out to the renderer, replace spaces in between headings and paragraphs: |
67bd3121a12e
Replaced TinyMCE 2.x with 3.0 beta 3. Supports everything but IE. Also rewrote the editor interface completely from the ground up.
Dan
parents:
326
diff
changeset
|
299 |
$text = preg_replace('/<\/(h[0-9]|div|p)>([\s]+)<(h[0-9]|div|p)( .+?)?>/i', '</\\1><\\3\\4>', $text); |
67bd3121a12e
Replaced TinyMCE 2.x with 3.0 beta 3. Supports everything but IE. Also rewrote the editor interface completely from the ground up.
Dan
parents:
326
diff
changeset
|
300 |
|
1 | 301 |
$text = process_tables($text); |
142
ca9118d9c0f2
Rebrand as 1.0.2 (Coblynau); internal links are now parsed by RenderMan::parse_internal_links()
Dan
parents:
136
diff
changeset
|
302 |
$text = RenderMan::parse_internal_links($text); |
1 | 303 |
|
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
304 |
$wiki = Text_Wiki::singleton('Mediawiki'); |
1 | 305 |
if($plaintext) |
306 |
{ |
|
307 |
$wiki->setRenderConf('Plain', 'wikilink', 'view_url', contentPath); |
|
308 |
$result = $wiki->transform($text, 'Plain'); |
|
309 |
} |
|
310 |
else |
|
311 |
{ |
|
312 |
$wiki->setRenderConf('Xhtml', 'wikilink', 'view_url', contentPath); |
|
313 |
$wiki->setRenderConf('Xhtml', 'Url', 'css_descr', 'external'); |
|
314 |
$result = $wiki->transform($text, 'Xhtml'); |
|
315 |
} |
|
316 |
||
163 | 317 |
// HTML fixes |
318 |
$result = preg_replace('#<tr>([\s]*?)<\/tr>#is', '', $result); |
|
319 |
$result = preg_replace('#<p>([\s]*?)<\/p>#is', '', $result); |
|
320 |
$result = preg_replace('#<br />([\s]*?)<table#is', '<table', $result); |
|
321 |
$result = str_replace("<pre><code>\n", "<pre><code>", $result); |
|
322 |
$result = preg_replace("/<p><table([^>]*?)><\/p>/", "<table\\1>", $result); |
|
323 |
$result = str_replace("<br />\n</td>", "\n</td>", $result); |
|
324 |
$result = str_replace("<p><tr>", "<tr>", $result); |
|
325 |
$result = str_replace("<tr><br />", "<tr>", $result); |
|
326 |
$result = str_replace("</tr><br />", "</tr>", $result); |
|
327 |
$result = str_replace("</table><br />", "</table>", $result); |
|
328 |
$result = preg_replace('/<\/table>$/', "</table><br /><br />", $result); |
|
329 |
$result = str_replace("<p></div></p>", "</div>", $result); |
|
330 |
$result = str_replace("<p></table></p>", "</table>", $result); |
|
331 |
||
332 |
$code = $plugins->setHook('render_wikiformat_post'); |
|
333 |
foreach ( $code as $cmd ) |
|
334 |
{ |
|
335 |
eval($cmd); |
|
336 |
} |
|
37 | 337 |
|
1 | 338 |
// Reinsert <nowiki> sections |
339 |
for($i=0;$i<$nw;$i++) |
|
340 |
{ |
|
341 |
$result = str_replace('{NOWIKI:'.$random_id.':'.$i.'}', $nowiki[1][$i], $result); |
|
342 |
} |
|
343 |
||
344 |
// Reinsert PHP |
|
345 |
for($i=0;$i<$php;$i++) |
|
346 |
{ |
|
347 |
$result = str_replace('{PHP:'.$random_id.':'.$i.'}', '<?php'.$phpsec[1][$i].'?>', $result); |
|
348 |
} |
|
349 |
||
382
2ccb55995aef
Profiling enabled for RenderMan's wikiformat routine; [minor] made HTML from profiler more pretty
Dan
parents:
377
diff
changeset
|
350 |
profiler_log("RenderMan: finished wikitext render"); |
2ccb55995aef
Profiling enabled for RenderMan's wikiformat routine; [minor] made HTML from profiler more pretty
Dan
parents:
377
diff
changeset
|
351 |
|
1 | 352 |
return $result; |
353 |
||
354 |
} |
|
355 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
356 |
public static function wikiFormat($message, $filter_links = true, $do_params = false, $plaintext = false) |
163 | 357 |
{ |
1 | 358 |
global $db, $session, $paths, $template, $plugins; // Common objects |
359 |
||
360 |
return RenderMan::next_gen_wiki_format($message, $plaintext, $filter_links, $do_params); |
|
361 |
||
362 |
$random_id = md5( time() . mt_rand() ); |
|
363 |
||
364 |
// Strip out <nowiki> sections |
|
365 |
$nw = preg_match_all('#<nowiki>(.*?)<\/nowiki>#is', $message, $nowiki); |
|
366 |
||
367 |
if(!$plaintext) |
|
368 |
{ |
|
369 |
||
370 |
//return '<pre>'.print_r($nowiki,true).'</pre>'; |
|
371 |
||
372 |
for($i=0;$i<sizeof($nowiki[1]);$i++) |
|
373 |
{ |
|
374 |
$message = str_replace('<nowiki>'.$nowiki[1][$i].'</nowiki>', '{NOWIKI:'.$random_id.':'.$i.'}', $message); |
|
375 |
} |
|
376 |
||
377 |
$message = preg_replace('/<noinclude>(.*?)<\/noinclude>/is', '\\1', $message); |
|
378 |
||
379 |
//return '<pre>'.htmlspecialchars($message).'</pre>'; |
|
380 |
||
35 | 381 |
$message = RenderMan::process_image_tags($message); |
1 | 382 |
|
383 |
} |
|
384 |
||
385 |
if($do_params) |
|
386 |
{ |
|
387 |
preg_match_all('#\(_([0-9]+)_\)#', $message, $matchlist); |
|
388 |
foreach($matchlist[1] as $m) |
|
389 |
{ |
|
390 |
$message = str_replace('(_'.$m.'_)', $paths->getParam((int)$m), $message); |
|
391 |
} |
|
392 |
} |
|
393 |
||
394 |
$message = RenderMan::include_templates($message); |
|
395 |
||
396 |
// Reinsert <nowiki> sections |
|
397 |
for($i=0;$i<$nw;$i++) |
|
398 |
{ |
|
399 |
$message = str_replace('{NOWIKI:'.$random_id.':'.$i.'}', '<nowiki>'.$nowiki[1][$i].'</nowiki>', $message); |
|
400 |
} |
|
401 |
||
402 |
$message = process_tables($message); |
|
403 |
//if($message2 != $message) return '<pre>'.htmlspecialchars($message2).'</pre>'; |
|
404 |
//$message = str_replace(array('<table>', '</table>'), array('<nowiki><table>', '</table></nowiki>'), $message); |
|
405 |
||
406 |
$wiki =& Text_Wiki::singleton('Mediawiki'); |
|
407 |
if($plaintext) |
|
408 |
{ |
|
409 |
$wiki->setRenderConf('Plain', 'wikilink', 'view_url', contentPath); |
|
410 |
$result = $wiki->transform($message, 'Plain'); |
|
411 |
} else { |
|
412 |
$wiki->setRenderConf('Xhtml', 'wikilink', 'view_url', contentPath); |
|
413 |
$wiki->setRenderConf('Xhtml', 'Url', 'css_descr', 'external'); |
|
414 |
$result = $wiki->transform($message, 'Xhtml'); |
|
415 |
} |
|
416 |
||
417 |
// HTML fixes |
|
418 |
$result = preg_replace('#<tr>([\s]*?)<\/tr>#is', '', $result); |
|
419 |
$result = preg_replace('#<p>([\s]*?)<\/p>#is', '', $result); |
|
420 |
$result = preg_replace('#<br />([\s]*?)<table#is', '<table', $result); |
|
421 |
$result = str_replace("<pre><code>\n", "<pre><code>", $result); |
|
422 |
$result = preg_replace("/<p><table([^>]*?)><\/p>/", "<table\\1>", $result); |
|
423 |
$result = str_replace("<br />\n</td>", "\n</td>", $result); |
|
424 |
$result = str_replace("<p><tr>", "<tr>", $result); |
|
425 |
$result = str_replace("<tr><br />", "<tr>", $result); |
|
426 |
$result = str_replace("</tr><br />", "</tr>", $result); |
|
427 |
$result = str_replace("</table></p>", "</table>", $result); |
|
428 |
$result = str_replace("</table><br />", "</table>", $result); |
|
429 |
$result = preg_replace('/<\/table>$/', "</table><br /><br />", $result); |
|
163 | 430 |
$result = str_replace("<p></div></p>", "</div>", $result); |
431 |
$result = str_replace("<p></table></p>", "</table>", $result); |
|
1 | 432 |
|
433 |
$result = str_replace('<nowiki>', '<nowiki>', $result); |
|
434 |
$result = str_replace('</nowiki>', '</nowiki>', $result); |
|
435 |
||
436 |
return $result; |
|
437 |
} |
|
438 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
439 |
public static function destroy_javascript($message, $_php = false) |
1 | 440 |
{ |
441 |
$message = preg_replace('#<(script|object|applet|embed|iframe|frame|form|input|select)(.*?)>#is', '<\\1\\2>', $message); |
|
442 |
$message = preg_replace('#</(script|object|applet|embed|iframe|frame|form|input|select)(.*?)>#is', '</\\1\\2>', $message); |
|
443 |
$message = preg_replace('#(javascript|script|activex|chrome|about|applet):#is', '\\1:', $message); |
|
444 |
if ( $_php ) |
|
445 |
{ |
|
446 |
// Left in only for compatibility |
|
447 |
$message = preg_replace('#<(.*?)>#is', '<\\1>', $message); |
|
448 |
$message = preg_replace('#<(.*?)>#is', '<\\1>', $message); |
|
449 |
$message = preg_replace('#<(\?|\?php|%)(.*?)(\?|%)>#is', '<\\1\\2\\3>', $message); |
|
450 |
// strip <a href="foo" onclick="bar();">-type attacks |
|
451 |
$message = preg_replace('#<([a-zA-Z:\-]+) (.*?)on([A-Za-z]*)=(.*?)>#is', '<\\1\\2on\\3=\\4>', $message); |
|
452 |
} |
|
453 |
return $message; |
|
454 |
} |
|
455 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
456 |
public static function strip_php($message) |
1 | 457 |
{ |
458 |
return RenderMan::destroy_javascript($message, true); |
|
459 |
} |
|
460 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
461 |
public static function sanitize_html($text) |
1 | 462 |
{ |
463 |
$text = htmlspecialchars($text); |
|
91 | 464 |
$allowed_tags = Array('b', 'i', 'u', 'pre', 'code', 'tt', 'br', 'p', 'nowiki', '!--([\w\W]+)--'); |
1 | 465 |
foreach($allowed_tags as $t) |
466 |
{ |
|
467 |
$text = preg_replace('#<'.$t.'>(.*?)</'.$t.'>#is', '<'.$t.'>\\1</'.$t.'>', $text); |
|
468 |
$text = preg_replace('#<'.$t.' />#is', '<'.$t.' />', $text); |
|
469 |
$text = preg_replace('#<'.$t.'>#is', '<'.$t.'>', $text); |
|
470 |
} |
|
471 |
return $text; |
|
472 |
} |
|
473 |
||
91 | 474 |
/** |
475 |
* Parses internal links (wikilinks) in a block of text. |
|
476 |
* @param string Text to process |
|
477 |
* @return string |
|
478 |
*/ |
|
479 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
480 |
public static function parse_internal_links($text) |
91 | 481 |
{ |
136
f2ee42f026f7
Fix: internal links parsed with RenderMan::parse_internal_links() did not get namespaces prepended; added Project: alias namespace for internal links
Dan
parents:
133
diff
changeset
|
482 |
global $db, $session, $paths, $template, $plugins; // Common objects |
91 | 483 |
|
484 |
// stage 1 - links with alternate text |
|
485 |
preg_match_all('/\[\[([^\[\]<>\{\}\|]+)\|(.+?)\]\]/', $text, $matches); |
|
486 |
foreach ( $matches[0] as $i => $match ) |
|
487 |
{ |
|
488 |
list($page_id, $namespace) = RenderMan::strToPageID($matches[1][$i]); |
|
489 |
$pid_clean = $paths->nslist[$namespace] . sanitize_page_id($page_id); |
|
490 |
||
491 |
$url = makeUrl($pid_clean, false, true); |
|
492 |
$inner_text = $matches[2][$i]; |
|
493 |
$quot = '"'; |
|
494 |
$exists = ( isPage($pid_clean) ) ? '' : ' class="wikilink-nonexistent"'; |
|
495 |
||
496 |
$link = "<a href={$quot}{$url}{$quot}{$exists}>{$inner_text}</a>"; |
|
497 |
||
498 |
$text = str_replace($match, $link, $text); |
|
499 |
} |
|
500 |
||
501 |
// stage 2 - links with no alternate text |
|
502 |
preg_match_all('/\[\[([^\[\]<>\{\}\|]+)\]\]/', $text, $matches); |
|
503 |
foreach ( $matches[0] as $i => $match ) |
|
504 |
{ |
|
505 |
list($page_id, $namespace) = RenderMan::strToPageID($matches[1][$i]); |
|
506 |
$pid_clean = $paths->nslist[$namespace] . sanitize_page_id($page_id); |
|
507 |
||
159
f7e83b6db3be
Fixed: RenderMan::parse_internal_links() problems with prepending Project: instead of Site_name: to project page alias-namespace links
Dan
parents:
142
diff
changeset
|
508 |
$url = makeUrl($pid_clean, false, true); |
f7e83b6db3be
Fixed: RenderMan::parse_internal_links() problems with prepending Project: instead of Site_name: to project page alias-namespace links
Dan
parents:
142
diff
changeset
|
509 |
$inner_text = ( isPage($pid_clean) ) ? htmlspecialchars(get_page_title($pid_clean)) : htmlspecialchars($matches[1][$i]); |
91 | 510 |
$quot = '"'; |
511 |
$exists = ( isPage($pid_clean) ) ? '' : ' class="wikilink-nonexistent"'; |
|
512 |
||
513 |
$link = "<a href={$quot}{$url}{$quot}{$exists}>{$inner_text}</a>"; |
|
514 |
||
515 |
$text = str_replace($match, $link, $text); |
|
516 |
} |
|
517 |
||
518 |
return $text; |
|
519 |
} |
|
520 |
||
1 | 521 |
/** |
522 |
* Parses a partial template tag in wikitext, and return an array with the parameters. |
|
63
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
523 |
* @param string The portion of the template tag that contains the parameters. |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
524 |
* @example |
1 | 525 |
* <code> |
63
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
526 |
foo = lorem ipsum |
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
527 |
bar = dolor sit amet |
1 | 528 |
* </code> |
529 |
* @return array Example: |
|
530 |
* [foo] => lorem ipsum |
|
531 |
* [bar] => dolor sit amet |
|
532 |
*/ |
|
533 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
534 |
public static function parse_template_vars($input) |
1 | 535 |
{ |
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
536 |
if ( !preg_match('/^(\|[ ]*([A-z0-9_]+)([ ]*)=([ ]*)(.+?))*$/is', trim($input)) ) |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
537 |
{ |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
538 |
$using_pipes = false; |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
539 |
$input = explode("\n", trim( $input )); |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
540 |
} |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
541 |
else |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
542 |
{ |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
543 |
$using_pipes = true; |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
544 |
$input = substr($input, 1); |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
545 |
$input = explode("|", trim( $input )); |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
546 |
} |
1 | 547 |
$parms = Array(); |
548 |
$current_line = ''; |
|
549 |
$current_parm = ''; |
|
550 |
foreach ( $input as $num => $line ) |
|
551 |
{ |
|
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
552 |
if ( preg_match('/^[ ]*([A-z0-9_]+)([ ]*)=([ ]*)(.+?)$/is', $line, $matches) ) |
1 | 553 |
{ |
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
554 |
$parm =& $matches[1]; |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
555 |
$text =& $matches[4]; |
1 | 556 |
if ( $parm == $current_parm ) |
557 |
{ |
|
558 |
$current_line .= $text; |
|
559 |
} |
|
560 |
else |
|
561 |
{ |
|
562 |
// New parameter |
|
563 |
if ( $current_parm != '' ) |
|
564 |
$parms[$current_parm] = $current_line; |
|
565 |
$current_line = $text; |
|
566 |
$current_parm = $parm; |
|
567 |
} |
|
568 |
} |
|
569 |
else if ( $num == 0 ) |
|
570 |
{ |
|
571 |
// Syntax error |
|
572 |
return false; |
|
573 |
} |
|
574 |
else |
|
575 |
{ |
|
576 |
$current_line .= "\n$line"; |
|
577 |
} |
|
578 |
} |
|
579 |
if ( !empty($current_parm) && !empty($current_line) ) |
|
580 |
{ |
|
581 |
$parms[$current_parm] = $current_line; |
|
582 |
} |
|
583 |
return $parms; |
|
584 |
} |
|
585 |
||
586 |
/** |
|
587 |
* Processes all template tags within a block of wikitext. |
|
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
588 |
* Updated in 1.0.2 to also parse template tags in the format of {{Foo |a = b |b = c |c = therefore, a}} |
1 | 589 |
* @param string The text to process |
590 |
* @return string Formatted text |
|
591 |
* @example |
|
592 |
* <code> |
|
593 |
$text = '{{Template |
|
594 |
parm1 = Foo |
|
595 |
parm2 = Bar |
|
596 |
}}'; |
|
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
597 |
$text = RenderMan::include_templates($text); |
1 | 598 |
* </code> |
599 |
*/ |
|
600 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
601 |
public static function include_templates($text) |
1 | 602 |
{ |
603 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
604 |
// $template_regex = "/\{\{([^\]]+?)((\n([ ]*?)[A-z0-9]+([ ]*?)=([ ]*?)(.+?))*)\}\}/is"; |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
605 |
$template_regex = "/\{\{(.+)(((\n|[ ]*\|)[ ]*([A-z0-9]+)[ ]*=[ ]*(.+))*)\}\}/isU"; |
1 | 606 |
if ( $count = preg_match_all($template_regex, $text, $matches) ) |
607 |
{ |
|
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
608 |
//die('<pre>' . print_r($matches, true) . '</pre>'); |
1 | 609 |
for ( $i = 0; $i < $count; $i++ ) |
610 |
{ |
|
63
2c57d3018a88
Fixed recursive template inclusion and spaces in template tags ({{Foo template}})
Dan
parents:
37
diff
changeset
|
611 |
$matches[1][$i] = sanitize_page_id($matches[1][$i]); |
1 | 612 |
$parmsection = trim($matches[2][$i]); |
613 |
if ( !empty($parmsection) ) |
|
614 |
{ |
|
615 |
$parms = RenderMan::parse_template_vars($parmsection); |
|
174
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
616 |
if ( !is_array($parms) ) |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
617 |
// Syntax error |
4c5c2b66a34d
SECURITY: remove debug message in session manager; implemented alternate MediaWiki syntax for template embedding; added Adobe Spry for "shake" effect on unsuccessful login
Dan
parents:
163
diff
changeset
|
618 |
$parms = array(); |
1 | 619 |
} |
620 |
else |
|
621 |
{ |
|
622 |
$parms = Array(); |
|
623 |
} |
|
624 |
if ( $tpl_code = RenderMan::fetch_template_text($matches[1][$i]) ) |
|
625 |
{ |
|
626 |
$parser = $template->makeParserText($tpl_code); |
|
627 |
$parser->assign_vars($parms); |
|
628 |
$text = str_replace($matches[0][$i], $parser->run(), $text); |
|
629 |
} |
|
630 |
} |
|
631 |
} |
|
632 |
return $text; |
|
633 |
} |
|
634 |
||
635 |
/** |
|
636 |
* Preprocesses an HTML text string prior to being sent to MySQL. |
|
637 |
* @param string $text |
|
638 |
* @param bool $strip_all_php - if true, strips all PHP regardless of user permissions. Else, strips PHP only if user level < USER_LEVEL_ADMIN. |
|
639 |
*/ |
|
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
640 |
public static function preprocess_text($text, $strip_all_php = true, $sqlescape = true) |
1 | 641 |
{ |
642 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
643 |
$random_id = md5( time() . mt_rand() ); |
|
644 |
||
407
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
645 |
$code = $plugins->setHook('render_sanitize_pre'); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
646 |
foreach ( $code as $cmd ) |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
647 |
{ |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
648 |
eval($cmd); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
649 |
} |
1 | 650 |
|
651 |
$can_do_php = ( $session->get_permissions('php_in_pages') && !$strip_all_php ); |
|
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
652 |
$can_do_html = $session->get_permissions('html_in_pages'); |
1 | 653 |
|
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
654 |
if ( $can_do_html && !$can_do_php ) |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
655 |
{ |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
656 |
$text = preg_replace('#<(\?|\?php|%)(.*?)(\?|%)>#is', '<\\1\\2\\3>', $text); |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
657 |
} |
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
658 |
else if ( !$can_do_html && !$can_do_php ) |
1 | 659 |
{ |
24 | 660 |
$text = sanitize_html($text, true); |
1 | 661 |
// If we can't do PHP, we can't do Javascript either. |
662 |
$text = RenderMan::destroy_javascript($text); |
|
663 |
} |
|
664 |
||
665 |
// Strip out <nowiki> sections and PHP code |
|
666 |
||
667 |
$php = preg_match_all('#(<|<)\?php(.*?)\?(>|>)#is', $text, $phpsec); |
|
668 |
||
669 |
//die('<pre>'.htmlspecialchars(print_r($phpsec, true))."\n".htmlspecialchars(print_r($text, true)).'</pre>'); |
|
670 |
||
671 |
for($i=0;$i<sizeof($phpsec[1]);$i++) |
|
672 |
{ |
|
673 |
$text = str_replace($phpsec[0][$i], '{PHP:'.$random_id.':'.$i.'}', $text); |
|
674 |
} |
|
675 |
||
676 |
$nw = preg_match_all('#<nowiki>(.*?)<\/nowiki>#is', $text, $nowiki); |
|
677 |
||
678 |
for($i=0;$i<sizeof($nowiki[1]);$i++) |
|
679 |
{ |
|
680 |
$text = str_replace('<nowiki>'.$nowiki[1][$i].'</nowiki>', '{NOWIKI:'.$random_id.':'.$i.'}', $text); |
|
681 |
} |
|
682 |
||
345
4ccdfeee9a11
WiP commit for admin panel localization. All modules up to Admin:UserManager (working down the list) are localized except Admin:ThemeManager, which is due for a rewrite
Dan
parents:
335
diff
changeset
|
683 |
$text = str_replace('~~~~~', enano_date('G:i, j F Y (T)'), $text); |
4ccdfeee9a11
WiP commit for admin panel localization. All modules up to Admin:UserManager (working down the list) are localized except Admin:ThemeManager, which is due for a rewrite
Dan
parents:
335
diff
changeset
|
684 |
$text = str_replace('~~~~', "[[User:$session->username|$session->username]] ".enano_date('G:i, j F Y (T)'), $text); |
1 | 685 |
$text = str_replace('~~~', "[[User:$session->username|$session->username]] ", $text); |
686 |
||
407
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
687 |
$code = $plugins->setHook('render_sanitize_post'); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
688 |
foreach ( $code as $cmd ) |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
689 |
{ |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
690 |
eval($cmd); |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
691 |
} |
35d94240a197
Mass-fixed all AJAX functions to also check the HTTP status code before parsing the response
Dan
parents:
391
diff
changeset
|
692 |
|
1 | 693 |
// Reinsert <nowiki> sections |
694 |
for($i=0;$i<$nw;$i++) |
|
695 |
{ |
|
696 |
$text = str_replace('{NOWIKI:'.$random_id.':'.$i.'}', '<nowiki>'.$nowiki[1][$i].'</nowiki>', $text); |
|
697 |
} |
|
698 |
// Reinsert PHP |
|
699 |
for($i=0;$i<$php;$i++) |
|
700 |
{ |
|
701 |
$phsec = ''.$phpsec[1][$i].'?php'.$phpsec[2][$i].'?'.$phpsec[3][$i].''; |
|
702 |
if ( $strip_all_php ) |
|
703 |
$phsec = htmlspecialchars($phsec); |
|
704 |
$text = str_replace('{PHP:'.$random_id.':'.$i.'}', $phsec, $text); |
|
705 |
} |
|
706 |
||
707 |
$text = ( $sqlescape ) ? $db->escape($text) : $text; |
|
708 |
||
709 |
return $text; |
|
710 |
} |
|
711 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
712 |
public static function smilieyize($text, $complete_urls = false) |
1 | 713 |
{ |
714 |
||
715 |
$random_id = md5( time() . mt_rand() ); |
|
716 |
||
717 |
// Smileys array - eventually this will be fetched from the database by |
|
718 |
// RenderMan::initSmileys during initialization, but it will all be hardcoded for beta 2 |
|
719 |
||
720 |
$smileys = Array( |
|
721 |
'O:-)' => 'face-angel.png', |
|
722 |
'O:)' => 'face-angel.png', |
|
723 |
'O=)' => 'face-angel.png', |
|
724 |
':-)' => 'face-smile.png', |
|
725 |
':)' => 'face-smile.png', |
|
726 |
'=)' => 'face-smile-big.png', |
|
727 |
':-(' => 'face-sad.png', |
|
728 |
':(' => 'face-sad.png', |
|
729 |
';(' => 'face-sad.png', |
|
730 |
':-O' => 'face-surprise.png', |
|
731 |
';-)' => 'face-wink.png', |
|
732 |
';)' => 'face-wink.png', |
|
733 |
'8-)' => 'face-glasses.png', |
|
734 |
'8)' => 'face-glasses.png', |
|
735 |
':-D' => 'face-grin.png', |
|
736 |
':D' => 'face-grin.png', |
|
737 |
'=D' => 'face-grin.png', |
|
738 |
':-*' => 'face-kiss.png', |
|
739 |
':*' => 'face-kiss.png', |
|
740 |
'=*' => 'face-kiss.png', |
|
741 |
':\'(' => 'face-crying.png', |
|
742 |
':-|' => 'face-plain.png', |
|
743 |
':-\\' => 'face-plain.png', |
|
744 |
':-/' => 'face-plain.png', |
|
745 |
':joke:' => 'face-plain.png', |
|
746 |
']:->' => 'face-devil-grin.png', |
|
189
fd0e9c7a7b28
Automatic set of state on Oxygen sidebar portlets should work now; reimplemented parts of the template parser (again) to workaround some PHP/PCRE issues and add support for parser plugins
Dan
parents:
174
diff
changeset
|
747 |
']:->' => 'face-devil-grin.png', |
1 | 748 |
':kiss:' => 'face-kiss.png', |
749 |
':-P' => 'face-tongue-out.png', |
|
750 |
':P' => 'face-tongue-out.png', |
|
751 |
':-p' => 'face-tongue-out.png', |
|
752 |
':p' => 'face-tongue-out.png', |
|
753 |
':-X' => 'face-sick.png', |
|
754 |
':X' => 'face-sick.png', |
|
755 |
':sick:' => 'face-sick.png', |
|
756 |
':-]' => 'face-oops.png', |
|
757 |
':]' => 'face-oops.png', |
|
758 |
':oops:' => 'face-oops.png', |
|
759 |
':-[' => 'face-embarassed.png', |
|
760 |
':[' => 'face-embarassed.png' |
|
761 |
); |
|
762 |
/* |
|
763 |
$keys = array_keys($smileys); |
|
764 |
foreach($keys as $k) |
|
765 |
{ |
|
766 |
$regex1 = '#([\W]+)'.preg_quote($k).'([\s\n\r\.]+)#s'; |
|
767 |
$regex2 = '\\1<img alt="'.$k.'" title="'.$k.'" src="'.scriptPath.'/images/smilies/'.$smileys[$k].'" style="border: 0;" />\\2'; |
|
768 |
$text = preg_replace($regex1, $regex2, $text); |
|
769 |
} |
|
770 |
*/ |
|
771 |
||
772 |
// Strip out <nowiki> sections |
|
773 |
//return '<pre>'.htmlspecialchars($text).'</pre>'; |
|
774 |
$nw = preg_match_all('#<nowiki>(.*?)<\/nowiki>#is', $text, $nowiki); |
|
775 |
||
776 |
for($i=0;$i<sizeof($nowiki[1]);$i++) |
|
777 |
{ |
|
778 |
$text = str_replace('<nowiki>'.$nowiki[1][$i].'</nowiki>', '{NOWIKI:'.$random_id.':'.$i.'}', $text); |
|
779 |
} |
|
780 |
||
781 |
$keys = array_keys($smileys); |
|
782 |
foreach($keys as $k) |
|
783 |
{ |
|
391
85f91037cd4f
Localization is FINISHED, DAMN IT HELLAH YEAH! OVER WITH! Man, it feels to get that off my chest. Release is in under 48 hours, folks. And we're ready for it.
Dan
parents:
387
diff
changeset
|
784 |
$t = hexencode($k, ' ', ''); |
85f91037cd4f
Localization is FINISHED, DAMN IT HELLAH YEAH! OVER WITH! Man, it feels to get that off my chest. Release is in under 48 hours, folks. And we're ready for it.
Dan
parents:
387
diff
changeset
|
785 |
$t = trim($t); |
1 | 786 |
$t = explode(' ', $t); |
787 |
$s = ''; |
|
788 |
foreach($t as $b) |
|
789 |
{ |
|
790 |
$s.='&#x'.$b.';'; |
|
791 |
} |
|
792 |
$pfx = ( $complete_urls ) ? 'http' . ( isset($_SERVER['HTTPS']) ? 's' : '' ) . '://'.$_SERVER['HTTP_HOST'] : ''; |
|
793 |
$text = str_replace(' '.$k, ' <nowiki><img title="'.$s.'" alt="'.$s.'" src="'.$pfx.scriptPath.'/images/smilies/'.$smileys[$k].'" style="border: 0;" /></nowiki>', $text); |
|
794 |
} |
|
795 |
//*/ |
|
796 |
||
797 |
// Reinsert <nowiki> sections |
|
798 |
for($i=0;$i<$nw;$i++) |
|
799 |
{ |
|
800 |
$text = str_replace('{NOWIKI:'.$random_id.':'.$i.'}', '<nowiki>'.$nowiki[1][$i].'</nowiki>', $text); |
|
801 |
} |
|
802 |
||
803 |
return $text; |
|
804 |
} |
|
805 |
||
806 |
/* |
|
807 |
* **** DEPRECATED **** |
|
808 |
* Replaces some critical characters in a string with MySQL-safe equivalents |
|
809 |
* @param $text string the text to escape |
|
810 |
* @return array key 0 is the escaped text, key 1 is the character tag |
|
811 |
* / |
|
812 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
813 |
public static function escape_page_text($text) |
1 | 814 |
{ |
815 |
$char_tag = md5(microtime() . mt_rand()); |
|
816 |
$text = str_replace("'", "{APOS:$char_tag}", $text); |
|
817 |
$text = str_replace('"', "{QUOT:$char_tag}", $text); |
|
818 |
$text = str_replace("\\", "{SLASH:$char_tag}", $text); |
|
819 |
return Array($text, $char_tag); |
|
820 |
} |
|
821 |
*/ |
|
822 |
||
823 |
/* **** DEPRECATED **** |
|
824 |
* Reverses the result of RenderMan::escape_page_text(). |
|
825 |
* @param $text string the text to unescape |
|
826 |
* @param $char_tag string the character tag |
|
827 |
* @return string |
|
828 |
* / |
|
829 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
830 |
public static function unescape_page_text($text, $char_tag) |
1 | 831 |
{ |
832 |
$text = str_replace("{APOS:$char_tag}", "'", $text); |
|
833 |
$text = str_replace("{QUOT:$char_tag}", '"', $text); |
|
834 |
$text = str_replace("{SLASH:$char_tag}", "\\", $text); |
|
835 |
return $text; |
|
836 |
} |
|
837 |
*/ |
|
838 |
||
839 |
/** |
|
840 |
* Generates a summary of the differences between two texts, and formats it as XHTML. |
|
841 |
* @param $str1 string the first block of text |
|
842 |
* @param $str2 string the second block of text |
|
843 |
* @return string |
|
844 |
*/ |
|
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
845 |
public static function diff($str1, $str2) |
1 | 846 |
{ |
847 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
848 |
$str1 = explode("\n", $str1); |
|
849 |
$str2 = explode("\n", $str2); |
|
850 |
$diff = new Diff($str1, $str2); |
|
851 |
$renderer = new TableDiffFormatter(); |
|
852 |
return '<table class="diff">'.$renderer->format($diff).'</table>'; |
|
853 |
} |
|
854 |
||
35 | 855 |
/** |
856 |
* Changes wikitext image tags to HTML. |
|
857 |
* @param string The wikitext to process |
|
37 | 858 |
* @param array Will be overwritten with the list of HTML tags (the system uses tokens for TextWiki compatibility) |
35 | 859 |
* @return string |
860 |
*/ |
|
861 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
862 |
public static function process_image_tags($text, &$taglist) |
35 | 863 |
{ |
864 |
global $db, $session, $paths, $template, $plugins; // Common objects |
|
865 |
||
37 | 866 |
$s_delim = "\xFF"; |
867 |
$f_delim = "\xFF"; |
|
868 |
$taglist = array(); |
|
869 |
||
35 | 870 |
// Wicked huh? |
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
parents:
371
diff
changeset
|
871 |
$regex = '/\[\[:' . str_replace('/', '\\/', preg_quote($paths->nslist['File'])) . '([\w\s0-9_\(\)!@%\^\+\|\.-]+?)((\|thumb)|(\|([0-9]+)x([0-9]+)))?(\|left|\|right)?(\|raw|\|(.+))?\]\]/i'; |
35 | 872 |
|
873 |
preg_match_all($regex, $text, $matches); |
|
874 |
||
875 |
foreach ( $matches[0] as $i => $match ) |
|
876 |
{ |
|
877 |
||
878 |
$full_tag =& $matches[0][$i]; |
|
879 |
$filename =& $matches[1][$i]; |
|
880 |
$scale_type =& $matches[2][$i]; |
|
881 |
$width =& $matches[5][$i]; |
|
882 |
$height =& $matches[6][$i]; |
|
883 |
$clear =& $matches[7][$i]; |
|
884 |
$caption =& $matches[8][$i]; |
|
885 |
||
886 |
if ( !isPage( $paths->nslist['File'] . $filename ) ) |
|
887 |
{ |
|
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
888 |
$text = str_replace($full_tag, '[[' . makeUrlNS('File', $filename) . ']]', $text); |
35 | 889 |
continue; |
890 |
} |
|
891 |
||
892 |
if ( $scale_type == '|thumb' ) |
|
893 |
{ |
|
894 |
$r_width = 225; |
|
895 |
$r_height = 225; |
|
896 |
||
897 |
$url = makeUrlNS('Special', 'DownloadFile/' . $filename, 'preview&width=' . $r_width . '&height=' . $r_height, true); |
|
898 |
} |
|
899 |
else if ( !empty($width) && !empty($height) ) |
|
900 |
{ |
|
901 |
$r_width = $width; |
|
902 |
$r_height = $height; |
|
903 |
||
904 |
$url = makeUrlNS('Special', 'DownloadFile/' . $filename, 'preview&width=' . $r_width . '&height=' . $r_height, true); |
|
905 |
} |
|
906 |
else |
|
907 |
{ |
|
908 |
$url = makeUrlNS('Special', 'DownloadFile/' . $filename); |
|
909 |
} |
|
910 |
||
911 |
$img_tag = '<img src="' . $url . '" '; |
|
912 |
||
65 | 913 |
// if ( isset($r_width) && isset($r_height) && $scale_type != '|thumb' ) |
914 |
// { |
|
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
915 |
// $img_tag .= 'width="' . $r_width . '" height="' . $r_height . '" '; |
65 | 916 |
// } |
35 | 917 |
|
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
918 |
$img_tag .= 'style="border-width: 0px; /* background-color: white; */" '; |
35 | 919 |
|
85
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
920 |
$code = $plugins->setHook('img_tag_parse_img'); |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
921 |
foreach ( $code as $cmd ) |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
922 |
{ |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
923 |
eval($cmd); |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
924 |
} |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
925 |
|
35 | 926 |
$img_tag .= '/>'; |
927 |
||
928 |
$complete_tag = ''; |
|
929 |
||
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
930 |
if ( !empty($scale_type) && $caption != '|raw' ) |
35 | 931 |
{ |
932 |
$complete_tag .= '<div class="thumbnail" '; |
|
933 |
$clear_text = ''; |
|
934 |
if ( !empty($clear) ) |
|
935 |
{ |
|
936 |
$side = ( $clear == '|left' ) ? 'left' : 'right'; |
|
937 |
$opposite = ( $clear == '|left' ) ? 'right' : 'left'; |
|
320
112debff64bd
SURPRISE! Preliminary PostgreSQL support added. The required schema file is not present in this commit and will be included at a later date. No installer support is implemented. Also in this commit: several fixes including <!-- SYSMSG ... --> was broken in template compiler; set fixed width on included images to prevent the thumbnail box from getting huge; added a much more friendly interface to AJAX responses that are invalid JSON
Dan
parents:
317
diff
changeset
|
938 |
$clear_text .= "float: $side; margin-$opposite: 20px; width: {$r_width}px;"; |
35 | 939 |
$complete_tag .= 'style="' . $clear_text . '" '; |
940 |
} |
|
941 |
$complete_tag .= '>'; |
|
942 |
||
943 |
$complete_tag .= '<a href="' . makeUrlNS('File', $filename) . '" style="display: block;">'; |
|
944 |
$complete_tag .= $img_tag; |
|
945 |
$complete_tag .= '</a>'; |
|
946 |
||
947 |
$mag_button = '<a href="' . makeUrlNS('File', $filename) . '" style="display: block; float: right; clear: right; margin: 0 0 10px 10px;"><img alt="[ + ]" src="' . scriptPath . '/images/thumbnail.png" style="border-width: 0px;" /></a>'; |
|
948 |
||
949 |
if ( !empty($caption) ) |
|
950 |
{ |
|
951 |
$cap = substr($caption, 1); |
|
952 |
$complete_tag .= $mag_button . $cap; |
|
953 |
} |
|
954 |
||
955 |
$complete_tag .= '</div>'; |
|
956 |
} |
|
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
957 |
else if ( $caption == '|raw' ) |
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
958 |
{ |
67 | 959 |
$complete_tag .= "$img_tag"; |
960 |
$taglist[$i] = $complete_tag; |
|
961 |
||
962 |
$repl = "{$s_delim}e_img_{$i}{$f_delim}"; |
|
963 |
$text = str_replace($full_tag, $repl, $text); |
|
964 |
continue; |
|
66
52017732bc20
Added "raw" option to embedded images to make complex clickables easier
Dan
parents:
65
diff
changeset
|
965 |
} |
35 | 966 |
else |
967 |
{ |
|
85
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
968 |
$complete_tag .= '<a href="' . makeUrlNS('File', $filename) . '" style="display: block;"'; |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
969 |
$code = $plugins->setHook('img_tag_parse_link'); |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
970 |
foreach ( $code as $cmd ) |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
971 |
{ |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
972 |
eval($cmd); |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
973 |
} |
7c68a18a27be
AJAX comments are now paginated; plugin manager can now show system plugins; typo in installer corrected; links in oxygen/stpatty/admin footers changed to "About Enano" page; 1.0.1 release candidate
Dan
parents:
73
diff
changeset
|
974 |
$complete_tag .= '>'; |
35 | 975 |
$complete_tag .= $img_tag; |
976 |
$complete_tag .= '</a>'; |
|
977 |
} |
|
978 |
||
37 | 979 |
$complete_tag .= "\n\n"; |
980 |
$taglist[$i] = $complete_tag; |
|
35 | 981 |
|
37 | 982 |
$pos = strpos($text, $full_tag); |
35 | 983 |
|
984 |
while(true) |
|
985 |
{ |
|
986 |
$check1 = substr($text, $pos, 3); |
|
987 |
$check2 = substr($text, $pos, 1); |
|
988 |
if ( $check1 == '<p>' || $pos == 0 || $check2 == "\n" ) |
|
989 |
{ |
|
990 |
// die('found at pos '.$pos); |
|
991 |
break; |
|
992 |
} |
|
993 |
$pos--; |
|
994 |
} |
|
995 |
||
37 | 996 |
$repl = "{$s_delim}e_img_{$i}{$f_delim}"; |
997 |
$text = substr($text, 0, $pos) . $repl . substr($text, $pos); |
|
35 | 998 |
|
999 |
$text = str_replace($full_tag, '', $text); |
|
1000 |
||
1001 |
unset($full_tag, $filename, $scale_type, $width, $height, $clear, $caption, $r_width, $r_height); |
|
1002 |
||
1003 |
} |
|
1004 |
||
1005 |
return $text; |
|
1006 |
} |
|
1007 |
||
37 | 1008 |
/** |
1009 |
* Finalizes processing of image tags. |
|
1010 |
* @param string The preprocessed text |
|
1011 |
* @param array The list of image tags created by RenderMan::process_image_tags() |
|
1012 |
*/ |
|
1013 |
||
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
parents:
345
diff
changeset
|
1014 |
public static function process_imgtags_stage2($text, $taglist) |
37 | 1015 |
{ |
1016 |
$s_delim = "\xFF"; |
|
1017 |
$f_delim = "\xFF"; |
|
1018 |
foreach ( $taglist as $i => $tag ) |
|
1019 |
{ |
|
1020 |
$repl = "{$s_delim}e_img_{$i}{$f_delim}"; |
|
1021 |
$text = str_replace($repl, $tag, $text); |
|
1022 |
} |
|
1023 |
return $text; |
|
1024 |
} |
|
1025 |
||
1 | 1026 |
} |
1027 |
||
1028 |
?> |