2010-10-27 43 views
1

我正在研究構建一個Scala Web應用程序,該應用程序將在許多編程語言中包含大量代碼片段,我希望它們能夠高亮度顯示。它看起來像最好的,最流行的語法熒光筆之一是Python工具Pygments。我下載了Jython,並且能夠先載入它,然後從我的Scala REPL中載入Pygments。然而,所有的間接方法都很醜陋,而且看起來相當慢(但是一旦所有東西都編譯好了,速度可能會更快)。我應該使用Pygments和Scala應用程序嗎?

我(清理後)REPL會話,爲了說明:

scala> :cp /usr/local/Cellar/jython/2.5.1/libexec/jython.jar 

scala> import org.python.util.PythonInterpreter; 

scala> val interp = new PythonInterpreter()   
*sys-package-mgr*: processing new jar, '/usr/local/Cellar/scala/2.8.0/libexec/lib/jline.jar' 
*sys-package-mgr*: processing new jar, '/usr/local/Cellar/scala/2.8.0/libexec/lib/scala-compiler.jar' 
*sys-package-mgr*: processing new jar, '/usr/local/Cellar/scala/2.8.0/libexec/lib/scala-dbc.jar' 
*sys-package-mgr*: processing new jar, '/usr/local/Cellar/scala/2.8.0/libexec/lib/scala-library.jar' 
*sys-package-mgr*: processing new jar, '/usr/local/Cellar/scala/2.8.0/libexec/lib/scala-swing.jar' 
*sys-package-mgr*: processing new jar, '/usr/local/Cellar/scala/2.8.0/libexec/lib/scalap.jar' 
interp: org.python.util.PythonInterpreter = [email protected] 

scala> interp.exec("import sys") 

scala> interp.exec("sys.path.append('/Library/Python/2.6/site-packages')") 

scala> interp.exec("from pygments import highlight") 

scala> interp.exec("from pygments.lexers import PythonLexer") 

scala> interp.exec("from pygments.formatters import HtmlFormatter") 

scala> interp.exec("html = highlight(code, PythonLexer(), HtmlFormatter())")   

scala> val html = interp.get("html").toString 
html: java.lang.String = 
<div class="highlight"><pre><span class="k">print</span> <span class="s">&quot;Hello World&quot;</span> 
</pre></div> 


scala>val xhtml = XML.loadString(html) 
xhtml: scala.xml.Elem = 
<div class="highlight"><pre><span class="k">print</span> <span class="s">&quot;Hello World&quot;</span> 
</pre></div> 

假設我選擇使用Pygments來做,你會建議去Jython的路線(是一種更好的方式來調用Python代碼比interp.exec()? )或者設置一個單獨的,簡單的,Python原生的Web服務運行Pygments來爲我的Scala代碼調用?當然,如果有一些圖書館可以比較容易地使用Scala的質量和支持的語言,那麼我就是所有人。

回答

2

Pygments是一個非常不錯的語法高亮顯示,如果你已經去了解如何從Scala代碼運行它的麻煩,你總是可以隱藏在一個或兩個函數背後的混亂。僅僅因爲它在REPL會話中速度不是很快,並不一定意味着它會成爲一個問題 - JVM在應用許多優化之前會等待一段時間,無論如何,您需要強調多少代碼?如果動態突出顯示代碼很慢,但內容變化不大,則可以緩存呈現的HTML。

我不知道您可以使用Scala或Java中的優秀語法突出顯示工具,但您可以在您的網站中包含JavaScript中提供的許多語法突出顯示工具。該方法的一個好處是,您不必使用任何服務器端資源來突出顯示代碼,就可以依靠每個訪問者訪問您的站點來提供額外的計算能力,以突出顯示他們所查看的代碼。

http://alexgorbatchev.com/SyntaxHighlighter/是一個廣泛使用的語法突出顯示的JS庫。

+0

所有優點,大衛。我不願意使用一個Javascript庫,只是因爲您勾畫的原因,有能力緩存呈現的HTML。也許pygments與Jython是一個體面的解決方案,然後... – pr1001 2010-10-28 09:25:38

+0

無論什麼是值得的,我在我自己的博客中使用Syntax Highlighter,我一直很滿意。 – 2010-10-28 10:56:20

+0

SH對博客很有幫助,但嘗試顯示大小超過10K的任何內容。我嘗試過 - 這太可怕了 – Bostone 2010-11-13 00:23:52