3 namespace wcf\system\html\metacode\upcast
;
5 use wcf\data\media\Media
;
6 use wcf\system\cache\runtime\MediaRuntimeCache
;
8 use wcf\util\StringUtil
;
12 * @copyright 2001-2024 WoltLab GmbH
13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16 final class WsmMetacodeUpcast
extends ImageMetacodeUpcast
19 public function upcast(\DOMElement
$element, array $attributes): void
22 * @var string $alignment
23 * @var string|int $width
24 * @var string $thumbnail
26 $mediaID = \
intval($attributes[0]);
27 $thumbnail = $attributes[1] ??
'original';
28 $alignment = $attributes[2] ??
'none';
29 $width = $attributes[3] ??
'auto';
30 $media = MediaRuntimeCache
::getInstance()->getObject($mediaID);
31 $parentLink = $element->parentNode
;
32 /** @var \DOMElement|null $parentLink */
33 if ($parentLink !== null && $parentLink->nodeName
!== 'a') {
37 $imgElement = $element->ownerDocument
->createElement('img');
38 if ($thumbnail === 'original') {
39 $imgElement->setAttribute('src', StringUtil
::decodeHTML($media->getLink()));
41 $imgElement->setAttribute('src', StringUtil
::decodeHTML($media->getThumbnailLink($thumbnail)));
43 if ($width !== 'auto') {
44 $imgElement->setAttribute('width', \
intval($width));
45 $imgElement->setAttribute('data-width', \
intval($width) . 'px');
47 $imgElement->setAttribute('data-media-id', $mediaID);
48 $imgElement->setAttribute('data-media-size', StringUtil
::decodeHTML($thumbnail));
49 $imgElement->setAttribute('style', $this->getStyle($media, $width, $thumbnail));
50 if ($alignment === 'none') {
51 $imgElement->setAttribute('class', 'image woltlabSuiteMedia');
52 DOMUtil
::replaceElement($element, $imgElement);
55 $imgElement->setAttribute('class', 'woltlabSuiteMedia');
57 $this->createFigure($element, $imgElement, $alignment, $parentLink);
61 public function hasValidAttributes(array $attributes): bool
64 if (\
count($attributes) < 1 || \
count($attributes) > 4) {
67 $media = MediaRuntimeCache
::getInstance()->getObject($attributes[0]);
68 if ($media === null) {
71 if (!$media->isAccessible()) {
74 // Other media types must be converted to the text [wsm…][/wsm]
75 return (bool)$media->isImage
;
79 public function cacheObject(array $attributes): void
81 MediaRuntimeCache
::getInstance()->cacheObjectID($attributes[0] ??
0);
84 private function getStyle(Media
$media, string|
int $width, string $thumbnail): string
86 if ($thumbnail === 'original') {
87 $maxWidth = $media->width
;
89 $maxWidth = $media->getThumbnailWidth($thumbnail);
92 'max-width: %dpx; width: %s;',
94 \
is_numeric($width) && $width > 0 ? \
intval($width) . 'px' : 'auto'