Skip to content

Commit

Permalink
Resource auto-linking filter! Developed by Eloy - thanks! (see bug 1389)
Browse files Browse the repository at this point in the history
  • Loading branch information
moodler committed May 16, 2004
1 parent b7f3582 commit d5aacf3
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 0 deletions.
1 change: 1 addition & 0 deletions lang/en/resource.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
$string['fetcherror'] = 'An error was found while trying to retrieve the web page.';
$string['fetchservererror'] = 'An error was found with the remote server while trying to retrieve the web page (possibly a program error).</p>';
$string['filename'] = 'File name';
$string['filtername'] = "Resource Auto-linking";
$string['fulltext'] = 'Full text';
$string['htmlfragment'] = 'HTML fragment';
$string['maindirectory'] = 'Main files directory';
Expand Down
136 changes: 136 additions & 0 deletions mod/resource/filter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
<?PHP // $Id$
//This function provides automatic linking to
//resources when its name (title) is found inside every Moodle text
//It's based in the glosssary filter by Williams Castillo
//Modifications by stronk7. Enjoy! :-)

$textfilter_function='resource_names_filter';

if (function_exists($textfilter_function)) {
return;
}

function resource_names_filter($courseid, $text) {

global $CFG;

if (empty($courseid)) {
if ($site = get_site()) {
$courseid = $site->id;
}
}

switch ($CFG->dbtype) {
case 'postgres7':
$as = 'as';
break;
case 'mysql':
$as = '';
break;
}

///sorting by the lenght of the title in order to assure that large resources
///could be linked first, if they exist in the text to parse

switch ($CFG->dbtype) {
case "postgres7":
case "mysql":
$rbylenght = "CHAR_LENGTH(name) desc";
break;
default:
$rbylenght = "";
break;
}

$resources = get_records_select("resource", "course = $courseid", "$rbylenght");

if (!empty($resources)) {
$cm = '';
foreach ($resources as $resource) {
if (!$cm = get_coursemodule_from_instance("resource", $resource->id, $courseid)) {
$cm->id = 1;
}
$title = strip_tags($resource->name);
$href_tag_begin = "<a class=\"autolink\" title=\"$title\" href=\"$CFG->wwwroot/mod/resource/view.php?id=$cm->id\">";
$currentname = $resource->name;
if ($currentname = trim($currentname)) {
$text = resource_link_names($text,$currentname,$href_tag_begin, "</a>");
}
}
}
return $text;
}

function resource_link_names($text,$name,$href_tag_begin,$href_tag_end = "</a>") {

$list_of_words_cp = $name;

$list_of_words_cp = trim($list_of_words_cp,'|');

$list_of_words_cp = trim($list_of_words_cp);

$list_of_words_cp = preg_quote($list_of_words_cp);

$invalidprefixs = "([a-zA-Z0-9])";
$invalidsufixs = "([a-zA-Z0-9])";

//Avoid seaching in the string if it's inside invalidprefixs and invalidsufixs
$words = array();
$regexp = '/'.$invalidprefixs.'('.$list_of_words_cp.')|('.$list_of_words_cp.')'.$invalidsufixs.'/is';
preg_match_all($regexp,$text,$list_of_words);

foreach (array_unique($list_of_words[0]) as $key=>$value) {
$words['<*'.$key.'*>'] = $value;
}
if (!empty($words)) {
$text = str_replace($words,array_keys($words),$text);
}

//Now avoid searching inside the <nolink>tag
$excludes = array();
preg_match_all('/<nolink>(.+?)<\/nolink>/is',$text,$list_of_excludes);
foreach (array_unique($list_of_excludes[0]) as $key=>$value) {
$excludes['<+'.$key.'+>'] = $value;
}
if (!empty($excludes)) {
$text = str_replace($excludes,array_keys($excludes),$text);
}

//Now avoid searching inside links
$links = array();
preg_match_all('/<A (.+?)>(.+?)<\/A>/is',$text,$list_of_links);
foreach (array_unique($list_of_links[0]) as $key=>$value) {
$links['<@'.$key.'@>'] = $value;
}
if (!empty($links)) {
$text = str_replace($links,array_keys($links),$text);
}

//Now avoid searching inside every tag
$final = array();
preg_match_all('/<(.+?)>/is',$text,$list_of_tags);
foreach (array_unique($list_of_tags[0]) as $key=>$value) {
$final['<|'.$key.'|>'] = $value;
}
if (!empty($final)) {
$text = str_replace($final,array_keys($final),$text);
}

$text = preg_replace('/('.$list_of_words_cp.')/is', $href_tag_begin.'$1'.$href_tag_end,$text);

//Now rebuild excluded areas
if (!empty($final)) {
$text = str_replace(array_keys($final),$final,$text);
}
if (!empty($links)) {
$text = str_replace(array_keys($links),$links,$text);
}
if (!empty($excludes)) {
$text = str_replace(array_keys($excludes),$excludes,$text);
}
if (!empty($words)) {
$text = str_replace(array_keys($words),$words,$text);
}
return $text;
}
?>

0 comments on commit d5aacf3

Please sign in to comment.