镜像自地址
https://github.com/lhly/search-syntax-pro.git
已同步 2026-10-20 22:37:48 +08:00
新增Yahoo、Startpage、Ecosia、Qwant、Naver、Sogou和360搜索适配器 更新搜索引擎类型定义和工厂类以支持新增引擎 添加适配器测试文件和国际化翻译 移除不再需要的测试文件和文档 更新版本号至1.8.5
190 行
5.4 KiB
TypeScript
190 行
5.4 KiB
TypeScript
import type { SearchEngineAdapter, SearchEngine } from '@/types'
|
|
import { BaiduAdapter } from './baidu'
|
|
import { GoogleAdapter } from './google'
|
|
import { BingAdapter } from './bing'
|
|
import { TwitterAdapter } from './twitter'
|
|
import { DuckDuckGoAdapter } from './duckduckgo'
|
|
import { BraveAdapter } from './brave'
|
|
import { YandexAdapter } from './yandex'
|
|
import { RedditAdapter } from './reddit'
|
|
import { GitHubAdapter } from './github'
|
|
import { StackOverflowAdapter } from './stackoverflow'
|
|
import { YahooAdapter } from './yahoo'
|
|
import { StartpageAdapter } from './startpage'
|
|
import { EcosiaAdapter } from './ecosia'
|
|
import { QwantAdapter } from './qwant'
|
|
import { NaverAdapter } from './naver'
|
|
import { SogouAdapter } from './sogou'
|
|
import { So360Adapter } from './so360'
|
|
|
|
/**
|
|
* 搜索引擎适配器工厂
|
|
* 负责创建和管理不同的搜索引擎适配器实例
|
|
*/
|
|
export class SearchAdapterFactory {
|
|
private static adapters: Map<SearchEngine, SearchEngineAdapter> = new Map()
|
|
|
|
/**
|
|
* 获取搜索引擎适配器实例(单例模式)
|
|
*/
|
|
static getAdapter(engine: SearchEngine): SearchEngineAdapter {
|
|
if (!this.adapters.has(engine)) {
|
|
const adapter = this.createAdapter(engine)
|
|
this.adapters.set(engine, adapter)
|
|
}
|
|
|
|
const adapter = this.adapters.get(engine)
|
|
if (!adapter) {
|
|
throw new Error(`无法创建搜索引擎适配器: ${engine}`)
|
|
}
|
|
return adapter
|
|
}
|
|
|
|
/**
|
|
* 创建新的搜索引擎适配器实例
|
|
*/
|
|
private static createAdapter(engine: SearchEngine): SearchEngineAdapter {
|
|
switch (engine) {
|
|
case 'baidu':
|
|
return new BaiduAdapter()
|
|
case 'google':
|
|
return new GoogleAdapter()
|
|
case 'bing':
|
|
return new BingAdapter()
|
|
case 'twitter':
|
|
return new TwitterAdapter()
|
|
case 'duckduckgo':
|
|
return new DuckDuckGoAdapter()
|
|
case 'brave':
|
|
return new BraveAdapter()
|
|
case 'yandex':
|
|
return new YandexAdapter()
|
|
case 'reddit':
|
|
return new RedditAdapter()
|
|
case 'github':
|
|
return new GitHubAdapter()
|
|
case 'stackoverflow':
|
|
return new StackOverflowAdapter()
|
|
case 'yahoo':
|
|
return new YahooAdapter()
|
|
case 'startpage':
|
|
return new StartpageAdapter()
|
|
case 'ecosia':
|
|
return new EcosiaAdapter()
|
|
case 'qwant':
|
|
return new QwantAdapter()
|
|
case 'naver':
|
|
return new NaverAdapter()
|
|
case 'sogou':
|
|
return new SogouAdapter()
|
|
case 'so360':
|
|
return new So360Adapter()
|
|
default:
|
|
throw new Error(`不支持的搜索引擎: ${engine}`)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取所有支持的搜索引擎
|
|
*/
|
|
static getSupportedEngines(): SearchEngine[] {
|
|
return ['baidu', 'google', 'bing', 'twitter', 'duckduckgo', 'brave', 'yandex', 'reddit', 'github', 'stackoverflow', 'yahoo', 'startpage', 'ecosia', 'qwant', 'naver', 'sogou', 'so360']
|
|
}
|
|
|
|
/**
|
|
* 🔥 新增:根据用户偏好获取可见的搜索引擎列表
|
|
* @param preferences 用户偏好设置(可选)
|
|
* @returns 按用户偏好排序的可见引擎列表
|
|
* @deprecated 建议使用 EnginePreferenceService.getVisibleEngines()
|
|
*/
|
|
static getVisibleEngines(preferences?: Array<{ engine: SearchEngine; visible: boolean; order: number }>): SearchEngine[] {
|
|
// 为了保持向后兼容,这里简单实现
|
|
// 实际业务逻辑在 EnginePreferenceService 中
|
|
if (!preferences || preferences.length === 0) {
|
|
return this.getSupportedEngines()
|
|
}
|
|
|
|
const validEngines = this.getSupportedEngines()
|
|
return preferences
|
|
.filter(pref => pref.visible)
|
|
.sort((a, b) => a.order - b.order)
|
|
.map(pref => pref.engine)
|
|
.filter(engine => validEngines.includes(engine))
|
|
}
|
|
|
|
/**
|
|
* 获取搜索引擎的显示名称
|
|
*/
|
|
static getEngineName(engine: SearchEngine): string {
|
|
const adapter = this.getAdapter(engine)
|
|
return adapter.getName()
|
|
}
|
|
|
|
/**
|
|
* 检查搜索引擎是否支持特定语法
|
|
*/
|
|
static supportsSyntax(engine: SearchEngine, syntax: string): boolean {
|
|
try {
|
|
const adapter = this.getAdapter(engine)
|
|
return adapter.validateSyntax(syntax as any)
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取搜索引擎支持的语法类型
|
|
*/
|
|
static getSupportedSyntax(engine: SearchEngine) {
|
|
const adapter = this.getAdapter(engine)
|
|
return adapter.getSupportedSyntax()
|
|
}
|
|
|
|
/**
|
|
* 构建搜索查询URL
|
|
*/
|
|
static buildSearchUrl(engine: SearchEngine, params: any): string {
|
|
const adapter = this.getAdapter(engine)
|
|
return adapter.buildQuery(params)
|
|
}
|
|
|
|
/**
|
|
* 验证搜索参数
|
|
*/
|
|
static validateSearchParams(engine: SearchEngine, params: any) {
|
|
const adapter = this.getAdapter(engine)
|
|
return adapter.validateParams?.(params) || { isValid: true, errors: [], warnings: [] }
|
|
}
|
|
|
|
/**
|
|
* 获取搜索建议
|
|
*/
|
|
static getSearchSuggestions(engine: SearchEngine, params: any): string[] {
|
|
const adapter = this.getAdapter(engine)
|
|
if ('getSearchSuggestions' in adapter) {
|
|
return (adapter as any).getSearchSuggestions(params)
|
|
}
|
|
return []
|
|
}
|
|
|
|
/**
|
|
* 预加载所有适配器
|
|
*/
|
|
static preloadAdapters(): void {
|
|
this.getSupportedEngines().forEach(engine => {
|
|
this.getAdapter(engine)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 清理适配器缓存
|
|
*/
|
|
static clearCache(): void {
|
|
this.adapters.clear()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 默认导出工厂实例
|
|
*/
|
|
export default SearchAdapterFactory |