From 5107b7aafa77fab8533c794ab41d54e5efc8e9b7 Mon Sep 17 00:00:00 2001 From: Ludovic Arnaud Date: Sun, 20 Apr 2003 20:30:01 +0000 Subject: [PATCH] First-pass syntax highlightning. Will fix quotes later git-svn-id: file:///svn/phpbb/trunk@3901 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/includes/bbcode.php | 30 +-------------- phpBB/includes/functions_posting.php | 3 ++ phpBB/includes/message_parser.php | 56 ++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 44 deletions(-) diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index c34092f35c..6d73e470a8 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -70,7 +70,6 @@ class bbcode } } - if (count($str['search'])) { $message = str_replace($str['search'], $str['replace'], $message); @@ -307,38 +306,11 @@ class bbcode function bbcode_second_pass_code($type, $code) { - $code = stripslashes(str_replace("\r\n", "\n", $code)); + $code = stripslashes($code); switch ($type) { case 'php': - $str_from = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}', '.', '@'); - $str_to = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}', '.', '@'); - - $code = str_replace($str_to, $str_from, $code); - - $remove_tags = FALSE; - if (!preg_match('/\<\?.*?\?\>/is', $code)) - { - $remove_tags = TRUE; - $code = ""; - } - - ob_start(); - highlight_string($code); - $code = ob_get_contents(); - ob_end_clean(); - - if ($remove_tags) - { - $code = preg_replace('!^[\n\r\s\t]*[\n\r\s\t]*()<\?php (.*)\?>[\n\r\s\t]*()[\n\r\s\t]*[\n\r\s\t]*!is', '\1\2\3', $code); - } - else - { - $code = preg_replace('!^[\n\r\s\t]*[\n\r\s\t]*(.*)[\n\r\s\t]*[\n\r\s\t]*!is', '\1', $code); - } - break; - default: $code = str_replace("\t", '   ', $code); $code = str_replace(' ', '  ', $code); diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index 389927983a..efd0098471 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -101,6 +101,7 @@ function decode_text(&$message, $bbcode_uid) '#.*?#', '#.*?#', '#', "\n", $message); $message = preg_replace($match, $replace, $message); return; diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php index 0d4a588a9d..729f712f84 100644 --- a/phpBB/includes/message_parser.php +++ b/phpBB/includes/message_parser.php @@ -215,47 +215,73 @@ class parse_message } // Expects the argument to start right after the opening [code] tag and to end with [/code] - function bbcode_code($type, $in) + function bbcode_code($stx, $in) { - $str_from = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}', '.', '@'); - $str_to = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}', '.', '@'); - // if I remember correctly, preg_replace() will slash passed vars - $in = stripslashes($in); + $in = str_replace("\r\n", "\n", stripslashes($in)); $out = ''; do { $pos = stripos($in, '[/code]') + 7; - $buffer = substr($in, 0, $pos); + $code = substr($in, 0, $pos); $in = substr($in, $pos); - // $buffer contains everything that was between code tags (including the ending tag) but we're trying to grab as much extra text as possible, as long as it does not contain open [code] tags + // $code contains everything that was between code tags (including the ending tag) but we're trying to grab as much extra text as possible, as long as it does not contain open [code] tags while ($in) { $pos = stripos($in, '[/code]') + 7; - $sub_buffer = substr($in, 0, $pos); + $buffer = substr($in, 0, $pos); - if (preg_match('#\[code(?:=([a-z]+))?\]#i', $sub_buffer)) + if (preg_match('#\[code(?:=([a-z]+))?\]#i', $buffer)) { break; } else { $in = substr($in, $pos); - $buffer .= $sub_buffer; + $code .= $buffer; } } - $buffer = substr($buffer, 0, -7); - switch ($type) + $code = substr($code, 0, -7); + $code = preg_replace('#^[\r\n]*(.*?)[\n\r\s\t]*$#s', '\1', $code); + + switch (strtolower($stx)) { case 'php': - $out .= '[code=php:' . $this->bbcode_uid . ']' . str_replace($str_from, $str_to, $buffer) . '[/code:' . $this->bbcode_uid . ']'; + $remove_tags = FALSE; + if (!preg_match('/\<\?.*?\?\>/is', $code)) + { + $remove_tags = TRUE; + $code = ""; + } + + ob_start(); + highlight_string($code); + $code = ob_get_contents(); + ob_end_clean(); + + if ($remove_tags) + { + $code = preg_replace('!^[\n\r\s\t]*[\n\r\s\t]*()<\?php (.*)\?>[\n\r\s\t]*()[\n\r\s\t]*[\n\r\s\t]*!is', '\1\2\3', $code); + } + else + { + $code = preg_replace('!^[\n\r\s\t]*[\n\r\s\t]*(.*)[\n\r\s\t]*[\n\r\s\t]*!is', '\1', $code); + } + + $str_from = array('[', ']', '.'); + $str_to = array('[', ']', '.'); + + $out .= "[code=$stx:" . $this->bbcode_uid . ']' . str_replace($str_from, $str_to, $code) . '[/code:' . $this->bbcode_uid . ']'; break; - + default: - $out .= '[code:' . $this->bbcode_uid . ']' . str_replace($str_from, $str_to, $buffer) . '[/code:' . $this->bbcode_uid . ']'; + $str_from = array('<', '>', '[', ']', '.'); + $str_to = array('<', '>', '[', ']', '.'); + + $out .= '[code:' . $this->bbcode_uid . ']' . str_replace($str_from, $str_to, $code) . '[/code:' . $this->bbcode_uid . ']'; }