From: moodler <moodler> Date: Sat, 9 Aug 2003 03:57:46 +0000 (+0000) Subject: New highlighting function that is able to cope with HTML. X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=88438a58934acd1b59fe55d5653eecdf1e036db0;p=moodle.git New highlighting function that is able to cope with HTML. It's a bit slower, but links in forums no longer cause problems. See bug #589 --- diff --git a/lib/weblib.php b/lib/weblib.php index 5bed9f2544..db95bfc867 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -619,15 +619,61 @@ function convert_urls_into_links(&$text) { /// Make lone URLs into links. eg http://moodle.com/ $text = eregi_replace("([[:space:]]|^|\(|\[)([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", - "\\1<a href=\"\\2://\\3\\4\" TARGET=\"newpage\">\\2://\\3\\4</a>", $text); + "\\1<a href=\"\\2://\\3\\4\" target=\"newpage\">\\2://\\3\\4</a>", $text); /// eg www.moodle.com $text = eregi_replace("([[:space:]]|^|\(|\[)www\.([^[:space:]]*)([[:alnum:]#?/&=])", - "\\1<a href=\"http://www.\\2\\3\" TARGET=\"newpage\">www.\\2\\3</a>", $text); + "\\1<a href=\"http://www.\\2\\3\" target=\"newpage\">www.\\2\\3</a>", $text); } -function highlight($needle, $haystack) { +function highlight($needle, $haystack, $case=0, + $left_string="<span class=\"highlight\">", $right_string="</span>") { +/// This function will highlight search words in a given string +/// It cares about HTML and will not ruin links. It's best to use +/// this function after performing any conversions to HTML. +/// Function found here: http://forums.devshed.com/t67822/scdaa2d1c3d4bacb4671d075ad41f0854.html + + $list_of_words = eregi_replace("[^-a-zA-Z0-9&']", " ", $needle); + $list_array = explode(" ", $list_of_words); + for ($i=0; $i<sizeof($list_array); $i++) { + if (strlen($list_array[$i]) == 1) { + $list_array[$i] = ""; + } + } + $list_of_words = implode(" ", $list_array); + $list_of_words_cp = $list_of_words; + $final = array(); + preg_match_all('/<(.+?)>/is',$haystack,$list_of_words); + + foreach (array_unique($list_of_words[0]) as $key=>$value) { + $final['<|'.$key.'|>'] = $value; + } + + $haystack = str_replace($final,array_keys($final),$haystack); + $list_of_words_cp = eregi_replace(" +", "|", $list_of_words_cp); + + if ($list_of_words_cp{0}=="|") { + $list_of_words_cp{0} = ""; + } + if ($list_of_words_cp{strlen($list_of_words_cp)-1}=="|") { + $list_of_words_cp{strlen($list_of_words_cp)-1}=""; + } + $list_of_words_cp = "(".trim($list_of_words_cp).")"; + + if (!$case){ + $haystack = eregi_replace("$list_of_words_cp", "$left_string"."\\1"."$right_string", $haystack); + } else { + $haystack = ereg_replace("$list_of_words_cp", "$left_string"."\\1"."$right_string", $haystack); + } + $haystack = str_replace(array_keys($final),$final,$haystack); + + return stripslashes($haystack); +} + +function highlightfast($needle, $haystack) { /// This function will highlight instances of $needle in $haystack +/// It's faster that the above function and doesn't care about +/// HTML or anything. $parts = explode(strtolower($needle), strtolower($haystack)); @@ -637,7 +683,7 @@ function highlight($needle, $haystack) { $parts[$key] = substr($haystack, $pos, strlen($part)); $pos += strlen($part); - $parts[$key] .= "<SPAN CLASS=highlight>".substr($haystack, $pos, strlen($needle))."</SPAN>"; + $parts[$key] .= "<span class=\"highlight\">".substr($haystack, $pos, strlen($needle))."</span>"; $pos += strlen($needle); } @@ -645,7 +691,6 @@ function highlight($needle, $haystack) { } - /// STANDARD WEB PAGE PARTS /////////////////////////////////////////////////// function print_header ($title="", $heading="", $navigation="", $focus="", $meta="", $cache=true, $button=" ", $menu="") { diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 015087f243..c2a2984054 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -910,7 +910,7 @@ function forum_make_mail_post(&$post, $user, $touser, $course, } -function forum_print_post(&$post, $courseid, $ownpost=false, $reply=false, $link=false, $rate=false, $footer="") { +function forum_print_post(&$post, $courseid, $ownpost=false, $reply=false, $link=false, $rate=false, $footer="", $highlight="") { global $THEME, $USER, $CFG; echo "<a name=\"$post->id\"></a>"; @@ -959,7 +959,11 @@ function forum_print_post(&$post, $courseid, $ownpost=false, $reply=false, $link echo "</a> (".get_string("numwords", "", $numwords).")...</p>"; } else { // Print whole message - echo format_text($post->message, $post->format); + if ($highlight) { + echo highlight($highlight, format_text($post->message, $post->format)); + } else { + echo format_text($post->message, $post->format); + } echo $attachedimages; } diff --git a/mod/forum/search.php b/mod/forum/search.php index 27dffd54a0..3218d5805b 100644 --- a/mod/forum/search.php +++ b/mod/forum/search.php @@ -51,22 +51,21 @@ error("Could not find forum $discussion->forum"); } - $post->subject = highlight("$search", $post->subject); - $discussion->name = highlight("$search", $discussion->name); + $post->subject = highlightfast("$search", $post->subject); + $discussion->name = highlightfast("$search", $discussion->name); - $fullsubject = "<A HREF=\"view.php?f=$forum->id\">$forum->name</A>"; + $fullsubject = "<a href=\"view.php?f=$forum->id\">$forum->name</a>"; if ($forum->type != "single") { - $fullsubject .= " -> <A HREF=\"discuss.php?d=$discussion->id\">$discussion->name</A>"; + $fullsubject .= " -> <a href=\"discuss.php?d=$discussion->id\">$discussion->name</a>"; if ($post->parent != 0) { - $fullsubject .= " -> <A HREF=\"discuss.php?d=$post->discussion&parent=$post->id\">$post->subject</A>"; + $fullsubject .= " -> <a href=\"discuss.php?d=$post->discussion&parent=$post->id\">$post->subject</a>"; } } $post->subject = $fullsubject; - $post->message = highlight("$search", $post->message); - $fulllink = "<P ALIGN=right><A HREF=\"discuss.php?d=$post->discussion&parent=$post->id\">".get_string("postincontext", "forum")."</A></P>"; - forum_print_post($post, $course->id, false, false, false, false, $fulllink); + $fulllink = "<p align=\"right\"><a href=\"discuss.php?d=$post->discussion&parent=$post->id\">".get_string("postincontext", "forum")."</a></p>"; + forum_print_post($post, $course->id, false, false, false, false, $fulllink, $search); echo "<BR>"; }