1
+ − 1
<?php
+ − 2
+ − 3
/*
+ − 4
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
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
diff
changeset
+ − 5
* Version 1.0.1 (Loch Ness)
1
+ − 6
* Copyright (C) 2006-2007 Dan Fuhry
+ − 7
*
+ − 8
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
+ − 9
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+ − 10
*
+ − 11
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ − 12
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ − 13
*/
22
+ − 14
+ − 15
/**
+ − 16
* Fetch a value from the site configuration.
+ − 17
* @param string The identifier of the value ("site_name" etc.)
+ − 18
* @return string Configuration value, or bool(false) if the value is not set
+ − 19
*/
+ − 20
+ − 21
function getConfig($n)
+ − 22
{
1
+ − 23
global $enano_config;
22
+ − 24
if ( isset( $enano_config[ $n ] ) )
+ − 25
{
+ − 26
return $enano_config[$n];
+ − 27
}
+ − 28
else
+ − 29
{
+ − 30
return false;
+ − 31
}
1
+ − 32
}
+ − 33
22
+ − 34
/**
+ − 35
* Update or change a configuration value.
+ − 36
* @param string The identifier of the value ("site_name" etc.)
+ − 37
* @param string The new value
+ − 38
* @return null
+ − 39
*/
+ − 40
+ − 41
function setConfig($n, $v)
+ − 42
{
76
+ − 43
1
+ − 44
global $enano_config, $db;
+ − 45
$enano_config[$n] = $v;
+ − 46
$v = $db->escape($v);
76
+ − 47
22
+ − 48
$e = $db->sql_query('DELETE FROM '.table_prefix.'config WHERE config_name=\''.$n.'\';');
+ − 49
if ( !$e )
+ − 50
{
+ − 51
$db->_die('Error during generic setConfig() call row deletion.');
+ − 52
}
76
+ − 53
22
+ − 54
$e = $db->sql_query('INSERT INTO '.table_prefix.'config(config_name, config_value) VALUES(\''.$n.'\', \''.$v.'\')');
+ − 55
if ( !$e )
+ − 56
{
+ − 57
$db->_die('Error during generic setConfig() call row insertion.');
+ − 58
}
1
+ − 59
}
+ − 60
22
+ − 61
/**
+ − 62
* Create a URI for an internal link.
+ − 63
* @param string The full identifier of the page to link to (Special:Administration)
+ − 64
* @param string The GET query string to append
+ − 65
* @param bool If true, perform htmlspecialchars() on the return value to make it HTML-safe
+ − 66
* @return string
+ − 67
*/
+ − 68
1
+ − 69
function makeUrl($t, $query = false, $escape = false)
+ − 70
{
+ − 71
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 72
$flags = '';
+ − 73
$sep = urlSeparator;
91
+ − 74
$t = sanitize_page_id($t);
22
+ − 75
if ( isset($_GET['printable'] ) )
+ − 76
{
+ − 77
$flags .= $sep . 'printable=yes';
+ − 78
$sep = '&';
+ − 79
}
+ − 80
if ( isset($_GET['theme'] ) )
+ − 81
{
+ − 82
$flags .= $sep . 'theme='.$session->theme;
+ − 83
$sep = '&';
+ − 84
}
+ − 85
if ( isset($_GET['style'] ) ) {
76
+ − 86
$flags .= $sep . 'style='.$session->style;
22
+ − 87
$sep = '&';
+ − 88
}
76
+ − 89
1
+ − 90
$url = $session->append_sid(contentPath.$t.$flags);
+ − 91
if($query)
+ − 92
{
+ − 93
$sep = strstr($url, '?') ? '&' : '?';
+ − 94
$url = $url . $sep . $query;
+ − 95
}
76
+ − 96
1
+ − 97
return ($escape) ? htmlspecialchars($url) : $url;
+ − 98
}
+ − 99
22
+ − 100
/**
+ − 101
* Create a URI for an internal link, and be namespace-friendly. Watch out for this one because it's different from most other Enano functions, in that the namespace is the first parameter.
+ − 102
* @param string The namespace ID
+ − 103
* @param string The page ID
+ − 104
* @param string The GET query string to append
+ − 105
* @param bool If true, perform htmlspecialchars() on the return value to make it HTML-safe
+ − 106
* @return string
+ − 107
*/
+ − 108
1
+ − 109
function makeUrlNS($n, $t, $query = false, $escape = false)
+ − 110
{
+ − 111
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 112
$flags = '';
76
+ − 113
1
+ − 114
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 115
{
22
+ − 116
$sep = urlSeparator;
1
+ − 117
}
+ − 118
else
+ − 119
{
22
+ − 120
$sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?';
+ − 121
}
+ − 122
if ( isset( $_GET['printable'] ) ) {
+ − 123
$flags .= $sep . 'printable';
+ − 124
$sep = '&';
+ − 125
}
76
+ − 126
if ( isset( $_GET['theme'] ) )
22
+ − 127
{
+ − 128
$flags .= $sep . 'theme='.$session->theme;
+ − 129
$sep = '&';
+ − 130
}
+ − 131
if ( isset( $_GET['style'] ) )
+ − 132
{
+ − 133
$flags .= $sep . 'style='.$session->style;
+ − 134
$sep = '&';
+ − 135
}
76
+ − 136
22
+ − 137
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 138
{
+ − 139
$url = contentPath . $paths->nslist[$n] . $t . $flags;
+ − 140
}
+ − 141
else
+ − 142
{
+ − 143
// If the path manager hasn't been initted yet, take an educated guess at what the URI should be
+ − 144
$url = contentPath . $n . ':' . $t . $flags;
1
+ − 145
}
76
+ − 146
1
+ − 147
if($query)
+ − 148
{
76
+ − 149
if(strstr($url, '?'))
22
+ − 150
{
+ − 151
$sep = '&';
+ − 152
}
+ − 153
else
+ − 154
{
+ − 155
$sep = '?';
+ − 156
}
1
+ − 157
$url = $url . $sep . $query . $flags;
+ − 158
}
76
+ − 159
1
+ − 160
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 161
{
+ − 162
$url = $session->append_sid($url);
+ − 163
}
76
+ − 164
1
+ − 165
return ($escape) ? htmlspecialchars($url) : $url;
+ − 166
}
+ − 167
22
+ − 168
/**
+ − 169
* Create a URI for an internal link, be namespace-friendly, and add http://hostname/scriptpath to the beginning if possible. Watch out for this one because it's different from most other Enano functions, in that the namespace is the first parameter.
+ − 170
* @param string The namespace ID
+ − 171
* @param string The page ID
+ − 172
* @param string The GET query string to append
+ − 173
* @param bool If true, perform htmlspecialchars() on the return value to make it HTML-safe
+ − 174
* @return string
+ − 175
*/
+ − 176
1
+ − 177
function makeUrlComplete($n, $t, $query = false, $escape = false)
+ − 178
{
+ − 179
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 180
$flags = '';
76
+ − 181
22
+ − 182
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 183
{
+ − 184
$sep = urlSeparator;
+ − 185
}
+ − 186
else
+ − 187
{
+ − 188
$sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?';
+ − 189
}
+ − 190
if ( isset( $_GET['printable'] ) ) {
+ − 191
$flags .= $sep . 'printable';
+ − 192
$sep = '&';
+ − 193
}
76
+ − 194
if ( isset( $_GET['theme'] ) )
22
+ − 195
{
+ − 196
$flags .= $sep . 'theme='.$session->theme;
+ − 197
$sep = '&';
+ − 198
}
+ − 199
if ( isset( $_GET['style'] ) )
+ − 200
{
+ − 201
$flags .= $sep . 'style='.$session->style;
+ − 202
$sep = '&';
+ − 203
}
76
+ − 204
22
+ − 205
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 206
{
+ − 207
$url = $session->append_sid(contentPath . $paths->nslist[$n] . $t . $flags);
+ − 208
}
+ − 209
else
+ − 210
{
+ − 211
// If the path manager hasn't been initted yet, take an educated guess at what the URI should be
+ − 212
$url = contentPath . $n . ':' . $t . $flags;
+ − 213
}
1
+ − 214
if($query)
+ − 215
{
+ − 216
if(strstr($url, '?')) $sep = '&';
+ − 217
else $sep = '?';
+ − 218
$url = $url . $sep . $query . $flags;
+ − 219
}
76
+ − 220
1
+ − 221
$baseprot = 'http' . ( isset($_SERVER['HTTPS']) ? 's' : '' ) . '://' . $_SERVER['HTTP_HOST'];
+ − 222
$url = $baseprot . $url;
76
+ − 223
1
+ − 224
return ($escape) ? htmlspecialchars($url) : $url;
+ − 225
}
+ − 226
+ − 227
/**
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 228
* Tells you the title for the given page ID string
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 229
* @param string Page ID string (ex: Special:Administration)
91
+ − 230
* @param bool Optional. If true, and if the namespace turns out to be something other than Article, the namespace prefix will be prepended to the return value.
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 231
* @return string
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 232
*/
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 233
91
+ − 234
function get_page_title($page_id, $show_ns = true)
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 235
{
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 236
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 237
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 238
$idata = RenderMan::strToPageID($page_id);
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 239
$page_id_key = $paths->nslist[ $idata[1] ] . $idata[0];
91
+ − 240
$page_id_key = sanitize_page_id($page_id_key);
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 241
$page_data = $paths->pages[$page_id_key];
91
+ − 242
$title = ( isset($page_data['name']) ) ?
+ − 243
( ( $page_data['namespace'] == 'Article' || !$show_ns ) ?
+ − 244
'' :
+ − 245
$paths->nslist[ $idata[1] ] )
+ − 246
. $page_data['name'] :
+ − 247
( $show_ns ? $paths->nslist[$idata[1]] : '' ) . str_replace('_', ' ', dirtify_page_id( $idata[0] ) );
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 248
return $title;
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 249
}
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 250
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 251
/**
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 252
* Tells you the title for the given page ID and namespace
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 253
* @param string Page ID
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 254
* @param string Namespace
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 255
* @return string
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 256
*/
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 257
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 258
function get_page_title_ns($page_id, $namespace)
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 259
{
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 260
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 261
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 262
$page_id_key = $paths->nslist[ $namespace ] . $page_id;
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 263
$page_data = $paths->pages[$page_id_key];
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 264
$title = ( isset($page_data['name']) ) ? $page_data['name'] : $paths->nslist[$namespace] . str_replace('_', ' ', dirtify_page_id( $page_id ) );
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 265
return $title;
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 266
}
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 267
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 268
/**
1
+ − 269
* Redirect the user to the specified URL.
+ − 270
* @param string $url The URL, either relative or absolute.
+ − 271
* @param string $title The title of the message
+ − 272
* @param string $message A short message to show to the user
+ − 273
* @param string $timeout Timeout, in seconds, to delay the redirect. Defaults to 3.
+ − 274
*/
76
+ − 275
1
+ − 276
function redirect($url, $title = 'Redirecting...', $message = 'Please wait while you are redirected.', $timeout = 3)
+ − 277
{
+ − 278
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 279
1
+ − 280
if ( $timeout == 0 )
+ − 281
{
+ − 282
header('Location: ' . $url);
+ − 283
header('HTTP/1.1 307 Temporary Redirect');
+ − 284
}
76
+ − 285
1
+ − 286
$template->add_header('<meta http-equiv="refresh" content="' . $timeout . '; url=' . str_replace('"', '\\"', $url) . '" />');
+ − 287
$template->add_header('<script type="text/javascript">
+ − 288
function __r() {
+ − 289
// FUNCTION AUTOMATICALLY GENERATED
+ − 290
window.location="' . str_replace('"', '\\"', $url) . '";
+ − 291
}
+ − 292
setTimeout(\'__r();\', ' . $timeout . '000);
+ − 293
</script>
+ − 294
');
76
+ − 295
1
+ − 296
$template->tpl_strings['PAGE_NAME'] = $title;
+ − 297
$template->header(true);
+ − 298
echo '<p>' . $message . '</p><p>If you are not redirected within ' . ( $timeout + 1 ) . ' seconds, <a href="' . str_replace('"', '\\"', $url) . '">please click here</a>.</p>';
+ − 299
$template->footer(true);
76
+ − 300
1
+ − 301
$db->close();
+ − 302
exit(0);
76
+ − 303
1
+ − 304
}
+ − 305
+ − 306
// Removed wikiFormat() from here, replaced with RenderMan::render
+ − 307
22
+ − 308
/**
+ − 309
* Tell me if the page exists or not.
+ − 310
* @param string the full page ID (Special:Administration) of the page to check for
+ − 311
* @return bool True if the page exists, false otherwise
+ − 312
*/
+ − 313
1
+ − 314
function isPage($p) {
+ − 315
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 316
22
+ − 317
// Try the easy way first ;-)
+ − 318
if ( isset( $paths->pages[ $p ] ) )
+ − 319
{
+ − 320
return true;
+ − 321
}
76
+ − 322
22
+ − 323
// Special case for Special, Template, and Admin pages that can't have slashes in their URIs
+ − 324
$ns_test = RenderMan::strToPageID( $p );
76
+ − 325
22
+ − 326
if($ns_test[1] != 'Special' && $ns_test[1] != 'Template' && $ns_test[1] != 'Admin')
+ − 327
{
+ − 328
return false;
+ − 329
}
76
+ − 330
22
+ − 331
$particles = explode('/', $p);
+ − 332
if ( isset ( $paths->pages[ $particles[ 0 ] ] ) )
+ − 333
{
+ − 334
return true;
+ − 335
}
+ − 336
else
+ − 337
{
+ − 338
return false;
+ − 339
}
1
+ − 340
}
+ − 341
76
+ − 342
/**
+ − 343
* These are some old functions that were used with the Midget codebase. They are deprecated and should not be used any more.
+ − 344
*/
+ − 345
1
+ − 346
function arrayItemUp($arr, $keyname) {
+ − 347
$keylist = array_keys($arr);
+ − 348
$keyflop = array_flip($keylist);
+ − 349
$idx = $keyflop[$keyname];
+ − 350
$idxm = $idx - 1;
+ − 351
$temp = $arr[$keylist[$idxm]];
+ − 352
if($arr[$keylist[0]] == $arr[$keyname]) return $arr;
+ − 353
$arr[$keylist[$idxm]] = $arr[$keylist[$idx]];
+ − 354
$arr[$keylist[$idx]] = $temp;
+ − 355
return $arr;
+ − 356
}
+ − 357
+ − 358
function arrayItemDown($arr, $keyname) {
+ − 359
$keylist = array_keys($arr);
+ − 360
$keyflop = array_flip($keylist);
+ − 361
$idx = $keyflop[$keyname];
+ − 362
$idxm = $idx + 1;
+ − 363
$temp = $arr[$keylist[$idxm]];
+ − 364
$sz = sizeof($arr); $sz--;
+ − 365
if($arr[$keylist[$sz]] == $arr[$keyname]) return $arr;
+ − 366
$arr[$keylist[$idxm]] = $arr[$keylist[$idx]];
+ − 367
$arr[$keylist[$idx]] = $temp;
+ − 368
return $arr;
+ − 369
}
+ − 370
+ − 371
function arrayItemTop($arr, $keyname) {
+ − 372
$keylist = array_keys($arr);
+ − 373
$keyflop = array_flip($keylist);
+ − 374
$idx = $keyflop[$keyname];
+ − 375
while( $orig != $arr[$keylist[0]] ) {
+ − 376
// echo 'Keyname: '.$keylist[$idx] . '<br />'; flush(); ob_flush(); // Debugger
+ − 377
if($idx < 0) return $arr;
+ − 378
if($keylist[$idx] == '' || $keylist[$idx] < 0 || !$keylist[$idx]) {
+ − 379
/* echo 'Infinite loop caught in arrayItemTop(<br /><pre>';
+ − 380
print_r($arr);
+ − 381
echo '</pre><br />, '.$keyname.');<br /><br />EnanoCMS: Critical error during function call, exiting to prevent excessive server load.';
+ − 382
exit; */
+ − 383
return $arr;
+ − 384
}
+ − 385
$arr = arrayItemUp($arr, $keylist[$idx]);
+ − 386
$idx--;
+ − 387
}
+ − 388
return $arr;
+ − 389
}
+ − 390
+ − 391
function arrayItemBottom($arr, $keyname) {
+ − 392
$keylist = array_keys($arr);
+ − 393
$keyflop = array_flip($keylist);
+ − 394
$idx = $keyflop[$keyname];
+ − 395
$sz = sizeof($arr); $sz--;
+ − 396
while( $orig != $arr[$keylist[$sz]] ) {
+ − 397
// echo 'Keyname: '.$keylist[$idx] . '<br />'; flush(); ob_flush(); // Debugger
+ − 398
if($idx > $sz) return $arr;
+ − 399
if($keylist[$idx] == '' || $keylist[$idx] < 0 || !$keylist[$idx]) {
+ − 400
echo 'Infinite loop caught in arrayItemBottom(<br /><pre>';
+ − 401
print_r($arr);
+ − 402
echo '</pre><br />, '.$keyname.');<br /><br />EnanoCMS: Critical error during function call, exiting to prevent excessive server load.';
+ − 403
exit;
+ − 404
}
+ − 405
$arr = arrayItemDown($arr, $keylist[$idx]);
+ − 406
$idx++;
+ − 407
}
+ − 408
return $arr;
+ − 409
}
+ − 410
+ − 411
// Convert IP address to hex string
+ − 412
// Input: 127.0.0.1 (string)
+ − 413
// Output: 0x7f000001 (string)
+ − 414
// Updated 12/8/06 to work with PHP4 and not use eval() (blech)
+ − 415
function ip2hex($ip) {
+ − 416
if ( preg_match('/^([0-9a-f:]+)$/', $ip) )
+ − 417
{
+ − 418
// this is an ipv6 address
+ − 419
return str_replace(':', '', $ip);
+ − 420
}
+ − 421
$nums = explode('.', $ip);
+ − 422
if(sizeof($nums) != 4) return false;
+ − 423
$str = '0x';
+ − 424
foreach($nums as $n)
+ − 425
{
+ − 426
$str .= (string)dechex($n);
+ − 427
}
+ − 428
return $str;
+ − 429
}
+ − 430
+ − 431
// Convert DWord to IP address
+ − 432
// Input: 0x7f000001
+ − 433
// Output: 127.0.0.1
+ − 434
// Updated 12/8/06 to work with PHP4 and not use eval() (blech)
+ − 435
function hex2ip($in) {
+ − 436
if(substr($in, 0, 2) == '0x') $ip = substr($in, 2, 8);
+ − 437
else $ip = substr($in, 0, 8);
+ − 438
$octets = enano_str_split($ip, 2);
+ − 439
$str = '';
+ − 440
$newoct = Array();
+ − 441
foreach($octets as $o)
+ − 442
{
+ − 443
$o = (int)hexdec($o);
+ − 444
$newoct[] = $o;
+ − 445
}
+ − 446
return implode('.', $newoct);
+ − 447
}
+ − 448
+ − 449
// Function strip_php moved to RenderMan class
+ − 450
76
+ − 451
/**
+ − 452
* Immediately brings the site to a halt with an error message. Unlike grinding_halt() this can only be called after the config has been
+ − 453
* fetched (plugin developers don't even need to worry since plugins are always loaded after the config) and shows the site name and
+ − 454
* description.
+ − 455
* @param string The title of the error message
+ − 456
* @param string The body of the message, this can be HTML, and should be separated into paragraphs using the <p> tag
+ − 457
*/
+ − 458
1
+ − 459
function die_semicritical($t, $p)
+ − 460
{
+ − 461
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 462
$db->close();
76
+ − 463
1
+ − 464
if ( ob_get_status() )
+ − 465
ob_end_clean();
76
+ − 466
1
+ − 467
dc_here('functions: <span style="color: red">calling die_semicritical</span>');
76
+ − 468
1
+ − 469
$tpl = new template_nodb();
+ − 470
$tpl->load_theme('oxygen', 'bleu');
+ − 471
$tpl->tpl_strings['SITE_NAME'] = getConfig('site_name');
+ − 472
$tpl->tpl_strings['SITE_DESC'] = getConfig('site_desc');
+ − 473
$tpl->tpl_strings['COPYRIGHT'] = getConfig('copyright_notice');
+ − 474
$tpl->tpl_strings['PAGE_NAME'] = $t;
+ − 475
$tpl->header();
+ − 476
echo $p;
+ − 477
$tpl->footer();
76
+ − 478
1
+ − 479
exit;
+ − 480
}
+ − 481
76
+ − 482
/**
+ − 483
* Halts Enano execution with a message. This doesn't have to be an error message, it's sometimes used to indicate success at an operation.
+ − 484
* @param string The title of the message
+ − 485
* @param string The body of the message, this can be HTML, and should be separated into paragraphs using the <p> tag
+ − 486
*/
+ − 487
1
+ − 488
function die_friendly($t, $p)
+ − 489
{
+ − 490
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 491
1
+ − 492
if ( ob_get_status() )
+ − 493
ob_end_clean();
76
+ − 494
1
+ − 495
dc_here('functions: <span style="color: red">calling die_friendly</span>');
+ − 496
$paths->cpage['name'] = $t;
+ − 497
$template->tpl_strings['PAGE_NAME'] = $t;
+ − 498
$template->header();
+ − 499
echo $p;
+ − 500
$template->footer();
+ − 501
$db->close();
76
+ − 502
1
+ − 503
exit;
+ − 504
}
+ − 505
76
+ − 506
/**
+ − 507
* Immediately brings the site to a halt with an error message, and focuses on immediately closing the database connection and shutting down Enano in the event that an attack may happen. This should only be used very early on to indicate very severe errors, or if the site may be under attack (like if the DBAL detects a malicious query). In the vast majority of cases, die_semicritical() is more appropriate.
+ − 508
* @param string The title of the error message
+ − 509
* @param string The body of the message, this can be HTML, and should be separated into paragraphs using the <p> tag
+ − 510
*/
+ − 511
1
+ − 512
function grinding_halt($t, $p)
+ − 513
{
+ − 514
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 515
1
+ − 516
$db->close();
76
+ − 517
1
+ − 518
if ( ob_get_status() )
+ − 519
ob_end_clean();
76
+ − 520
1
+ − 521
dc_here('functions: <span style="color: red">calling grinding_halt</span>');
+ − 522
$tpl = new template_nodb();
+ − 523
$tpl->load_theme('oxygen', 'bleu');
+ − 524
$tpl->tpl_strings['SITE_NAME'] = 'Critical error';
+ − 525
$tpl->tpl_strings['SITE_DESC'] = 'This website is experiencing a serious error and cannot load.';
+ − 526
$tpl->tpl_strings['COPYRIGHT'] = 'Unable to retrieve copyright information';
+ − 527
$tpl->tpl_strings['PAGE_NAME'] = $t;
+ − 528
$tpl->header();
+ − 529
echo $p;
+ − 530
$tpl->footer();
+ − 531
exit;
+ − 532
}
+ − 533
76
+ − 534
/**
+ − 535
* Prints out the categorization box found on most regular pages. Doesn't take or return anything, but assumes that the page information is already set in $paths.
+ − 536
*/
+ − 537
+ − 538
/*
+ − 539
function show_category_info()
+ − 540
{
1
+ − 541
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 542
dc_here('functions: showing category info');
76
+ − 543
// if($template->no_headers && !strpos($_SERVER['REQUEST_URI'], 'ajax.php')) return '';
+ − 544
if ( $paths->namespace == 'Category' )
1
+ − 545
{
+ − 546
$q = $db->sql_query('SELECT page_id,namespace FROM '.table_prefix.'categories WHERE category_id=\''.$paths->cpage['urlname_nons'].'\' AND namespace=\'Category\' ORDER BY page_id;');
+ − 547
if(!$q) $db->_die('The category information could not be selected.');
+ − 548
$ticker = -1;
+ − 549
echo '<h3>Subcategories</h3>';
+ − 550
if($db->numrows() < 1) echo '<p>There are no subcategories in this category.</p>';
+ − 551
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 552
while($row = $db->fetchrow())
+ − 553
{
76
+ − 554
$ticker++;
+ − 555
if ( $ticker == 3 )
+ − 556
{
+ − 557
$ticker = 0;
+ − 558
}
+ − 559
if ( $ticker == 0 )
+ − 560
{
+ − 561
echo '<tr>';
+ − 562
}
+ − 563
echo '<td style="width: 200px;"><a href="' . makeUrlNS($row['namespace'], $row['page_id']) . '">' . htmlspecialchars($paths->pages[$paths->nslist[$row['namespace']].$row['page_id']]['name']) . '</a></td>';
+ − 564
if ( $ticker == 2 )
+ − 565
{
+ − 566
echo '</tr>';
+ − 567
}
1
+ − 568
}
+ − 569
$db->free_result();
+ − 570
if($ticker) echo '</tr>';
+ − 571
echo '</table>';
76
+ − 572
1
+ − 573
$q = $db->sql_query('SELECT page_id,namespace FROM '.table_prefix.'categories WHERE category_id=\''.$paths->cpage['urlname_nons'].'\' AND namespace!=\'Category\' ORDER BY page_id;');
76
+ − 574
if ( !$q )
+ − 575
{
+ − 576
$db->_die('The category information could not be selected.');
+ − 577
}
1
+ − 578
$ticker = -1;
+ − 579
echo '<h3>Pages</h3>';
76
+ − 580
if ( $db->numrows() < 1 )
+ − 581
{
+ − 582
echo '<p>There are no pages in this category.</p>';
+ − 583
}
1
+ − 584
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 585
while($row = $db->fetchrow())
+ − 586
{
76
+ − 587
$ticker += ( $ticker == 3 ) ? -3 : 1;
+ − 588
if ( $ticker == 0 )
+ − 589
{
+ − 590
echo '<tr>';
+ − 591
}
+ − 592
echo '<td style="width: 200px;"><a href="'.makeUrlNS($row['namespace'], $row['page_id']).'">'.htmlspecialchars($paths->pages[$paths->nslist[$row['namespace']].$row['page_id']]['name']).'</a></td>';
+ − 593
if ( $ticker == 2 )
+ − 594
{
+ − 595
echo '</tr>';
+ − 596
}
1
+ − 597
}
+ − 598
$db->free_result();
+ − 599
if($ticker) echo '</tr>';
+ − 600
echo '</table><br /><br />';
+ − 601
}
+ − 602
$q = $db->sql_query('SELECT category_id FROM '.table_prefix.'categories WHERE page_id=\''.$paths->cpage['urlname_nons'].'\' AND namespace=\''.$paths->namespace.'\'');
+ − 603
if(!$q) $db->_die('The error seems to have occurred during selection of category data.');
+ − 604
if($db->numrows() > 0) {
+ − 605
echo '<div class="mdg-comment" style="margin-left: 0;">Categories: ';
+ − 606
$i=0;
+ − 607
while($r = $db->fetchrow())
+ − 608
{
+ − 609
if($i>0) echo ', ';
+ − 610
$i++;
+ − 611
echo '<a href="'.makeUrlNS('Category', $r['category_id']).'">'.$paths->pages[$paths->nslist['Category'].$r['category_id']]['name'].'</a>';
+ − 612
}
+ − 613
if( ( $paths->wiki_mode && !$paths->page_protected ) || ( $session->get_permissions('edit_cat') && $session->get_permissions('even_when_protected') ) ) echo ' [ <a href="'.makeUrl($paths->page, 'do=catedit', true).'" onclick="ajaxCatEdit(); return false;">edit categorization</a> ]</div>';
76
+ − 614
}
+ − 615
else
+ − 616
{
1
+ − 617
echo '<div class="mdg-comment" style="margin-left: 0;">Categories: ';
+ − 618
echo '(Uncategorized)';
+ − 619
if( ( $paths->wiki_mode && !$paths->page_protected ) || ( $session->get_permissions('edit_cat') && $session->get_permissions('even_when_protected') ) ) echo ' [ <a href="'.makeUrl($paths->page, 'do=catedit', true).'" onclick="ajaxCatEdit(); return false;">edit categorization</a> ]</div>';
+ − 620
else echo '</div>';
+ − 621
}
+ − 622
$db->free_result();
+ − 623
}
76
+ − 624
*/
+ − 625
+ − 626
function show_category_info()
+ − 627
{
+ − 628
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 629
+ − 630
if ( $paths->namespace == 'Category' )
+ − 631
{
+ − 632
// Show member pages and subcategories
+ − 633
$q = $db->sql_query('SELECT p.urlname, p.namespace, p.name, p.namespace=\'Category\' AS is_category FROM '.table_prefix.'categories AS c
+ − 634
LEFT JOIN '.table_prefix.'pages AS p
+ − 635
ON ( p.urlname = c.page_id AND p.namespace = c.namespace )
+ − 636
WHERE c.category_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\'
+ − 637
ORDER BY is_category DESC, p.name ASC;');
+ − 638
if ( !$q )
+ − 639
{
+ − 640
$db->_die();
+ − 641
}
+ − 642
echo '<h3>Subcategories</h3>';
+ − 643
echo '<div class="tblholder">';
+ − 644
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 645
echo '<tr>';
+ − 646
$ticker = 0;
+ − 647
$counter = 0;
+ − 648
$switched = false;
+ − 649
$class = 'row1';
+ − 650
while ( $row = $db->fetchrow() )
+ − 651
{
+ − 652
if ( $row['is_category'] == 0 && !$switched )
+ − 653
{
+ − 654
if ( $counter > 0 )
+ − 655
{
+ − 656
// Fill-in
+ − 657
while ( $ticker < 3 )
+ − 658
{
+ − 659
$ticker++;
+ − 660
echo '<td class="' . $class . '" style="width: 33.3%;"></td>';
+ − 661
}
+ − 662
}
+ − 663
else
+ − 664
{
+ − 665
echo '<td class="' . $class . '">No subcategories.</td>';
+ − 666
}
+ − 667
echo '</tr></table></div>' . "\n\n";
+ − 668
echo '<h3>Pages</h3>';
+ − 669
echo '<div class="tblholder">';
+ − 670
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 671
echo '<tr>';
+ − 672
$counter = 0;
+ − 673
$ticker = 0;
+ − 674
$switched = true;
+ − 675
}
+ − 676
$counter++;
+ − 677
$ticker++;
+ − 678
if ( $ticker == 3 )
+ − 679
{
+ − 680
echo '</tr><tr>';
+ − 681
$ticker = 0;
+ − 682
$class = ( $class == 'row3' ) ? 'row1' : 'row3';
+ − 683
}
+ − 684
echo "<td class=\"{$class}\" style=\"width: 33.3%;\">"; // " to workaround stupid jEdit bug
+ − 685
+ − 686
$link = makeUrlNS($row['namespace'], sanitize_page_id($row['urlname']));
+ − 687
echo '<a href="' . $link . '"';
+ − 688
$key = $paths->nslist[$row['namespace']] . sanitize_page_id($row['urlname']);
+ − 689
if ( !isPage( $key ) )
+ − 690
{
+ − 691
echo ' class="wikilink-nonexistent"';
+ − 692
}
+ − 693
echo '>';
+ − 694
$title = get_page_title_ns($row['urlname'], $row['namespace']);
+ − 695
echo htmlspecialchars($title);
+ − 696
echo '</a>';
+ − 697
+ − 698
echo "</td>";
+ − 699
}
+ − 700
if ( !$switched )
+ − 701
{
+ − 702
if ( $counter > 0 )
+ − 703
{
+ − 704
// Fill-in
+ − 705
while ( $ticker < 3 )
+ − 706
{
+ − 707
$ticker++;
+ − 708
echo '<td class="' . $class . '" style="width: 33.3%;"></td>';
+ − 709
}
+ − 710
}
+ − 711
else
+ − 712
{
+ − 713
echo '<td class="' . $class . '">No subcategories.</td>';
+ − 714
}
+ − 715
echo '</tr></table></div>' . "\n\n";
+ − 716
echo '<h3>Pages</h3>';
+ − 717
echo '<div class="tblholder">';
+ − 718
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 719
echo '<tr>';
+ − 720
$counter = 0;
+ − 721
$ticker = 0;
+ − 722
$switched = true;
+ − 723
}
+ − 724
if ( $counter > 0 )
+ − 725
{
+ − 726
// Fill-in
+ − 727
while ( $ticker < 3 )
+ − 728
{
+ − 729
$ticker++;
+ − 730
echo '<td class="' . $class . '" style="width: 33.3%;"></td>';
+ − 731
}
+ − 732
}
+ − 733
else
+ − 734
{
+ − 735
echo '<td class="' . $class . '">No pages in this category.</td>';
+ − 736
}
+ − 737
echo '</tr></table></div>' . "\n\n";
+ − 738
}
+ − 739
+ − 740
if ( $paths->namespace != 'Special' && $paths->namespace != 'Admin' )
+ − 741
{
86
c162ca39db8f
Finished pagination code (was incomplete in previous revision) and added a few hacks for an upcoming theme
Dan
diff
changeset
+ − 742
echo '<div class="mdg-comment" style="margin: 10px 0 0 0;" id="category_box_wrapper">';
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 743
echo '<div style="float: right;">';
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 744
echo '(<a href="#" onclick="ajaxCatToTag(); return false;">show page tags</a>)';
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 745
echo '</div>';
76
+ − 746
echo '<div id="mdgCatBox">Categories: ';
+ − 747
+ − 748
$where = '( c.page_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\' AND c.namespace=\'' . $db->escape($paths->namespace) . '\' )';
+ − 749
$prefix = table_prefix;
+ − 750
$sql = <<<EOF
+ − 751
SELECT c.category_id FROM {$prefix}categories AS c
+ − 752
LEFT JOIN {$prefix}pages AS p
+ − 753
ON ( ( p.urlname = c.page_id AND p.namespace = c.namespace ) OR ( p.urlname IS NULL AND p.namespace IS NULL ) )
+ − 754
WHERE $where
+ − 755
ORDER BY p.name ASC, c.page_id ASC;
+ − 756
EOF;
+ − 757
$q = $db->sql_query($sql);
+ − 758
if ( !$q )
+ − 759
$db->_die();
+ − 760
+ − 761
if ( $row = $db->fetchrow() )
+ − 762
{
+ − 763
$list = array();
+ − 764
do
+ − 765
{
+ − 766
$cid = sanitize_page_id($row['category_id']);
+ − 767
$title = get_page_title_ns($cid, 'Category');
+ − 768
$link = makeUrlNS('Category', $cid);
+ − 769
$list[] = '<a href="' . $link . '">' . htmlspecialchars($title) . '</a>';
+ − 770
}
+ − 771
while ( $row = $db->fetchrow() );
+ − 772
echo implode(', ', $list);
+ − 773
}
+ − 774
else
+ − 775
{
+ − 776
echo '(Uncategorized)';
+ − 777
}
+ − 778
+ − 779
$can_edit = ( $session->get_permissions('edit_cat') && ( !$paths->page_protected || $session->get_permissions('even_when_protected') ) );
+ − 780
if ( $can_edit )
+ − 781
{
+ − 782
$edit_link = '<a href="' . makeUrl($paths->page, 'do=catedit', true) . '" onclick="ajaxCatEdit(); return false;">edit categorization</a>';
+ − 783
echo ' [ ' . $edit_link . ' ]';
+ − 784
}
+ − 785
+ − 786
echo '</div></div>';
+ − 787
+ − 788
}
+ − 789
+ − 790
}
+ − 791
+ − 792
/**
+ − 793
* Prints out the file information box seen on File: pages. Doesn't take or return anything, but assumes that the page information is already set in $paths, and expects $paths->namespace to be File.
+ − 794
*/
1
+ − 795
+ − 796
function show_file_info()
+ − 797
{
+ − 798
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 799
if($paths->namespace != 'File') return null; // Prevent unnecessary work
+ − 800
$selfn = $paths->cpage['urlname_nons']; // substr($paths->page, strlen($paths->nslist['File']), strlen($paths->cpage));
+ − 801
if(substr($paths->cpage['name'], 0, strlen($paths->nslist['File']))==$paths->nslist['File']) $selfn = substr($paths->cpage['urlname_nons'], strlen($paths->nslist['File']), strlen($paths->cpage['urlname_nons']));
+ − 802
$q = $db->sql_query('SELECT mimetype,time_id,size FROM '.table_prefix.'files WHERE page_id=\''.$selfn.'\' ORDER BY time_id DESC;');
+ − 803
if(!$q) $db->_die('The file type could not be fetched.');
+ − 804
if($db->numrows() < 1) { echo '<div class="mdg-comment" style="margin-left: 0;"><h3>Uploaded file</h3><p>There are no files uploaded with this name yet. <a href="'.makeUrlNS('Special', 'UploadFile/'.$paths->cpage['urlname_nons']).'">Upload a file...</a></p></div><br />'; return; }
+ − 805
$r = $db->fetchrow();
+ − 806
$mimetype = $r['mimetype'];
+ − 807
$datestring = date('F d, Y h:i a', (int)$r['time_id']);
+ − 808
echo '<div class="mdg-comment" style="margin-left: 0;"><p><h3>Uploaded file</h3></p><p>Type: '.$r['mimetype'].'<br />Size: ';
+ − 809
$fs = $r['size'];
+ − 810
echo $fs.' bytes';
+ − 811
$fs = (int)$fs;
+ − 812
if($fs >= 1048576)
+ − 813
{
+ − 814
$fs = round($fs / 1048576, 1);
+ − 815
echo ' ('.$fs.' MB)';
+ − 816
} elseif($fs >= 1024) {
+ − 817
$fs = round($fs / 1024, 1);
+ − 818
echo ' ('.$fs.' KB)';
+ − 819
}
+ − 820
echo '<br />Uploaded: '.$datestring.'</p>';
+ − 821
if(substr($mimetype, 0, 6)!='image/' && ( substr($mimetype, 0, 5) != 'text/' || $mimetype == 'text/html' || $mimetype == 'text/javascript' ))
+ − 822
{
+ − 823
echo '<div class="warning-box">This file type may contain viruses or other code that could harm your computer. You should exercise caution if you download it.</div>';
+ − 824
}
+ − 825
if(substr($mimetype, 0, 6)=='image/')
+ − 826
{
+ − 827
echo '<p><a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn).'"><img style="border: 0;" alt="'.$paths->page.'" src="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.htmlspecialchars(urlSeparator).'preview').'" /></a></p>';
+ − 828
}
+ − 829
echo '<p><a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.'/'.$r['time_id'].htmlspecialchars(urlSeparator).'download').'">Download this file</a>';
+ − 830
if(!$paths->page_protected && ( $paths->wiki_mode || $session->get_permissions('upload_new_version') ))
+ − 831
{
+ − 832
echo ' | <a href="'.makeUrlNS('Special', 'UploadFile'.'/'.$selfn).'">Upload new version</a>';
+ − 833
}
+ − 834
echo '</p>';
+ − 835
if($db->numrows() > 1)
+ − 836
{
+ − 837
echo '<h3>File history</h3><p>';
+ − 838
while($r = $db->fetchrow())
+ − 839
{
+ − 840
echo '(<a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.'/'.$r['time_id'].htmlspecialchars(urlSeparator).'download').'">this ver</a>) ';
+ − 841
if($session->get_permissions('history_rollback'))
+ − 842
echo ' (<a href="#" onclick="ajaxRollback(\''.$r['time_id'].'\'); return false;">revert</a>) ';
+ − 843
$mimetype = $r['mimetype'];
+ − 844
$datestring = date('F d, Y h:i a', (int)$r['time_id']);
+ − 845
echo $datestring.': '.$r['mimetype'].', ';
+ − 846
$fs = $r['size'];
+ − 847
$fs = (int)$fs;
+ − 848
if($fs >= 1048576)
+ − 849
{
+ − 850
$fs = round($fs / 1048576, 1);
+ − 851
echo ' '.$fs.' MB';
+ − 852
} elseif($fs >= 1024) {
+ − 853
$fs = round($fs / 1024, 1);
+ − 854
echo ' '.$fs.' KB';
+ − 855
} else {
+ − 856
echo ' '.$fs.' bytes';
+ − 857
}
+ − 858
echo '<br />';
+ − 859
}
+ − 860
echo '</p>';
+ − 861
}
+ − 862
$db->free_result();
+ − 863
echo '</div><br />';
+ − 864
}
+ − 865
76
+ − 866
/**
+ − 867
* Shows header information on the current page. Currently this is only the delete-vote feature. Doesn't take or return anything, but assumes that the page information is already set in $paths.
+ − 868
*/
+ − 869
1
+ − 870
function display_page_headers()
+ − 871
{
+ − 872
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 873
if($session->get_permissions('vote_reset') && $paths->cpage['delvotes'] > 0)
+ − 874
{
112
+ − 875
$delvote_ips = unserialize($paths->cpage['delvote_ips']);
+ − 876
$hr = htmlspecialchars(implode(', ', $delvote_ips['u']));
1
+ − 877
$is = 'is';
+ − 878
$s = '';
+ − 879
$s2 = 's';
+ − 880
if ( $paths->cpage['delvotes'] > 1)
+ − 881
{
+ − 882
$is = 'are';
+ − 883
$s = 's';
+ − 884
$s2 = '';
+ − 885
}
+ − 886
echo '<div class="info-box" style="margin-left: 0; margin-top: 5px;" id="mdgDeleteVoteNoticeBox">
+ − 887
<b>Notice:</b> There '.$is.' '.$paths->cpage['delvotes'].' user'.$s.' that think'.$s2.' this page should be deleted.<br />
+ − 888
<b>Users that voted:</b> ' . $hr . '<br />
+ − 889
<a href="'.makeUrl($paths->page, 'do=deletepage').'" onclick="ajaxDeletePage(); return false;">Delete page</a> | <a href="'.makeUrl($paths->page, 'do=resetvotes').'" onclick="ajaxResetDelVotes(); return false;">Reset votes</a>
+ − 890
</div>';
+ − 891
}
+ − 892
}
+ − 893
76
+ − 894
/**
+ − 895
* Displays page footer information including file and category info. This also has the send_page_footers hook. Doesn't take or return anything, but assumes that the page information is already set in $paths.
+ − 896
*/
+ − 897
1
+ − 898
function display_page_footers()
+ − 899
{
+ − 900
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 901
if(isset($_GET['nofooters'])) return;
+ − 902
$code = $plugins->setHook('send_page_footers');
+ − 903
foreach ( $code as $cmd )
+ − 904
{
+ − 905
eval($cmd);
+ − 906
}
+ − 907
show_file_info();
+ − 908
show_category_info();
+ − 909
}
+ − 910
76
+ − 911
/**
+ − 912
* Deprecated, do not use.
+ − 913
*/
+ − 914
1
+ − 915
function password_prompt($id = false)
+ − 916
{
+ − 917
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 918
if(!$id) $id = $paths->page;
+ − 919
if(isset($paths->pages[$id]['password']) && strlen($paths->pages[$id]['password']) == 40 && !isset($_REQUEST['pagepass']))
+ − 920
{
+ − 921
die_friendly('Password required', '<p>You must supply a password to access this page.</p><form action="'.makeUrl($paths->pages[$id]['urlname']).'" method="post"><p>Password: <input name="pagepass" type="password" /></p><p><input type="submit" value="Submit" /></p>');
+ − 922
} elseif(isset($_REQUEST['pagepass'])) {
+ − 923
$p = (preg_match('#^([a-f0-9]*){40}$#', $_REQUEST['pagepass'])) ? $_REQUEST['pagepass'] : sha1($_REQUEST['pagepass']);
+ − 924
if($p != $paths->pages[$id]['password']) die_friendly('Password required', '<p style="color: red;">The password you entered is incorrect.</p><form action="'.makeUrl($paths->page).'" method="post"><p>Password: <input name="pagepass" type="password" /></p><p><input type="submit" value="Submit" /></p>');
+ − 925
}
+ − 926
}
+ − 927
76
+ − 928
/**
+ − 929
* Some sort of primitive hex converter from back in the day. Deprecated, do not use.
+ − 930
* @param string Text to encode
+ − 931
* @return string
+ − 932
*/
+ − 933
1
+ − 934
function str_hex($string){
+ − 935
$hex='';
+ − 936
for ($i=0; $i < strlen($string); $i++){
+ − 937
$hex .= ' '.dechex(ord($string[$i]));
+ − 938
}
+ − 939
return substr($hex, 1, strlen($hex));
+ − 940
}
+ − 941
76
+ − 942
/**
+ − 943
* Essentially an return code reader for a socket. Don't use this unless you're writing mail code and smtp_send_email doesn't cut it. Ported from phpBB's smtp.php.
+ − 944
* @param socket A socket resource
+ − 945
* @param string The expected response from the server, this needs to be exactly three characters.
+ − 946
*/
+ − 947
+ − 948
function smtp_get_response($socket, $response, $line = __LINE__)
1
+ − 949
{
76
+ − 950
$server_response = '';
+ − 951
while (substr($server_response, 3, 1) != ' ')
+ − 952
{
+ − 953
if (!($server_response = fgets($socket, 256)))
+ − 954
{
1
+ − 955
die_friendly('SMTP Error', "<p>Couldn't get mail server response codes</p>");
76
+ − 956
}
+ − 957
}
1
+ − 958
76
+ − 959
if (!(substr($server_response, 0, 3) == $response))
+ − 960
{
1
+ − 961
die_friendly('SMTP Error', "<p>Ran into problems sending mail. Response: $server_response</p>");
76
+ − 962
}
1
+ − 963
}
+ − 964
76
+ − 965
/**
+ − 966
* Wrapper for smtp_send_email_core that takes the sender as the fourth parameter instead of additional headers.
+ − 967
* @param string E-mail address to send to
+ − 968
* @param string Subject line
+ − 969
* @param string The body of the message
+ − 970
* @param string Address of the sender
+ − 971
*/
+ − 972
1
+ − 973
function smtp_send_email($to, $subject, $message, $from)
+ − 974
{
+ − 975
return smtp_send_email_core($to, $subject, $message, "From: <$from>\n");
+ − 976
}
+ − 977
76
+ − 978
/**
+ − 979
* Replacement or substitute for PHP's mail() builtin function.
+ − 980
* @param string E-mail address to send to
+ − 981
* @param string Subject line
+ − 982
* @param string The body of the message
+ − 983
* @param string Message headers, separated by a single newline ("\n")
+ − 984
* @copyright (C) phpBB Group
+ − 985
* @license GPL
+ − 986
*/
+ − 987
1
+ − 988
function smtp_send_email_core($mail_to, $subject, $message, $headers = '')
+ − 989
{
76
+ − 990
// Fix any bare linefeeds in the message to make it RFC821 Compliant.
+ − 991
$message = preg_replace("#(?<!\r)\n#si", "\r\n", $message);
1
+ − 992
76
+ − 993
if ($headers != '')
+ − 994
{
+ − 995
if (is_array($headers))
+ − 996
{
+ − 997
if (sizeof($headers) > 1)
+ − 998
{
+ − 999
$headers = join("\n", $headers);
+ − 1000
}
+ − 1001
else
+ − 1002
{
+ − 1003
$headers = $headers[0];
+ − 1004
}
+ − 1005
}
+ − 1006
$headers = chop($headers);
1
+ − 1007
76
+ − 1008
// Make sure there are no bare linefeeds in the headers
+ − 1009
$headers = preg_replace('#(?<!\r)\n#si', "\r\n", $headers);
1
+ − 1010
76
+ − 1011
// Ok this is rather confusing all things considered,
+ − 1012
// but we have to grab bcc and cc headers and treat them differently
+ − 1013
// Something we really didn't take into consideration originally
+ − 1014
$header_array = explode("\r\n", $headers);
+ − 1015
@reset($header_array);
1
+ − 1016
76
+ − 1017
$headers = '';
+ − 1018
while(list(, $header) = each($header_array))
+ − 1019
{
+ − 1020
if (preg_match('#^cc:#si', $header))
+ − 1021
{
+ − 1022
$cc = preg_replace('#^cc:(.*)#si', '\1', $header);
+ − 1023
}
+ − 1024
else if (preg_match('#^bcc:#si', $header))
+ − 1025
{
+ − 1026
$bcc = preg_replace('#^bcc:(.*)#si', '\1', $header);
+ − 1027
$header = '';
+ − 1028
}
+ − 1029
$headers .= ($header != '') ? $header . "\r\n" : '';
+ − 1030
}
1
+ − 1031
76
+ − 1032
$headers = chop($headers);
+ − 1033
$cc = explode(', ', $cc);
+ − 1034
$bcc = explode(', ', $bcc);
+ − 1035
}
1
+ − 1036
76
+ − 1037
if (trim($subject) == '')
+ − 1038
{
+ − 1039
die_friendly(GENERAL_ERROR, "No email Subject specified");
+ − 1040
}
1
+ − 1041
76
+ − 1042
if (trim($message) == '')
+ − 1043
{
+ − 1044
die_friendly(GENERAL_ERROR, "Email message was blank");
+ − 1045
}
+ − 1046
1
+ − 1047
// setup SMTP
+ − 1048
$host = getConfig('smtp_server');
+ − 1049
if ( empty($host) )
+ − 1050
return 'No smtp_host in config';
+ − 1051
if ( strstr($host, ':' ) )
+ − 1052
{
+ − 1053
$n = explode(':', $host);
+ − 1054
$smtp_host = $n[0];
+ − 1055
$port = intval($n[1]);
+ − 1056
}
+ − 1057
else
+ − 1058
{
+ − 1059
$smtp_host = $host;
+ − 1060
$port = 25;
+ − 1061
}
76
+ − 1062
1
+ − 1063
$smtp_user = getConfig('smtp_user');
+ − 1064
$smtp_pass = getConfig('smtp_password');
+ − 1065
76
+ − 1066
// Ok we have error checked as much as we can to this point let's get on
+ − 1067
// it already.
+ − 1068
if( !$socket = @fsockopen($smtp_host, $port, $errno, $errstr, 20) )
+ − 1069
{
+ − 1070
die_friendly(GENERAL_ERROR, "Could not connect to smtp host : $errno : $errstr");
+ − 1071
}
+ − 1072
+ − 1073
// Wait for reply
+ − 1074
smtp_get_response($socket, "220", __LINE__);
1
+ − 1075
76
+ − 1076
// Do we want to use AUTH?, send RFC2554 EHLO, else send RFC821 HELO
+ − 1077
// This improved as provided by SirSir to accomodate
+ − 1078
if( !empty($smtp_user) && !empty($smtp_pass) )
+ − 1079
{
+ − 1080
enano_fputs($socket, "EHLO " . $smtp_host . "\r\n");
+ − 1081
smtp_get_response($socket, "250", __LINE__);
1
+ − 1082
76
+ − 1083
enano_fputs($socket, "AUTH LOGIN\r\n");
+ − 1084
smtp_get_response($socket, "334", __LINE__);
1
+ − 1085
76
+ − 1086
enano_fputs($socket, base64_encode($smtp_user) . "\r\n");
+ − 1087
smtp_get_response($socket, "334", __LINE__);
1
+ − 1088
76
+ − 1089
enano_fputs($socket, base64_encode($smtp_pass) . "\r\n");
+ − 1090
smtp_get_response($socket, "235", __LINE__);
+ − 1091
}
+ − 1092
else
+ − 1093
{
+ − 1094
enano_fputs($socket, "HELO " . $smtp_host . "\r\n");
+ − 1095
smtp_get_response($socket, "250", __LINE__);
+ − 1096
}
1
+ − 1097
76
+ − 1098
// From this point onward most server response codes should be 250
+ − 1099
// Specify who the mail is from....
+ − 1100
enano_fputs($socket, "MAIL FROM: <" . getConfig('contact_email') . ">\r\n");
+ − 1101
smtp_get_response($socket, "250", __LINE__);
1
+ − 1102
76
+ − 1103
// Specify each user to send to and build to header.
+ − 1104
$to_header = '';
1
+ − 1105
76
+ − 1106
// Add an additional bit of error checking to the To field.
+ − 1107
$mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to);
+ − 1108
if (preg_match('#[^ ]+\@[^ ]+#', $mail_to))
+ − 1109
{
+ − 1110
enano_fputs($socket, "RCPT TO: <$mail_to>\r\n");
+ − 1111
smtp_get_response($socket, "250", __LINE__);
+ − 1112
}
1
+ − 1113
76
+ − 1114
// Ok now do the CC and BCC fields...
+ − 1115
@reset($bcc);
+ − 1116
while(list(, $bcc_address) = each($bcc))
+ − 1117
{
+ − 1118
// Add an additional bit of error checking to bcc header...
+ − 1119
$bcc_address = trim($bcc_address);
+ − 1120
if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address))
+ − 1121
{
+ − 1122
enano_fputs($socket, "RCPT TO: <$bcc_address>\r\n");
+ − 1123
smtp_get_response($socket, "250", __LINE__);
+ − 1124
}
+ − 1125
}
1
+ − 1126
76
+ − 1127
@reset($cc);
+ − 1128
while(list(, $cc_address) = each($cc))
+ − 1129
{
+ − 1130
// Add an additional bit of error checking to cc header
+ − 1131
$cc_address = trim($cc_address);
+ − 1132
if (preg_match('#[^ ]+\@[^ ]+#', $cc_address))
+ − 1133
{
+ − 1134
enano_fputs($socket, "RCPT TO: <$cc_address>\r\n");
+ − 1135
smtp_get_response($socket, "250", __LINE__);
+ − 1136
}
+ − 1137
}
1
+ − 1138
76
+ − 1139
// Ok now we tell the server we are ready to start sending data
+ − 1140
enano_fputs($socket, "DATA\r\n");
1
+ − 1141
76
+ − 1142
// This is the last response code we look for until the end of the message.
+ − 1143
smtp_get_response($socket, "354", __LINE__);
1
+ − 1144
76
+ − 1145
// Send the Subject Line...
+ − 1146
enano_fputs($socket, "Subject: $subject\r\n");
1
+ − 1147
76
+ − 1148
// Now the To Header.
+ − 1149
enano_fputs($socket, "To: $mail_to\r\n");
1
+ − 1150
76
+ − 1151
// Now any custom headers....
+ − 1152
enano_fputs($socket, "$headers\r\n\r\n");
1
+ − 1153
76
+ − 1154
// Ok now we are ready for the message...
+ − 1155
enano_fputs($socket, "$message\r\n");
1
+ − 1156
76
+ − 1157
// Ok the all the ingredients are mixed in let's cook this puppy...
+ − 1158
enano_fputs($socket, ".\r\n");
+ − 1159
smtp_get_response($socket, "250", __LINE__);
1
+ − 1160
76
+ − 1161
// Now tell the server we are done and close the socket...
+ − 1162
enano_fputs($socket, "QUIT\r\n");
+ − 1163
fclose($socket);
1
+ − 1164
76
+ − 1165
return TRUE;
1
+ − 1166
}
+ − 1167
+ − 1168
/**
+ − 1169
* Tell which version of Enano we're running.
+ − 1170
* @param bool $long if true, uses English version names (e.g. alpha, beta, release candidate). If false (default) uses abbreviations (1.0a1, 1.0b3, 1.0RC2, etc.)
+ − 1171
* @return string
+ − 1172
*/
+ − 1173
+ − 1174
function enano_version($long = false, $no_nightly = false)
+ − 1175
{
+ − 1176
$r = getConfig('enano_version');
+ − 1177
$rc = ( $long ) ? ' release candidate ' : 'RC';
+ − 1178
$b = ( $long ) ? ' beta ' : 'b';
+ − 1179
$a = ( $long ) ? ' alpha ' : 'a';
+ − 1180
if($v = getConfig('enano_rc_version')) $r .= $rc.$v;
+ − 1181
if($v = getConfig('enano_beta_version')) $r .= $b.$v;
+ − 1182
if($v = getConfig('enano_alpha_version')) $r .= $a.$v;
+ − 1183
if ( defined('ENANO_NIGHTLY') && !$no_nightly )
+ − 1184
{
+ − 1185
$nightlytag = ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR;
+ − 1186
$nightlylong = ' nightly; build date: ' . ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR;
+ − 1187
$r = ( $long ) ? $r . $nightlylong : $r . '-nightly-' . $nightlytag;
+ − 1188
}
+ − 1189
return $r;
+ − 1190
}
+ − 1191
76
+ − 1192
/**
+ − 1193
* What kinda sh** was I thinking when I wrote this. Deprecated.
+ − 1194
*/
+ − 1195
1
+ − 1196
function _dualurlenc($t) {
+ − 1197
return rawurlencode(rawurlencode($t));
+ − 1198
}
76
+ − 1199
+ − 1200
/**
+ − 1201
* Badly named function to send back eval'able Javascript code with an error message. Deprecated, use JSON instead.
+ − 1202
* @param string Message to send
+ − 1203
*/
+ − 1204
1
+ − 1205
function _die($t) {
+ − 1206
$_ob = 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\'' . rawurlencode('' . $t . '') . '\')';
+ − 1207
die($_ob);
+ − 1208
}
+ − 1209
76
+ − 1210
/**
+ − 1211
* Same as _die(), but sends an SQL backtrace with the error message, and doesn't halt execution.
+ − 1212
* @param string Message to send
+ − 1213
*/
+ − 1214
1
+ − 1215
function jsdie($text) {
+ − 1216
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 1217
$text = rawurlencode($text . "\n\nSQL Backtrace:\n" . $db->sql_backtrace());
+ − 1218
echo 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\''.$text.'\');';
+ − 1219
}
+ − 1220
+ − 1221
/**
+ − 1222
* Capitalizes the first letter of a string
+ − 1223
* @param $text string the text to be transformed
+ − 1224
* @return string
+ − 1225
*/
76
+ − 1226
1
+ − 1227
function capitalize_first_letter($text)
+ − 1228
{
+ − 1229
return strtoupper(substr($text, 0, 1)) . substr($text, 1);
+ − 1230
}
+ − 1231
+ − 1232
/**
+ − 1233
* Checks if a value in a bitfield is on or off
+ − 1234
* @param $bitfield int the bit-field value
+ − 1235
* @param $value int the value to switch off
+ − 1236
* @return bool
+ − 1237
*/
76
+ − 1238
1
+ − 1239
function is_bit($bitfield, $value)
+ − 1240
{
+ − 1241
return ( $bitfield & $value ) ? true : false;
+ − 1242
}
+ − 1243
+ − 1244
/**
+ − 1245
* Trims spaces/newlines from the beginning and end of a string
+ − 1246
* @param $text the text to process
+ − 1247
* @return string
+ − 1248
*/
76
+ − 1249
1
+ − 1250
function trim_spaces($text)
+ − 1251
{
+ − 1252
$d = true;
+ − 1253
while($d)
+ − 1254
{
+ − 1255
$c = substr($text, 0, 1);
+ − 1256
$a = substr($text, strlen($text)-1, strlen($text));
+ − 1257
if($c == "\n" || $c == "\r" || $c == "\t" || $c == ' ') $text = substr($text, 1, strlen($text));
+ − 1258
elseif($a == "\n" || $a == "\r" || $a == "\t" || $a == ' ') $text = substr($text, 0, strlen($text)-1);
+ − 1259
else $d = false;
+ − 1260
}
+ − 1261
return $text;
+ − 1262
}
+ − 1263
+ − 1264
/**
+ − 1265
* Enano-ese equivalent of str_split() which is only found in PHP5
+ − 1266
* @param $text string the text to split
+ − 1267
* @param $inc int size of each block
+ − 1268
* @return array
+ − 1269
*/
76
+ − 1270
1
+ − 1271
function enano_str_split($text, $inc = 1)
+ − 1272
{
76
+ − 1273
if($inc < 1)
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1274
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1275
return false;
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1276
}
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1277
if($inc >= strlen($text))
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1278
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1279
return Array($text);
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1280
}
1
+ − 1281
$len = ceil(strlen($text) / $inc);
+ − 1282
$ret = Array();
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1283
for ( $i = 0; $i < strlen($text); $i = $i + $inc )
1
+ − 1284
{
+ − 1285
$ret[] = substr($text, $i, $inc);
+ − 1286
}
+ − 1287
return $ret;
+ − 1288
}
+ − 1289
+ − 1290
/**
+ − 1291
* Converts a hexadecimal number to a binary string.
+ − 1292
* @param text string hexadecimal number
+ − 1293
* @return string
+ − 1294
*/
+ − 1295
function hex2bin($text)
+ − 1296
{
+ − 1297
$arr = enano_str_split($text, 2);
+ − 1298
$ret = '';
+ − 1299
for ($i=0; $i<sizeof($arr); $i++)
+ − 1300
{
+ − 1301
$ret .= chr(hexdec($arr[$i]));
+ − 1302
}
+ − 1303
return $ret;
+ − 1304
}
+ − 1305
+ − 1306
/**
+ − 1307
* Generates and/or prints a human-readable backtrace
76
+ − 1308
* @param bool $return - if true, this function returns a string, otherwise returns null and prints the backtrace
1
+ − 1309
* @return mixed
+ − 1310
*/
76
+ − 1311
1
+ − 1312
function enano_debug_print_backtrace($return = false)
+ − 1313
{
+ − 1314
ob_start();
+ − 1315
echo '<pre>';
19
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1316
if ( function_exists('debug_print_backtrace') )
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1317
{
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1318
debug_print_backtrace();
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1319
}
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1320
else
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1321
{
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1322
echo '<b>Warning:</b> No debug_print_backtrace() support!';
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1323
}
1
+ − 1324
echo '</pre>';
+ − 1325
$c = ob_get_contents();
+ − 1326
ob_end_clean();
+ − 1327
if($return) return $c;
+ − 1328
else echo $c;
+ − 1329
return null;
+ − 1330
}
+ − 1331
+ − 1332
/**
+ − 1333
* Like rawurlencode(), but encodes all characters
+ − 1334
* @param string $text the text to encode
+ − 1335
* @param optional string $prefix text before each hex character
+ − 1336
* @param optional string $suffix text after each hex character
+ − 1337
* @return string
+ − 1338
*/
76
+ − 1339
1
+ − 1340
function hexencode($text, $prefix = '%', $suffix = '')
+ − 1341
{
+ − 1342
$arr = enano_str_split($text);
+ − 1343
$r = '';
+ − 1344
foreach($arr as $a)
+ − 1345
{
+ − 1346
$nibble = (string)dechex(ord($a));
+ − 1347
if(strlen($nibble) == 1) $nibble = '0' . $nibble;
+ − 1348
$r .= $prefix . $nibble . $suffix;
+ − 1349
}
+ − 1350
return $r;
+ − 1351
}
+ − 1352
+ − 1353
/**
+ − 1354
* Enano-ese equivalent of get_magic_quotes_gpc()
+ − 1355
* @return bool
+ − 1356
*/
76
+ − 1357
1
+ − 1358
function enano_get_magic_quotes_gpc()
+ − 1359
{
+ − 1360
if(function_exists('get_magic_quotes_gpc'))
+ − 1361
{
+ − 1362
return ( get_magic_quotes_gpc() == 1 );
+ − 1363
}
+ − 1364
else
+ − 1365
{
+ − 1366
return ( strtolower(@ini_get('magic_quotes_gpc')) == '1' );
+ − 1367
}
+ − 1368
}
+ − 1369
+ − 1370
/**
+ − 1371
* Recursive stripslashes()
+ − 1372
* @param array
+ − 1373
* @return array
+ − 1374
*/
76
+ − 1375
1
+ − 1376
function stripslashes_recurse($arr)
+ − 1377
{
+ − 1378
foreach($arr as $k => $xxxx)
+ − 1379
{
+ − 1380
$val =& $arr[$k];
+ − 1381
if(is_string($val))
+ − 1382
$val = stripslashes($val);
+ − 1383
elseif(is_array($val))
+ − 1384
$val = stripslashes_recurse($val);
+ − 1385
}
+ − 1386
return $arr;
+ − 1387
}
+ − 1388
+ − 1389
/**
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1390
* Recursive function to remove all NUL bytes from a string
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1391
* @param array
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1392
* @return array
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1393
*/
76
+ − 1394
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1395
function strip_nul_chars($arr)
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1396
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1397
foreach($arr as $k => $xxxx_unused)
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1398
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1399
$val =& $arr[$k];
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1400
if(is_string($val))
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1401
$val = str_replace("\000", '', $val);
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1402
elseif(is_array($val))
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1403
$val = strip_nul_chars($val);
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1404
}
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1405
return $arr;
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1406
}
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1407
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1408
/**
76
+ − 1409
* If magic_quotes_gpc is on, calls stripslashes() on everything in $_GET/$_POST/$_COOKIE. Also strips any NUL characters from incoming requests, as these are typically malicious.
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1410
* @ignore - this doesn't work too well in my tests
1
+ − 1411
* @todo port version from the PHP manual
+ − 1412
* @return void
+ − 1413
*/
+ − 1414
function strip_magic_quotes_gpc()
+ − 1415
{
+ − 1416
if(enano_get_magic_quotes_gpc())
+ − 1417
{
40
+ − 1418
$_POST = stripslashes_recurse($_POST);
+ − 1419
$_GET = stripslashes_recurse($_GET);
+ − 1420
$_COOKIE = stripslashes_recurse($_COOKIE);
+ − 1421
$_REQUEST = stripslashes_recurse($_REQUEST);
1
+ − 1422
}
40
+ − 1423
$_POST = strip_nul_chars($_POST);
+ − 1424
$_GET = strip_nul_chars($_GET);
+ − 1425
$_COOKIE = strip_nul_chars($_COOKIE);
+ − 1426
$_REQUEST = strip_nul_chars($_REQUEST);
78
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1427
$_POST = decode_unicode_array($_POST);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1428
$_GET = decode_unicode_array($_GET);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1429
$_COOKIE = decode_unicode_array($_COOKIE);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1430
$_REQUEST = decode_unicode_array($_REQUEST);
1
+ − 1431
}
+ − 1432
+ − 1433
/**
+ − 1434
* A very basic single-character compression algorithm for binary strings/bitfields
76
+ − 1435
* @param string $bits the text to compress, should be only 1s and 0s
1
+ − 1436
* @return string
+ − 1437
*/
76
+ − 1438
1
+ − 1439
function compress_bitfield($bits)
+ − 1440
{
+ − 1441
$crc32 = crc32($bits);
+ − 1442
$bits .= '0';
+ − 1443
$start_pos = 0;
+ − 1444
$current = substr($bits, 1, 1);
+ − 1445
$last = substr($bits, 0, 1);
+ − 1446
$chunk_size = 1;
+ − 1447
$len = strlen($bits);
+ − 1448
$crc = $len;
+ − 1449
$crcval = 0;
+ − 1450
for ( $i = 1; $i < $len; $i++ )
+ − 1451
{
+ − 1452
$current = substr($bits, $i, 1);
+ − 1453
$last = substr($bits, $i - 1, 1);
+ − 1454
$next = substr($bits, $i + 1, 1);
+ − 1455
// Are we on the last character?
+ − 1456
if($current == $last && $i+1 < $len)
+ − 1457
$chunk_size++;
+ − 1458
else
+ − 1459
{
+ − 1460
if($i+1 == $len && $current == $next)
+ − 1461
{
+ − 1462
// This character completes a chunk
+ − 1463
$chunk_size++;
+ − 1464
$i++;
+ − 1465
$chunk = substr($bits, $start_pos, $chunk_size);
+ − 1466
$chunklen = strlen($chunk);
+ − 1467
$newchunk = $last . '[' . $chunklen . ']';
+ − 1468
$newlen = strlen($newchunk);
+ − 1469
$bits = substr($bits, 0, $start_pos) . $newchunk . substr($bits, $i, $len);
+ − 1470
$chunk_size = 1;
+ − 1471
$i = $start_pos + $newlen;
+ − 1472
$start_pos = $i;
+ − 1473
$len = strlen($bits);
+ − 1474
$crcval = $crcval + $chunklen;
+ − 1475
}
+ − 1476
else
+ − 1477
{
+ − 1478
// Last character completed a chunk
+ − 1479
$chunk = substr($bits, $start_pos, $chunk_size);
+ − 1480
$chunklen = strlen($chunk);
+ − 1481
$newchunk = $last . '[' . $chunklen . '],';
+ − 1482
$newlen = strlen($newchunk);
+ − 1483
$bits = substr($bits, 0, $start_pos) . $newchunk . substr($bits, $i, $len);
+ − 1484
$chunk_size = 1;
+ − 1485
$i = $start_pos + $newlen;
+ − 1486
$start_pos = $i;
+ − 1487
$len = strlen($bits);
+ − 1488
$crcval = $crcval + $chunklen;
+ − 1489
}
+ − 1490
}
+ − 1491
}
+ − 1492
if($crc != $crcval)
+ − 1493
{
+ − 1494
echo __FUNCTION__.'(): ERROR: length check failed, this is a bug in the algorithm<br />Debug info: aiming for a CRC val of '.$crc.', got '.$crcval;
+ − 1495
return false;
+ − 1496
}
+ − 1497
$compressed = 'cbf:len='.$crc.';crc='.dechex($crc32).';data='.$bits.'|end';
+ − 1498
return $compressed;
+ − 1499
}
+ − 1500
+ − 1501
/**
+ − 1502
* Uncompresses a bitfield compressed with compress_bitfield()
+ − 1503
* @param string $bits the compressed bitfield
+ − 1504
* @return string the uncompressed, original (we hope) bitfield OR bool false on error
+ − 1505
*/
76
+ − 1506
1
+ − 1507
function uncompress_bitfield($bits)
+ − 1508
{
+ − 1509
if(substr($bits, 0, 4) != 'cbf:')
+ − 1510
{
+ − 1511
echo __FUNCTION__.'(): ERROR: Invalid stream';
+ − 1512
return false;
+ − 1513
}
+ − 1514
$len = intval(substr($bits, strpos($bits, 'len=')+4, strpos($bits, ';')-strpos($bits, 'len=')-4));
+ − 1515
$crc = substr($bits, strpos($bits, 'crc=')+4, 8);
+ − 1516
$data = substr($bits, strpos($bits, 'data=')+5, strpos($bits, '|end')-strpos($bits, 'data=')-5);
+ − 1517
$data = explode(',', $data);
+ − 1518
foreach($data as $a => $b)
+ − 1519
{
+ − 1520
$d =& $data[$a];
+ − 1521
$char = substr($d, 0, 1);
+ − 1522
$dlen = intval(substr($d, 2, strlen($d)-1));
+ − 1523
$s = '';
+ − 1524
for($i=0;$i<$dlen;$i++,$s.=$char);
+ − 1525
$d = $s;
+ − 1526
unset($s, $dlen, $char);
+ − 1527
}
+ − 1528
$decompressed = implode('', $data);
+ − 1529
$decompressed = substr($decompressed, 0, -1);
+ − 1530
$dcrc = (string)dechex(crc32($decompressed));
+ − 1531
if($dcrc != $crc)
+ − 1532
{
+ − 1533
echo __FUNCTION__.'(): ERROR: CRC check failed<br />debug info:<br />original crc: '.$crc.'<br />decomp\'ed crc: '.$dcrc.'<br />';
+ − 1534
return false;
+ − 1535
}
+ − 1536
return $decompressed;
+ − 1537
}
+ − 1538
+ − 1539
/**
+ − 1540
* Exports a MySQL table into a SQL string.
+ − 1541
* @param string $table The name of the table to export
+ − 1542
* @param bool $structure If true, include a CREATE TABLE command
+ − 1543
* @param bool $data If true, include the contents of the table
+ − 1544
* @param bool $compact If true, omits newlines between parts of SQL statements, use in Enano database exporter
+ − 1545
* @return string
+ − 1546
*/
+ − 1547
+ − 1548
function export_table($table, $structure = true, $data = true, $compact = false)
+ − 1549
{
+ − 1550
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 1551
$struct_keys = '';
+ − 1552
$divider = (!$compact) ? "\n" : "\n";
+ − 1553
$spacer1 = (!$compact) ? "\n" : " ";
+ − 1554
$spacer2 = (!$compact) ? " " : " ";
+ − 1555
$rowspacer = (!$compact) ? "\n " : " ";
+ − 1556
$index_list = Array();
+ − 1557
$cols = $db->sql_query('SHOW COLUMNS IN '.$table.';');
+ − 1558
if(!$cols)
+ − 1559
{
+ − 1560
echo 'export_table(): Error getting column list: '.$db->get_error_text().'<br />';
+ − 1561
return false;
+ − 1562
}
+ − 1563
$col = Array();
+ − 1564
$sqlcol = Array();
+ − 1565
$collist = Array();
+ − 1566
$pri_keys = Array();
+ − 1567
// Using fetchrow_num() here to compensate for MySQL l10n
+ − 1568
while( $row = $db->fetchrow_num() )
+ − 1569
{
+ − 1570
$field =& $row[0];
+ − 1571
$type =& $row[1];
+ − 1572
$null =& $row[2];
+ − 1573
$key =& $row[3];
+ − 1574
$def =& $row[4];
+ − 1575
$extra =& $row[5];
+ − 1576
$col[] = Array(
+ − 1577
'name'=>$field,
+ − 1578
'type'=>$type,
+ − 1579
'null'=>$null,
+ − 1580
'key'=>$key,
+ − 1581
'default'=>$def,
+ − 1582
'extra'=>$extra,
+ − 1583
);
+ − 1584
$collist[] = $field;
+ − 1585
}
76
+ − 1586
1
+ − 1587
if ( $structure )
+ − 1588
{
+ − 1589
$db->sql_query('SET SQL_QUOTE_SHOW_CREATE = 0;');
+ − 1590
$struct = $db->sql_query('SHOW CREATE TABLE '.$table.';');
+ − 1591
if ( !$struct )
+ − 1592
$db->_die();
+ − 1593
$row = $db->fetchrow_num();
+ − 1594
$db->free_result();
+ − 1595
$struct = $row[1];
+ − 1596
$struct = preg_replace("/\n\) ENGINE=(.+)$/", "\n);", $struct);
+ − 1597
unset($row);
+ − 1598
if ( $compact )
+ − 1599
{
+ − 1600
$struct_arr = explode("\n", $struct);
+ − 1601
foreach ( $struct_arr as $i => $leg )
+ − 1602
{
+ − 1603
if ( $i == 0 )
+ − 1604
continue;
+ − 1605
$test = trim($leg);
+ − 1606
if ( empty($test) )
+ − 1607
{
+ − 1608
unset($struct_arr[$i]);
+ − 1609
continue;
+ − 1610
}
+ − 1611
$struct_arr[$i] = preg_replace('/^([\s]*)/', ' ', $leg);
+ − 1612
}
+ − 1613
$struct = implode("", $struct_arr);
+ − 1614
}
+ − 1615
}
76
+ − 1616
1
+ − 1617
// Structuring complete
+ − 1618
if($data)
+ − 1619
{
+ − 1620
$datq = $db->sql_query('SELECT * FROM '.$table.';');
+ − 1621
if(!$datq)
+ − 1622
{
+ − 1623
echo 'export_table(): Error getting column list: '.$db->get_error_text().'<br />';
+ − 1624
return false;
+ − 1625
}
+ − 1626
if($db->numrows() < 1)
+ − 1627
{
+ − 1628
if($structure) return $struct;
+ − 1629
else return '';
+ − 1630
}
+ − 1631
$rowdata = Array();
+ − 1632
$dataqs = Array();
+ − 1633
$insert_strings = Array();
+ − 1634
$z = false;
+ − 1635
while($row = $db->fetchrow_num())
+ − 1636
{
+ − 1637
$z = false;
+ − 1638
foreach($row as $i => $cell)
+ − 1639
{
+ − 1640
$str = mysql_encode_column($cell, $col[$i]['type']);
+ − 1641
$rowdata[] = $str;
+ − 1642
}
+ − 1643
$dataqs2 = implode(",$rowspacer", $dataqs) . ",$rowspacer" . '( ' . implode(', ', $rowdata) . ' )';
+ − 1644
$ins = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . $dataqs2 . ";";
+ − 1645
if ( strlen( $ins ) > MYSQL_MAX_PACKET_SIZE )
+ − 1646
{
+ − 1647
// We've exceeded the maximum allowed packet size for MySQL - separate this into a different query
+ − 1648
$insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";;
+ − 1649
$dataqs = Array('( ' . implode(', ', $rowdata) . ' )');
+ − 1650
$z = true;
+ − 1651
}
+ − 1652
else
+ − 1653
{
+ − 1654
$dataqs[] = '( ' . implode(', ', $rowdata) . ' )';
+ − 1655
}
+ − 1656
$rowdata = Array();
+ − 1657
}
+ − 1658
if ( !$z )
+ − 1659
{
+ − 1660
$insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";;
+ − 1661
$dataqs = Array();
+ − 1662
}
+ − 1663
$datstring = implode($divider, $insert_strings);
+ − 1664
}
+ − 1665
if($structure && !$data) return $struct;
+ − 1666
elseif(!$structure && $data) return $datstring;
+ − 1667
elseif($structure && $data) return $struct . $divider . $datstring;
+ − 1668
elseif(!$structure && !$data) return '';
+ − 1669
}
+ − 1670
+ − 1671
/**
+ − 1672
* Encodes a string value for use in an INSERT statement for given column type $type.
+ − 1673
* @access private
+ − 1674
*/
76
+ − 1675
1
+ − 1676
function mysql_encode_column($input, $type)
+ − 1677
{
+ − 1678
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 1679
// Decide whether to quote the string or not
+ − 1680
if(substr($type, 0, 7) == 'varchar' || $type == 'datetime' || $type == 'text' || $type == 'tinytext' || $type == 'smalltext' || $type == 'longtext' || substr($type, 0, 4) == 'char')
+ − 1681
{
+ − 1682
$str = "'" . $db->escape($input) . "'";
+ − 1683
}
+ − 1684
elseif(in_array($type, Array('blob', 'longblob', 'mediumblob', 'smallblob')) || substr($type, 0, 6) == 'binary' || substr($type, 0, 9) == 'varbinary')
+ − 1685
{
+ − 1686
$str = '0x' . hexencode($input, '', '');
+ − 1687
}
+ − 1688
elseif(is_null($input))
+ − 1689
{
+ − 1690
$str = 'NULL';
+ − 1691
}
+ − 1692
else
+ − 1693
{
+ − 1694
$str = (string)$input;
+ − 1695
}
+ − 1696
return $str;
+ − 1697
}
+ − 1698
+ − 1699
/**
+ − 1700
* Creates an associative array defining which file extensions are allowed and which ones aren't
+ − 1701
* @return array keyname will be a file extension, value will be true or false
+ − 1702
*/
+ − 1703
+ − 1704
function fetch_allowed_extensions()
+ − 1705
{
+ − 1706
global $mime_types;
+ − 1707
$bits = getConfig('allowed_mime_types');
+ − 1708
if(!$bits) return Array(false);
+ − 1709
$bits = uncompress_bitfield($bits);
+ − 1710
if(!$bits) return Array(false);
+ − 1711
$bits = enano_str_split($bits, 1);
+ − 1712
$ret = Array();
+ − 1713
$mt = array_keys($mime_types);
+ − 1714
foreach($bits as $i => $b)
+ − 1715
{
+ − 1716
$ret[$mt[$i]] = ( $b == '1' ) ? true : false;
+ − 1717
}
+ − 1718
return $ret;
+ − 1719
}
+ − 1720
+ − 1721
/**
+ − 1722
* Generates a random key suitable for encryption
+ − 1723
* @param int $len the length of the key
+ − 1724
* @return string a BINARY key
+ − 1725
*/
+ − 1726
+ − 1727
function randkey($len = 32)
+ − 1728
{
+ − 1729
$key = '';
+ − 1730
for($i=0;$i<$len;$i++)
+ − 1731
{
+ − 1732
$key .= chr(mt_rand(0, 255));
+ − 1733
}
+ − 1734
return $key;
+ − 1735
}
+ − 1736
+ − 1737
/**
+ − 1738
* Decodes a hex string.
+ − 1739
* @param string $hex The hex code to decode
+ − 1740
* @return string
+ − 1741
*/
+ − 1742
+ − 1743
function hexdecode($hex)
+ − 1744
{
+ − 1745
$hex = enano_str_split($hex, 2);
+ − 1746
$bin_key = '';
+ − 1747
foreach($hex as $nibble)
+ − 1748
{
+ − 1749
$byte = chr(hexdec($nibble));
+ − 1750
$bin_key .= $byte;
+ − 1751
}
+ − 1752
return $bin_key;
+ − 1753
}
+ − 1754
+ − 1755
/**
+ − 1756
* Enano's own (almost) bulletproof HTML sanitizer.
+ − 1757
* @param string $html The input HTML
+ − 1758
* @return string cleaned HTML
+ − 1759
*/
+ − 1760
+ − 1761
function sanitize_html($html, $filter_php = true)
+ − 1762
{
76
+ − 1763
1
+ − 1764
$html = preg_replace('#<([a-z]+)([\s]+)([^>]+?)'.htmlalternatives('javascript:').'(.+?)>(.*?)</\\1>#is', '<\\1\\2\\3javascript:\\59>\\60</\\1>', $html);
+ − 1765
$html = preg_replace('#<([a-z]+)([\s]+)([^>]+?)'.htmlalternatives('javascript:').'(.+?)>#is', '<\\1\\2\\3javascript:\\59>', $html);
76
+ − 1766
1
+ − 1767
if($filter_php)
+ − 1768
$html = str_replace(
+ − 1769
Array('<?php', '<?', '<%', '?>', '%>'),
+ − 1770
Array('<?php', '<?', '<%', '?>', '%>'),
+ − 1771
$html);
76
+ − 1772
1
+ − 1773
$tag_whitelist = array_keys ( setupAttributeWhitelist() );
+ − 1774
if ( !$filter_php )
+ − 1775
$tag_whitelist[] = '?php';
+ − 1776
$len = strlen($html);
+ − 1777
$in_quote = false;
+ − 1778
$quote_char = '';
+ − 1779
$tag_start = 0;
+ − 1780
$tag_name = '';
+ − 1781
$in_tag = false;
+ − 1782
$trk_name = false;
+ − 1783
for ( $i = 0; $i < $len; $i++ )
+ − 1784
{
+ − 1785
$chr = $html{$i};
+ − 1786
$prev = ( $i == 0 ) ? '' : $html{ $i - 1 };
+ − 1787
$next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 };
+ − 1788
if ( $in_quote && $in_tag )
+ − 1789
{
+ − 1790
if ( $quote_char == $chr && $prev != '\\' )
+ − 1791
$in_quote = false;
+ − 1792
}
+ − 1793
elseif ( ( $chr == '"' || $chr == "'" ) && $prev != '\\' && $in_tag )
+ − 1794
{
+ − 1795
$in_quote = true;
+ − 1796
$quote_char = $chr;
+ − 1797
}
+ − 1798
if ( $chr == '<' && !$in_tag && $next != '/' )
76
+ − 1799
{
1
+ − 1800
// start of a tag
+ − 1801
$tag_start = $i;
+ − 1802
$in_tag = true;
+ − 1803
$trk_name = true;
+ − 1804
}
+ − 1805
elseif ( !$in_quote && $in_tag && $chr == '>' )
+ − 1806
{
+ − 1807
$full_tag = substr($html, $tag_start, ( $i - $tag_start ) + 1 );
+ − 1808
$l = strlen($tag_name) + 2;
+ − 1809
$attribs_only = trim( substr($full_tag, $l, ( strlen($full_tag) - $l - 1 ) ) );
76
+ − 1810
1
+ − 1811
// Debugging message
+ − 1812
// echo htmlspecialchars($full_tag) . '<br />';
76
+ − 1813
1
+ − 1814
if ( !in_array($tag_name, $tag_whitelist) )
+ − 1815
{
+ − 1816
// Illegal tag
+ − 1817
//echo $tag_name . ' ';
76
+ − 1818
1
+ − 1819
$s = ( empty($attribs_only) ) ? '' : ' ';
76
+ − 1820
1
+ − 1821
$sanitized = '<' . $tag_name . $s . $attribs_only . '>';
76
+ − 1822
1
+ − 1823
$html = substr($html, 0, $tag_start) . $sanitized . substr($html, $i + 1);
+ − 1824
$html = str_replace('</' . $tag_name . '>', '</' . $tag_name . '>', $html);
+ − 1825
$new_i = $tag_start + strlen($sanitized);
76
+ − 1826
1
+ − 1827
$len = strlen($html);
+ − 1828
$i = $new_i;
76
+ − 1829
1
+ − 1830
$in_tag = false;
+ − 1831
$tag_name = '';
+ − 1832
continue;
+ − 1833
}
+ − 1834
else
+ − 1835
{
+ − 1836
if ( $tag_name == '?php' && !$filter_php )
+ − 1837
continue;
+ − 1838
$f = fixTagAttributes( $attribs_only, $tag_name );
+ − 1839
$s = ( empty($f) ) ? '' : ' ';
76
+ − 1840
1
+ − 1841
$sanitized = '<' . $tag_name . $f . '>';
+ − 1842
$new_i = $tag_start + strlen($sanitized);
76
+ − 1843
1
+ − 1844
$html = substr($html, 0, $tag_start) . $sanitized . substr($html, $i + 1);
+ − 1845
$len = strlen($html);
+ − 1846
$i = $new_i;
76
+ − 1847
1
+ − 1848
$in_tag = false;
+ − 1849
$tag_name = '';
+ − 1850
continue;
+ − 1851
}
+ − 1852
}
+ − 1853
elseif ( $in_tag && $trk_name )
+ − 1854
{
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 1855
$is_alphabetical = ( strtolower($chr) != strtoupper($chr) || in_array($chr, array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) || $chr == '?' || $chr == '!' || $chr == '-' );
1
+ − 1856
if ( $is_alphabetical )
+ − 1857
$tag_name .= $chr;
+ − 1858
else
+ − 1859
{
+ − 1860
$trk_name = false;
+ − 1861
}
+ − 1862
}
76
+ − 1863
1
+ − 1864
}
76
+ − 1865
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1866
// Vulnerability from ha.ckers.org/xss.html:
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1867
// <script src="http://foo.com/xss.js"
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1868
// <
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1869
// The rule is so specific because everything else will have been filtered by now
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1870
$html = preg_replace('/<(script|iframe)(.+?)src=([^>]*)</i', '<\\1\\2src=\\3<', $html);
76
+ − 1871
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 1872
// Unstrip comments
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 1873
$html = preg_replace('/<!--([^>]*?)-->/i', '', $html);
76
+ − 1874
1
+ − 1875
return $html;
76
+ − 1876
1
+ − 1877
}
+ − 1878
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1879
/**
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1880
* Using the same parsing code as sanitize_html(), this function adds <litewiki> tags around certain block-level elements
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1881
* @param string $html The input HTML
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1882
* @return string formatted HTML
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1883
*/
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1884
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1885
function wikiformat_process_block($html)
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1886
{
76
+ − 1887
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1888
$tok1 = "<litewiki>";
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1889
$tok2 = "</litewiki>";
76
+ − 1890
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1891
$block_tags = array('div', 'p', 'table', 'blockquote', 'pre');
76
+ − 1892
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1893
$len = strlen($html);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1894
$in_quote = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1895
$quote_char = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1896
$tag_start = 0;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1897
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1898
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1899
$trk_name = false;
76
+ − 1900
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1901
$diag = 0;
76
+ − 1902
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1903
$block_tagname = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1904
$in_blocksec = 0;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1905
$block_start = 0;
76
+ − 1906
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1907
for ( $i = 0; $i < $len; $i++ )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1908
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1909
$chr = $html{$i};
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1910
$prev = ( $i == 0 ) ? '' : $html{ $i - 1 };
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1911
$next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 };
76
+ − 1912
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1913
// Are we inside of a quoted section?
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1914
if ( $in_quote && $in_tag )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1915
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1916
if ( $quote_char == $chr && $prev != '\\' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1917
$in_quote = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1918
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1919
elseif ( ( $chr == '"' || $chr == "'" ) && $prev != '\\' && $in_tag )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1920
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1921
$in_quote = true;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1922
$quote_char = $chr;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1923
}
76
+ − 1924
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1925
if ( $chr == '<' && !$in_tag && $next == '/' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1926
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1927
// Iterate through until we've got a tag name
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1928
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1929
$i++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1930
while(true)
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1931
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1932
$i++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1933
// echo $i . ' ';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1934
$chr = $html{$i};
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1935
$prev = ( $i == 0 ) ? '' : $html{ $i - 1 };
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1936
$next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 };
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1937
$tag_name .= $chr;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1938
if ( $next == '>' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1939
break;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1940
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1941
// echo '<br />';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1942
if ( in_array($tag_name, $block_tags) )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1943
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1944
if ( $block_tagname == $tag_name )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1945
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1946
$in_blocksec -= 1;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1947
if ( $in_blocksec == 0 )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1948
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1949
$block_tagname = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1950
$i += 2;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1951
// echo 'Finished wiki litewiki wraparound calc at pos: ' . $i;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1952
$full_litewiki = substr($html, $block_start, ( $i - $block_start ));
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1953
$new_text = "{$tok1}{$full_litewiki}{$tok2}";
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1954
$html = substr($html, 0, $block_start) . $new_text . substr($html, $i);
76
+ − 1955
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1956
$i += ( strlen($tok1) + strlen($tok2) ) - 1;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1957
$len = strlen($html);
76
+ − 1958
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1959
//die('<pre>' . htmlspecialchars($html) . '</pre>');
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1960
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1961
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1962
}
76
+ − 1963
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1964
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1965
$in_quote = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1966
$tag_name = '';
76
+ − 1967
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1968
continue;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1969
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1970
else if ( $chr == '<' && !$in_tag && $next != '/' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1971
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1972
// start of a tag
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1973
$tag_start = $i;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1974
$in_tag = true;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1975
$trk_name = true;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1976
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1977
else if ( !$in_quote && $in_tag && $chr == '>' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1978
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1979
if ( !in_array($tag_name, $block_tags) )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1980
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1981
// Inline tag - reset and go to the next one
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1982
// echo '<inline ' . $tag_name . '> ';
76
+ − 1983
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1984
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1985
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1986
continue;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1987
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1988
else
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1989
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1990
// echo '<block: ' . $tag_name . ' @ ' . $i . '><br/>';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1991
if ( $in_blocksec == 0 )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1992
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1993
//die('Found a starting tag for a block element: ' . $tag_name . ' at pos ' . $tag_start);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1994
$block_tagname = $tag_name;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1995
$block_start = $tag_start;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1996
$in_blocksec++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1997
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1998
else if ( $block_tagname == $tag_name )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1999
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2000
$in_blocksec++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2001
}
76
+ − 2002
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2003
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2004
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2005
continue;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2006
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2007
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2008
elseif ( $in_tag && $trk_name )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2009
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2010
$is_alphabetical = ( strtolower($chr) != strtoupper($chr) || in_array($chr, array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) || $chr == '?' || $chr == '!' || $chr == '-' );
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2011
if ( $is_alphabetical )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2012
$tag_name .= $chr;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2013
else
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2014
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2015
$trk_name = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2016
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2017
}
76
+ − 2018
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2019
// Tokenization complete
76
+ − 2020
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2021
}
76
+ − 2022
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2023
$regex = '/' . str_replace('/', '\\/', preg_quote($tok2)) . '([\s]*)' . preg_quote($tok1) . '/is';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2024
// die(htmlspecialchars($regex));
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2025
$html = preg_replace($regex, '\\1', $html);
76
+ − 2026
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2027
return $html;
76
+ − 2028
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2029
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2030
1
+ − 2031
function htmlalternatives($string)
+ − 2032
{
+ − 2033
$ret = '';
+ − 2034
for ( $i = 0; $i < strlen($string); $i++ )
+ − 2035
{
+ − 2036
$chr = $string{$i};
+ − 2037
$ch1 = ord($chr);
+ − 2038
$ch2 = dechex($ch1);
+ − 2039
$byte = '(&\\#([0]*){0,7}' . $ch1 . ';|\\\\([0]*){0,7}' . $ch1 . ';|\\\\([0]*){0,7}' . $ch2 . ';|&\\#x([0]*){0,7}' . $ch2 . ';|%([0]*){0,7}' . $ch2 . '|' . preg_quote($chr) . ')';
+ − 2040
$ret .= $byte;
+ − 2041
$ret .= '([\s]){0,2}';
+ − 2042
}
+ − 2043
return $ret;
+ − 2044
}
+ − 2045
+ − 2046
/**
+ − 2047
* Paginates (breaks into multiple pages) a MySQL result resource, which is treated as unbuffered.
+ − 2048
* @param resource The MySQL result resource. This should preferably be an unbuffered query.
+ − 2049
* @param string A template, with variables being named after the column name
+ − 2050
* @param int The number of total results. This should be determined by a second query.
+ − 2051
* @param string sprintf-style formatting string for URLs for result pages. First parameter will be start offset.
+ − 2052
* @param int Optional. Start offset in individual results. Defaults to 0.
+ − 2053
* @param int Optional. The number of results per page. Defualts to 10.
+ − 2054
* @param int Optional. An associative array of functions to call, with key names being column names, and values being function names. Values can also be an array with key 0 being either an object or a string(class name) and key 1 being a [static] method.
+ − 2055
* @param string Optional. The text to be sent before the result list, only if there are any results. Possibly the start of a table.
+ − 2056
* @param string Optional. The text to be sent after the result list, only if there are any results. Possibly the end of a table.
+ − 2057
* @return string
+ − 2058
*/
+ − 2059
+ − 2060
function paginate($q, $tpl_text, $num_results, $result_url, $start = 0, $perpage = 10, $callers = Array(), $header = '', $footer = '')
+ − 2061
{
+ − 2062
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 2063
$parser = $template->makeParserText($tpl_text);
+ − 2064
$num_pages = ceil ( $num_results / $perpage );
+ − 2065
$out = '';
+ − 2066
$i = 0;
+ − 2067
$this_page = ceil ( $start / $perpage );
76
+ − 2068
1
+ − 2069
// Build paginator
82
+ − 2070
$pg_css = ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) ?
+ − 2071
// IE-specific hack
+ − 2072
'display: block; width: 1px;':
+ − 2073
// Other browsers
+ − 2074
'display: table; margin: 10px 0 0 auto;';
+ − 2075
$begin = '<div class="tblholder" style="'. $pg_css . '">
1
+ − 2076
<table border="0" cellspacing="1" cellpadding="4">
+ − 2077
<tr><th>Page:</th>';
+ − 2078
$block = '<td class="row1" style="text-align: center;">{LINK}</td>';
+ − 2079
$end = '</tr></table></div>';
+ − 2080
$blk = $template->makeParserText($block);
+ − 2081
$inner = '';
+ − 2082
$cls = 'row2';
+ − 2083
if ( $num_pages < 5 )
+ − 2084
{
+ − 2085
for ( $i = 0; $i < $num_pages; $i++ )
+ − 2086
{
+ − 2087
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2088
$offset = strval($i * $perpage);
76
+ − 2089
$url = htmlspecialchars(sprintf($result_url, $offset));
1
+ − 2090
$j = $i + 1;
+ − 2091
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2092
$blk->assign_vars(array(
+ − 2093
'CLASS'=>$cls,
+ − 2094
'LINK'=>$link
+ − 2095
));
+ − 2096
$inner .= $blk->run();
+ − 2097
}
+ − 2098
}
+ − 2099
else
+ − 2100
{
+ − 2101
if ( $this_page + 5 > $num_pages )
+ − 2102
{
+ − 2103
$list = Array();
+ − 2104
$tp = $this_page;
+ − 2105
if ( $this_page + 0 == $num_pages ) $tp = $tp - 3;
+ − 2106
if ( $this_page + 1 == $num_pages ) $tp = $tp - 2;
+ − 2107
if ( $this_page + 2 == $num_pages ) $tp = $tp - 1;
+ − 2108
for ( $i = $tp - 1; $i <= $tp + 1; $i++ )
+ − 2109
{
+ − 2110
$list[] = $i;
+ − 2111
}
+ − 2112
}
+ − 2113
else
+ − 2114
{
+ − 2115
$list = Array();
+ − 2116
$current = $this_page;
+ − 2117
$lower = ( $current < 3 ) ? 1 : $current - 1;
+ − 2118
for ( $i = 0; $i < 3; $i++ )
+ − 2119
{
+ − 2120
$list[] = $lower + $i;
+ − 2121
}
+ − 2122
}
+ − 2123
$url = sprintf($result_url, '0');
+ − 2124
$link = ( 0 == $start ) ? "<b>First</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>« First</a>";
+ − 2125
$blk->assign_vars(array(
+ − 2126
'CLASS'=>$cls,
+ − 2127
'LINK'=>$link
+ − 2128
));
+ − 2129
$inner .= $blk->run();
76
+ − 2130
1
+ − 2131
// if ( !in_array(1, $list) )
+ − 2132
// {
+ − 2133
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2134
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2135
// $inner .= $blk->run();
+ − 2136
// }
76
+ − 2137
1
+ − 2138
foreach ( $list as $i )
+ − 2139
{
+ − 2140
if ( $i == $num_pages )
+ − 2141
break;
+ − 2142
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2143
$offset = strval($i * $perpage);
+ − 2144
$url = sprintf($result_url, $offset);
+ − 2145
$j = $i + 1;
+ − 2146
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2147
$blk->assign_vars(array(
+ − 2148
'CLASS'=>$cls,
+ − 2149
'LINK'=>$link
+ − 2150
));
+ − 2151
$inner .= $blk->run();
+ − 2152
}
76
+ − 2153
1
+ − 2154
$total = $num_pages * $perpage - $perpage;
76
+ − 2155
1
+ − 2156
if ( $this_page < $num_pages )
+ − 2157
{
+ − 2158
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2159
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2160
// $inner .= $blk->run();
76
+ − 2161
1
+ − 2162
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2163
$offset = strval($total);
+ − 2164
$url = sprintf($result_url, $offset);
+ − 2165
$j = $i + 1;
+ − 2166
$link = ( $offset == strval($start) ) ? "<b>Last</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>Last »</a>";
+ − 2167
$blk->assign_vars(array(
+ − 2168
'CLASS'=>$cls,
+ − 2169
'LINK'=>$link
+ − 2170
));
+ − 2171
$inner .= $blk->run();
+ − 2172
}
76
+ − 2173
1
+ − 2174
}
76
+ − 2175
1
+ − 2176
$inner .= '<td class="row2" style="cursor: pointer;" onclick="paginator_goto(this, '.$this_page.', '.$num_pages.', '.$perpage.', unescape(\'' . rawurlencode($result_url) . '\'));">↓</td>';
76
+ − 2177
1
+ − 2178
$paginator = "\n$begin$inner$end\n";
+ − 2179
$out .= $paginator;
76
+ − 2180
1
+ − 2181
$cls = 'row2';
76
+ − 2182
1
+ − 2183
if ( $row = $db->fetchrow($q) )
+ − 2184
{
+ − 2185
$i = 0;
+ − 2186
$out .= $header;
+ − 2187
do {
+ − 2188
$i++;
+ − 2189
if ( $i <= $start )
+ − 2190
{
+ − 2191
continue;
+ − 2192
}
+ − 2193
if ( ( $i - $start ) > $perpage )
+ − 2194
{
+ − 2195
break;
+ − 2196
}
+ − 2197
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2198
foreach ( $row as $j => $val )
+ − 2199
{
+ − 2200
if ( isset($callers[$j]) )
+ − 2201
{
74
68469a95658d
Various bugfixes and cleanups, too much to remember... see the diffs for what got changed :-)
Dan
diff
changeset
+ − 2202
$tmp = ( is_callable($callers[$j]) ) ? @call_user_func($callers[$j], $val, $row) : $val;
76
+ − 2203
1
+ − 2204
if ( $tmp )
+ − 2205
{
+ − 2206
$row[$j] = $tmp;
+ − 2207
}
+ − 2208
}
+ − 2209
}
+ − 2210
$parser->assign_vars($row);
+ − 2211
$parser->assign_vars(array('_css_class' => $cls));
+ − 2212
$out .= $parser->run();
+ − 2213
} while ( $row = $db->fetchrow($q) );
+ − 2214
$out .= $footer;
+ − 2215
}
76
+ − 2216
1
+ − 2217
$out .= $paginator;
76
+ − 2218
1
+ − 2219
return $out;
+ − 2220
}
+ − 2221
+ − 2222
/**
+ − 2223
* This is the same as paginate(), but it processes an array instead of a MySQL result resource.
+ − 2224
* @param array The results. Each value is simply echoed.
+ − 2225
* @param int The number of total results. This should be determined by a second query.
+ − 2226
* @param string sprintf-style formatting string for URLs for result pages. First parameter will be start offset.
+ − 2227
* @param int Optional. Start offset in individual results. Defaults to 0.
+ − 2228
* @param int Optional. The number of results per page. Defualts to 10.
+ − 2229
* @param string Optional. The text to be sent before the result list, only if there are any results. Possibly the start of a table.
+ − 2230
* @param string Optional. The text to be sent after the result list, only if there are any results. Possibly the end of a table.
+ − 2231
* @return string
+ − 2232
*/
+ − 2233
+ − 2234
function paginate_array($q, $num_results, $result_url, $start = 0, $perpage = 10, $header = '', $footer = '')
+ − 2235
{
+ − 2236
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 2237
$parser = $template->makeParserText($tpl_text);
+ − 2238
$num_pages = ceil ( $num_results / $perpage );
+ − 2239
$out = '';
+ − 2240
$i = 0;
+ − 2241
$this_page = ceil ( $start / $perpage );
76
+ − 2242
1
+ − 2243
// Build paginator
+ − 2244
$begin = '<div class="tblholder" style="display: table; margin: 10px 0 0 auto;">
+ − 2245
<table border="0" cellspacing="1" cellpadding="4">
+ − 2246
<tr><th>Page:</th>';
+ − 2247
$block = '<td class="row1" style="text-align: center;">{LINK}</td>';
+ − 2248
$end = '</tr></table></div>';
+ − 2249
$blk = $template->makeParserText($block);
+ − 2250
$inner = '';
+ − 2251
$cls = 'row2';
+ − 2252
if ( $start > 0 )
+ − 2253
{
+ − 2254
$url = sprintf($result_url, abs($start - $perpage));
+ − 2255
$link = "<a href=".'"'."$url".'"'." style='text-decoration: none;'>« Prev</a>";
+ − 2256
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2257
$blk->assign_vars(array(
+ − 2258
'CLASS'=>$cls,
+ − 2259
'LINK'=>$link
+ − 2260
));
+ − 2261
$inner .= $blk->run();
+ − 2262
}
+ − 2263
if ( $num_pages < 5 )
+ − 2264
{
+ − 2265
for ( $i = 0; $i < $num_pages; $i++ )
+ − 2266
{
+ − 2267
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2268
$offset = strval($i * $perpage);
76
+ − 2269
$url = htmlspecialchars(sprintf($result_url, $offset));
1
+ − 2270
$j = $i + 1;
+ − 2271
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2272
$blk->assign_vars(array(
+ − 2273
'CLASS'=>$cls,
+ − 2274
'LINK'=>$link
+ − 2275
));
+ − 2276
$inner .= $blk->run();
+ − 2277
}
+ − 2278
}
+ − 2279
else
+ − 2280
{
+ − 2281
if ( $this_page + 5 > $num_pages )
+ − 2282
{
+ − 2283
$list = Array();
+ − 2284
$tp = $this_page;
+ − 2285
if ( $this_page + 0 == $num_pages ) $tp = $tp - 3;
+ − 2286
if ( $this_page + 1 == $num_pages ) $tp = $tp - 2;
+ − 2287
if ( $this_page + 2 == $num_pages ) $tp = $tp - 1;
+ − 2288
for ( $i = $tp - 1; $i <= $tp + 1; $i++ )
+ − 2289
{
+ − 2290
$list[] = $i;
+ − 2291
}
+ − 2292
}
+ − 2293
else
+ − 2294
{
+ − 2295
$list = Array();
+ − 2296
$current = $this_page;
+ − 2297
$lower = ( $current < 3 ) ? 1 : $current - 1;
+ − 2298
for ( $i = 0; $i < 3; $i++ )
+ − 2299
{
+ − 2300
$list[] = $lower + $i;
+ − 2301
}
+ − 2302
}
+ − 2303
$url = sprintf($result_url, '0');
+ − 2304
$link = ( 0 == $start ) ? "<b>First</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>« First</a>";
+ − 2305
$blk->assign_vars(array(
+ − 2306
'CLASS'=>$cls,
+ − 2307
'LINK'=>$link
+ − 2308
));
+ − 2309
$inner .= $blk->run();
76
+ − 2310
1
+ − 2311
// if ( !in_array(1, $list) )
+ − 2312
// {
+ − 2313
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2314
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2315
// $inner .= $blk->run();
+ − 2316
// }
76
+ − 2317
1
+ − 2318
foreach ( $list as $i )
+ − 2319
{
+ − 2320
if ( $i == $num_pages )
+ − 2321
break;
+ − 2322
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2323
$offset = strval($i * $perpage);
+ − 2324
$url = sprintf($result_url, $offset);
+ − 2325
$j = $i + 1;
+ − 2326
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2327
$blk->assign_vars(array(
+ − 2328
'CLASS'=>$cls,
+ − 2329
'LINK'=>$link
+ − 2330
));
+ − 2331
$inner .= $blk->run();
+ − 2332
}
76
+ − 2333
1
+ − 2334
$total = $num_pages * $perpage - $perpage;
76
+ − 2335
1
+ − 2336
if ( $this_page < $num_pages )
+ − 2337
{
+ − 2338
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2339
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2340
// $inner .= $blk->run();
76
+ − 2341
1
+ − 2342
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2343
$offset = strval($total);
+ − 2344
$url = sprintf($result_url, $offset);
+ − 2345
$j = $i + 1;
+ − 2346
$link = ( $offset == strval($start) ) ? "<b>Last</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>Last »</a>";
+ − 2347
$blk->assign_vars(array(
+ − 2348
'CLASS'=>$cls,
+ − 2349
'LINK'=>$link
+ − 2350
));
+ − 2351
$inner .= $blk->run();
+ − 2352
}
76
+ − 2353
1
+ − 2354
}
76
+ − 2355
1
+ − 2356
if ( $start < $total )
+ − 2357
{
+ − 2358
$url = sprintf($result_url, abs($start + $perpage));
+ − 2359
$link = "<a href=".'"'."$url".'"'." style='text-decoration: none;'>Next »</a>";
+ − 2360
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2361
$blk->assign_vars(array(
+ − 2362
'CLASS'=>$cls,
+ − 2363
'LINK'=>$link
+ − 2364
));
+ − 2365
$inner .= $blk->run();
+ − 2366
}
76
+ − 2367
1
+ − 2368
$inner .= '<td class="row2" style="cursor: pointer;" onclick="paginator_goto(this, '.$this_page.', '.$num_pages.', '.$perpage.', unescape(\'' . rawurlencode($result_url) . '\'));">↓</td>';
76
+ − 2369
1
+ − 2370
$paginator = "\n$begin$inner$end\n";
+ − 2371
if ( $total > 1 )
+ − 2372
$out .= $paginator;
76
+ − 2373
1
+ − 2374
$cls = 'row2';
76
+ − 2375
1
+ − 2376
if ( sizeof($q) > 0 )
+ − 2377
{
+ − 2378
$i = 0;
+ − 2379
$out .= $header;
+ − 2380
foreach ( $q as $val ) {
+ − 2381
$i++;
+ − 2382
if ( $i <= $start )
+ − 2383
{
+ − 2384
continue;
+ − 2385
}
+ − 2386
if ( ( $i - $start ) > $perpage )
+ − 2387
{
+ − 2388
break;
+ − 2389
}
+ − 2390
$out .= $val;
+ − 2391
}
+ − 2392
$out .= $footer;
+ − 2393
}
76
+ − 2394
1
+ − 2395
if ( $total > 1 )
+ − 2396
$out .= $paginator;
76
+ − 2397
1
+ − 2398
return $out;
+ − 2399
}
+ − 2400
76
+ − 2401
/**
1
+ − 2402
* Enano version of fputs for debugging
+ − 2403
*/
+ − 2404
+ − 2405
function enano_fputs($socket, $data)
+ − 2406
{
+ − 2407
// echo '<pre>' . htmlspecialchars($data) . '</pre>';
+ − 2408
// flush();
+ − 2409
// ob_flush();
+ − 2410
// ob_end_flush();
+ − 2411
return fputs($socket, $data);
+ − 2412
}
+ − 2413
+ − 2414
/**
+ − 2415
* Sanitizes a page URL string so that it can safely be stored in the database.
+ − 2416
* @param string Page ID to sanitize
+ − 2417
* @return string Cleaned text
+ − 2418
*/
+ − 2419
+ − 2420
function sanitize_page_id($page_id)
+ − 2421
{
76
+ − 2422
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2423
// Remove character escapes
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2424
$page_id = dirtify_page_id($page_id);
76
+ − 2425
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2426
$pid_clean = preg_replace('/[\w\.\/:;\(\)@\[\]_-]/', 'X', $page_id);
1
+ − 2427
$pid_dirty = enano_str_split($pid_clean, 1);
76
+ − 2428
1
+ − 2429
foreach ( $pid_dirty as $id => $char )
+ − 2430
{
+ − 2431
if ( $char == 'X' )
+ − 2432
continue;
+ − 2433
$cid = ord($char);
+ − 2434
$cid = dechex($cid);
+ − 2435
$cid = strval($cid);
+ − 2436
if ( strlen($cid) < 2 )
+ − 2437
{
+ − 2438
$cid = strtoupper("0$cid");
+ − 2439
}
+ − 2440
$pid_dirty[$id] = ".$cid";
+ − 2441
}
76
+ − 2442
1
+ − 2443
$pid_chars = enano_str_split($page_id, 1);
+ − 2444
$page_id_cleaned = '';
76
+ − 2445
1
+ − 2446
foreach ( $pid_chars as $id => $char )
+ − 2447
{
+ − 2448
if ( $pid_dirty[$id] == 'X' )
+ − 2449
$page_id_cleaned .= $char;
+ − 2450
else
+ − 2451
$page_id_cleaned .= $pid_dirty[$id];
+ − 2452
}
76
+ − 2453
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2454
// global $mime_types;
76
+ − 2455
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2456
// $exts = array_keys($mime_types);
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2457
// $exts = '(' . implode('|', $exts) . ')';
76
+ − 2458
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2459
// $page_id_cleaned = preg_replace('/\.2e' . $exts . '$/', '.\\1', $page_id_cleaned);
76
+ − 2460
1
+ − 2461
return $page_id_cleaned;
+ − 2462
}
+ − 2463
+ − 2464
/**
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2465
* Removes character escapes in a page ID string
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2466
* @param string Page ID string to dirty up
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2467
* @return string
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2468
*/
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2469
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2470
function dirtify_page_id($page_id)
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2471
{
38
+ − 2472
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 2473
// First, replace spaces with underscores
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2474
$page_id = str_replace(' ', '_', $page_id);
76
+ − 2475
38
+ − 2476
// Exception for userpages for IP addresses
+ − 2477
if ( preg_match('/^' . preg_quote($paths->nslist['User']) . '/', $page_id) )
+ − 2478
{
+ − 2479
$ip = preg_replace('/^' . preg_quote($paths->nslist['User']) . '/', '', $page_id);
+ − 2480
if ( is_valid_ip($ip) )
+ − 2481
return $page_id;
+ − 2482
}
76
+ − 2483
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2484
preg_match_all('/\.[A-Fa-f0-9][A-Fa-f0-9]/', $page_id, $matches);
76
+ − 2485
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2486
foreach ( $matches[0] as $id => $char )
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2487
{
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2488
$char = substr($char, 1);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2489
$char = strtolower($char);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2490
$char = intval(hexdec($char));
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2491
$char = chr($char);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2492
$page_id = str_replace($matches[0][$id], $char, $page_id);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2493
}
76
+ − 2494
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2495
return $page_id;
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2496
}
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2497
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2498
/**
76
+ − 2499
* Inserts commas into a number to make it more human-readable. Floating point-safe and doesn't flirt with the number like number_format() does.
1
+ − 2500
* @param int The number to process
+ − 2501
* @return string Input number with commas added
+ − 2502
*/
+ − 2503
+ − 2504
function commatize($num)
+ − 2505
{
+ − 2506
$num = (string)$num;
+ − 2507
if ( strpos($num, '.') )
+ − 2508
{
+ − 2509
$whole = explode('.', $num);
+ − 2510
$num = $whole[0];
+ − 2511
$dec = $whole[1];
+ − 2512
}
+ − 2513
else
+ − 2514
{
+ − 2515
$whole = $num;
+ − 2516
}
+ − 2517
$offset = ( strlen($num) ) % 3;
+ − 2518
$len = strlen($num);
+ − 2519
$offset = ( $offset == 0 )
+ − 2520
? 3
+ − 2521
: $offset;
+ − 2522
for ( $i = $offset; $i < $len; $i=$i+3 )
+ − 2523
{
+ − 2524
$num = substr($num, 0, $i) . ',' . substr($num, $i, $len);
+ − 2525
$len = strlen($num);
+ − 2526
$i++;
+ − 2527
}
+ − 2528
if ( isset($dec) )
+ − 2529
{
+ − 2530
return $num . '.' . $dec;
+ − 2531
}
+ − 2532
else
+ − 2533
{
+ − 2534
return $num;
+ − 2535
}
+ − 2536
}
+ − 2537
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2538
/**
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2539
* Injects a string into another string at the specified position.
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2540
* @param string The haystack
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2541
* @param string The needle
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2542
* @param int Position at which to insert the needle
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2543
*/
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2544
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2545
function inject_substr($haystack, $needle, $pos)
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2546
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2547
$str1 = substr($haystack, 0, $pos);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2548
$pos++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2549
$str2 = substr($haystack, $pos);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2550
return "{$str1}{$needle}{$str2}";
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2551
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2552
38
+ − 2553
/**
+ − 2554
* Tells if a given IP address is valid.
+ − 2555
* @param string suspected IP address
+ − 2556
* @return bool true if valid, false otherwise
+ − 2557
*/
76
+ − 2558
38
+ − 2559
function is_valid_ip($ip)
+ − 2560
{
+ − 2561
// These came from phpBB3.
+ − 2562
$ipv4 = '(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])';
+ − 2563
$ipv6 = '(?:(?:(?:[\dA-F]{1,4}:){6}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:::(?:[\dA-F]{1,4}:){5}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:):(?:[\dA-F]{1,4}:){4}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,2}:(?:[\dA-F]{1,4}:){3}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,3}:(?:[\dA-F]{1,4}:){2}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,4}:(?:[\dA-F]{1,4}:)(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,5}:(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,6}:[\dA-F]{1,4})|(?:(?:[\dA-F]{1,4}:){1,7}:))';
76
+ − 2564
38
+ − 2565
if ( preg_match("/^{$ipv4}$/", $ip) || preg_match("/^{$ipv6}$/", $ip) )
+ − 2566
return true;
+ − 2567
else
+ − 2568
return false;
+ − 2569
}
+ − 2570
48
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2571
/**
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2572
* Replaces the FIRST given occurrence of needle within haystack with thread
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2573
* @param string Needle
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2574
* @param string Thread
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2575
* @param string Haystack
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2576
*/
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2577
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2578
function str_replace_once($needle, $thread, $haystack)
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2579
{
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2580
$needle_len = strlen($needle);
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2581
for ( $i = 0; $i < strlen($haystack); $i++ )
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2582
{
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2583
$test = substr($haystack, $i, $needle_len);
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2584
if ( $test == $needle )
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2585
{
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2586
// Got it!
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2587
$upto = substr($haystack, 0, $i);
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2588
$from = substr($haystack, ( $i + $needle_len ));
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2589
$new_haystack = "{$upto}{$thread}{$from}";
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2590
return $new_haystack;
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2591
}
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2592
}
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2593
return $haystack;
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2594
}
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2595
78
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2596
/**
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2597
* From http://us2.php.net/urldecode - decode %uXXXX
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2598
* @param string The urlencoded string
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2599
* @return string
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2600
*/
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2601
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2602
function decode_unicode_url($str)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2603
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2604
$res = '';
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2605
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2606
$i = 0;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2607
$max = strlen($str) - 6;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2608
while ($i <= $max)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2609
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2610
$character = $str[$i];
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2611
if ($character == '%' && $str[$i + 1] == 'u')
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2612
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2613
$value = hexdec(substr($str, $i + 2, 4));
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2614
$i += 6;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2615
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2616
if ($value < 0x0080)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2617
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2618
// 1 byte: 0xxxxxxx
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2619
$character = chr($value);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2620
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2621
else if ($value < 0x0800)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2622
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2623
// 2 bytes: 110xxxxx 10xxxxxx
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2624
$character =
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2625
chr((($value & 0x07c0) >> 6) | 0xc0)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2626
. chr(($value & 0x3f) | 0x80);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2627
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2628
else
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2629
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2630
// 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2631
$character =
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2632
chr((($value & 0xf000) >> 12) | 0xe0)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2633
. chr((($value & 0x0fc0) >> 6) | 0x80)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2634
. chr(($value & 0x3f) | 0x80);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2635
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2636
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2637
else
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2638
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2639
$i++;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2640
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2641
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2642
$res .= $character;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2643
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2644
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2645
return $res . substr($str, $i);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2646
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2647
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2648
/**
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2649
* Recursively decodes an array with UTF-8 characters in its strings
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2650
* @param array Can be multi-depth
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2651
* @return array
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2652
*/
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2653
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2654
function decode_unicode_array($array)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2655
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2656
foreach ( $array as $i => $val )
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2657
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2658
if ( is_string($val) )
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2659
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2660
$array[$i] = decode_unicode_url($val);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2661
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2662
else
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2663
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2664
$array[$i] = decode_unicode_array($val);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2665
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2666
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2667
return $array;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2668
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2669
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2670
/**
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2671
* Sanitizes a page tag.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2672
* @param string
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2673
* @return string
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2674
*/
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2675
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2676
function sanitize_tag($tag)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2677
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2678
$tag = strtolower($tag);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2679
$tag = preg_replace('/[^\w _-]+/', '', $tag);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2680
$tag = trim($tag);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2681
return $tag;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2682
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2683
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2684
/**
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2685
* Gzips the output buffer.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2686
*/
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2687
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2688
function gzip_output()
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2689
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2690
global $do_gzip;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2691
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2692
//
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2693
// Compress buffered output if required and send to browser
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2694
//
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2695
if ( $do_gzip && function_exists('ob_gzhandler') )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2696
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2697
$gzip_contents = ob_get_contents();
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2698
ob_end_clean();
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2699
81
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2700
$return = ob_gzhandler($gzip_contents);
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2701
if ( $return )
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2702
{
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2703
header('Content-encoding: gzip');
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2704
echo $gzip_contents;
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2705
}
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2706
else
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2707
{
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2708
echo $gzip_contents;
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2709
}
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2710
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2711
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2712
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2713
/**
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2714
* Aggressively and hopefully non-destructively optimizes a blob of HTML.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2715
* @param string HTML to process
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2716
* @return string much snaller HTML
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2717
*/
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2718
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2719
function aggressive_optimize_html($html)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2720
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2721
$size_before = strlen($html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2722
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2723
// kill carriage returns
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2724
$html = str_replace("\r", "", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2725
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2726
// Optimize (but don't obfuscate) Javascript
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2727
preg_match_all('/<script(.*?)>(.+?)<\/script>/is', $html, $jscript);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2728
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2729
// list of Javascript reserved words - from about.com
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2730
$reserved_words = array('abstract', 'as', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'continue', 'const', 'debugger', 'default', 'delete', 'do',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2731
'double', 'else', 'enum', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', 'if', 'implements', 'import',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2732
'in', 'instanceof', 'int', 'interface', 'is', 'long', 'namespace', 'native', 'new', 'null', 'package', 'private', 'protected', 'public',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2733
'return', 'short', 'static', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'use', 'var',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2734
'void', 'volatile', 'while', 'with');
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2735
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2736
$reserved_words = '(' . implode('|', $reserved_words) . ')';
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2737
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2738
for ( $i = 0; $i < count($jscript[0]); $i++ )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2739
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2740
$js =& $jscript[2][$i];
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2741
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2742
// for line optimization, explode it
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2743
$particles = explode("\n", $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2744
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2745
foreach ( $particles as $j => $atom )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2746
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2747
// Remove comments
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2748
$atom = preg_replace('#\/\/(.+)#i', '', $atom);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2749
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2750
$atom = trim($atom);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2751
if ( empty($atom) )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2752
unset($particles[$j]);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2753
else
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2754
$particles[$j] = $atom;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2755
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2756
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2757
$js = implode("\n", $particles);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2758
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2759
$js = preg_replace('#/\*(.*?)\*/#s', '', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2760
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2761
// find all semicolons and then linebreaks, and replace with a single semicolon
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2762
$js = str_replace(";\n", ';', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2763
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2764
// starting braces
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2765
$js = preg_replace('/\{([\s]+)/m', '{', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2766
$js = str_replace(")\n{", '){', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2767
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2768
// ending braces (tricky)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2769
$js = preg_replace('/\}([^;])/m', '};\\1', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2770
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2771
// other rules
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2772
$js = str_replace("};\n", "};", $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2773
$js = str_replace(",\n", ',', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2774
$js = str_replace("[\n", '[', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2775
$js = str_replace("]\n", ']', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2776
$js = str_replace("\n}", '}', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2777
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2778
// newlines immediately before reserved words
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2779
$js = preg_replace("/(\)|;)\n$reserved_words/is", '\\1\\2', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2780
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2781
// fix for firefox issue
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2782
$js = preg_replace('/\};([\s]*)(else|\))/i', '}\\2', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2783
81
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2784
$replacement = "<script{$jscript[1][$i]}>/* <![CDATA[ */ $js /* ]]> */</script>";
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2785
// apply changes
81
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2786
$html = str_replace($jscript[0][$i], $replacement, $html);
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2787
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2788
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2789
// Which tags to strip - you can change this if needed
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2790
$strip_tags = Array('pre', 'script', 'style', 'enano:no-opt');
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2791
$strip_tags = implode('|', $strip_tags);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2792
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2793
// Strip out the tags and replace with placeholders
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2794
preg_match_all("#<($strip_tags)(.*?)>(.*?)</($strip_tags)>#is", $html, $matches);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2795
$seed = md5(microtime() . mt_rand()); // Random value used for placeholders
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2796
for ($i = 0;$i < sizeof($matches[1]); $i++)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2797
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2798
$html = str_replace($matches[0][$i], "{DONT_STRIP_ME_NAKED:$seed:$i}", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2799
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2800
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2801
// Finally, process the HTML
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2802
$html = preg_replace("#\n([ ]*)#", " ", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2803
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2804
// Remove annoying spaces between tags
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2805
$html = preg_replace("#>([ ][ ]+)<#", "> <", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2806
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2807
// Re-insert untouchable tags
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2808
for ($i = 0;$i < sizeof($matches[1]); $i++)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2809
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2810
$html = str_replace("{DONT_STRIP_ME_NAKED:$seed:$i}", "<{$matches[1][$i]}{$matches[2][$i]}>{$matches[3][$i]}</{$matches[4][$i]}>", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2811
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2812
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2813
// Remove <enano:no-opt> blocks (can be used by themes that don't want their HTML optimized)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2814
$html = preg_replace('#<(\/|)enano:no-opt(.*?)>#', '', $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2815
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2816
$size_after = strlen($html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2817
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2818
// Tell snoopish users what's going on
81
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2819
$html = str_replace('<html', "\n".'<!-- NOTE: Enano has performed an HTML optimization routine on the HTML you see here. This is to enhance page loading speeds.
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2820
To view the uncompressed source of this page, add the "nocompress" parameter to the URI of this page: index.php?title=Main_Page&nocompress or Main_Page?nocompress'."
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2821
Size before compression: $size_before bytes
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2822
Size after compression: $size_after bytes
81
d7fc25acd3f3
Replaced the menu in the admin theme with something much more visually pleasureable; minor fix in Special:UploadFile; finished patching a couple of XSS problems from Banshee; finished Admin:PageGroups; removed unneeded code in flyin.js; finished tag system (except tag cloud); 1.0.1 release candidate
Dan
diff
changeset
+ − 2823
-->\n<html", $html);
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2824
return $html;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2825
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2826
1
+ − 2827
//die('<pre>Original: 01010101010100101010100101010101011010'."\nProcessed: ".uncompress_bitfield(compress_bitfield('01010101010100101010100101010101011010')).'</pre>');
+ − 2828
+ − 2829
?>