2010-10-27 84 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