$category, 'slice' => $slice, ]; } public static function isListUrl(?string $url): bool { return self::parse($url) !== null; } public static function buildCategorySearchQuery(?string $url): ?string { $parsed = self::parse($url); if ($parsed === null) { return null; } $category = $parsed['category']; if (str_contains($category, '.')) { return 'cat:'.$category; } return 'cat:'.$category.'*'; } /** * @return array{sortBy: string, sortOrder: string} */ public static function sortParams(?string $url): array { $parsed = self::parse($url); $slice = strtolower($parsed['slice'] ?? 'new'); if ($slice === 'recent') { return [ 'sortBy' => 'lastUpdatedDate', 'sortOrder' => 'descending', ]; } return [ 'sortBy' => 'submittedDate', 'sortOrder' => 'descending', ]; } public static function buildListPageUrl(string $requestUrl, int $skip, int $show): string { $parts = parse_url($requestUrl); $scheme = $parts['scheme'] ?? 'https'; $host = $parts['host'] ?? 'arxiv.org'; $path = $parts['path'] ?? '/'; $query = []; if (! empty($parts['query'])) { parse_str((string) $parts['query'], $query); } $query['skip'] = max(0, $skip); $query['show'] = min(2000, max(1, $show)); return $scheme.'://'.$host.$path.'?'.http_build_query($query); } }