What have you found for these years?

2010-01-27

pygmentize

coderay 很弱,ultraviolet 不錯,不過有些地方有點麻煩,
而且有點年久失修,很多東西都有點老舊了。也不支援 ruby 1.9
現在看到 pygments, 我想這個應該是目前為止最好的。

> sudo port install py(25|26)?-pygments

不過沒有 twilight theme, 我自己從 ultraviolet 裡
改了一個出來,寫成 twilight.py, 硬塞到 pygments 的
styles 資料夾底下。一個 symbolic link, 指到我的
git repository 底下的 twilight.py. 我不知道有沒有
良好掛進去的方式,翻手冊沒看到,反正能動就這樣暴力搞 @@

這個移植其實也沒那麼單純一對一對應,還要看不同語言間
parse 出來的結果如何。例如一開始只針對 ruby,
跑 haskell 出來的結果就不太好看。值得高興的是,
pygments parse 出來的結果似乎是超集,可以套到不同
語言之間似乎沒什麼問題。

基本上 coderay 有個很嚴重的問題是,parse 的能力太弱。
ultraviolet 好些,但是他的命名我完全看不懂...
pygments 則是非常清楚,一看就知道是什麼意思!

ultraviolet 那什麼 Storage, 完全不知道是啥鬼。
看他的 css class 跟內容完全接不起來。pygments 除了
非常清楚外,parse tree 看起來也正確、多樣多了。
而且 scala, haskell, 這些比較冷門的都有。

看來我是不需要自己寫了... 剩下差的就是,如何快速 highlight.
深切體會到,只要不方便那就跟沒用差不多。或許我需要自己寫一個
markdown parser 之類的,現有的都跟我的習慣有點差距 :(
friendly_format 開刀好了。不過這樣就沒有 markdown.

取得 css:
> pygmentize -f html -S twilight -a .pygments
輸出:
> pygmentize -f html -O \
style=twilight,encoding=utf-8 input.hs
如果要整頁,則 -O 那邊改用 -O full,style=...
encoding 要指定,不然不認得 utf-8...

以下是弄出來的 twilight.py, 看看效果如何吧?

# -*- coding: utf-8 -*-
"""
pygments.styles.twilight
~~~~~~~~~~~~~~~~~~~~~~~~

inspired by TextMate
"""

from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String, Error, \
Number, Operator, Generic, Whitespace, Punctuation


class TwilightStyle(Style):
"""
inspired by TextMate
"""

background_color = "#000000"
highlight_color = ""
default_style = ""

styles = {
Whitespace: "#000000",
Comment: "#5F5A60",
Comment.Preproc: "",
Comment.Special: "",

Keyword: "#CDA869",
Keyword.Declaration: "",
Keyword.Namespace: "",
Keyword.Pseudo: "#CDA869",
Keyword.Type: "#9B859D",

Operator: "#CDA869",
Operator.Word: "",

Punctuation: "#CDA869",

Name: "#FFFFFF",
Name.Builtin: "#7587A6",
Name.Function: "#9B703F",
Name.Class: "#9B859D",
Name.Namespace: "",
Name.Exception: "",
Name.Variable: "",
Name.Variable.Instance: "",
Name.Variable.Class: "",
Name.Variable.Global: "",
Name.Constant: "#9B859D",
Name.Label: "",
Name.Entity: "",
Name.Attribute: "",
Name.Tag: "",
Name.Decorator: "",

String: "#8F9D6A",
String.Char: "",
String.Doc: "",
String.Interpol: "",
String.Escape: "",
String.Regex: "#E9C062",
String.Symbol: "#CF6A4C",
String.Other: "#FFFFFF",

Number: "#CF6A4C",
Number.Integer: "",
Number.Float: "",
Number.Hex: "",
Number.Oct: "",

Generic.Heading: "",
Generic.Subheading: "",
Generic.Deleted: "",
Generic.Inserted: "",
Generic.Error: "",
Generic.Emph: "",
Generic.Strong: "",
Generic.Prompt: "",
Generic.Output: "",
Generic.Traceback: "",

Error: ""
}

==
slidedown 裡找到的。他寫死路徑在 /usr/local 下...
slidedown 試了一下還是不行,做得不完整,而且有些不合
我的需求。例如輸出的字太小了,我希望有高橋流的大小 XD

至於 ultraviolet 的 css, 日後砍掉好了..?

2 retries:

老林 said...

效果很棒耶 @@
不過要怎麼把它嵌到文章中啊?
你要手動做這動作嗎?

Lin Jen-Shin (aka godfat 真常) said...

對,輸出結果是 html 片段,然後 copypasta 到文章裡

這樣不是很方便,理想上是我寫我的文章,
經過處理之後產生 html, 接著整段貼上去

只是很可惜現在流行的 markdown 我還是覺得不是很習慣...

Post a Comment

All texts are licensed under CC Attribution 3.0