2017-09-09 02:10:51 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Utilities;
|
|
|
|
|
2017-11-03 23:47:38 +09:00
|
|
|
use Misd\Linkify\Linkify;
|
|
|
|
|
2017-09-09 02:10:51 +09:00
|
|
|
class Formatter
|
|
|
|
{
|
2017-11-03 23:47:38 +09:00
|
|
|
/** @var Linkify */
|
|
|
|
private $linkify;
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
$this->linkify = new Linkify();
|
|
|
|
}
|
|
|
|
|
2017-09-09 02:10:51 +09:00
|
|
|
/**
|
|
|
|
* 通算秒数を日数と時分にフォーマットします。
|
|
|
|
* @param int|float $value 通算秒数
|
|
|
|
* @return string "xx日 xx時間 xx分" 形式でフォーマットされた文字列
|
|
|
|
*/
|
|
|
|
public function formatInterval($value)
|
|
|
|
{
|
|
|
|
$days = floor($value / 86400);
|
|
|
|
$hours = floor($value % 86400 / 3600);
|
|
|
|
$minutes = floor($value % 3600 / 60);
|
2019-01-15 00:05:01 +09:00
|
|
|
|
2017-09-09 02:10:51 +09:00
|
|
|
return "{$days}日 {$hours}時間 {$minutes}分";
|
|
|
|
}
|
2017-11-03 23:47:38 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* テキスト内のURLをHTMLのリンクに置き換えます。
|
|
|
|
* @param string $text テキスト
|
|
|
|
* @return string URLをリンクに置き換えた文字列
|
|
|
|
*/
|
|
|
|
public function linkify($text)
|
|
|
|
{
|
2019-06-24 20:19:48 +09:00
|
|
|
return $this->linkify->processUrls($text, ['attr' => ['target' => '_blank', 'rel' => 'noopener']]);
|
2017-11-03 23:47:38 +09:00
|
|
|
}
|
2018-06-07 23:46:40 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* URLを正規化します。
|
|
|
|
* @param string $url URL
|
|
|
|
* @return string 正規化されたURL
|
|
|
|
*/
|
|
|
|
public function normalizeUrl($url)
|
|
|
|
{
|
|
|
|
// Decode
|
|
|
|
$url = urldecode($url);
|
|
|
|
|
|
|
|
// Remove Hashbang
|
|
|
|
$url = preg_replace('~/#!/~u', '/', $url);
|
|
|
|
|
|
|
|
// Sort query parameters
|
2019-01-19 02:10:18 +09:00
|
|
|
$parts = parse_url($url);
|
|
|
|
if (!empty($parts['query'])) {
|
|
|
|
// Remove query parameters
|
|
|
|
$url = str_replace_last('?' . $parts['query'], '', $url);
|
|
|
|
if (!empty($parts['fragment'])) {
|
|
|
|
// Remove fragment identifier
|
|
|
|
$url = str_replace_last('#' . $parts['fragment'], '', $url);
|
|
|
|
} else {
|
|
|
|
// "http://example.com/?query#" の場合 $parts['fragment'] は unset になるので、個別に判定して除去する必要がある
|
|
|
|
$url = preg_replace('/#\z/u', '', $url);
|
|
|
|
}
|
|
|
|
|
|
|
|
parse_str($parts['query'], $params);
|
2018-06-07 23:46:40 +09:00
|
|
|
ksort($params);
|
2019-01-19 02:10:18 +09:00
|
|
|
|
2018-06-07 23:46:40 +09:00
|
|
|
$url = $url . '?' . http_build_query($params);
|
2019-01-19 02:10:18 +09:00
|
|
|
if (!empty($parts['fragment'])) {
|
|
|
|
$url .= '#' . $parts['fragment'];
|
|
|
|
}
|
2018-06-07 23:46:40 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
return $url;
|
|
|
|
}
|
2020-01-28 01:36:59 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* imgタグのsrcsetで使用できる形式で、プロフィール画像URLを生成します。
|
|
|
|
* @param object $user Userなど、getProfileImageUrl()が実装されているオブジェクト
|
|
|
|
* @param int $baseSize 1x解像度における画像サイズ
|
2020-01-29 08:38:13 +09:00
|
|
|
* @param int $maxDensity 最高密度
|
2020-01-28 01:36:59 +09:00
|
|
|
* @return string srcset用の文字列
|
|
|
|
*/
|
2020-01-29 08:38:13 +09:00
|
|
|
public function profileImageSrcSet($user, int $baseSize, int $maxDensity = 3)
|
2020-01-28 01:36:59 +09:00
|
|
|
{
|
|
|
|
$srcset = [];
|
2020-01-29 08:38:13 +09:00
|
|
|
for ($i = 1; $i <= $maxDensity; $i++) {
|
2020-01-28 01:36:59 +09:00
|
|
|
$srcset[] = $user->getProfileImageUrl($baseSize * $i) . " {$i}x";
|
|
|
|
}
|
|
|
|
|
|
|
|
return implode(',', $srcset);
|
|
|
|
}
|
2019-01-15 00:05:01 +09:00
|
|
|
}
|