weekly release 2.3.9+
[moodle.git] / filter / activitynames / filter.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * This filter provides automatic linking to
20  * activities when its name (title) is found inside every Moodle text
21  *
22  * @package    filter
23  * @subpackage activitynames
24  * @copyright  2004 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
25  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
28 defined('MOODLE_INTERNAL') || die();
30 /**
31  * Activity name filtering
32  */
33 class filter_activitynames extends moodle_text_filter {
34     // Trivial-cache - keyed on $cachedcourseid
35     static $activitylist = null;
36     static $cachedcourseid;
38     function filter($text, array $options = array()) {
39         global $CFG, $COURSE, $DB;
41         if (!$courseid = get_courseid_from_context($this->context)) {
42             return $text;
43         }
45         // Initialise/invalidate our trivial cache if dealing with a different course
46         if (!isset(self::$cachedcourseid) || self::$cachedcourseid !== (int)$courseid) {
47             self::$activitylist = null;
48         }
49         self::$cachedcourseid = (int)$courseid;
51         /// It may be cached
53         if (is_null(self::$activitylist)) {
54             self::$activitylist = array();
56             if ($COURSE->id == $courseid) {
57                 $course = $COURSE;
58             } else {
59                 $course = $DB->get_record("course", array("id"=>$courseid));
60             }
62             if (!isset($course->modinfo)) {
63                 return $text;
64             }
66         /// Casting $course->modinfo to string prevents one notice when the field is null
67             $modinfo = unserialize((string)$course->modinfo);
69             if (!empty($modinfo)) {
71                 self::$activitylist = array();      /// We will store all the activities here
73                 //Sort modinfo by name length
74                 usort($modinfo, 'filter_activitynames_comparemodulenamesbylength');
76                 foreach ($modinfo as $activity) {
77                     //Exclude labels, hidden activities and activities for group members only
78                     if ($activity->mod != "label" and $activity->visible and empty($activity->groupmembersonly)) {
79                         $title = s(trim(strip_tags($activity->name)));
80                         $currentname = trim($activity->name);
81                         $entitisedname  = s($currentname);
82                         /// Avoid empty or unlinkable activity names
83                         if (!empty($title)) {
84                             $href_tag_begin = "<a class=\"autolink\" title=\"$title\" href=\"$CFG->wwwroot/mod/$activity->mod/view.php?id=$activity->cm\">";
85                             self::$activitylist[] = new filterobject($currentname, $href_tag_begin, '</a>', false, true);
86                             if ($currentname != $entitisedname) { /// If name has some entity (&amp; &quot; &lt; &gt;) add that filter too. MDL-17545
87                                 self::$activitylist[] = new filterobject($entitisedname, $href_tag_begin, '</a>', false, true);
88                             }
89                         }
90                     }
91                 }
92             }
93         }
95         if (self::$activitylist) {
96             return $text = filter_phrases ($text, self::$activitylist);
97         } else {
98             return $text;
99         }
100     }
105 //This function is used to order module names from longer to shorter
106 function filter_activitynames_comparemodulenamesbylength($a, $b)  {
107     if (strlen($a->name) == strlen($b->name)) {
108         return 0;
109     }
110     return (strlen($a->name) < strlen($b->name)) ? 1 : -1;