2025-04-28 14:47:25 +03:00

67 lines
2.1 KiB
PHP

<?php
namespace engine\skin;
class Meta
{
const array TWITTER_LIMITS = [
'title' => 70,
'description' => 200
];
public ?string $url = null;
public ?string $title = null;
public ?string $description = null;
public ?string $keywords = null;
public ?string $image = null;
protected array $social = [];
public function setSocial(string $name, string $value): void {
$this->social[$name] = $value;
}
public function getHtml(): string {
$tags = [];
$add_og_twitter = function ($key, $value) use (&$tags) {
foreach (['og', 'twitter'] as $social) {
if ($social == 'twitter' && isset(self::TWITTER_LIMITS[$key])) {
if (mb_strlen($value) > self::TWITTER_LIMITS[$key])
$value = mb_substr($value, 0, self::TWITTER_LIMITS[$key] - 3).'...';
}
$tags[] = [
$social == 'twitter' ? 'name' : 'property' => $social.':'.$key,
'content' => $value
];
}
};
foreach (['url', 'title', 'image'] as $k) {
if ($this->$k !== null)
$add_og_twitter($k, $this->$k);
}
foreach (['description', 'keywords'] as $k) {
if ($this->$k !== null) {
$add_og_twitter($k, $this->$k);
$tags[] = ['name' => $k, 'content' => $this->$k];
}
}
if (!empty($this->social)) {
foreach ($this->social as $key => $value) {
if (str_starts_with($key, 'og:')) {
$tags[] = ['property' => $key, 'content' => $value];
} else {
logWarning("unsupported meta: $key => $value");
}
}
}
return implode('', array_map(function (array $item): string {
$s = '<meta';
foreach ($item as $k => $v)
$s .= ' '.htmlescape($k).'="'.htmlescape($v).'"';
$s .= '/>';
$s .= "\n";
return $s;
}, $tags));
}
}