xref: /plugin/ragasker/SearchHelper.php (revision abb7d3a81e47d0abe3f1fd67ad9dcad4b861232c)
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