2007年11月9日

Syntax Highlight

厭倦了單調的程式碼嗎,來加點色彩吧!

當你需要某種軟體功能時,要花多久時間才能找到讓你滿意的答案呢?龐大的資料量,加上不同的用語、語言、資料來源,使得需要在搜尋結果中花費很多時間來篩選,然後還要再一一測試,而且說不定還找不到想要的結果。所以搜尋引擎還有很多進步空間,suryvey、catalog類型的網站或文章還是需要的。

對於將程式碼加上語法色彩,大致上分為兩類,事先產生後將靜態的資料貼到網頁上,或是以javascript線上即時修改網頁,以下是一些例子:

事先產生:

1. Highlight(名字真直接)
桌上軟體,可將檔案轉換成所選的格式,語法以副檔名判斷,可選擇配色、CSS是否inline、是否顯示行數,可自行定義語法及配色,若輸出格式選擇UTF-8,中文在預覽視窗會是亂碼,不過輸出的結果是正確的。

Highlight Screen Capture
因為使用CSS檔,以下程式碼在feeds中顯示會有問題。
//syntax highligth 測試程式碼
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
  logger.info("copy 開始!");
  for (int i = 0; i < src.size(); i++) {
    dst.set(i, src.get(i));
  }
  logger.info("copy 結束!");
}

2. SyntaxColor4Writer (Windows Live Writer Plugin)
需要.NET 2.0,使用inline CSS,神奇的是會將WLW轉換編輯模式後吃掉的空白和斷行回復。
註:0.26版在WLW 12.0.1367.1128無法執行

//syntax highligth 測試程式碼
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
  logger.info("copy 開始!");
  for (int i = 0; i < src.size(); i++) {
    dst.set(i, src.get(i));
  }
  logger.info("copy 結束!");
}

3. CodeSnippet(Eclipse plugin)
將所選程式片段依Editor中的顏色設定產生輸出,因為如此所以不需要定義語法,但是目前只支援幾種格式,使用inline CSS。

//syntax highligth 測試程式碼
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
  logger.info("copy 開始!");
  for (int i = 0; i < src.size(); i++) {
    dst.set(i, src.get(i));
  }
  logger.info("copy 結束!");
}

4. Iris Syntax Highlighter(C# Open Source)
提供網頁版syntax highlight介面,下載版需要.NET 2.0,利用Vim(一種文字編輯器)已有的語法定義檔,支援超過460種語法,可選擇配色、是否顯示行數,可自行定義語法及配色。

//syntax highligth 測試程式碼
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
  logger.info("copy 開始!");
  for (int i = 0; i < src.size(); i++) {
    dst.set(i, src.get(i));
  }
  logger.info("copy 結束!");
}
1
2
3
4
5
6
7
8

線上即時:

1. SyntaxHighlighter (Yahoo Developer Network上有在用)
可以處理<textarea>(ps. 為了在feed中有較好的顯示結果,最好還是使用<pre>),使用CSS檔做樣式,適合用在少量程式碼的情況(因為用regular expression來做parse),在Blogger上因為轉換換行符號的問題,需要特別設定(只是多呼叫一個函示)。

//syntax highligth 測試程式碼
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
logger.info("copy 開始!");
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
logger.info("copy 結束!");
}

1 則留言: