Search Service
Search Service отвечает за организацию поиска по документации. Сервис предоставляет гибкую систему поиска с поддержкой различных провайдеров и возможностью кастомизации.
Основные возможности
- Поддержка различных поисковых провайдеров
- Генерация поискового индекса
- Поддержка многоязычности
- Интеграция с клиентской частью
Получение доступа к сервису
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('MyExtension', (run) => {
// Получение сервиса из контекста
const {search} = run;
// Получение хуков сервиса
const searchHooks = getSearchHooks(search);
});
}
}
Доступные хуки
Page
Хук для модификации страницы поиска.
searchHooks.Page.tap('MyHook', (template) => {
// template: Шаблон страницы поиска
template.addMeta({custom: 'value'});
});
Provider
Хук для регистрации и настройки поисковых провайдеров.
searchHooks.Provider.tap('MyProvider', (provider, config) => {
// provider: Текущий провайдер
// config: Конфигурация провайдера
return new CustomSearchProvider(config);
});
API сервиса
Метод init
Инициализирует сервис, загружая поисковый провайдер.
await searchService.init();
Метод config
Получает конфигурацию поиска для указанного языка.
Параметры:
lang: string
- код языка
Возвращает:
SearchAppConfig | undefined
- конфигурация поиска или undefined, если поиск отключен
const config = searchService.config('ru');
Метод add
Добавляет документ в поисковый индекс.
Параметры:
path: RelativePath
- путь к документуlang: string
- код языкаinfo: EntryInfo
- информация о документе
await searchService.add('path/to/doc.md', 'ru', info);
Метод release
Освобождает ресурсы поискового провайдера.
await searchService.release();
Метод page
Генерирует страницу поиска для указанного языка.
Параметры:
lang: string
- код языка
Возвращает:
Promise<string>
- HTML страницы поиска
const html = await searchService.page('ru');
Свойства
enabled
Флаг, указывающий, включен ли поиск.
if (searchService.enabled) {
// Поиск включен
}
connected
Флаг, указывающий, подключен ли пользовательский провайдер.
if (searchService.connected) {
// Пользовательский провайдер подключен
}
Примеры использования
Создание пользовательского провайдера
export class CustomSearchProvider implements SearchProvider {
async add(path: RelativePath, lang: string, info: EntryInfo) {
// Добавление документа в индекс
}
async release() {
// Освобождение ресурсов
}
config(lang: string) {
return {
enabled: true,
// Дополнительные настройки
};
}
}
Регистрация провайдера
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('CustomSearch', (run) => {
const searchHooks = getSearchHooks(run.search);
searchHooks.Provider.tap('CustomSearch', (provider, config) => {
return new CustomSearchProvider(config);
});
});
}
}
Модификация страницы поиска
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('SearchPageModifier', (run) => {
const searchHooks = getSearchHooks(run.search);
searchHooks.Page.tap('SearchPageModifier', (template) => {
// Добавление пользовательских стилей
template.addStyle('custom-search.css');
// Добавление пользовательских скриптов
template.addScript('custom-search.js');
});
});
}
}
Интеграция с внешним поисковым сервисом
export class ExternalSearchProvider implements SearchProvider {
constructor(private apiKey: string) {}
async add(path: RelativePath, lang: string, info: EntryInfo) {
// Отправка документа во внешний сервис
await this.externalService.index(path, lang, info);
}
async release() {
// Закрытие соединения с внешним сервисом
await this.externalService.close();
}
config(lang: string) {
return {
enabled: true,
apiKey: this.apiKey,
// Дополнительные настройки
};
}
}
Была ли статья полезна?
Предыдущая
Следующая