class/Utility.php
<?php
namespace XoopsModules\Extgallery;
use XoopsModules\Extgallery;
use XoopsModules\Extgallery\Common;
//use XoopsModules\Extgallery\Constants;
/**
* Class Utility
*/
class Utility extends Common\SysUtility
{
//--------------- Custom module methods -----------------------------
/**
* @param $option
* @return bool|mixed
*/
public static function getModuleOption($option)
{
global $xoopsModule;
/** @var \XoopsModules\Extgallery\Helper $helper */
$helper = \XoopsModules\Extgallery\Helper::getInstance();
static $tbloptions = [];
if (\is_array($tbloptions) && \array_key_exists($option, $tbloptions)) {
return $tbloptions[$option];
}
$retval = false;
if (isset($xoopsModuleConfig)
&& (\is_object($xoopsModule) && 'extgallery' === $xoopsModule->getVar('dirname')
&& $xoopsModule->getVar('isactive'))) {
if (isset($xoopsModuleConfig[$option])) {
$retval = $xoopsModuleConfig[$option];
}
} else {
/** @var \XoopsModuleHandler $moduleHandler */
$moduleHandler = \xoops_getHandler('module');
$module = $moduleHandler->getByDirname('extgallery');
/** @var \XoopsModuleHandler $moduleHandler */
$configHandler = \xoops_getHandler('config');
if ($module) {
$configurator = $configHandler->getConfigsByCat(0, $module->getVar('mid'));
if (isset($configurator[$option])) {
$retval = $configurator[$option];
}
}
}
$tbloptions[$option] = $retval;
return $retval;
}
/**
* @param $caption
* @param $name
* @param $value
* @param $rows
* @param $cols
* @param $width
* @param $height
* @param $supplemental
*
* @return bool|\XoopsFormEditor
*/
public static function getWysiwygForm($caption, $name, $value, $rows, $cols, $width, $height, $supplemental)
{
$editor_option = mb_strtolower(static::getModuleOption('form_options'));
$editor = false;
$editor_configs = [];
$editor_configs['name'] = $name;
$editor_configs['value'] = $value;
$editor_configs['rows'] = $rows;
$editor_configs['cols'] = $cols;
$editor_configs['width'] = $width;
$editor_configs['height'] = $height;
$editor_configs['editor'] = $editor_option;
$editor = new \XoopsFormEditor($caption, $name, $editor_configs);
return $editor;
}
/**
* truncateHtml can truncate a string up to a number of characters while preserving whole words and HTML tags
* www.gsdesign.ro/blog/cut-html-string-without-breaking-the-tags
* www.cakephp.org
*
* @param string $text String to truncate.
* @param int $length Length of returned string, including ellipsis.
* @param string $ending Ending to be appended to the trimmed string.
* @param bool $exact If false, $text will not be cut mid-word
* @param bool $considerHtml If true, HTML tags would be handled correctly
*
* @return string Trimmed string.
*/
public static function truncateHtml($text, $length = 100, $ending = '...', $exact = false, $considerHtml = true)
{
$open_tags = [];
if ($considerHtml) {
// if the plain text is shorter than the maximum length, return the whole text
if (mb_strlen(\preg_replace('/<.*?' . '>/', '', $text)) <= $length) {
return $text;
}
// splits all html-tags to scanable lines
\preg_match_all('/(<.+?' . '>)?([^<>]*)/s', $text, $lines, \PREG_SET_ORDER);
$total_length = mb_strlen($ending);
$truncate = '';
foreach ($lines as $line_matchings) {
// if there is any html-tag in this line, handle it and add it (uncounted) to the output
if (!empty($line_matchings[1])) {
// if it's an "empty element" with or without xhtml-conform closing slash
if (\preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
// do nothing
// if tag is a closing tag
} elseif (\preg_match('/^<\s*\/(\S+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
// delete tag from $open_tags list
$pos = \array_search($tag_matchings[1], $open_tags, true);
if (false !== $pos) {
unset($open_tags[$pos]);
}
// if tag is an opening tag
} elseif (\preg_match('/^<\s*([^\s>!]+).*?' . '>$/s', $line_matchings[1], $tag_matchings)) {
// add tag to the beginning of $open_tags list
\array_unshift($open_tags, mb_strtolower($tag_matchings[1]));
}
// add html-tag to $truncate'd text
$truncate .= $line_matchings[1];
}
// calculate the length of the plain text part of the line; handle entities as one character
$content_length = mb_strlen(\preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
if ($total_length + $content_length > $length) {
// the number of characters which are left
$left = $length - $total_length;
$entities_length = 0;
// search for html entities
if (\preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, \PREG_OFFSET_CAPTURE)) {
// calculate the real length of all entities in the legal range
foreach ($entities[0] as $entity) {
if ($left >= $entity[1] + 1 - $entities_length) {
$left--;
$entities_length += mb_strlen($entity[0]);
} else {
// no more characters left
break;
}
}
}
$truncate .= mb_substr($line_matchings[2], 0, $left + $entities_length);
// maximum lenght is reached, so get off the loop
break;
}
$truncate .= $line_matchings[2];
$total_length += $content_length;
// if the maximum length is reached, get off the loop
if ($total_length >= $length) {
break;
}
}
} else {
if (mb_strlen($text) <= $length) {
return $text;
}
$truncate = mb_substr($text, 0, $length - mb_strlen($ending));
}
// if the words shouldn't be cut in the middle...
if (!$exact) {
// ...search the last occurance of a space...
$spacepos = mb_strrpos($truncate, ' ');
if (isset($spacepos)) {
// ...and cut the text in this position
$truncate = mb_substr($truncate, 0, $spacepos);
}
}
// add the defined ending to the text
$truncate .= $ending;
if ($considerHtml) {
// close all unclosed html-tags
foreach ($open_tags as $tag) {
$truncate .= '</' . $tag . '>';
}
}
return $truncate;
}
}