Skip to content

[Python] 使用 Pygments 套件將程式語言 keyword 加上顏色

Last Updated on 2021-06-04 by Clay

一般我們撰寫程式碼時,如果我們是使用 IDE 來開發程式,那麼我們通常都會注意到我們的程式碼是『高亮』(Highlight) 的。這是由於在 IDE 當中另外有著使用『正規表示式』(Regular Expression) 替 Keyword 上色的程式。

那我們要如何替自己的程式碼上色呢?這時候,我們可以使用 Pygments 這個方便好用的工具!

以下引用自 Wiki:

Pygments是一個著名的語法高亮工具,它使用Python程式語言實現。目前Pygments支持超過300種語言或文本格式的語法高亮。Pygments同時也曾被GitHubBitbucketPhabricator等著名項目用作於其語法高亮工具。

Wiki 中關於 Pygments 的簡介

那麼,我們該怎麼使用 Pygments 呢?以下我就簡單地紀錄使用流程。我們這就開始吧!


安裝

若是在電腦中從未安裝過 Pygments,那麼我們就需要使用以下指令安裝:

sudo pip3 install Pygments

使用流程

基本上,要使用 Pygments 需要決定三種輸出參數,分別為:

  • Lexer (語法器): 決定 Highlight 的是什麼語言
  • Style: 決定以什麼樣的風格進行 Highlight
  • Formatter: 輸出格式

那麼,我們就一步步地來看吧!


Lexer 語法分析器

首先,我們要決定我們要 Highlight 的是什麼語言。在這之前,我們可以先看一下 Pygments 支援哪些語言。

from pygments import lexers

for lexer in lexers.get_all_lexers():
    print(lexer)



Output:

('ABAP', ('abap',), ('<em>.abap', '</em>.ABAP'), ('text/x-abap',))
('APL', ('apl',), ('<em>.apl',), ())
('ABNF', ('abnf',), ('</em>.abnf',), ('text/x-abnf',))
.
.
.
('Zeek', ('zeek', 'bro'), ('<em>.zeek', '</em>.bro'), ())
('Zephir', ('zephir',), ('<em>.zep',), ()) </em>
('Zig', ('zig',), ('*.zig',), ('text/zig',))

可以看到,我們能選擇的語言非常多種!


Style

接下來,我們便來決定程式碼要用什麼樣的樣式來進行 Highlight。順帶一提,我在 Blog 上的程式碼目前都是用 "native" 這種風格來 Highlight 的呢。

那麼,我們來看看到底有多少種 Style 吧!

from pygments.styles import get_all_styles

# Style
for s in get_all_styles():
    print(s)



Output:

 default
 emacs
 friendly
 colorful
 autumn
 murphy
 manni
 monokai
 perldoc
 pastie
 borland
 trac
 native
 fruity
 bw
 vim
 vs
 tango
 rrt
 xcode
 igor
 paraiso-light
 paraiso-dark
 lovelace
 algol
 algol_nu
 arduino
 rainbow_dash
 abap
 solarized-dark
 solarized-light
 sas
 stata
 stata-light
 stata-dark
 inkpot

Formatter

Pygments 的輸出格式有非常多種,以下我們就分別解釋經典的『HTML 格式』以及『Image 格式』吧!

首先是輸出成 HTML:

from pygments import highlight
from pygments import lexers
from pygments.formatters.html import HtmlFormatter
from pygments.styles import get_style_by_name

# Settings
code = "print('Hello World!')"
lexer = lexers.get_lexer_by_name('python')
style = get_style_by_name('native')
formatter = HtmlFormatter(full=True, style=style)

# Highlight
with open('test.html', 'w') as f:
    highlight(code, lexer, formatter, outfile=f)


Output:

你大概會得到像這樣的 html 檔

使用網頁打開,我們便會看到結果:

使用圖片輸出的格式也一樣,唯一的差別在於圖片的寫入是二進制的,所以要用 "wb" 模式:

from pygments import highlight
from pygments import lexers
from pygments.formatters.img import ImageFormatter
from pygments.styles import get_style_by_name

# Settings
code = "print('Hello World!')"
lexer = lexers.get_lexer_by_name('python')
style = get_style_by_name('native')
formatter = ImageFormatter(full=True, style=style)

# Highlight
with open('test.png', 'wb') as f:
    f.write(highlight(code, lexer, formatter))



Output:

如果出現了以下的報錯:

pygments.formatters.img.PilNotAvailable: Python Imaging Library is required for this formatter

那麼便使用以下指令安裝 Pillow 即可:

sudo pip3 install Pillow

References

https://pygments.org/docs/quickstart/

還有許多的參數以及使用方法我並沒有紀錄在文章中,這些都可以在以上網站中查到,可以多多參考。

Leave a Reply