2010年2月3日 星期三

[reStructuredText] Pygments Intro. & Install

參考了劍心的這篇,也弄了pygments來用用看。

不過我不是用port install來裝。原因不明地,> sudo port install py26-pygments以後,不知道怎麼打開它。@@
> pygmentize
> pygments
> py-pygments
> py26-pygments
等等的排列組合都試過了,但是就是不能用。
不知道是哪個地方跳針了還是如何? @@
最後解決的方法是去PyPI下載source code以後自己build就可以用了。(我的python版本=2.5.1)
> wget 'http://pypi.python.org/packages/source/P/Pygments/Pygments-1.2.2.tar.gz#md5=920e706a817437eae3a1406380421a3d'
> tar -xzf Pygments-1.2.2.tar.gz
> cd Pygments-1.2.2
> sudo python setup.py install




pygments有四個重要的元件:Lexers, Formatters, Filters和Styles。Lexers是source code parser;Formatters是output generator;Filters是針對特別需求時可以更改部份輸出結果用的工具;Styles是色彩字體等格式的定義。詳情可以參考Pygments Online Document中的Builtin components的部份。

(註:要使用有關圖檔的formatter都需要安裝PIL(Python Image Library)。build的方法幾乎和build pygments一模一樣。只是wget的target要換一下罷了。
> wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
> tar -xf Imaging-1.1.7.tar
> cd Imaging-1.1.7
> sudo python setup.py install
)

(註:在Mac上,style的定義檔存放在/Library/Python/2.5/site-packages/Pygments-1.2.2-py2.5.egg/pygments/styles/這裡面。劍心的twilight.py我就是直接賽進這邊就可以用了。)



pygmentize身上也有非常多參數可以下。最基本的兩個flag分別是-f-o。-f 可以指定要使用的formatter(也就是指定輸出格式);-o 則是和一般compiler一樣指定輸出檔名。當然,因為formatter本身就包含了format在內,所以也可以不要用-o,不過這樣一來就要自己做檔案輸出。以下兩個作法是等價的。
> pygmentize -f html -o setup_c.html setup.c
> pygmentize -f html setup.c > setup_c.html

-O可以進一步設定lexer和formatter的選項。-O可以一次接受複數個選項,但是這也造成了-O不能接受含有","或"="的選項。因此也就有了-P的出現,-P一次只能吃一個選項參數,但是選項參數中就可以包含","或"="。
> pygmentize -f html -O full,style=twilight,linenos=1 01.hs
> pygmentize -f html -P "heading=Pygments, the Python highlighter" full,linenos=1 setup.py
相似於-O和-P, -F是用來在token stream上面增加filter用的。用法大概是這樣-F keywordcase:case=upper,whitespace:spaces=True-F whitespace:spaces=True
(註,這三個參數都可以重複一直使用。)

pygmentize預設只會生出資訊而不會把style的定義也一併輸出,也就是說,
> pygmentize -f html setup.py > test.html
用browser打開test.html以後會發現是黑白的。
因此我們可以用
> pygmentize -f html -S twilight -a .pygments > style.css
來取得名為twilight的style的css檔

還有, 參數-N可以查詢某source code的lexer。
例如說> pygmentize -N Makefile會輸出make

此外pygmentize也提供兩個flag, -L-H, 可以查詢lexers, formatters和filters的資訊(-L還可以查詢styles)。例如
> pygmentize -L會傾印lexers, formatters, filters和styles的資訊
> pygmentize -L styles會指定印出styles的資訊
> pygmentize -H formatter html會印出html的help info.



這是測試的結果(原因不明的在blogger上面Line#和Code會有點錯開)
 1
2
3
4
5
6
7
8
9
10
11
import GHC.Conc
import System.Info
import Text.Printf
import Data.Version

main = do
printf "Compiled with %s-%s on %s/%s\n"
compilerName
(showVersion compilerVersion)
os arch
printf "Running with %d OS threads\n" numCapabilities

5 則留言:

  1. 他放在這
    /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/

    回覆刪除
  2. 話說我沒研究這麼透徹 XD
    這篇以後要參考一下 XD

    twilight.py 其實也還沒完全調好 @@

    回覆刪除
  3. > 話說我沒研究這麼透徹 XD
    > 這篇以後要參考一下 XD
    (羞)

    > twilight.py 其實也還沒完全調好 @@
    確實很多東西都是空的
    不過, 目前看起來是還不錯
    調好記得mail給我一份 or 我(有空)改好以後mail給你? XD

    回覆刪除