讀Ghost部落格原始碼與自定義Ghost部落格主題

2022-09-16 09:15:11 字數 2450 閱讀 9622

我使用的ghost部落格一直使用者預設的casper主題。我向來沒怎麼打理過自己部落格,一方面認為自己不夠專業,很難寫出質量比較高的文字;另一方面認為部落格太耗時間,很容易影響正常的工作內容。最近公司即將搬遷,我的開發工作也告一段落,因此抽點時間自定義乙個自己的部落格主頁。

ghost自稱是專業的內容發布平台,實際上跟wordpress相比它只能算乙個相對比較年輕的部落格系統,在功能上完全無法與成熟的wordpress相比。

我之所以選擇ghost作為部落格系統除了它簡單方便,更因為它是基於node.js且開源。畢竟基本的功能有了,如果有其他需求的話自己改**就可以實現。ghost提供http服務用的是express框架。這是一種對我這類半路接觸js的人都可以輕易掌握的框架。

ghost主題存放在安裝路徑的content/themes目錄中。安裝包自帶了casperroon兩個主題,其中前者為預設主題。

ghost支援handlebars模板語言,自帶的兩個主題也是基於此語言編寫的,因此,定製ghost主題最簡單的方法是複製乙份casper的**,基於它進行自定義。我就是這麼做的。

這麼一說你就發現了,部落格的主頁和文章列表頁面是同乙個頁面。主頁對應的路徑為/,列表對應的路徑為/page/:page,其中:page為佔位符,表示某個頁碼值,如1、2、3等。這兩個路徑實際上渲染的都是同乙個模板檔案index.hbs。預設地,ghost接收到請求時/page/1的get請求時,返回301重定向到/,再結合一些樣式變化,從而讓你以為主頁和列表頁是分離開的。

我要做的就是讓主頁和列表頁面不一樣。

解決方法1

首先我想到的就是在index.hbs檔案中通過變數渲染不一樣的內容。參考pagination.hbs我發現確實存在這兩個可用的變數:prev表示是否有前一頁,以及page表示當前為第幾頁。

如果能拿到這兩個變數中的乙個,我就可以區別對待主頁和列表。遺憾的是不行。

分頁相關的變數是模板驅動的,也就是說只能在固定的pagination.hbs這個檔案中才能獲取對應的值。該結論尚未在**上得到驗證

若在這個問題繼續下去是可以實現我的需求的,但考慮到偏離ghost原來的設計太遠可能埋下更多坑,因此放棄該解決方法。

解決方法2

既然無法在模板上解決問題,那就讓路徑/渲染原來的index.hbs,讓路徑/page/:page渲染另乙個handlebars檔案(我設定為list)。

實現這個方法只要兩個步驟:

去除針對/page/1的重定向;

/page/:page指定新的渲染檔案list.hbs。

需要改動ghost安裝目錄下的core/server/routes/frontend.js檔案。下面是改動後的結果:

function handleindexpageparam(req, res, next, page)  else if (page < 1 || isnan(page))  else 

}

另外/page/:page路徑對應的渲染物件frontend.listcore/server/controllers/frontend/index.js中定義。改後的內容如下圖所示:

描述list節點的配置在core/server/controllers/frontend/channel-config.js中定義,在defaults中增加乙個節點:

...

list: ,

...

儘管需求實現了,但是這種解決方法產生了新的問題:以後無法直接使用第三方提供的主題,若要使用,需要複製index.hbs到新的檔案list.hbs

解決方法3

實際上方法2的解決方案增加list相關的**是多餘的,我在ghost官網的文件裡面查到,原來可以讓路徑/獨立渲染home.hbs文件,而路徑/page/2+依舊渲染index.hbs

因此結合方法2,應該可以有一種更輕巧的自定義主頁的方式。

本文同步部落格

模仿原始碼自定義ArrayList

最近看了下arraylist的原始碼,抽空根據arraylist的底層結構寫了乙個功能簡單無泛型的自定義arraylsit,幫助自己更好理解arraylist 其實現的底層資料結構為數object組,如下 自己實現乙個arraylist public class myarraylist public...

自定義屬性提取原始碼分析

原始碼分析基於android 5.0,自定義view的 黃色別墅使用示例如下 其中attrs標識customtitleview對應的節點屬性集合 obtainstyledattributes的作用是將attrs屬性集合中 指定的部分 的屬性進行封裝,屬於container的角色,呼叫過程如下 因此t...

Spring 原始碼解析 自定義標籤

零.閱讀準備 讀這篇文章前先看下預備知識 spring 自定義標籤 一.閱讀 自定義標籤解析核心 public beandefinition parsecustomelement element ele,beandefinition containingbd return handler.parse...