Hexo 插件歪門邪道
前情提要
是這樣的,這個站點用的主題是 Redefine,個人非常滿意,但遇到了個問題:圖片的 markdown 語法沒有辦法自訂大小。正常來說,插入帶有自訂屬性的圖片是這麼寫的:
1 | <img src="/path/to/image.png" width="500"> |
對,它是 html 標籤,這時候就會想我都用 markdown 了,沒有更優雅的方法來自定它的大小嗎?
欸,找了下有個大佬跟我有一樣的問題,並給出了 很好的答案:
1 |  |
沒錯,在 js 腳本綁定 window.onload 事件之後 query img 元素然後給他們注入 width 跟 height 屬性,看看程式碼,你知道我知道獨眼龍也知道。
問題就出在:
該怎麼魔改主題?
有兩個方法:
- 把主題放專案資料夾的
themes內,跟著專案一起進版控 - 放其他地方,用
npm install /path的方式內連
兩個方法都可行,但 1 就會跟主專案分離;而 2 會牽涉到使用 git submodule 管理專案,另外我是用 github action 自動部屬,有點懶得改配置。
說來慚愧,有另一部份原因是我翻看別人專案程式碼的速度實在慢得感人。。。
自己寫插件
綜合剛剛兩個方法,決定以不破壞主題原始碼,從 Hexo Plugin 下手。
先新增了一個名為 hexo-jackoo-plugins 的插件資料夾,格式照著 官方文件 寫的:
1 | . |
1 | { |
命名正確 npm install ./hexo-jackoo-plugins 內連後,應該就可以愉快玩耍了。
index.js 是進入點,插件執行的時機點是生成靜態網頁的階段,所以用 Generator 把上面的 resize_image.js 複製進去,然後用 Injector 讓每個頁面都讀取它。
1 | var fs = require("hexo-fs"); |
hexo 是全域的不用再 require。
摁,有效果了,但這個主題有用 IntersectionObserver 做惰性加載,所以我改了下抓元素的邏輯以及回呼:
1 | function hexo_resize_image() { |
用 MutationObserver 觀察 lazyload 屬性,被拔掉代表開始加載,綁定 img.onload 回呼等圖片載入完成再計算大小。
摁,又測了測,切頁時圖片大小怪怪的,發現因為有用 swup.js 提升使用者體驗,所以回呼不只要掛在 window.onload 事件,還要掛在 swup 完成內容置換的事件上,所以又給加上了:
1 | // this is for the initial page load |
大功告成,可以繼續優雅得寫 markdown 了。
後話
有了這個旁路,感覺能玩出更多花招就是了,也不會被主題綁死做一個堆疊,只能說 js 寫起來還是那麼單純又混亂。
git submodule 遲早會找機會寫一篇,一直搞不明白。。。