Github Pages(四):Hexo進階-NexT本地搜索引擎的移植

Hexo 默認的 Landscape 主題其實已經(jīng)很好了侨把,可以說簡明美觀腌零,網(wǎng)頁上的元素也不難添加莲组。
但是美中不足的就是用了谷歌搜索引擎看疗,谷歌在國內(nèi)打不開就不說了沙峻,而且用外部搜索引擎本來也不如站內(nèi)搜索便捷實用。
后來我發(fā)現(xiàn) NexT 主題是有站內(nèi)搜索功能的两芳,就試著把這個功能移植了進來摔寨。

本地搜索的原理

對于動態(tài)網(wǎng)站來說,可以通過 php 實現(xiàn)(具體見Github Pages(二):個人網(wǎng)站的功能插件)怖辆。
但是是复,GitHub博客是靜態(tài)網(wǎng)站,用不了 php疗隶,導致我在老網(wǎng)站只能把google搜索結(jié)果頁內(nèi)置到了網(wǎng)站里面 (Landscape也用了谷歌)佑笋。

NexT 主題實現(xiàn)這個功能,用了 Hexo 的拓展包 hexo-generator-searchdb斑鼻,它預先生成了一個文本庫search.xml蒋纬,然后傳到了網(wǎng)站里面。在本地搜索的時候坚弱,NexT直接用javascript調(diào)用了這個文件蜀备,從而實現(xiàn)了靜態(tài)網(wǎng)站的本地搜索。

準備工作

首先把產(chǎn)生文本庫的包安裝好荒叶,執(zhí)行 npm install hexo-generator-searchdb --save碾阁。
然后在主配置文件 _config.yml里面加上

search:
  path: search.xml
  field: post
  format: html
  limit: 10000

并且在主題配置文件加上

local_search:
  enable: true
  trigger: auto
  top_n_per_article: 1

其中trigger表示搜索結(jié)果會不會打字時自動顯示,top_n_per_article 表示每篇文章最多顯示幾條結(jié)果(-1為不限數(shù)字)些楣。
這些只是準備工作脂凶,在把代碼放到Landscape 之前,這些設置不會起任何作用愁茁。

NexT 主題的本地搜索代碼

NexT 主題的 local-search 主要是下面幾個模塊組成的:

Landscape主題的后綴有所不同(不是.swig蚕钦, 而是.ejs),這幾個文件copy過來之后需要稍微改一下語法鹅很,幾個圖標也需要重新定義嘶居,細節(jié)如下。

移植步驟

定義"搜索"促煮,"關閉"邮屁,"無結(jié)果"等圖標

NexT 大量使用了 <i class = "fa abc"> </i> 這樣的方式來引用 FontAwesome 圖標整袁,但是 Landscape 卻不支持這么用。
所以一開始不得不定義一些圖標佑吝,在主題文件夾 themes/landscape//source/css/ 下面找個地方 (比如說_partial/header.styl)坐昙,定義:

#icon-close:before {
  font-family: FontAwesome;
  content: "\f146";
  font-size: x-large
}

這樣就定義了一個關閉搜索框的圖標。移植的時候重新定義圖標為<span id="icon-close"></span> 就可以了。
新定義的圖標主要是搜索 \f002,關閉\f146暴构,和無結(jié)果 \f119烈拒。

放入調(diào)出搜索框的鏈接

首先進入主題文件夾的/layout/_partial/header.ejs ,那里默認有一個搜索鏈接(id="nav-search-btn" class="nav-icon")陋桂。
把這個鏈接擴展為:

<% if(!theme.local_search.enable) { %><a id="nav-search-btn" class="nav-icon" title="<%= __('search') %>"></a><% } %>
<% if(theme.local_search.enable) { %><a href="javascript:;" class="popup-trigger nav-icon" id="nav-search-btn"></a><% } %>

這也就意味著用主題配置中的 local_search.enable 來控制搜索功能了逆趣,打開本地搜索的情況下,搜索鏈接會啟動class="popup-trigger"嗜历,也就打開了本地搜索引擎宣渗。

放入搜索框

還是著剛才的文件header.ejs,可以在最后一行</header>前面加上

<% if(theme.local_search.enable) { %><div class="local-search-inner"><%- partial('search') %></div><% } %>

