ghostblog主題_讀Ghost博客源碼與自定義Ghost博客主題

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

備注:上圖來自GhostChina官網,與本文內容無關。

Ghost與Ghost主題

Ghost自稱是專業的內容發布平臺,實際上跟WordPress相比它只能算一個相對比較年輕的博客系統,在功能上完全無法與成熟的WordPress相比。

我之所以選擇Ghost作為博客系統除了它簡單方便,更因為它是基于Node.js且開源。畢竟基本的功能有了,如果有其他需求的話自己改代碼就可以實現。Ghost提供HTTP服務用的是Express框架。這是一種對我這類半路接觸js的人都可以輕易掌握的框架。

Ghost主題存放在安裝路徑的content/themes目錄中。安裝包自帶了Casper和Roon兩個主題,其中前者為默認主題。

Ghost支持HandleBars模板語言,自帶的兩個主題也是基于此語言編寫的,因此,定制Ghost主題最簡單的方法是復制一份Casper的代碼,基于它進行自定義。我就是這么做的。

自定義主頁

Ghost只定義了幾個主要頁面,分別是文章列表頁(包含主頁)、文章內容頁、某標簽的文章列表、某作者的文章列表,以及一些rss或sitemap相關的頁面。

這么一說你就發現了,博客的主頁和文章列表頁面是同一個頁面。主頁對應的路徑為/,列表對應的路徑為/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文件。下面是改動后的結果:

其中,handleIndexPageParam是參考handlePageParam后新增加的一個函數,內容如下:

function handleIndexPageParam(req, res, next, page) {

var rssRegex = new RegExp('/rss/(.*)?/');

page = parseInt(page, 10);

if (page === 1 && rssRegex.test(req.url)) {

// Page 1 is an alias, do a permanent 301 redirect

return redirect301(res, req.originalUrl.replace(rssRegex, '/rss/'));

} else if (page < 1 || isNaN(page)) {

// Nothing less than 1 is a valid page number, go straight to a 404

return next(new errors.NotFoundError());

} else {

// Set req.params.page to the already parsed number, and continue

req.params.page = page;

return next();

}

}

另外/page/:page路徑對應的渲染對象frontend.list在core/server/controllers/frontend/index.js中定義。改后的內容如下圖所示:

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

...

list: {

name:'list',

route:'/',

frontPageTemplate:'home'},

...

盡管需求實現了,但是這種解決方法產生了新的問題:以后無法直接使用第三方提供的主題,若要使用,需要復制index.hbs到新的文件list.hbs。

解決方法3

實際上方法2的解決方案增加list相關的代碼是多余的,我在Ghost官網的文檔里面查到,原來可以讓路徑/獨立渲染home.hbs文檔,而路徑/page/2+依舊渲染index.hbs。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法系列之十二】最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數&#xff0c;使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如&#xff0c;給定數組 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1…

定義一個dto對象_業務代碼的救星——Java 對象轉換框架 MapStruct 妙用

在業務項目的開發中&#xff0c;我們經常需要將 Java 對象進行轉換&#xff0c;比如從將外部微服務得到的對象轉換為本域的業務對象 domainobject&#xff0c;將 domainobject 轉為數據持久層的 dataobject&#xff0c;將 domainobject 轉換為 DTO 以便返回給外部調用方等。在轉…

JVM調優總結 -Xms -Xmx -Xmn -Xss

堆大小設置 JVM 中最大堆大小有三方面限制&#xff1a;相關操作系統的數據模型&#xff08;32-bt還是64-bit&#xff09;限制&#xff1b;系統的可用虛擬內存限制&#xff1b;系統的可用物理內存限制。32位系統 下&#xff0c;一般限制在1.5G~2G&#xff1b;64為操作系統對內存…

discuz設置用戶每天回帖數_[建站教程]Discuz3.4設置QQ互聯登陸教程

雖然現在很多人已經不在使用QQ了&#xff0c;但瘦死的駱駝比馬大&#xff0c;QQ的用戶基數還是很大&#xff0c;而且QQ里有大量的年輕用戶&#xff0c;像我的表妹&#xff0c;表弟剛上初中。他們是忠誠的QQ用戶。為了獲取這批年輕的用戶&#xff0c;我們還是有必要讓網站支持QQ…

五種線程池的對比與使用

