15f0c5114SCharles Chan<?php 25f0c5114SCharles Chan/** 35f0c5114SCharles Chan * 最小限度的搜索结果处理器 45f0c5114SCharles Chan */ 55f0c5114SCharles Chanclass SearchHelper { 65f0c5114SCharles Chan 75f0c5114SCharles Chan /** 85f0c5114SCharles Chan * 从ft_pageSearch结果中提取两个列表 95f0c5114SCharles Chan * 105f0c5114SCharles Chan * @param array $searchResults ft_pageSearch()返回的原始结果 115f0c5114SCharles Chan * @return array 包含两个列表的数组 125f0c5114SCharles Chan */ 135f0c5114SCharles Chan public function extractLists($searchResults, $maxLines = 3) { 145f0c5114SCharles Chan $links = []; 155f0c5114SCharles Chan $contents = []; 165f0c5114SCharles Chan 175f0c5114SCharles Chan foreach ($searchResults as $key => $result) { 18*abb7d3a8SCharles Chan $normalized = $this->normalizeResult($key, $result); 195f0c5114SCharles Chan if (!$normalized) { 205f0c5114SCharles Chan continue; 215f0c5114SCharles Chan } 225f0c5114SCharles Chan 235f0c5114SCharles Chan // 1. 链接列表 245f0c5114SCharles Chan $links[] = $this->extractLinkInfo($normalized); 255f0c5114SCharles Chan 265f0c5114SCharles Chan // 2. 内容列表 275f0c5114SCharles Chan $contents[] = $this->extractContentInfo($normalized, $maxLines); 285f0c5114SCharles Chan } 295f0c5114SCharles Chan 305f0c5114SCharles Chan return [ 315f0c5114SCharles Chan 'links' => $links, 325f0c5114SCharles Chan 'contents' => $contents 335f0c5114SCharles Chan ]; 345f0c5114SCharles Chan } 355f0c5114SCharles Chan 365f0c5114SCharles Chan /** 375f0c5114SCharles Chan * 提取链接信息 385f0c5114SCharles Chan */ 395f0c5114SCharles Chan private function extractLinkInfo($result) { 405f0c5114SCharles Chan return [ 415f0c5114SCharles Chan 'id' => $result['id'], 425f0c5114SCharles Chan 'title' => $this->getPageTitle($result['id']), 435f0c5114SCharles Chan 'url' => wl($result['id']), 445f0c5114SCharles Chan 'score' => $result['score'] ?? 0, 455f0c5114SCharles Chan 'namespace' => getNS($result['id']) 465f0c5114SCharles Chan ]; 475f0c5114SCharles Chan } 485f0c5114SCharles Chan 495f0c5114SCharles Chan /** 505f0c5114SCharles Chan * 提取内容信息 515f0c5114SCharles Chan */ 525f0c5114SCharles Chan private function extractContentInfo($result, $maxLines = 3) { 535f0c5114SCharles Chan return [ 545f0c5114SCharles Chan 'id' => $result['id'], 555f0c5114SCharles Chan 'summary' => $this->getFirstLines($result['id'], $maxLines), 565f0c5114SCharles Chan 'has_content' => page_exists($result['id']) 575f0c5114SCharles Chan ]; 585f0c5114SCharles Chan } 595f0c5114SCharles Chan 605f0c5114SCharles Chan /** 615f0c5114SCharles Chan * 兼容不同格式的搜索结果 625f0c5114SCharles Chan */ 63*abb7d3a8SCharles Chan private function normalizeResult($key, $score = null) { 645f0c5114SCharles Chan // 结果可能是字符串(页面ID) 655f0c5114SCharles Chan if (is_string($key) && $key !== '') { 66*abb7d3a8SCharles Chan return ['id' => $key, 'score' => $score]; 675f0c5114SCharles Chan } 685f0c5114SCharles Chan 695f0c5114SCharles Chan return null; 705f0c5114SCharles Chan } 715f0c5114SCharles Chan 725f0c5114SCharles Chan /** 735f0c5114SCharles Chan * 获取页面标题 745f0c5114SCharles Chan */ 755f0c5114SCharles Chan private function getPageTitle($pageId) { 765f0c5114SCharles Chan $title = p_get_first_heading($pageId); 775f0c5114SCharles Chan return $title ?: $pageId; 785f0c5114SCharles Chan } 795f0c5114SCharles Chan 805f0c5114SCharles Chan /** 815f0c5114SCharles Chan * 获取页面前几行作为摘要 825f0c5114SCharles Chan */ 835f0c5114SCharles Chan private function getFirstLines($pageId, $maxLines = 3) { 845f0c5114SCharles Chan if (!page_exists($pageId)) { 855f0c5114SCharles Chan return ''; 865f0c5114SCharles Chan } 875f0c5114SCharles Chan 885f0c5114SCharles Chan $content = rawWiki($pageId); 895f0c5114SCharles Chan if ($maxLines === 0) { 905f0c5114SCharles Chan return $content; 915f0c5114SCharles Chan } 925f0c5114SCharles Chan 935f0c5114SCharles Chan $lines = explode("\n", $content, $maxLines + 1); 945f0c5114SCharles Chan return implode("\n", array_slice($lines, 0, $maxLines)); 955f0c5114SCharles Chan } 965f0c5114SCharles Chan 975f0c5114SCharles Chan /** 985f0c5114SCharles Chan * 使用示例 995f0c5114SCharles Chan */ 1005f0c5114SCharles Chan public function exampleUsage($searchQuery) { 1015f0c5114SCharles Chan // 1. 执行搜索 102*abb7d3a8SCharles Chan $highlight = false; 103*abb7d3a8SCharles Chan $rawResults = ft_pageSearch($searchQuery, $highlight); 1045f0c5114SCharles Chan 1055f0c5114SCharles Chan // 2. 提取两个列表 1065f0c5114SCharles Chan $lists = $this->extractLists($rawResults); 1075f0c5114SCharles Chan 1085f0c5114SCharles Chan // 3. 返回结果 1095f0c5114SCharles Chan return $lists; 1105f0c5114SCharles Chan } 1115f0c5114SCharles Chan} 112