我应该在Scala应用程序中使用Pygments吗?

时间:2010-10-27 22:00:36

标签: web-services scala jython pygments

我正在寻找构建一个Scala Web应用程序,该应用程序将包含许多编程语言中的大量代码片段,我希望能够突出显示这些代码片段。它看起来像最好的,最流行的语法荧光笔之一是Pygments,一个Python工具。我下载了Jython并且能够先从我的Scala REPL中加载它然后加载Pygments。然而,所有的间接都非常难看,而且看起来相当缓慢(但是一旦编译完所有内容可能会更快?)。

我的(清理过的)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 = org.python.util.PythonInterpreter@111de95a

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路由(比调用interp.exec()更好的方法来调用Python代码吗?)或者设置运行Pygments的单独的,简单的,Python原生的Web服务我的Scala代码可以调用吗?当然,如果Scala中有更容易使用的质量和支持语言范围相当的库,我很满意。

1 个答案:

答案 0 :(得分:2)

Pygments是一个非常好的语法高亮显示器,如果你已经解决了如何从Scala代码运行它的麻烦,你总是可以隐藏一两个函数后面的混乱。只是因为它在你的REPL会话中不是很快并不一定意味着它会成为一个问题 - 在应用它的许多优化之前JVM会等待一段时间,无论如何你需要强调多少代码?如果动态突出显示代码很慢,但内容变化不大,则可以缓存呈现的HTML。

我不知道您可以使用Scala或Java中的语法突出显示工具,但是 JavaScript 中有许多语法突出显示工具可以包含在您的网站中。这种方法的一个好处是您不必使用任何服务器端资源来突出显示代码,您可以依赖站点的每个访问者来提供突出显示他们查看的代码所需的额外计算能力。

http://alexgorbatchev.com/SyntaxHighlighter/是一个广泛使用的JS库,用于语法高亮。