今天對五種常見的java內置線程池進行講解。 線程使用的demo public static void cache() {ExecutorService pool Executors.newCachedThreadPool();long start System.currentTimeMillis();pool.execute(() -> {int sum 0;for (int i 0; i < 10; i) {sum (int) Ma…

16進制加法 keil_C/C++編程筆記:C語言進制詳解,二進制、八進制和十六進制

我們平時使用的數字都是由 0~9 共十個數字組成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一個數字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;就需要多個數字組合起來。例如表示 58 的結果&#xff0c;一個數字不夠&#xff0c;只能”…

MySQL的索引是什么?怎么優化?

索引類似大學圖書館建書目索引&#xff0c;可以提高數據檢索的效率&#xff0c;降低數據庫的IO成本。MySQL在300萬條記錄左右性能開始逐漸下降&#xff0c;雖然官方文檔說500~800w記錄&#xff0c;所以大數據量建立索引是非常有必要的。MySQL提供了Explain&#xff0c;用于顯示…

通達信板塊監控指標_通達信洞察強勢板塊指標公式

N:13;P:4;RN:27;VVAR1:(MA(CLOSE,80)-MA(CLOSE,13)/3);VVAR2:( MA((CLOSE-VVAR1)/VVAR1,1));VVAR3:(CLOSE-LLV(LOW,28))/(HHV(HIGH,28)-LLV(LOW,28))*100;VVAR4:SMA(VVAR3,4,1);MMA:EMA(VVAR2,12)*0.7;MMB:EMA(VVAR2,3);快到底:IF(LLV(MMB-MMA,12)>0,0,-20),LINETHICK2,COLO…

12306能刪候補訂單記錄_12306候補購票功能在哪里怎么用 火車票候補購票使用攻略...

12月27日&#xff0c;12306火車票官方推出了一個「候補購票」功能&#xff0c;目前已經開啟春運試點&#xff0c;對于購買火車票的用戶來說&#xff0c;當沒票可買的時候&#xff0c;可以提交候補購票&#xff0c;又多了一種購票途徑了。不過&#xff0c;很多小伙伴對于候補購票…

GIT提交message規范

<type>(<scope>): <subject> <body> <footer> # type 用于說明 commit 的類別&#xff0c;只允許使用下面7個標識。 feat: 新功能&#xff08;feature&#xff09; fix: 修補bug docs: 文檔&#xff08;documentation&#xff09; style: 格…

git實現審核功能_一文教你如何搭建PDD分傭小程序實現財富自由

隨著拼多多的火爆&#xff0c;很多淘客以各種方式通過推廣拼多多商品獲取返傭來月入萬元&#xff0c;實現財富自由。只要你有流量或者足夠努力&#xff0c;像其他淘客一樣實現睡后過萬財富自由不是夢。本文通過詳細教程教你快速搭建屬于自己的PDD分傭小程序&#xff0c;完成自己…

9型轉x型 cobol_蘭州一餐館推鴛鴦牛肉面 9種面型一面多吃

來源標題&#xff1a;蘭州一餐館推鴛鴦牛肉面&#xff0c;清湯酸菜各一邊還有9種面型&#xff0c;網友&#xff1a;能連吃三碗近日&#xff0c;位于甘肅蘭州的一家牛肉面館推出了鴛鴦牛肉面。一個大碗分隔為兩邊&#xff0c;一邊是傳統清湯牛肉面&#xff0c;另一邊是酸菜牛肉面…

gitignore不起作用

.gitignore中已經標明忽略的文件目錄下的文件&#xff0c;git push的時候還會出現在push的目錄中&#xff0c;原因是因為在git忽略目錄中&#xff0c;新建的文件在git中會有緩存&#xff0c;如果某些文件已經被納入了版本管理中&#xff0c;就算是在.gitignore中已經聲明了忽略…

java填空題 在非靜態成員方法中_成本加成定價法的優點有

【單選題】以下Math類的方法中,-4.4通過哪個方法運算后,結果為-5.0?【填空題】以下程序的輸出結果為?【單選題】下列方法定義中,正確的是()【判斷題】Java 中被 final 關鍵字修飾的變量,不能被重新賦值。【簡答題】請按以下要求編寫程序 (1) 創建一個Rectangle類,添加width和…

【算法系列之十三】二叉樹兩葉節點的最大距離

1、題目描述 給定一棵二叉樹&#xff0c;計算這課二叉樹的直徑長度&#xff0c;即為二叉樹任意兩個節點間的最長路徑。比如&#xff1a; 這棵二叉樹的最長路徑為3。 2、解題思路 使用遞歸進行求解&#xff0c;每次遞歸的過程中&#xff0c;先求出以某個節點為樹根的二…

date比較大小 mybatis_Hibernate 和 MyBatis 哪個更好用?

Java大聯盟幫助萬千Java學習者持續成長關注作者&#xff5c;SylvanasSun鄭沐興https://zhuanlan.zhihu.com/p/21966051B 站搜索&#xff1a;楠哥教你學Java獲取更多優質視頻教程前言由于編程思想與數據庫的設計模式不同&#xff0c;生出了一些ORM框架。核心都是將關系型數據庫和…

簡單的cpu飆升排查方法

1先來一段飆升代碼 public class FindJavaThreadInTaskManager {public static void main(String[] args) {Thread thread new Thread(new Worker());thread.start();}static class Worker implements Runnable {Overridepublic void run() {while (true) {System.out.printl…

tortoisesvn創建部署項目_FrameWork如何進行云托管部署

介紹CloudBase Framework 是云開發官方出品的云原生一體化部署工具&#xff0c;可以幫助開發者將靜態網站、后端服務和小程序等應用&#xff0c;一鍵部署到云開發 Serverless 架構的云平臺上&#xff0c;自動伸縮且無需關心運維&#xff0c;聚焦應用本身&#xff0c;無需關心底…

【算法系列之十四】最大子序和

1、題目描述 給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大&#xff0c;為 6。 2、…

python的代碼復用技術_Python__函數和代碼復用

主要內容函數的定義和使用實例:七段數碼管的繪制代碼復用與函數遞歸PyInstall庫的使用實例&#xff1a;科赫雪花小包裹函數的定義與使用函數的理解與定義函數的使用及調用過程函數的參數傳遞函數的返回值局部變量和全局變量lambda函數------------------------------------函數…