其中 <%- partial('search') %> 指向了 search.ejs梨州,這個文件也就是 NexT 的搜索框 另一個localsearch.swig 了痕囱。
把它拷貝成search.ejsheader.ejs 放在一起,但是圖標要全部換成適配Landscape的定義暴匠。另外直接明碼寫上placeholder=" 本地搜索..." 就可以了鞍恢。

放入核心 javascript

localsearch.swig放入/layout/_partial/, 并且命名為localsearch.ejs
然后在/layout/layout.ejs的最后每窖,</body> 的上一行引用這個文件 <%- partial('_partial/localsearch') %>帮掉。
這個目的是在每一個網(wǎng)頁的最下方加入這一段 javascript。

然后就要改這個文件了窒典, 要改的有三項:

  • 圖標
    跟剛才一樣蟆炊,凡是帶class="fa abc" 的圖標都要重新定義成適配Landscape的。
  • 語法
    改成 localsearch.ejs 之后瀑志,這個腳本里面的兩類語法要改涩搓。 一是if..else..要這樣用:
  <% if (theme.local_search.enable){ %><% } %>

二是config要這樣調(diào)用(注意有個等號):

var search_path = "<%= config.search.path %>" ;

大概一共三四處要改,主要是config能讀到就可以了劈猪。

  • 搜索框的位置
    這個腳本里面有一處容易坑的地方昧甘,就是這一行

    $('.popup').detach().appendTo('.header-inner');
    

    注意這個.header-inner是搜索框的位置,是要根據(jù)情況改的岸霹。比如我剛才在header.ejs定義的是

    <div class="local-search-inner"><%- partial('search') %></div>
    

    那就要把.header-inner 改為 .local-search-inner 了疾层。

放入渲染文件,取消陰影背景

渲染文件也是必須的贡避,可以把 localsearch.styl 放入 /source/css/_partial/
然后在主渲染文件/source/css/style.styl中痛黎,注意加上 @import "_partial/localsearch" 就可以了予弧。

不知道什么原因,這個搜索引擎的陰影背景.local-search-pop-overlay 總是會出現(xiàn)在最上方湖饱,導致搜索框出來之后根本點不到掖蛤。我直接給它設置 z-index: auto ,跳過了這個問題井厌。

這個文件是大部分元素的渲染文件蚓庭,可以用來調(diào)整圖標位置,placeholder文字的大小等等仅仆,這都是細節(jié)了器赞。

把原先的搜索功能關掉

原先的搜索能在 source/js/script.js 里面,把這一段code移到 localsearch.ejs 里面墓拜,然后用一個

<% if (!theme.local_search.enable){ %><% } %>

來控制就可以了港柜。

總結(jié)

最終搜索的效果截圖在這里:


本地搜索效果

其實直接用 NexT 就好了,不過自己編輯主題可以趁機學習一下咳榜。畢竟還是成功了夏醉。
有一點很重要的是,自己編輯主題是免不了要debug的涌韩,要善用谷歌瀏覽器的檢查功能(以及最簡單的輸出 console.log()畔柔,或者其他工具的同類功能)。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臣樱,一起剝皮案震驚了整個濱河市靶擦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擎淤,老刑警劉巖奢啥,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘴拢,居然都是意外死亡桩盲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門席吴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赌结,“玉大人,你說我怎么就攤上這事孝冒〖硪Γ” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵庄涡,是天一觀的道長量承。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么撕捍? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任拿穴,我火速辦了婚禮,結(jié)果婚禮上忧风,老公的妹妹穿的比我還像新娘默色。我一直安慰自己,他們只是感情好狮腿,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布腿宰。 她就那樣靜靜地躺著,像睡著了一般缘厢。 火紅的嫁衣襯著肌膚如雪吃度。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天贴硫,我揣著相機與錄音规肴,去河邊找鬼。 笑死夜畴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的删壮。 我是一名探鬼主播贪绘,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼央碟!你這毒婦竟也來了税灌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿虽,失蹤者是張志新(化名)和其女友劉穎菱涤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洛勉,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡粘秆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了收毫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攻走。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖此再,靈堂內(nèi)的尸體忽然破棺而出昔搂,到底是詐尸還是另有隱情,我是刑警寧澤输拇,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布摘符,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逛裤。R本人自食惡果不足惜瘩绒,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望别凹。 院中可真熱鬧草讶,春花似錦、人聲如沸炉菲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拍霜。三九已至嘱丢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祠饺,已是汗流浹背越驻。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留道偷,地道東北人缀旁。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像勺鸦,于是被迫代替她去往敵國和親并巍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容