يعد Hugo منشئًا رائعًا للمواقع الثابتة، وكما هو الحال مع معظمهم، فهو غير قادر أصلاً على تنفيذ محرك بحث ديناميكي كما اعتدنا على استخدامه على الأنظمة الأساسية التقليدية من جانب الخادم، مع إمكانيات استعلام أكثر أو أقل تقدمًا.
يهدف هذا المشروع إلى حل هذه المشكلة من خلال دمج محرك البحث Lyra مع Hugo.
وهو يعمل عن طريق تحليل ملفات content/**/*.md
إلى نص أولي واستخدامها لإنشاء فهرس Lyra، والذي سيصبح أصلًا ثابتًا يمكنك نشره إلى جانب الملفات الأخرى في Hugo public dist.
يقدم هذا المشروع أيضًا مكتبة جافا سكريبت من جانب العميل لاستهلاك الفهرس بسهولة من موقع 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 العام الذي يمكنك استخدامه لتنفيذ محرك البحث الخاص بك.
إن كيفية استخدامه يعود إليك ليناسب احتياجاتك بشكل أفضل؛ يمكنك أن تجد أدناه تطبيقًا مباشرًا لجافا سكريبت الخام يمكنك استخدامه كنقطة بداية:
( 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
Hugo-Lyra سهل الاستخدام.
بمجرد التثبيت، يمكنك دمجه في ملف package.json
الخاص بك في قسم البرامج النصية مثل هذا:
"scripts" : {
"index" : " hugo-lyra "
}
افتراضيًا، سيقوم Hugo-Lyra بقراءة دليل content
الخاص بك وإخراج فهرس Lyra إلى public/hugo-lyra-english.msp
.
يمكنك تعديل بعض التكوينات (مثل الإدخال والإخراج واللغة والتنسيق وما إلى ذلك) عن طريق تمرير وسيطات الإدخال إلى cli؛ يمكنك رؤية جميع الخيارات عن طريق تشغيل:
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 ) ;
} ) ( ) ;