顯示廣告
隱藏 ✕
看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [PHP] 使用 Pygments 將程式碼上色 syntax highlighter
時間 2015-10-16 Fri. 08:18:27


[圖]

Pygments 是個用 Python 在後端將程式碼文字上色的工具
官網 http://pygments.org/

雖然有一些用JS寫的前端程式碼上色工具
像是 SyntaxHighlighter, Google Prettifier, highlighter.js
但效果不太理想,一些比較複雜的語法會辨識錯誤
且必需載入很多JS程式會讓瀏覽器變慢

所以改找個後端的程式碼上色工具來用

在 CentOS 下安裝 Pygments

先安裝 Python
$ sudo yum install python3

安裝 Pygments
$ sudo yum install python-pygments

不過這樣只能裝舊版的 Pygments 1.4
要使用新功能與新的語言支援(例如swift)的話,要安裝新版才行

移除 yum 安裝的 pygments
$ sudo yum remove python-pygments

使用 pip 安裝
$ python3 -m pip install pygments

執行檔會安裝在 /usr/local/bin/pygmentize,加個軟連結到 /usr/bin
$ ln -s /usr/local/bin/pygmentize /usr/bin/pygmentize

查看安裝版本
$ pygmentize -V
Pygments version 2.14.0, (c) 2006-2022 by Georg Brandl, Matthäus Chajdas and contributors.


在 Windows 下安裝 Pygments

Python官網 下載 windows 版安裝程式

http://pypi.python.org/pypi/distribute#installation-instructions 下載安裝 distribute

將 C:\Python27\Scripts\ 加進系統路徑中
控制台/系統/進階系統設定/進階,點環境變數
編輯系統變數的 path,加上 ;C:\Python27\Scripts
[圖]


在命令提示字元模式下執行 C:\Python27\Scripts\easy_install Pygmentize


製作 Pygments 的 CSS 檔

命令模式下輸入
$ pygmentize -S default -f html -a .highlight > style.css
可產生網頁要用到的css檔

其中 -S default 可換成其他想要使用的樣式
(參考 Pygments Style Demo)

-a .highlight 代表上色的程式碼要限定在哪個class裡面

產生的CSS檔會像這樣:
.highlight .hll { background-color: #ffffcc }
.highlight  { background: #f8f8f8; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
...

之後可以修改這個CSS為自己想要的顏色


在 PHP 執行 Pygments

在 php 用 exec() 執行 pygmentize
即可產生程式碼的 html

使用範例:
<?php
//產生一段要上色的PHP程式碼
$code_type = 'php';
$code = <<<'EOD'
<?php
/* comment
 * comment
 */
for($i=1;$i<10;$i++){
	
// comment

	
echo "number ".$i."\n";

}
EOD;

//將程式碼存進暫存檔
$temp_file = tempnam("./", "pygmentize_");
$file_handle = fopen( $temp_file, "w" );
fwrite( $file_handle, $code );
fclose( $file_handle );

//用exec執行pygmentize讀取暫存檔,輸出上色的程式碼
$command = "pygmentize -f html -O linenos=table,encoding=utf-8 -l $code_type $temp_file";
$output = array();
exec( $command, $output );
unlink( $temp_file );
$output_string = join( "\n", $output );

//載入之前產生的CSS檔
echo '<link href="style.css" rel="stylesheet">'."\n";
echo $output_string;

產生的 HTML 會像這樣:
<link href="style.css" rel="stylesheet">
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8</pre></div></td><td class="code"><div class="highlight"><pre><span class="o">&lt;?</span><span class="nx">php</span>
<span class="cm">/* comment</span>
<span class="cm"> * 註解</span>
<span class="cm"> */</span>
<span class="k">for</span><span class="p">(</span><span class="nv">$i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span><span class="nv">$i</span><span class="o">&lt;</span><span class="mi">10</span><span class="p">;</span><span class="nv">$i</span><span class="o">++</span><span class="p">){</span>
	
<span class="c1">// comment</span>
	
<span class="k">echo</span> <span class="s2">&quot;number &quot;</span><span class="o">.</span><span class="nv">$i</span><span class="o">.</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>

上色的樣子:
[圖]



支援的語言列表: https://pygments.org/languages/


參考:
http://derek.simkowiak.net/pygments-for-php/
http://davidwalsh.name/pygments-php-wordpress
http://eddmann.com/posts/using-pythons-pygments-syntax-highlighter-in-php/

問題解決記錄:

在 Windows 下用 wamp 執行 exec('pygmentize')
會出現找不到執行檔 pygmentize 的問題,有改系統變數 path 也不行
只好寫成 Windows 執行時會加上絕對路徑
$path = "C:\\Python27\\Scripts\\";
exec($path.'pygmentize');

預設當程式碼為 PHP 時,開頭要是 <?php 才會上色
如果希望不加 <?php 也可以上色的話
可以在執行時的 -O 加上參數 startinline=true
參考: http://pygments.org/docs/lexers/#lexers-for-php-and-related-languages

--
※ 作者: Knuckles 時間: 2015-10-16 08:18:27
※ 編輯: Knuckles 時間: 2023-11-25 00:00:21 (台灣)
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 563 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