<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[BuddyPress] [2218] trunk: @username notifications and filters.</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>2218</dd>
<dt>Author</dt> <dd>apeatling</dd>
<dt>Date</dt> <dd>2009-12-27 20:01:21 +0000 (Sun, 27 Dec 2009)</dd>
</dl>
<h3>Log Message</h3>
<pre>@username notifications and filters.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpactivitybpactivityfiltersphp">trunk/bp-activity/bp-activity-filters.php</a></li>
<li><a href="#trunkbpactivitybpactivitytemplatetagsphp">trunk/bp-activity/bp-activity-templatetags.php</a></li>
<li><a href="#trunkbpactivityphp">trunk/bp-activity.php</a></li>
<li><a href="#trunkbpcorebpcorewpabstractionphp">trunk/bp-core/bp-core-wpabstraction.php</a></li>
<li><a href="#trunkbpgroupsphp">trunk/bp-groups.php</a></li>
<li><a href="#trunkbpthemesbpdefault_incajaxphp">trunk/bp-themes/bp-default/_inc/ajax.php</a></li>
<li><a href="#trunkbpthemesbpdefault_incglobaljs">trunk/bp-themes/bp-default/_inc/global.js</a></li>
<li><a href="#trunkbpthemesbpdefaultactivityentryphp">trunk/bp-themes/bp-default/activity/entry.php</a></li>
<li><a href="#trunkbpxprofilebpxprofilenotificationsphp">trunk/bp-xprofile/bp-xprofile-notifications.php</a></li>
<li><a href="#trunkbpxprofilephp">trunk/bp-xprofile.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpactivitybpactivityfiltersphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-activity/bp-activity-filters.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-activity/bp-activity-filters.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-activity/bp-activity-filters.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -54,5 +54,26 @@
</span><span class="cx">         return wp_kses( $content, $activity_allowedtags );
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+function bp_activity_at_name_filter( $content ) {
+        include_once( ABSPATH . WPINC . '/registration.php' );
</ins><span class="cx">
</span><ins>+        $pattern = '/[@]+([A-Za-z0-9-_]+)/';
+        preg_match_all( $pattern, $content, $usernames );
+
+        /* Make sure there's only one instance of each username */
+        if ( !$usernames = array_unique( $usernames[1] ) )
+                return $content;
+
+        foreach( (array)$usernames as $username ) {
+                if ( !username_exists( $username ) )
+                        continue;
+
+                $content = str_replace( "@$username", "<a href='" . bp_core_get_user_domain( bp_core_get_userid( $username ) ) . "' rel='nofollow'>@$username</a>", $content );
+        }
+
+        return $content;
+}
+add_filter( 'xprofile_activity_new_update_content', 'bp_activity_at_name_filter' );
+add_filter( 'groups_activity_new_update_content', 'bp_activity_at_name_filter' );
+
</ins><span class="cx"> ?>
</span><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkbpactivitybpactivitytemplatetagsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-activity/bp-activity-templatetags.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-activity/bp-activity-templatetags.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-activity/bp-activity-templatetags.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -509,14 +509,7 @@
</span><span class="cx">         function bp_get_activity_thread_permalink() {
</span><span class="cx">                 global $bp, $activities_template;
</span><span class="cx">
</span><del>-                if ( 'new_blog_post' == bp_get_activity_action_name() || 'new_blog_comment' == bp_get_activity_action_name() || 'new_forum_topic' == bp_get_activity_action_name() || 'new_forum_post' == bp_get_activity_action_name() )
-                        $link = bp_activity_feed_item_link();
-                else {
-                        if ( 'activity_comment' == bp_get_activity_action_name() )
-                                $link = $bp->root_domain . '/' . BP_ACTIVITY_SLUG . '/p/' . $activities_template->activity->item_id;
-                        else
-                                $link = $bp->root_domain . '/' . BP_ACTIVITY_SLUG . '/p/' . $activities_template->activity->id;
-                }
</del><ins>+                $link = bp_activity_get_permalink( $activities_template->activity->id, $activities_template->activity );
</ins><span class="cx">
</span><span class="cx">                  return apply_filters( 'bp_get_activity_thread_permalink', $link );
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkbpactivityphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-activity.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-activity.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-activity.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -162,6 +162,8 @@
</span><span class="cx">
</span><span class="cx">         $has_access = apply_filters( 'bp_activity_permalink_access', $has_access, &$activity );
</span><span class="cx">
</span><ins>+        do_action( 'bp_activity_screen_single_activity_permalink', $activity, $has_access );
+
</ins><span class="cx">         if ( !$has_access ) {
</span><span class="cx">                 bp_core_add_message( __( 'You do not have access to this activity.', 'buddypress' ), 'error' );
</span><span class="cx">                 bp_core_redirect( $bp->loggedin_user->domain );
</span><span class="lines">@@ -485,6 +487,24 @@
</span><span class="cx">         return true;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+function bp_activity_get_permalink( $activity_id, $activity_obj = false ) {
+        global $bp;
+
+        if ( !$activity_obj )
+                $activity_obj = new BP_Activity_Activity( $activity_id );
+
+        if ( 'new_blog_post' == $activity_obj->component_action || 'new_blog_comment' == $activity_obj->component_action || 'new_forum_topic' == $activity_obj->component_action || 'new_forum_post' == $activity_obj->component_action )
+                $link = $activity_obj->primary_link;
+        else {
+                if ( 'activity_comment' == $activity_obj->component_action )
+                        $link = $bp->root_domain . '/' . BP_ACTIVITY_SLUG . '/p/' . $activity_obj->item_id . '/';
+                else
+                        $link = $bp->root_domain . '/' . BP_ACTIVITY_SLUG . '/p/' . $activity_obj->id . '/';
+        }
+
+        return apply_filters( 'bp_activity_get_permalink', $link );
+}
+
</ins><span class="cx"> function bp_activity_add_timesince_placeholder( $content ) {
</span><span class="cx">         /* Check a time-since span doesn't already exist */
</span><span class="cx">         if ( false === strpos( $content, '<span class="time-since">' ) ) {
</span></span></pre></div>
<a id="trunkbpcorebpcorewpabstractionphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/bp-core-wpabstraction.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/bp-core-wpabstraction.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-core/bp-core-wpabstraction.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -110,7 +110,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if ( !function_exists( 'wpmu_validate_user_signup' ) ) {
</span><del>-        function wpmu_validate_user_signup($user_name, $user_email) {
</del><ins>+        function wpmu_validate_user_signup( $user_name, $user_email ) {
</ins><span class="cx">                 global $wpdb;
</span><span class="cx">
</span><span class="cx">                 $errors = new WP_Error();
</span><span class="lines">@@ -169,33 +169,6 @@
</span><span class="cx">                 if ( email_exists($user_email) )
</span><span class="cx">                         $errors->add('user_email', __("Sorry, that email address is already used!"));
</span><span class="cx">
</span><del>-                // Has someone already signed up for this username?
-                $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_name) );
-                if ( $signup != null ) {
-                        $registered_at = mysql2date('U', $signup->registered);
-                        $now = current_time( 'timestamp', true );
-                        $diff = $now - $registered_at;
-                        // If registered more than two days ago, cancel registration and let this signup go through.
-                        if ( $diff > 172800 ) {
-                                $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE user_login = %s", $user_name) );
-                        } else {
-                                $errors->add('user_name', __("That username is currently reserved but may be available in a couple of days."));
-                        }
-                        if( $signup->active == 0 && $signup->user_email == $user_email )
-                                $errors->add('user_email_used', __("username and email used"));
-                }
-
-                $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_email = %s", $user_email) );
-                if ( $signup != null ) {
-                        $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered);
-                        // If registered more than two days ago, cancel registration and let this signup go through.
-                        if ( $diff > 172800 ) {
-                                $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE user_email = %s", $user_email) );
-                        } else {
-                                $errors->add('user_email', __("That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing."));
-                        }
-                }
-
</del><span class="cx">                 $result = array('user_name' => $user_name, 'user_email' => $user_email,        'errors' => $errors);
</span><span class="cx">
</span><span class="cx">                 return apply_filters('wpmu_validate_user_signup', $result);
</span></span></pre></div>
<a id="trunkbpgroupsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-groups.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-groups.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-groups.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -2001,8 +2001,8 @@
</span><span class="cx">
</span><span class="cx">         $activity_id = groups_record_activity( array(
</span><span class="cx">                 'user_id' => $user_id,
</span><del>-                'content' => apply_filters( 'groups_activity_new_wire_post', $activity_content ),
-                'primary_link' => apply_filters( 'groups_activity_new_wire_post_primary_link', bp_get_group_permalink( $group ) ),
</del><ins>+                'content' => apply_filters( 'groups_activity_new_update_content', $activity_content ),
+                'primary_link' => apply_filters( 'groups_activity_new_update_primary_link', bp_get_group_permalink( $group ) ),
</ins><span class="cx">                 'component_action' => 'new_wire_post',
</span><span class="cx">                 'item_id' => $item_id
</span><span class="cx">         ) );
</span></span></pre></div>
<a id="trunkbpthemesbpdefault_incajaxphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-themes/bp-default/_inc/ajax.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-themes/bp-default/_inc/ajax.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-themes/bp-default/_inc/ajax.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -376,7 +376,6 @@
</span><span class="cx">                         $new_favs[] = $fav;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-
</del><span class="cx">         update_usermeta( $bp->loggedin_user->id, 'bp_favorite_activities', $new_favs );
</span><span class="cx">
</span><span class="cx">         _e( 'Mark Favorite', 'buddypress' );
</span></span></pre></div>
<a id="trunkbpthemesbpdefault_incglobaljs"></a>
<div class="modfile"><h4>Modified: trunk/bp-themes/bp-default/_inc/global.js (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-themes/bp-default/_inc/global.js        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-themes/bp-default/_inc/global.js        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -74,6 +74,7 @@
</span><span class="cx">                                 }
</span><span class="cx">
</span><span class="cx">                                 j("ul.activity-list").prepend(response);
</span><ins>+                                j("ul.activity-list li:first").addClass('new-update');
</ins><span class="cx">                                 j("li.new-update").hide().slideDown( 300 );
</span><span class="cx">                                 j("li.new-update").removeClass( 'new-update' );
</span><span class="cx">                                 j("textarea#whats-new").val('');
</span><span class="lines">@@ -290,7 +291,6 @@
</span><span class="cx">                         form.slideDown( 200 );
</span><span class="cx">                         j.scrollTo( form, 500, { offset:-100, easing:'easeout' } );
</span><span class="cx">                         j('#ac-form-' + ids[2] + ' textarea').focus();
</span><del>-                        j('#ac-form-' + ids[2] + ' textarea').TextAreaExpander( 60, 1000 );
</del><span class="cx">
</span><span class="cx">                         return false;
</span><span class="cx">                 }
</span></span></pre></div>
<a id="trunkbpthemesbpdefaultactivityentryphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-themes/bp-default/activity/entry.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-themes/bp-default/activity/entry.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-themes/bp-default/activity/entry.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> <?php /* This template is used by permalink pages and AJAX functions to load in new updates */ ?>
</span><del>-<li class="<?php bp_activity_css_class() ?> new-update" id="activity-<?php bp_activity_id() ?>">
</del><ins>+<li class="<?php bp_activity_css_class() ?>" id="activity-<?php bp_activity_id() ?>">
</ins><span class="cx">         <div class="activity-avatar">
</span><span class="cx">                 <?php bp_activity_avatar( 'type=full&width=60&height=60' ) ?>
</span><span class="cx">         </div>
</span></span></pre></div>
<a id="trunkbpxprofilebpxprofilenotificationsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-xprofile/bp-xprofile-notifications.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-xprofile/bp-xprofile-notifications.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-xprofile/bp-xprofile-notifications.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -1,7 +1,56 @@
</span><span class="cx"> <?php
</span><span class="cx">
</span><ins>+function xprofile_at_message_notification( $content, $poster_user_id, $activity_id ) {
+        global $bp;
+
+        /* Scan for @username strings in an activity update. Notify each user. */
+        $pattern = '/[@]+([A-Za-z0-9-_]+)/';
+        preg_match_all( $pattern, $content, $usernames );
+
+        /* Make sure there's only one instance of each username */
+        if ( !$usernames = array_unique( $usernames[1] ) )
+                return false;
+
+        foreach( (array)$usernames as $username ) {
+                if ( !$receiver_user_id = bp_core_get_userid($username) )
+                        continue;
+
+                // Add a screen notification of an @message
+                bp_core_add_notification( $activity_id, $receiver_user_id, $bp->profile->id, 'new_at_mention', $poster_user_id );
+
+                // Now email the user with the contents of the message (if they have enabled email notifications)
+                if ( !get_usermeta( $user_id, 'notification_activity_new_mention' ) || 'yes' == get_usermeta( $user_id, 'notification_activity_new_mention' ) ) {
+                        $poster_name = bp_core_get_user_displayname( $poster_user_id );
+
+                        $message_link = bp_activity_get_permalink( $activity_id );
+                        $settings_link = bp_core_get_user_domain( $user_id ) . 'settings/notifications/';
+
+                        // Set up and send the message
+                        $ud = get_userdata( $receiver_user_id );
+                        $to = $ud->user_email;
+                        $subject = '[' . get_blog_option( BP_ROOT_BLOG, 'blogname' ) . '] ' . sprintf( __( '%s mentioned you in an update', 'buddypress' ), stripslashes($poster_name) );
+
+$message = sprintf( __(
+'%s mentioned you in an update:
+
+"%s"
+
+To view and respond to the message, log in and visit: %s
+
+---------------------
+', 'buddypress' ), $poster_name, wp_filter_kses( stripslashes($content) ), $message_link );
+
+                        $message .= sprintf( __( 'To disable these notifications please log in and go to: %s', 'buddypress' ), $settings_link );
+
+                        // Send it
+                        wp_mail( $to, $subject, $message );
+                }
+        }
+}
+add_action( 'xprofile_posted_update', 'xprofile_at_message_notification', 10, 3 );
+
</ins><span class="cx"> /**
</span><del>- * xprofile_record_wire_post_notification()
</del><ins>+ * xprofile_record_wire_post_notification() [DEPRECATED]
</ins><span class="cx"> *
</span><span class="cx"> * Records a notification for a new profile wire post to the database and sends out a notification
</span><span class="cx"> * email if the user has this setting enabled.
</span></span></pre></div>
<a id="trunkbpxprofilephp"></a>
<div class="modfile"><h4>Modified: trunk/bp-xprofile.php (2217 => 2218)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-xprofile.php        2009-12-27 15:05:26 UTC (rev 2217)
+++ trunk/bp-xprofile.php        2009-12-27 20:01:21 UTC (rev 2218)
</span><span class="lines">@@ -718,6 +718,16 @@
</span><span class="cx"> function xprofile_format_notifications( $action, $item_id, $secondary_item_id, $total_items ) {
</span><span class="cx">         global $bp;
</span><span class="cx">
</span><ins>+        if ( 'new_at_mention' == $action ) {
+                $user_fullname = bp_core_get_user_displayname( $secondary_item_id );
+
+                if ( (int)$total_items > 1 ) {
+                        return apply_filters( 'bp_xprofile_multiple_at_mentions_notification', '<a href="' . bp_core_get_user_domain( $secondary_item_id ) . 'activity/" title="' . __( 'View User', 'buddypress' ) . '">' . sprintf( __( '%s mentioned you in %d updates', 'buddypress' ), $user_fullname, (int)$total_items ) . '</a>', $total_items );
+                } else {
+                        return apply_filters( 'bp_xprofile_single_at_mention_notification', '<a href="' . bp_activity_get_permalink( $item_id ) . '" title="' . __( 'View Thread', 'buddypress' ) . '">' . sprintf( __( '%s mentioned you in an update', 'buddypress' ), $user_fullname ) . '</a>', $user_fullname );
+                }
+        }
+
</ins><span class="cx">         if ( 'new_wire_post' == $action ) {
</span><span class="cx">                 if ( (int)$total_items > 1 ) {
</span><span class="cx">                         return apply_filters( 'bp_xprofile_multiple_new_wire_post_notification', '<a href="' . $bp->loggedin_user->domain . $bp->wire->slug . '" title="' . __( 'Wire', 'buddypress' ) . '">' . sprintf( __( 'You have %d new posts on your wire', 'buddypress' ), (int)$total_items ) . '</a>', $total_items );
</span><span class="lines">@@ -766,7 +776,7 @@
</span><span class="cx">         /* Now write the values */
</span><span class="cx">         $activity_id = xprofile_record_activity( array(
</span><span class="cx">                 'user_id' => $user_id,
</span><del>-                'content' => apply_filters( 'xprofile_activity_new_update', $activity_content ),
</del><ins>+                'content' => apply_filters( 'xprofile_activity_new_update_content', $activity_content ),
</ins><span class="cx">                 'primary_link' => apply_filters( 'xprofile_activity_new_update_primary_link', $primary_link ),
</span><span class="cx">                 'component_action' => 'new_wire_post'
</span><span class="cx">         ) );
</span><span class="lines">@@ -774,6 +784,8 @@
</span><span class="cx">         /* Add this update to the "latest update" usermeta so it can be fetched anywhere. */
</span><span class="cx">         update_usermeta( $bp->loggedin_user->id, 'bp_latest_update', array( 'id' => $activity_id, 'content' => wp_filter_kses( $content ) ) );
</span><span class="cx">
</span><ins>+        do_action( 'xprofile_posted_update', $content, $user_id, $activity_id );
+
</ins><span class="cx">         return $activity_id;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1128,9 +1140,12 @@
</span><span class="cx"> function xprofile_remove_screen_notifications() {
</span><span class="cx">         global $bp;
</span><span class="cx">
</span><ins>+        bp_core_delete_notifications_for_user_by_type( $bp->loggedin_user->id, $bp->profile->id, 'new_at_mention' );
</ins><span class="cx">         bp_core_delete_notifications_for_user_by_type( $bp->loggedin_user->id, $bp->profile->id, 'new_wire_post' );
</span><span class="cx"> }
</span><span class="cx"> add_action( 'bp_wire_screen_latest', 'xprofile_remove_screen_notifications' );
</span><ins>+add_action( 'bp_activity_screen_my_activity', 'xprofile_remove_screen_notifications' );
+add_action( 'bp_activity_screen_single_activity_permalink', 'xprofile_remove_screen_notifications' );
</ins><span class="cx">
</span><span class="cx"> /**
</span><span class="cx"> * xprofile_filter_template_paths()
</span></span></pre>
</div>
</div>
</body>
</html>