Zeile 119 | Zeile 119 |
---|
* @access public * @var self::VALIDATION_* */
|
* @access public * @var self::VALIDATION_* */
|
public $output_validation_policy = self::VALIDATION_REPORT_ONLY;
| public $output_validation_policy = self::VALIDATION_REQUIRE;
|
/** * Parses a message with the specified options.
| /** * Parses a message with the specified options.
|
Zeile 315 | Zeile 315 |
---|
global $cache, $lang, $mybb; $this->mycode_cache = array();
|
global $cache, $lang, $mybb; $this->mycode_cache = array();
|
$standard_mycode = $callback_mycode = $nestable_mycode = array(); $standard_count = $callback_count = $nestable_count = 0;
| $standard_mycode = $callback_mycode = $nestable_mycode = $nestable_callback_mycode = array(); $standard_count = $callback_count = $nestable_count = $nestable_callback_count = 0;
|
if($mybb->settings['allowbasicmycode'] == 1) {
| if($mybb->settings['allowbasicmycode'] == 1) {
|
Zeile 398 | Zeile 398 |
---|
++$nestable_count; ++$callback_count;
|
++$nestable_count; ++$callback_count;
|
}
if($mybb->settings['allowfontmycode'] == 1) { $callback_mycode['font']['regex'] = "#\[font=\\s*(\"?)([a-z0-9 ,\-_'\"]+)\\1\\s*\](.*?)\[/font\]#si"; $callback_mycode['font']['replacement'] = array($this, 'mycode_parse_font_callback');
++$nestable_count;
| |
}
if($mybb->settings['allowalignmycode'] == 1)
| }
if($mybb->settings['allowalignmycode'] == 1)
|
Zeile 414 | Zeile 406 |
---|
$nestable_mycode['align']['replacement'] = "<div style=\"text-align: $1;\" class=\"mycode_align\">$2</div>";
++$nestable_count;
|
$nestable_mycode['align']['replacement'] = "<div style=\"text-align: $1;\" class=\"mycode_align\">$2</div>";
++$nestable_count;
|
| }
if($mybb->settings['allowfontmycode'] == 1) { $nestable_callback_mycode['font']['regex'] = "#\[font=\\s*(\"?)([a-z0-9 ,\-_'\"]+)\\1\\s*\](.*?)\[/font\]#si"; $nestable_callback_mycode['font']['replacement'] = array($this, 'mycode_parse_font_callback');
++$nestable_callback_count;
|
}
$custom_mycode = $cache->read("mycode");
| }
$custom_mycode = $cache->read("mycode");
|
Zeile 448 | Zeile 448 |
---|
$this->mycode_cache['nestable'][] = array('find' => $code['regex'], 'replacement' => $code['replacement']); }
|
$this->mycode_cache['nestable'][] = array('find' => $code['regex'], 'replacement' => $code['replacement']); }
|
// Assign the nestable MyCode to the cache.
| // Assign the callback MyCode to the cache.
|
foreach($callback_mycode as $code) { $this->mycode_cache['callback'][] = array('find' => $code['regex'], 'replacement' => $code['replacement']);
|
foreach($callback_mycode as $code) { $this->mycode_cache['callback'][] = array('find' => $code['regex'], 'replacement' => $code['replacement']);
|
| }
// Assign the nestable callback MyCode to the cache. foreach($nestable_callback_mycode as $code) { $this->mycode_cache['nestable_callback'][] = array('find' => $code['regex'], 'replacement' => $code['replacement']);
|
}
$this->mycode_cache['standard_count'] = $standard_count; $this->mycode_cache['callback_count'] = $callback_count; $this->mycode_cache['nestable_count'] = $nestable_count;
|
}
$this->mycode_cache['standard_count'] = $standard_count; $this->mycode_cache['callback_count'] = $callback_count; $this->mycode_cache['nestable_count'] = $nestable_count;
|
| $this->mycode_cache['nestable_callback_count'] = $nestable_callback_count;
|
}
/**
| }
/**
|
Zeile 523 | Zeile 530 |
---|
foreach($this->mycode_cache['callback'] as $replace) { $message = preg_replace_callback($replace['find'], $replace['replacement'], $message);
|
foreach($this->mycode_cache['callback'] as $replace) { $message = preg_replace_callback($replace['find'], $replace['replacement'], $message);
|
} }
| } }
|
// Replace the nestable mycode's if($this->mycode_cache['nestable_count'] > 0)
|
// Replace the nestable mycode's if($this->mycode_cache['nestable_count'] > 0)
|
{
| {
|
foreach($this->mycode_cache['nestable'] as $mycode)
|
foreach($this->mycode_cache['nestable'] as $mycode)
|
{
| {
|
while(preg_match($mycode['find'], $message))
|
while(preg_match($mycode['find'], $message))
|
{
| {
|
$message = preg_replace($mycode['find'], $mycode['replacement'], $message);
|
$message = preg_replace($mycode['find'], $mycode['replacement'], $message);
|
| } } }
// Replace the nestable callback mycodes if($this->mycode_cache['nestable_callback_count'] > 0) { foreach($this->mycode_cache['nestable_callback'] as $replace) { while(preg_match($replace['find'], $message)) { $message_org = $message; $message = preg_replace_callback($replace['find'], $replace['replacement'], $message); if ($message_org == $message) { break; }
|
} } }
| } } }
|
Zeile 575 | Zeile 599 |
---|
{ global $cache, $mybb, $theme, $templates; $this->smilies_cache = array();
|
{ global $cache, $mybb, $theme, $templates; $this->smilies_cache = array();
|
|
|
$smilies = $cache->read("smilies"); if(is_array($smilies)) { $extra_class = $onclick = ''; foreach($smilies as $sid => $smilie) {
|
$smilies = $cache->read("smilies"); if(is_array($smilies)) { $extra_class = $onclick = ''; foreach($smilies as $sid => $smilie) {
|
| if(isset($theme['imgdir'])) { $imgdir = $theme['imgdir']; } else { $imgdir = ''; }
|
$smilie['find'] = explode("\n", $smilie['find']);
|
$smilie['find'] = explode("\n", $smilie['find']);
|
$smilie['image'] = str_replace("{theme}", $theme['imgdir'], $smilie['image']);
| $smilie['image'] = str_replace("{theme}", $imgdir, $smilie['image']);
|
$smilie['image'] = htmlspecialchars_uni($mybb->get_asset_url($smilie['image'])); $smilie['name'] = htmlspecialchars_uni($smilie['name']);
| $smilie['image'] = htmlspecialchars_uni($mybb->get_asset_url($smilie['image'])); $smilie['name'] = htmlspecialchars_uni($smilie['name']);
|
Zeile 600 | Zeile 633 |
---|
"<$s" => "<$s", ">$s" => ">$s", );
|
"<$s" => "<$s", ">$s" => ">$s", );
|
}
| }
|
} } }
| } } }
|
Zeile 993 | Zeile 1026 |
---|
* Parses code MyCode. * * @param string $code The message to be parsed
|
* Parses code MyCode. * * @param string $code The message to be parsed
|
* @param boolean $text_only Are we formatting as text? * @return string The parsed message.
| * @param boolean $text_only Are we formatting as text? * @return string The parsed message.
|
*/ function mycode_parse_code($code, $text_only=false) {
| */ function mycode_parse_code($code, $text_only=false) {
|
Zeile 1082 | Zeile 1115 |
---|
$code = @highlight_string($str, true);
// Do the actual replacing.
|
$code = @highlight_string($str, true);
// Do the actual replacing.
|
| $code = preg_replace('#<pre><code style="color: \#000000">#i', "<code>", $code);
|
$code = preg_replace('#<code>\s*<span style="color: \#000000">\s*#i', "<code>", $code); $code = preg_replace("#</span>\s*</code>#", "</code>", $code);
|
$code = preg_replace('#<code>\s*<span style="color: \#000000">\s*#i', "<code>", $code); $code = preg_replace("#</span>\s*</code>#", "</code>", $code);
|
| $code = preg_replace("#</code>\s*</pre>#", "</code>", $code);
|
$code = preg_replace("#</span>(\r\n?|\n?)</code>#", "</span></code>", $code); $code = str_replace("\\", '\', $code); $code = str_replace('$', '$', $code);
| $code = preg_replace("#</span>(\r\n?|\n?)</code>#", "</span></code>", $code); $code = str_replace("\\", '\', $code); $code = str_replace('$', '$', $code);
|
Zeile 1091 | Zeile 1126 |
---|
if($added_open_tag) {
|
if($added_open_tag) {
|
$code = preg_replace("#<code><span style=\"color: \#([A-Z0-9]{6})\"><\?php( | )(<br />?)#", "<code><span style=\"color: #$1\">", $code);
| $code = preg_replace("#<code><span style=\"color: \#([A-Z0-9]{6})\"><\?php( | )(<br />|\n)#", "<code><span style=\"color: #$1\">", $code);
|
}
if($added_end_tag)
| }
if($added_end_tag)
|
Zeile 1118 | Zeile 1153 |
---|
/** * Parses PHP code MyCode.
|
/** * Parses PHP code MyCode.
|
* * @param array $matches Matches.
| * * @param array $matches Matches.
|
* @return string The parsed message. */ function mycode_parse_php_callback($matches)
| * @return string The parsed message. */ function mycode_parse_php_callback($matches)
|
Zeile 1143 | Zeile 1178 |
---|
}
if(!empty($this->options['allow_html']))
|
}
if(!empty($this->options['allow_html']))
|
{
| {
|
$url = $this->parse_html($url); }
| $url = $this->parse_html($url); }
|
Zeile 1192 | Zeile 1227 |
---|
// posts prior to the client-side aspect of this fix for the // browser-independent SCEditor bug of issue #4182. $fonts = str_replace('"', "'", $matches[2]);
|
// posts prior to the client-side aspect of this fix for the // browser-independent SCEditor bug of issue #4182. $fonts = str_replace('"', "'", $matches[2]);
|
|
|
return "<span style=\"font-family: {$fonts};\" class=\"mycode_font\">{$matches[3]}</span>"; }
| return "<span style=\"font-family: {$fonts};\" class=\"mycode_font\">{$matches[3]}</span>"; }
|
Zeile 1237 | Zeile 1272 |
---|
function mycode_parse_img($url, $dimensions=array(), $align='') { global $lang, $templates;
|
function mycode_parse_img($url, $dimensions=array(), $align='') { global $lang, $templates;
|
$url = trim($url); $url = str_replace("\n", "", $url); $url = str_replace("\r", "", $url);
| $url = trim($url); $url = str_replace("\n", "", $url); $url = str_replace("\r", "", $url);
|
if(!empty($this->options['allow_html'])) { $url = $this->parse_html($url);
| if(!empty($this->options['allow_html'])) { $url = $this->parse_html($url);
|
Zeile 1282 | Zeile 1317 |
---|
eval("\$mycode_img = \"".$templates->get("mycode_img", 1, 0)."\";"); return $mycode_img;
|
eval("\$mycode_img = \"".$templates->get("mycode_img", 1, 0)."\";"); return $mycode_img;
|
}
/** * Parses IMG MyCode. * * @param array $matches Matches. * @return string Image code. */
| }
/** * Parses IMG MyCode. * * @param array $matches Matches. * @return string Image code. */
|
function mycode_parse_img_callback1($matches) { return $this->mycode_parse_img($matches[2]);
| function mycode_parse_img_callback1($matches) { return $this->mycode_parse_img($matches[2]);
|
Zeile 1388 | Zeile 1423 |
---|
function mycode_parse_img_disabled_callback4($matches) { return $this->mycode_parse_img_disabled($matches[5]);
|
function mycode_parse_img_disabled_callback4($matches) { return $this->mycode_parse_img_disabled($matches[5]);
|
}
/**
| }
/**
|
* Parses email MyCode. * * @param string $email The email address to link to.
| * Parses email MyCode. * * @param string $email The email address to link to.
|
Zeile 1436 | Zeile 1471 |
---|
*/ function mycode_parse_video($video, $url) {
|
*/ function mycode_parse_video($video, $url) {
|
global $templates;
| global $mybb, $templates;
|
if(empty($video) || empty($url)) {
| if(empty($video) || empty($url)) {
|
Zeile 1446 | Zeile 1481 |
---|
// Check URL is a valid URL first, as `parse_url` doesn't check validity. if(false === filter_var($url, FILTER_VALIDATE_URL)) {
|
// Check URL is a valid URL first, as `parse_url` doesn't check validity. if(false === filter_var($url, FILTER_VALIDATE_URL)) {
|
return "[video={$video}]{$url}[/video]"; }
| return "[video={$video}]{$url}[/video]"; }
|
$parsed_url = @parse_url(urldecode($url)); if($parsed_url === false)
|
$parsed_url = @parse_url(urldecode($url)); if($parsed_url === false)
|
{
| {
|
return "[video={$video}]{$url}[/video]";
|
return "[video={$video}]{$url}[/video]";
|
}
| }
$bbdomain = parse_url($mybb->settings['bburl'], PHP_URL_HOST);
|
|
|
$fragments = array(); if($parsed_url['fragment']) { $fragments = explode("&", $parsed_url['fragment']); }
| $fragments = empty($parsed_url['fragment']) ? array() : explode("&", $parsed_url['fragment']);
|
|
|
if($video == "liveleak")
| if($video == "liveleak" && !empty($parsed_url['query']))
|
{ // The query part can start with any alphabet, but set only 'i' to catch in index key later $parsed_url['query'] = "i".substr($parsed_url['query'], 1);
|
{ // The query part can start with any alphabet, but set only 'i' to catch in index key later $parsed_url['query'] = "i".substr($parsed_url['query'], 1);
|
}
$queries = explode("&", $parsed_url['query']);
| }
$queries = empty($parsed_url['query']) ? array() : explode("&", $parsed_url['query']);
|
$input = array(); foreach($queries as $query) {
|
$input = array(); foreach($queries as $query) {
|
list($key, $value) = explode("=", $query); $key = str_replace("amp;", "", $key); $input[$key] = $value;
| $query_array = explode("=", $query); if(count($query_array) == 2) { list($key, $value) = $query_array; $key = str_replace("amp;", "", $key); $input[$key] = $value; }
|
}
|
}
|
$path = explode('/', $parsed_url['path']);
| $path = empty($parsed_url['path']) ? array() : explode('/', $parsed_url['path']);
|
switch($video) { case "dailymotion":
|
switch($video) { case "dailymotion":
|
if(isset($path[2]))
| if(!empty($path[2]))
|
{ list($id) = explode('_', $path[2], 2); // http://www.dailymotion.com/video/fds123_title-goes-here }
|
{ list($id) = explode('_', $path[2], 2); // http://www.dailymotion.com/video/fds123_title-goes-here }
|
else
| elseif(!empty($path[1]))
|
{ $id = $path[1]; // http://dai.ly/fds123
|
{ $id = $path[1]; // http://dai.ly/fds123
|
} break; case "metacafe": $id = $path[2]; // http://www.metacafe.com/watch/fds123/title_goes_here/ $title = htmlspecialchars_uni($path[3]);
| } break; case "metacafe": if(!empty($path[2])) { $id = $path[2]; // http://www.metacafe.com/watch/fds123/title_goes_here/ }
|
break; case "myspacetv":
|
break; case "myspacetv":
|
$id = $path[4]; // http://www.myspace.com/video/fds/fds/123
| if(!empty($path[4])) { $id = $path[4]; // http://www.myspace.com/video/fds/fds/123 }
|
break; case "facebook":
|
break; case "facebook":
|
if(isset($input['v'])) {
| if(!empty($input['v'])) {
|
$id = $input['v']; // http://www.facebook.com/video/video.php?v=123
|
$id = $input['v']; // http://www.facebook.com/video/video.php?v=123
|
} elseif(substr($path[3], 0, 3) == 'vb.')
| } elseif(!empty($path[3]) && substr($path[3], 0, 3) == 'vb.' && !empty($path[4]))
|
{ $id = $path[4]; // https://www.facebook.com/fds/videos/vb.123/123/ }
|
{ $id = $path[4]; // https://www.facebook.com/fds/videos/vb.123/123/ }
|
else
| elseif(!empty($path[3]))
|
{ $id = $path[3]; // https://www.facebook.com/fds/videos/123/ } break; case "mixer":
|
{ $id = $path[3]; // https://www.facebook.com/fds/videos/123/ } break; case "mixer":
|
$id = $path[1]; // https://mixer.com/streamer
| if(!empty($path[1])) { $id = $path[1]; // https://mixer.com/streamer }
|
break; case "liveleak":
|
break; case "liveleak":
|
$id = $input['i']; // http://www.liveleak.com/view?i=123
| if(!empty($input['i'])) { $id = $input['i']; // http://www.liveleak.com/view?i=123 }
|
break; case "yahoo":
|
break; case "yahoo":
|
if(isset($path[2]))
| if(!empty($path[2]))
|
{ $id = $path[2]; // http://xy.screen.yahoo.com/fds/fds-123.html
|
{ $id = $path[2]; // http://xy.screen.yahoo.com/fds/fds-123.html
|
} else { $id = $path[1]; // http://xy.screen.yahoo.com/fds-123.html
| } elseif(!empty($path[1])) { $id = $path[1]; // http://xy.screen.yahoo.com/fds-123.html
|
} // Support for localized portals
|
} // Support for localized portals
|
$domain = explode('.', $parsed_url['host']); if($domain[0] != 'screen' && preg_match('#^([a-z-]+)$#', $domain[0])) { $local = "{$domain[0]}."; } else { $local = ''; } break;
| if(!empty($parsed_url['host'])) { $domain = explode('.', $parsed_url['host']); if($domain[0] != 'screen' && preg_match('#^([a-z-]+)$#', $domain[0])) { $local = "{$domain[0]}."; } else { $local = ''; } } break;
|
case "vimeo":
|
case "vimeo":
|
if(isset($path[3]))
| if(!empty($path[3]))
|
{ $id = $path[3]; // http://vimeo.com/fds/fds/fds123
|
{ $id = $path[3]; // http://vimeo.com/fds/fds/fds123
|
} else
| } elseif(!empty($path[1]))
|
{ $id = $path[1]; // http://vimeo.com/fds123 } break; case "youtube":
|
{ $id = $path[1]; // http://vimeo.com/fds123 } break; case "youtube":
|
if($fragments[0]) {
| if(!empty($fragments[0])) {
|
$id = str_replace('!v=', '', $fragments[0]); // http://www.youtube.com/watch#!v=fds123
|
$id = str_replace('!v=', '', $fragments[0]); // http://www.youtube.com/watch#!v=fds123
|
} elseif($input['v'])
| } elseif(!empty($input['v']))
|
{ $id = $input['v']; // http://www.youtube.com/watch?v=fds123 }
|
{ $id = $input['v']; // http://www.youtube.com/watch?v=fds123 }
|
else
| elseif(!empty($path[1]))
|
{ $id = $path[1]; // http://www.youtu.be/fds123 }
| { $id = $path[1]; // http://www.youtu.be/fds123 }
|
Zeile 1642 | Zeile 1693 |
---|
*/ function mycode_auto_url($message) {
|
*/ function mycode_auto_url($message) {
|
// Links should end with slashes, numbers, characters and braces but not with dots, commas or question marks // Don't create links within existing links (handled up-front in the callback function).
| /* * Don't create links: * - within existing links (any <a> HTML tag must be returned as-is) * - within HTML tags (must not be followed by a > character without a matching < after the link) * * Don't include: * - common punctuation characters around the link * - braces that likely constitute punctuation around the particular link (handled in the callback function) * - partial HTML entities (https://github.com/mybb/mybb/issues/4303) */
|
$message = preg_replace_callback( "~ <a\\s[^>]*>.*?</a>| # match and return existing links
| $message = preg_replace_callback( "~ <a\\s[^>]*>.*?</a>| # match and return existing links
|
Zeile 1653 | Zeile 1712 |
---|
(?:www|ftp)\. # common subdomain ) (?P<link>
|
(?:www|ftp)\. # common subdomain ) (?P<link>
|
(?:[^\/\"\s\<\[\.]+\.)*[\w]+ # host (?::[0-9]+)? # port (?:/(?:[^\"\s<\[&]|\[\]|&(?:amp|lt|gt);)*)? # path, query, fragment; exclude unencoded characters [\w\/\)]
| (?: \[[0-9a-fA-F:]+(?:%[0-9a-zA-Z._-]+)?\]| # IPv6 address with optional zone (?:\d{1,3}\.){3}\d{1,3}| # IPv4 address (?:[^\"\s<>\[\]:/?&#.]+\.)*[\w-]+ # domain name ) (?::[0-9]+)? # optional port number (?:/[^\"\s<>\[\]?&#]*)? # optional path (?:\?(?:[^\"\s<>\[\]?#]|\[\])*)? # optional query (?:\#[^\"\s<>\[\]]*)? # optional fragment ) (?: (?<=&)|(?<=<)|(?<=>)| # allow trailing entities (?<![.,:`'\"?!])(?<!&) # exclude other trailing punctuation
|
) (?![^<>]*?>) # not followed by unopened > (within HTML tags) ~iusx", array($this, 'mycode_auto_url_callback'), $message );
|
) (?![^<>]*?>) # not followed by unopened > (within HTML tags) ~iusx", array($this, 'mycode_auto_url_callback'), $message );
|
|
|
return $message; }
| return $message; }
|
Zeile 1678 | Zeile 1746 |
---|
// If we matched a preexisting link (the part of the regexes in mycode_auto_url() before the pipe symbol), // then simply return it - we don't create links within existing links. if(count($matches) == 1)
|
// If we matched a preexisting link (the part of the regexes in mycode_auto_url() before the pipe symbol), // then simply return it - we don't create links within existing links. if(count($matches) == 1)
|
{
| {
|
return $matches[0]; }
| return $matches[0]; }
|
Zeile 1700 | Zeile 1768 |
---|
$last_char = my_substr($matches['link'], -1); while($last_char == '.' || $last_char == ',' || $last_char == '?' || $last_char == '!') {
|
$last_char = my_substr($matches['link'], -1); while($last_char == '.' || $last_char == ',' || $last_char == '?' || $last_char == '!') {
|
$matches[4] = my_substr($matches['link'], 0, -1);
| $matches['link'] = my_substr($matches['link'], 0, -1);
|
$external = $last_char.$external; $last_char = my_substr($matches['link'], -1); }
| $external = $last_char.$external; $last_char = my_substr($matches['link'], -1); }
|
Zeile 2014 | Zeile 2082 |
---|
$error_message .= var_export($data, true);
$error_handler->error(E_USER_WARNING, $error_message, __FILE__, __LINE__, false);
|
$error_message .= var_export($data, true);
$error_handler->error(E_USER_WARNING, $error_message, __FILE__, __LINE__, false);
|
}
| |
|
|
return empty($errors);
| return false; } else { return true; }
|
} }
| } }
|