Version 4.2.0
This commit is contained in:
1 parent
0dc2aee5ed
commit
96997ddd8e
2074 files changed
+125454
-55780
No files matched your search
@@ -0,0 +1,162 @@
|
||||
<?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 URL 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::$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::$featureColumnName ] );
|
||||
|
||||
/* Normalize */
|
||||
$node['feature_color'] = $node[ 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( 'htmlsprintf' => array( $containerData['_club']['name'], $title ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return $title;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user