我正在考虑构建一个 Scala Web 应用程序,该应用程序将包含许多我想突出显示的多种编程语言的代码片段。看起来最好、最流行的语法荧光笔之一是Python 工具Pygments。我下载了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">"Hello World"</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">"Hello World"</span>
</pre></div>
假设我选择使用 Pygments,您会建议走 Jython 路线(比调用 Python 代码更好interp.exec()
吗?),或者设置一个单独的、简单的、Python 原生的 Web 服务来运行 Pygments 以供我的 Scala 代码调用?当然,如果有质量相近的库以及更容易从 Scala 使用的受支持语言的广度,我会全力以赴。