Pustaka JavaScript untuk menambahkan fungsionalitas pencarian ke blog Jekyll mana pun.
Anda memiliki blog, dibuat dengan Jekyll, dan menginginkan fungsi pencarian ringan di blog Anda, murni sisi klien?
Tidak ada konfigurasi server atau database yang harus dipelihara .
Hanya 5 menit untuk memiliki blog yang dapat dicari dan berfungsi sepenuhnya .
npm install simple-jekyll-search
search.json
Tempatkan kode berikut dalam file bernama search.json
di root blog Jekyll Anda. (Anda juga bisa mendapatkan salinannya dari sini)
File ini akan digunakan sebagai sumber data kecil untuk melakukan pencarian di sisi klien:
---
layout : none
---
[
{% for post in site.posts %}
{
" title " : "{{ post.title | escape }}",
" category " : "{{ post.category }}",
" tags " : "{{ post.tags | join: ', ' }}",
" url " : "{{ site.baseurl }}{{ post.url }}",
" date " : "{{ post.date }}"
} {% unless forloop.last %},{% endunless %}
{% endfor %}
]
SimpleJekyllSearch memerlukan dua elemen DOM
agar berfungsi:
Berikut kode yang dapat Anda gunakan dengan konfigurasi default:
Anda perlu menempatkan kode berikut dalam tata letak tempat Anda ingin pencarian muncul. (Lihat bagian konfigurasi di bawah untuk menyesuaikannya)
Misalnya di _layouts/default.html :
<!-- HTML elements for search -->
< input type =" text " id =" search-input " placeholder =" Search blog posts.. " >
< ul id =" results-container " > </ ul >
<!-- or without installing anything -->
< script src =" https://unpkg.com/simple-jekyll-search@latest/dest/simple-jekyll-search.min.js " > </ script >
Sesuaikan SimpleJekyllSearch dengan meneruskan opsi konfigurasi Anda:
var sjs = SimpleJekyllSearch ( {
searchInput : document . getElementById ( 'search-input' ) ,
resultsContainer : document . getElementById ( 'results-container' ) ,
json : '/search.json'
} )
Contoh baru SimpleJekyllSearch mengembalikan objek, dengan satu-satunya properti search
.
search
adalah fungsi yang digunakan untuk mensimulasikan input pengguna dan menampilkan hasil yang cocok.
Misalnya:
var sjs = SimpleJekyllSearch ( { ... options } )
sjs . search ( 'Hello' )
ini dapat digunakan untuk memfilter postingan berdasarkan tag atau kategori!
Berikut adalah daftar opsi yang tersedia, pertanyaan penggunaan, pemecahan masalah & panduan.
Elemen masukan tempat plugin harus mendengarkan peristiwa keyboard dan memicu pencarian dan rendering artikel.
Elemen penampung tempat hasil pencarian harus dirender. Biasanya <ul>
.
Anda dapat meneruskan URL ke file search.json
, atau hasilnya langsung dalam bentuk JSON, untuk menghemat satu perjalanan pulang pergi untuk mendapatkan data.
Templat dari satu hasil penelusuran yang dirender.
Sintaks templating sangat sederhana: Anda cukup mengapit properti yang ingin Anda ganti dengan kurung kurawal.
Misalnya
Templat
var sjs = SimpleJekyllSearch ( {
searchInput : document . getElementById ( 'search-input' ) ,
resultsContainer : document . getElementById ( 'results-container' ) ,
json : '/search.json' ,
searchResultTemplate : '<li><a href="{{ site.url }}{url}">{title}</a></li>'
} )
akan memberikan yang berikut ini
< li > < a href =" /jekyll/update/2014/11/01/welcome-to-jekyll.html " > Welcome to Jekyll! </ a > </ li >
Jika search.json
berisi data ini
[
{
"title" : " Welcome to Jekyll! " ,
"category" : " " ,
"tags" : " " ,
"url" : " /jekyll/update/2014/11/01/welcome-to-jekyll.html " ,
"date" : " 2014-11-01 21:07:22 +0100 "
}
]
Sebuah fungsi yang akan dipanggil setiap kali ditemukan kecocokan dalam template.
Itu akan melewati nama properti saat ini, nilai properti, dan template.
Jika fungsi mengembalikan nilai yang tidak ditentukan, fungsi tersebut akan diganti di templat.
Ini berpotensi berguna untuk memanipulasi URL, dll.
Contoh:
SimpleJekyllSearch ( {
...
templateMiddleware : function ( prop , value , template ) {
if ( prop === 'bar' ) {
return value . replace ( / ^/ / , '' )
}
}
. . .
} )
Lihat pengujian untuk contoh kode yang mendalam
Fungsi yang akan digunakan untuk mengurutkan hasil yang difilter.
Ini dapat digunakan misalnya untuk mengelompokkan bagian-bagian menjadi satu.
Contoh:
SimpleJekyllSearch ( {
...
sortMiddleware : function ( a , b ) {
var astr = String ( a . section ) + "-" + String ( a . caption ) ;
var bstr = String ( b . section ) + "-" + String ( b . caption ) ;
return astr . localeCompare ( bstr )
}
. . .
} )
HTML yang akan ditampilkan jika kueri tidak cocok dengan apa pun.
Anda dapat membatasi jumlah postingan yang dirender pada halaman.
Aktifkan pencarian fuzzy untuk memungkinkan pencocokan yang tidak terlalu ketat.
Masukkan daftar istilah yang ingin Anda kecualikan (istilah akan dicocokkan dengan ekspresi reguler, jadi URL, kata diperbolehkan).
Sebuah fungsi dipanggil setelah data dimuat.
Batasi berapa kali fungsi pencarian dapat dijalankan selama jangka waktu tertentu. Hal ini sangat berguna untuk meningkatkan pengalaman pengguna saat menelusuri kumpulan data yang besar (baik dengan istilah yang jarang atau karena jumlah postingan yang akan ditampilkan banyak). Jika tidak ada debounceTime
(milidetik) yang disediakan, pencarian akan dipicu pada setiap penekanan tombol.
remove_chars
sebagai filter.Misalnya: di search.json, ganti
"content" : " {{ page.content | strip_html | strip_newlines }} "
dengan
"content" : " {{ page.content | strip_html | strip_newlines | remove_chars | escape }} "
Jika ini tidak berhasil saat menggunakan halaman Github, Anda dapat mencoba jsonify
untuk memastikan kontennya kompatibel dengan json:
"content" : { { page . content | jsonify } }
Catatan: Anda tidak perlu menggunakan tanda kutip "
karena jsonify
secara otomatis memasukkannya.
Ganti search.json
dengan kode berikut:
---
layout : none
---
[
{% for post in site.posts %}
{
" title " : "{{ post.title | escape }}",
" category " : "{{ post.category }}",
" tags " : "{{ post.tags | join: ', ' }}",
" url " : "{{ site.baseurl }}{{ post.url }}",
" date " : "{{ post.date }}",
" content " : "{{ post.content | strip_html | strip_newlines }}"
} {% unless forloop.last %},{% endunless %}
{% endfor %}
,
{% for page in site.pages %}
{
{% if page.title != nil %}
" title " : "{{ page.title | escape }}",
" category " : "{{ page.category }}",
" tags " : "{{ page.tags | join: ', ' }}",
" url " : "{{ site.baseurl }}{{ page.url }}",
" date " : "{{ page.date }}",
" content " : "{{ page.content | strip_html | strip_newlines }}"
{% endif %}
} {% unless forloop.last %},{% endunless %}
{% endfor %}
]
npm install
npm test
cd example ; jekyll serve
# in another tab
npm run cypress -- run
Terima kasih kepada semua kontributor selama bertahun-tahun! Kamu yang terbaik :)
@daviddarnes @XhmikosR @PeterDaveHalo @mikeybeck @egladman @midzer @eduardoboucas @kremalicious @tibotiber dan banyak lainnya!