$requirements */ public function __construct( public string $extension, public string $name, public string $url, public array $requirements, ) {} /** @param list $capabilities */ public function supportedBy(array $capabilities): bool { $required = $this->requirements; if (in_array($this->name, ['edit', 'editnew', 'convert'], true)) { $required = array_merge($required, ['locks', 'update']); } return array_diff($required, $capabilities) === []; } public function launchUrl(string $wopiSource): string { new ServerAddress($wopiSource); $url = preg_replace_callback('/<([^=<>]+)=([^<>]*?)(\&?)>/', static fn (array $match): string => $match[2] === 'WOPI_SOURCE' ? $match[1] . '=' . rawurlencode($wopiSource) . $match[3] : '', $this->url, ); $query = parse_url($url, PHP_URL_QUERY) ?? ''; if (!preg_match('/(?:^|&)WOPISrc=/i', $query)) { $url = rtrim($url, '?&'); $url .= (str_contains($url, '?') ? '&' : '?') . 'WOPISrc=' . rawurlencode($wopiSource); } return $url; } }