Seditio Source
Root |
./othercms/ips_4.3.4/system/Node/Colorize.php
<?php
/**
 * @brief        Colorize Node Titles Trait
 * @author        <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright    (c) Invision Power Services, Inc.
 * @license        https://www.invisioncommunity.com/legal/standards/
 * @package        Invision Community
 * @since        5 April 2017
 */

namespace IPS\Node;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
   
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

/**
 * Colorize Trait
 */
trait Colorize
{
   
/**
     * @brief    Table column name that holds the feature color hex
     */
   
public static $featureColumnName = 'feature_color';
   
   
/**
     * @brief    Cache the calculated formatted title for this node
     */
   
protected $formattedTitle = NULL;
   
   
/**
     * @brief    Cache the formatted text colour for this node
     */
   
protected $featureTextColor = NULL;
   
   
/**
     * Get HTML formatted title. Allows apps or nodes to format the title, such as adding different colours, etc
     *
     * @return    string
     */
   
public function get__formattedTitle()
    {
        if (
$this->formattedTitle === NULL )
        {
           
$columnName = static::$featureColumnName;

            if ( !
$this->$columnName )
            {
               
$this->formattedTitle = $this->_title;
            }
            else
            {
               
$this->formattedTitle = \IPS\Theme::i()->getTemplate( 'global', 'core', 'front' )->formattedTitle( $this );
            }
        }
       
        return
$this->formattedTitle;
    }
   
   
/**
     * Get the featured text color for use in CSS
     *
     * @return    string
     */
   
public function get__featureTextColor()
    {
        if (
$this->featureTextColor === NULL )
        {
            if ( !
$this->feature_color )
            {
                return
NULL;
            }
            else
            {
               
$columnName = static::$featureColumnName;
               
$this->featureTextColor = static::featureTextColor( $this->$columnName );
            }
        }
       
        return
$this->featureTextColor;
    }
   
   
/**
     * Static method to fetch the text colour based on the the contrast from the background color
     *
     * @return    string
     */
   
public static function featureTextColor( $featureColor )
    {
       
$hexColor = str_replace( '#', '', $featureColor );
       
$blackColor = '000000';
       
$textColor = '#ffffff';
       
       
/* Use luminosity contrast algorithm to determine font color */
       
$r1 = hexdec( \substr( $hexColor, 0, 2 ) );
       
$g1 = hexdec( \substr( $hexColor, 2, 2 ) );
       
$b1 = hexdec( \substr( $hexColor, 4, 2 ) );

       
$r2 = hexdec( \substr( $blackColor, 0, 2 ) );
       
$g2 = hexdec( \substr( $blackColor, 2, 2 ) );
       
$b2 = hexdec( \substr( $blackColor, 4, 2 ) );

       
$l1 = 0.2126 * pow( $r1 / 255, 2.2 ) + 0.7152 * pow( $g1 / 255, 2.2 ) + 0.0722 * pow( $b1 / 255, 2.2 );
       
$l2 = 0.2126 * pow( $r2 / 255, 2.2 ) + 0.7152 * pow( $g2 / 255, 2.2 ) + 0.0722 * pow( $b2 / 255, 2.2 );

       
$contrastRatio = 0;
        if (
$l1 > $l2 )
        {
           
$contrastRatio = (int) ( ( $l1 + 0.05 ) / ( $l2 + 0.05 ) );
        }
        else
        {
           
$contrastRatio = (int) ( ( $l2 + 0.05 ) / ( $l1 + 0.05 ) );
        }

        if (
$contrastRatio > 5 )
        {
           
$textColor = '#000000';
        }
       
        return
$textColor;
    }

   
   
/**
     * Get title from index data
     *
     * @param    array        $indexData        Data from the search index
     * @param    array        $itemData        Basic data about the item. Only includes columns returned by item::basicDataColumns()
     * @param    array|NULL    $containerData    Basic data about the container. Only includes columns returned by container::basicDataColumns()
     * @return    \IPS\Http\Url
     */
   
public static function titleFromIndexData( $indexData, $itemData, $containerData )
    {
        if ( ! isset(
$containerData[ static::$databasePrefix . static::$featureColumnName ] ) )
        {
            return
parent::titleFromIndexData( $indexData, $itemData, $containerData );
        }
       
       
$node = $containerData;
       
$node['title'] = \IPS\Member::loggedIn()->language()->addToStack( static::$titleLangPrefix . $indexData['index_container_id'], 'NULL', array( 'escape' => true ) );
       
$node['text_color'] = static::featureTextColor( $node[ static::$databasePrefix . static::$featureColumnName ] );
       
       
/* Normalize */
       
$node['feature_color'] = $node[ static::$databasePrefix . static::$featureColumnName ];
       
       
$title = \IPS\Theme::i()->getTemplate( 'global', 'core', 'front' )->formattedTitle( $node );
       
        if (
$indexData['index_club_id'] and isset( $containerData['_club'] ) )
        {
            return \
IPS\Member::loggedIn()->language()->addToStack( 'club_container_title', FALSE, array( 'sprintf' => array( $containerData['_club']['name'] ), 'htmlsprintf' => array( $title ) ) );
        }
        else
        {
            return
$title;
        }
    }
}