]> git.mjollnir.org Git - moodle.git/commitdiff
New highlighting function that is able to cope with HTML.
authormoodler <moodler>
Sat, 9 Aug 2003 03:57:46 +0000 (03:57 +0000)
committermoodler <moodler>
Sat, 9 Aug 2003 03:57:46 +0000 (03:57 +0000)
It's a bit slower, but links in forums no longer cause problems.

See bug #589

lib/weblib.php
mod/forum/lib.php
mod/forum/search.php

index 5bed9f254448322ec7778a2377144b2a96a38bb1..db95bfc8672d9eea69d95af874f197e12928ef1b 100644 (file)
@@ -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="&nbsp;", $menu="") {
index 015087f243041ad9d039076bc4e840d1dc462ad8..c2a2984054339c8111d16d3a70f2bf1a0e9d0ffb 100644 (file)
@@ -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; 
     }
 
index 27dffd54a059db6271cc67f041ef96fb5dfa6535..3218d5805beff96c2813ca8e8041fe01306f6161 100644 (file)
                     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>";
             }