67 lines
2.1 KiB
PHP
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));
|
|
}
|
|
} |