*/
class WiseChatCssRenderer {
/**
* @var WiseChatOptions
*/
private $options;
/**
* @var string
*/
private $containerId;
/**
* @var array
*/
private $definitions;
public function __construct() {
$this->options = WiseChatOptions::getInstance();
}
/**
* Returns CSS styles definition for the plugin.
*
* @param string $containerId ID of the chat HTML container
*
* @return string HTML source
*/
public function getCssDefinition($containerId) {
$this->containerId = $containerId;
$this->definitions = array();
$this->addDefinition('*', 'text_color_chat', 'color');
if ($this->options->isOptionNotEmpty('text_size_chat')) {
$this->addDefinition('', 'text_size_chat', 'font-size');
$this->addRawDefinition('*', 'font-size', 'inherit');
}
$this->addDefinition('', 'background_color_chat', 'background-color');
$this->addDefinition('.wcControls', 'background_color_chat', 'background-color');
if ($this->options->isOptionNotEmpty('background_color_chat')) {
$this->addRawDefinition('.wcControls', 'background', 'none');
$this->addDefinition('.wcControls', 'background_color_chat', 'background-color');
}
$this->addDefinition('.wcWindowTitle', 'background_color_chat', 'background-color');
$this->addDefinition('.wcMessages', 'background_color', 'background-color');
$this->addDefinition('.wcMessages .wcMessage', 'background_color', 'background-color');
$this->addDefinition('.wcMessages .wcMessage > .wcMessageUser', 'background_color', 'background-color');
$this->addDefinition('.wcMessages .wcMessage > .wcMessageContent', 'background_color', 'background-color');
$this->addDefinition('.wcMessages .wcMessage *', 'text_color', 'color');
$this->addDefinition('.wcMessages .wcMessageUser', 'text_color_user', 'color');
$this->addDefinition('.wcMessages .wcMessageUser a', 'text_color_user', 'color');
$this->addDefinition('.wcWpMessage .wcMessageUser', 'text_color_logged_user', 'color');
$this->addDefinition('.wcWpMessage .wcMessageUser a', 'text_color_logged_user', 'color');
if ($this->options->isOptionNotEmpty('text_size')) {
$this->addDefinition('.wcMessages', 'text_size', 'font-size');
$this->addRawDefinition('.wcMessages *', 'font-size', 'inherit');
}
$this->addDefinition('.wcControls', 'background_color_input', 'background-color');
$this->addDefinition('.wcControls span', 'background_color_input', 'background-color');
$this->addDefinition('.wcControls a', 'background_color_input', 'background-color');
$this->addDefinition('.wcControls label', 'background_color_input', 'background-color');
$this->addDefinition('.wcUsersCounter', 'text_color_input_field', 'color');
$this->addDefinition('.wcUsersCounter *', 'text_color_input_field', 'color');
$this->addDefinition('.wcControls', 'text_color_input_field', 'color');
$this->addDefinition('.wcControls span', 'text_color_input_field', 'color');
$this->addDefinition('.wcControls a', 'text_color_input_field', 'color');
$this->addDefinition('.wcControls label', 'text_color_input_field', 'color');
$this->addDefinition('.wcUsersList', 'background_color_users_list', 'background-color');
$this->addDefinition('.wcUsersList', 'text_color_users_list', 'color');
$this->addDefinition('.wcUsersList *', 'text_color_users_list', 'color');
if ($this->options->isOptionNotEmpty('text_size_users_list')) {
$this->addDefinition('.wcUsersList', 'text_size_users_list', 'font-size');
$this->addRawDefinition('.wcUsersList *', 'font-size', 'inherit');
}
$this->addLengthDefinition('', 'chat_width', 'width');
$this->addLengthDefinition('.wcMessages', 'chat_height', 'height');
$this->addLengthDefinition('.wcUsersList', 'chat_height', 'height');
$this->addUsersListWidthDefinition();
return $this->getDefinitions();
}
/**
* Returns custom CSS styles definition for the plugin.
*
* @return string HTML source
*/
public function getCustomCssDefinition() {
if ($this->options->isOptionNotEmpty('custom_styles')) {
return sprintf("", $this->options->getOption('custom_styles'));
}
return '';
}
/**
* Adds a single style definition.
*
* @param string $cssSelector
* @param string $property
* @param string $cssProperty
*
* @return null
*/
private function addDefinition($cssSelector, $property, $cssProperty) {
if ($this->options->isOptionNotEmpty($property)) {
$this->addRawDefinition($cssSelector, $cssProperty, $this->options->getOption($property));
}
}
/**
* Adds a raw style definition.
*
* @param string $cssSelector
* @param string $property
* @param string $value
*
* @return null
*/
private function addRawDefinition($cssSelector, $property, $value, $rootSelector = null) {
if ($rootSelector === null) {
$rootSelector = '#'.$this->containerId;
}
$fullCssSelector = sprintf("%s %s", $rootSelector, $cssSelector);
$this->definitions[$fullCssSelector][] = sprintf("%s: %s;", $property, $value);
}
/**
* Adds single length style definition.
*
* @param string $cssSelector
* @param string $lengthProperty
* @param string $cssProperty
*
* @return null
*/
private function addLengthDefinition($cssSelector, $lengthProperty, $cssProperty) {
if ($this->options->isOptionNotEmpty($lengthProperty)) {
$value = $this->options->getOption($lengthProperty);
if (preg_match('/^\d+$/', $value)) {
$value .= 'px';
}
if (preg_match('/^\d+((px)|%)$/', $value)) {
$this->addRawDefinition($cssSelector, $cssProperty, $value);
}
}
}
private function addUsersListWidthDefinition() {
if ($this->options->isOptionNotEmpty('users_list_width')) {
$width = $this->options->getIntegerOption('users_list_width');
if ($width > 1 && $width < 99) {
$this->addRawDefinition('.wcMessages', 'width', (100 - $width).'%', '#'.$this->containerId.'.wcUsersListIncluded');
}
}
}
/**
* Returns rendered styles definition.
*
* @return string HTML source
*/
private function getDefinitions() {
$html = '';
foreach ($this->definitions as $cssSelector => $stylesList) {
$html .= "$cssSelector { ".implode(" ", $stylesList)." }\n";
}
return sprintf('', $html);
}
}