2015年8月19日 星期三

在 Asciidoc 輸出結果中加入區塊圖示

在 Asciidoctor 的工具輔助之下,一些預設就有區塊內容,像是「TIP」、「NOTE」⋯ 都能夠在輸出的時候被加上預設的圖示。只要在最開頭的設定值中加上⋯
:icons:font

就可以在輸出 HTML 的結果中,看到本來醜醜的介面被加上的圖示。

沒有深入研究是 asciidoc 本來就有的,還是 asciidoctor 加上的項目。總之,能夠讓輸出的結果更加賞心悅,是一件不錯的事情。

2015年8月13日 星期四

[Soma.js] 設定要注入的物件名稱

依賴注入似乎已經成為許多軟體框架的必要元素,它的概念仍然不易被人熟悉,但其方便性以及能夠帶給軟體開發的彈性是很大很大的。 Soma.js 是 javascript 的一個以 infuse.js 為基底開發的依賴注入程式框架(framework),依循它所提供的規則,可以自動偵測到建構式所需要的參數,使用 this 定義的物件變數,Soma.js 將在所有註冊在它身上的變數中,尋找相同名字的變數置入。

換言之⋯ 只要取相同的名字, Soma.js 能夠自動完成變數對應的工作。很方便,但也是其限制。要是一旦名字不同了呢?要是不同時期開發出來的程式,用了同一個名稱表示不同的名字呢? Soma.js 的對應機制是不是就無法順利運作了?

另一個會改變名字的地方在於程式的最小化,為了極致地減少程式碼所佔用的空間,會以較短的文字(像單一字母)取代變數名稱。如此處理的程式碼,很有可能會使得依賴注入失效。

同樣的情形也出現在同為 javascript 的 AngularJS 框架中,而 AngularJS 的處理方式,是在建立 controller, service 的地方,以陣列取代原先傳入建構函數的地方。陣列中列舉了每個注入引用的名稱,最後一個陣列元素才是建構式。由於程式最小化不會對字串進行處理,因此可以避免注入的對應出錯。

那麼回到 Soma.js 身上,它使用了 injector.createInstance 方法來建立物件,然而只接受一個參數,也只能是建構函數。它是支援在建構函數後頭增加其它的參數,依序作為建構函數的參數,不足的部分的由既有的注入對應機制處理、補齊。

不過,如果傳入的參數是要注入項目的名稱,會發現該名稱的字串,會直接作為參數傳入建構函數,而不是該名稱所對應的物件。因此,如果要傳入注入名稱的對應,不能使用 injector.createInstance 函數來達到。

最後的由其的基底 infuse.js 的文件中找到,它的作法是在建構函數上定義 inject 變數,其對應到建構時所注入物件名稱,經過實測的結果是能夠順利運作。至於物件內的變數要怎麼對應,這個部分就留待未來有需要再進行測試。

以下列個簡單的物件宣告⋯ (注意 inject 是定義給建構函數,而不是建構出來的物件上)
function MyClass(opt1, opt2) {
  // some code...
}
MyClass.inject = ['optName', 'otherOption'];
module.exports = MyClass;

2015年8月11日 星期二

在 asciidoc 文件中使用語法高亮

許久前照著範例輸入,卻怎麼也作不出上面講的語法高亮的效果。輸出的 HTML 還是「平平的純文字」,後來才發現,原來要在文件的開頭加上宣告,似乎這樣會多引入一些額外的 CSS  ,才能讓高亮的效果出現。

在主標題(文件最開頭,寫大標題的那區)加上⋯

:source-highlighter: pygments
這樣在輸入高亮語法時,就會被處理了。

除了 pygents 之外,還可以改成 coderay, highlightjs, prettify 。應該是其它幾種 CSS 主題吧~ 就沒有特別再去測試了,目前這種就讓我很滿意了。

語法的宣告很簡單,只要「[source,語法名稱]」就可以了。像是 javascript, php 這種比較單純,有一些則是要嘗試一下,像是我試了「shell, bashell, hash」三種,最後只有 bash 才被正確解析。

哪天有空再找找有沒有什麼表格,把所有支援的語法都列出好在未來作查詢。

另外,讓我有點意外的,也有支援 livescript 語法。算是一個驚喜吧~

[2015-10-5 補充]
重灌 mac 後發現,如果要使用 pygments 樣式的話,需要安裝 pygments.rb 這個套件。不確定在原來在打這篇文章之前就裝過,還是因為後來的 asciidoctor 安裝不會將它裝入。總之包含其它的樣式(coderay, hightlightjs, prettify)應該都要先安裝對應套件才能使用。

[2016-10-23 補充]
使用以下指令安裝 pygments.rb

gem install pygments.rb