forkbb/app/Core/Func.php
2020-09-12 23:22:32 +07:00

222 lines
5.8 KiB
PHP

<?php
namespace ForkBB\Core;
use ForkBB\Core\Container;
use function \ForkBB\__;
class Func
{
/**
* Контейнер
* @var Container
*/
protected $c;
/**
* Список доступных стилей
* @var array
*/
protected $styles;
/**
* Список доступных языков
* @var array
*/
protected $langs;
/**
* Список имен доступных языков
* @var array
*/
protected $nameLangs;
public function __construct(Container $container)
{
$this->c = $container;
}
/**
* Список доступных стилей
*/
public function getStyles(): array
{
if (! \is_array($this->styles)) {
$this->styles = $this->getFoldersWithFile($this->c->DIR_PUBLIC . '/style', 'style.css');
}
return $this->styles;
}
/**
* Список доступных языков
*/
public function getLangs(): array
{
if (! \is_array($this->langs)) {
$this->langs = $this->getFoldersWithFile($this->c->DIR_LANG, 'common.po');
}
return $this->langs;
}
/**
* Список имен доступных языков
*/
public function getNameLangs(): array
{
if (! \is_array($this->nameLangs)) {
$langs = $this->getLangs();
foreach ($langs as &$value) {
$value = include "{$this->c->DIR_LANG}/{$value}/name.php";
}
unset($value);
$this->nameLangs = $langs;
}
return $this->nameLangs;
}
/**
* Список папок в данной директории содержащих заданный файл
*/
public function getFoldersWithFile(string $dir, string $file): array
{
$result = [];
if (
\is_dir($dir)
&& false !== ($dh = \opendir($dir))
) {
while (false !== ($entry = \readdir($dh))) {
if (
isset($entry[0])
&& '.' !== $entry[0]
&& \is_dir("{$dir}/{$entry}")
&& \is_file("{$dir}/{$entry}/{$file}")
) {
$result[$entry] = $entry;
}
}
\closedir($dh);
\asort($result, \SORT_NATURAL);
}
return $result;
}
/**
* Пагинация
*/
public function paginate(int $all, int $cur, string $marker, array $args = [], string $info = 'Page %1$s of %2$s'): array
{
$pages = [];
if ($all < 2) {
// $pages[] = [null, 1, true];
} else {
if ($cur > 0) {
$pages[] = [__($info, $cur, $all), 'info', null];
$cur = \min(\max(1, $cur), $all);
if ($cur > 1) {
$pages[] = [
$this->c->Router->link(
$marker,
[
'page' => $cur - 1,
]
+ $args
),
'prev',
null,
];
}
$tpl = [1 => 1];
$start = $cur < 6 ? 2 : $cur - 2;
$end = $all - $cur < 5 ? $all : $cur + 3;
for ($i = $start; $i < $end; ++$i) {
$tpl[$i] = $i;
}
$tpl[$all] = $all;
} else {
$tpl = $all < 7
? \array_slice([2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6], 0, $all - 1)
: [2 => 2, 3 => 3, 4 => 4, $all => $all];
}
$k = 1;
foreach ($tpl as $i) {
if ($i - $k > 1) {
$pages[] = [null, 'space', null];
}
if ($i === $cur) {
$pages[] = [null, $i, true];
} else {
$pages[] = [
$this->c->Router->link(
$marker,
[
'page' => $i,
]
+ $args
),
$i,
null,
];
}
$k = $i;
}
if (
$cur > 0
&& $cur < $all
) {
$pages[] = [
$this->c->Router->link(
$marker,
[
'page' => $cur + 1,
]
+ $args
),
'next',
null,
];
}
}
return $pages;
}
/**
* Разбор HTTP_ACCEPT_LANGUAGE
*/
public function langParse(string $str): array
{
$result = [];
foreach (\explode(',', $str) as $step) {
$dsr = \explode(';', $step, 2);
if (
isset($dsr[1])) {
$q = \trim(\ltrim(\ltrim($dsr[1], 'q '), '='));
if (
! \is_numeric($q)
|| $q < 0
|| $q > 1
) {
continue;
}
$q = (float) $q;
} else {
$q = 1;
}
$l = \trim($dsr[0]);
if (! \preg_match('%^[[:alpha:]]{1,8}(?:-[[:alnum:]]{1,8})?$%', $l)) {
continue;
}
$result[$l] = $q;
}
\arsort($result, \SORT_NUMERIC);
return \array_keys($result);
}
}