Hugo — фантастический генератор статических сайтов, и, как и большинство из них, он изначально не способен реализовать динамическую поисковую систему, которую мы привыкли использовать на более традиционных серверных платформах, с более или менее расширенными возможностями запросов.
Этот проект направлен на решение этой проблемы путем интеграции поисковой системы Lyra с Hugo.
Он работает путем анализа файлов content/**/*.md
в необработанный текст и использования его для создания индекса Lyra, который станет статическим ресурсом, который вы можете публиковать вместе с другими файлами публичного дистрибутива Hugo.
Этот проект также предлагает клиентскую библиотеку JavaScript, позволяющую легко использовать индекс с вашего веб-сайта Hugo; вы можете увидеть это в действии в моем личном блоге здесь и здесь, чтобы узнать о реализации. Вы можете перейти в раздел клиента для получения более подробной информации.
Анализатор может анализировать только файлы Markdown, а стандартные начальные элементы, массивы, такие как теги, и категории разлагаются и разделяются пробелами.
Определение схемы :
const hugoDb = create ( {
schema : {
title : "string" ,
body : "string" ,
uri : "string" ,
meta : {
date : "string" ,
description : "string" ,
tags : "string" ,
categories : "string" ,
keywords : "string" ,
summary : "string" ,
} ,
} ,
defaultLanguage : "english" ,
} ) ;
Вам необходимо импортировать библиотеку из CDN:
< script src = https://unpkg.com/hugo-lyra@latest/dist/browser/hugo-lyra.js > </ script >
Или лучше использовать Hugo Pipes в базовом шаблоне:
{ { $script : = resources . GetRemote https : //unpkg.com/hugo-lyra@latest/dist/browser/hugo-lyra.js | minify | fingerprint }}
< script src = "{{ $script.RelPermalink }}" integrity = "{{ $script.Data.Integrity }}" > < / script >
Клиентский код объединяет код поискового индекса Lyra, чтобы гарантировать совместимость сгенерированного индекса на стороне клиента и сервера; вам не нужно импортировать его отдельно . Ограничением этого подхода является то, что вы не можете изменить версию Lyra.
После создания экземпляра вы найдете в window.HugoLyra
новый глобальный объект. Глобальный объект HugoLyra, который вы можете использовать для реализации своей поисковой системы.
Как вы будете его использовать, зависит от вас, чтобы лучше соответствовать вашим потребностям; Ниже вы можете найти простую реализацию необработанного JavaScript, которую вы можете использовать в качестве отправной точки:
( async ( ) => {
try {
const params = new URLSearchParams ( window . location . search ) ;
const query = params . get ( "q" ) ;
if ( query ) {
const db = await HugoLyra . fetchDb ( `/hugo-lyra-english.json` ) ;
const res = await HugoLyra . search ( db , { term : query , properties : "*" } ) ;
document . getElementById ( "search-input" ) . setAttribute ( "value" , res . options . term ) ;
let resultList = "" ;
const searchResults = document . getElementById ( "results" ) ;
if ( res ?. search ?. count ) {
for ( const hit of res . search . hits ) {
const doc = hit . document ;
resultList += "<li>" ;
resultList += '<span class="date">' + doc . meta . date + "</span>" ;
resultList += '<a class="title" href="' + doc . uri + '">' + doc . title + "</a>" ;
resultList += "</li>" ;
}
}
searchResults . innerHTML = resultList . length ? resultList : "No results found" ;
}
} catch ( e ) {
console . error ( e ) ;
}
} ) ( ) ;
Этот код является частью моего блога; вы можете покопать больше здесь.
npm i paolomainardi/hugo-lyra
yarn add paolomainardi/hugo-lyra
Хьюго-Лира проста в использовании.
После установки вы можете интегрировать его в свой package.json
в разделе скриптов следующим образом:
"scripts" : {
"index" : " hugo-lyra "
}
По умолчанию Hugo-Lyra прочитает ваш каталог content
и выведет индекс Lyra в public/hugo-lyra-english.msp
.
Вы можете настроить некоторые конфигурации (например, ввод, вывод, язык, формат и т. д.), передавая входные аргументы в командную строку; вы можете увидеть все варианты, запустив:
npx hugo-lyra -h
Конечно, вы можете восстановить индекс программно, просто выполнив:
npx hugo-lyra
> СОВЕТ: если вы запустите его с DEBUG=hugo-lyra npx hugo lyra
, вы можете получить прибыль.
> дополнительных журналов отладки.
Например, предположим, что мы хотим:
Сгенерировать индекс в формате JSON
Сохраните его в dist/search
Парсинг content/posts
Команда будет такой: npx --yes hugo-lyra --content content/posts --indexFormat json --indexFilePath output/search
СОВЕТ: если вы запустите его с
DEBUG=hugo-lyra npx hugo lyra
, вы можете получить прибыль.
Hugo-Lyra поставляется с модулями ES CommonJS.
В большинстве случаев импортируйте или потребуйте paolomainardi/hugo-lyra
, и ваша среда выберет наиболее подходящую сборку.
Иногда вам может потребоваться импортировать или потребовать определенные файлы (например, типы). В пакет Lyra включены следующие сборки:
Вы можете использовать его из Javascript/Typescript:
import { cwd } from "process" ;
import { generateIndex } from "hugo-lyra" ;
import { LyraOptions } from "hugo-lyra/dist/esm/types" ;
( async ( ) => {
const res = await generateIndex ( "./content" , < LyraOptions > {
indexFilePath : cwd ( ) ,
} );
console.log(res);
} ) ( ) ;
const { cwd } = require ( "process" ) ;
const { generateIndex } = require ( "hugo-lyra" ) ;
( async ( ) => {
const res = await generateIndex ( "./content" , {
indexFilePath : process . cwd ( ) ,
} ) ;
console . log ( res ) ;
} ) ( ) ;