Seditio Source
Root |
./othercms/b2evolution_7.2.3/plugins/_nofollow.plugin.php
<?php
/**
 * This file implements the Nofollow UGC Sponsored plugin for b2evolution
 *
 * b2evolution - {@link http://b2evolution.net/}
 * Released under GNU GPL License - {@link http://b2evolution.net/about/gnu-gpl-license}
 * @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}
 *
 * @package plugins
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );


/**
 * Nofollow UGC Sponsored plugin.
 *
 * @package plugins
 */
class nofollow_plugin extends Plugin
{
    var
$code = 'evo_nofollow';
    var
$name = 'Tag external links';
    var
$priority = 99;
    var
$version = '7.2.3';
    var
$group = 'rendering';
    var
$short_desc;
    var
$long_desc;
    var
$help_topic = 'tag-external-links-plugin';
    var
$number_of_installs = 1;


   
/**
     * Init
     */
   
function PluginInit( & $params )
    {
       
$this->short_desc = sprintf( T_('Add options %s for absolute links'), '<code>rel="nofollow"</code>, <code>rel="ugc"</code>, <code>rel="sponsored"</code>, <code>target="_blank"</code>' );
       
$this->long_desc = $this->short_desc;
    }


   
/**
     * Define here default collection/blog settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_coll_setting_definitions( & $params )
    {
       
$default_values = array(
               
'abs_links_posts_nofollow'     => 0,
               
'abs_links_posts_ugc'          => 0,
               
'abs_links_posts_sponsored'    => 0,
               
'abs_links_posts_blank'        => 0,
               
'abs_links_comments_nofollow'  => 1,
               
'abs_links_comments_ugc'       => 1,
               
'abs_links_comments_sponsored' => 0,
               
'abs_links_comments_blank'     => 0,
            );

        if( ! empty(
$params['blog_type'] ) )
        {    
// Set the default settings depends on collection type:
           
switch( $params['blog_type'] )
            {
                case
'forum':
                   
$default_values['abs_links_posts_nofollow'] = 1;
                   
$default_values['abs_links_posts_ugc'] = 1;
                    break;
            }
        }

       
// set params to allow rendering for comments by default
       
$default_params = array_merge( $params, array(
               
'default_post_rendering' => 'always',
               
'default_comment_rendering' => 'always',
            ) );
        return
array_merge( parent::get_coll_setting_definitions( $default_params ),
            array(
               
'abs_links_posts' => array(
                       
'label' => T_('For absolute links in posts'),
                       
'type' => 'checklist',
                       
'options' => array(
                            array(
'nofollow', sprintf( $this->T_('Add %s'), '<code>rel="nofollow"</code>' ), $default_values['abs_links_posts_nofollow'] ),
                            array(
'ugc', sprintf( $this->T_('Add %s'), '<code>rel="ugc"</code>' ), $default_values['abs_links_posts_ugc'] ),
                            array(
'sponsored', sprintf( $this->T_('Add %s'), '<code>rel="sponsored"</code>' ), $default_values['abs_links_posts_sponsored'] ),
                            array(
'blank', sprintf( $this->T_('Add %s'), '<code>target="_blank"</code>' ), $default_values['abs_links_posts_blank'] ),
                        )
                    ),
               
'abs_links_comments' => array(
                       
'label' => T_('For absolute links in comments'),
                       
'type' => 'checklist',
                       
'options' => array(
                            array(
'nofollow', sprintf( $this->T_('Add %s'), '<code>rel="nofollow"</code>' ), $default_values['abs_links_comments_nofollow'] ),
                            array(
'ugc', sprintf( $this->T_('Add %s'), '<code>rel="ugc"</code>' ), $default_values['abs_links_comments_ugc'] ),
                            array(
'sponsored', sprintf( $this->T_('Add %s'), '<code>rel="sponsored"</code>' ), $default_values['abs_links_comments_sponsored'] ),
                                array(
'blank', sprintf( $this->T_('Add %s'), '<code>target="_blank"</code>' ), $default_values['abs_links_comments_blank'] ),
                        )
                    ),
            )
        );
    }


   
/**
     * Define here default message settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_msg_setting_definitions( & $params )
    {
       
$default_params = array_merge( $params, array( 'default_msg_rendering' => 'never' ) );
        return
array_merge( parent::get_msg_setting_definitions( $default_params ) );
    }


   
/**
     * Define here default email settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_email_setting_definitions( & $params )
    {
       
$default_params = array_merge( $params, array( 'default_email_rendering' => 'never' ) );
        return
array_merge( parent::get_email_setting_definitions( $default_params ) );
    }


   
/**
     * Define here default shared settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_shared_setting_definitions( & $params )
    {
       
$default_params = array_merge( $params, array( 'default_shared_rendering' => 'never' ) );
        return
array_merge( parent::get_shared_setting_definitions( $default_params ) );
    }


   
/**
     * Perform rendering
     *
     * @param array Associative array of parameters
     *                             (Output format, see {@link format_to_output()})
     * @return boolean true if we can render something for the required output format
     */
   
function RenderItemAsHtml( & $params )
    {
       
$content = & $params['data'];

       
// Get collection from given params (also it is used to build link for tag links):
       
$current_Blog = $this->get_Blog_from_params( $params );

       
// Define the setting names depending on what is rendering now:
       
$setting_name = ( empty( $params['Comment'] ) ? 'abs_links_posts' : 'abs_links_comments' );
       
$this->setting_rel_options = array();
        if(
$this->get_checklist_setting( $setting_name, 'nofollow', 'coll', $current_Blog ) )
        {
           
$this->setting_rel_options[] = 'nofollow';
        }
        if(
$this->get_checklist_setting( $setting_name, 'ugc', 'coll', $current_Blog ) )
        {
           
$this->setting_rel_options[] = 'ugc';
        }
        if(
$this->get_checklist_setting( $setting_name, 'sponsored', 'coll', $current_Blog ) )
        {
           
$this->setting_rel_options[] = 'sponsored';
        }
       
$this->setting_target_options = array();
        if(
$this->get_checklist_setting( $setting_name, 'blank', 'coll', $current_Blog ) )
        {
           
$this->setting_target_options[] = 'blank';
        }

        if( ! empty(
$this->setting_rel_options ) || ! empty( $this->setting_target_options ) )
        {    
// Try to find links only of at least one rel option should be added:
           
$content = replace_outside_code_tags( '#<a([^>]+href="https?://[^"]+"[^>]*)>(.+?)</a>#i', array( $this, 'callback_render_content' ), $content, 'replace_content_callback' );
        }

        return
false;
    }


   
/**
     * Perform rendering of Message content
     *
     * NOTE: Use default coll settings of comments as messages settings
     *
     * @see Plugin::RenderMessageAsHtml()
     */
   
function RenderMessageAsHtml( & $params )
    {
        return
true;
    }


   
/**
     * Perform rendering of Email content
     *
     * NOTE: Use default coll settings of comments as messages settings
     *
     * @see Plugin::RenderEmailAsHtml()
     */
   
function RenderEmailAsHtml( & $params )
    {
        return
true;
    }


   
/**
     * Callback function to render content of Item, Comment
     *
     * @param array Matches
     */
   
function callback_render_content( $link_match )
    {
       
$link_attrs = $link_match[1];

        if( ! empty(
$this->setting_rel_options ) )
        {    
// Add attribute "rel":
           
if( preg_match( '# rel="([^"]*)"#i', $link_attrs, $rel_match ) )
            {    
// If link already has attrbiute "rel":
               
$rel_options = trim( $rel_match[1] );
               
$rel_options = ( $rel_options === '' ? array() : explode( ' ', trim( $rel_match[1] ) ) );
               
$rel_options_exist = true;
            }
            else
            {    
// If link has no attrbiute "rel" yet:
               
$rel_options = array();
               
$rel_options_exist = false;
            }

            foreach(
$this->setting_rel_options as $setting_rel_option )
            {
                if( !
in_array( $setting_rel_option, $rel_options ) )
                {    
// Add only new option to avoid duplicates:
                   
$rel_options[] = $setting_rel_option;
                }
            }

            if(
$rel_options_exist )
            {    
// Update attribute "rel" with added options:
               
$link_attrs = preg_replace( '# rel="([^"]*)"#i', ' rel="'.implode( ' ', $rel_options ).'"', $link_attrs );
            }
            else
            {    
// Add attribute "rel":
               
$link_attrs .= ' rel="'.implode( ' ', $rel_options ).'"';
            }
        }

        if( ! empty(
$this->setting_target_options ) &&
           
in_array( 'blank', $this->setting_target_options ) )
        {    
// Add attribute "target" only if it is not provided in the link:
           
if( preg_match( '# target="([^"]*)"#i', $link_attrs, $target_match ) )
            {    
// If link already has attrbiute "target":
               
$target_option = trim( $target_match[1] );
               
$target_options_exist = true;
            }
            else
            {    
// If link has no attrbiute "target" yet:
               
$target_option = '';
               
$target_options_exist = false;
            }

            if(
$target_option === '' )
            {    
// Add new option to target only if this attribute is not defined or value is empty string:
                // Do NOT rewrite already defined attributes like `target="_parent"`, `target="_self"`, etc.!
               
if( $target_options_exist )
                {    
// Update attribute "target" with added options:
                   
$link_attrs = preg_replace( '# target="([^"]*)"#i', ' target="_blank"', $link_attrs );
                }
                else
                {    
// Add attribute "rel":
                   
$link_attrs .= ' target="_blank"';
                }
            }
        }

        return
'<a'.$link_attrs.'>'.$link_match[2].'</a>';
    }
}

?>