Lexer->addSpecialPattern('~~RAGASKER~~', $mode, 'plugin_ragasker'); // 用于测试搜索功能的语法 $this->Lexer->addSpecialPattern('~~RAGASKER:Search:.*~~', $mode, 'plugin_ragasker'); } public function handle($match, $state, $pos, Doku_Handler $handler) { // 只传递唯一ID用于渲染 $uniqid = uniqid('ragasker_', true); if (preg_match('/~~RAGASKER:Search:([A-Za-z0-9_]+)~~/', $match, $m)) { // 解析参数 $param = $m[1]; return [$uniqid, 'searcher', $param]; } return [$uniqid, 'asker', null]; } public function render($mode, Doku_Renderer $renderer, $data) { if($mode !== 'xhtml') return false; list($uniqid, $type, $param) = $data; if ($type === 'searcher') { return $this->renderSearcher($renderer, $param); } else { return $this->renderAsker($renderer, $uniqid); } } private function renderSearcher($renderer, $param) { $processor = new SearchHelper(); $lists = $processor->exampleUsage($param); $linkList = $lists['links']; $contentList = $lists['contents']; $searchList = ''; if (is_array($linkList) && count($linkList) > 0) { $searchList = ''; } $renderer->doc .= $searchList; return true; } private function renderAsker($renderer, $uniqid) { $inputId = $uniqid . '_input'; $btnId = $uniqid . '_btn'; $resultId = $uniqid . '_result'; $renderer->doc .= '
'; $renderer->doc .= '
'; $renderer->doc .= ' '; $renderer->doc .= ''; $renderer->doc .= '
'; $renderer->doc .= ''; return true; } // callOpenAI 逻辑将迁移到 action 处理 // 保留接口以兼容 private function callOpenAI($prompt, $params = []) { return ''; } private function formatResponse($text) { // 转换 Markdown 到 HTML $text = hsc($text); // HTML 安全转义 // 基础 Markdown 转换 $text = preg_replace('/\*\*(.+?)\*\*/', '$1', $text); $text = preg_replace('/\*(.+?)\*/', '$1', $text); $text = preg_replace('/`(.+?)`/', '$1', $text); // 转换换行 $text = nl2br($text); return $text; } }