我应该将 Pygments 与 Scala 应用程序一起使用吗?

Posted

技术标签:

【中文标题】我应该将 Pygments 与 Scala 应用程序一起使用吗?【英文标题】:Should I use Pygments with a Scala App? 【发布时间】:2010-10-27 22:00:36 【问题描述】:

我正在考虑构建一个 Scala 网络应用程序,该应用程序将包含许多我想强调的多种编程语言的代码 sn-ps。看起来最好、最流行的语法荧光笔之一是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 路线(调用 Python 代码的方式比 interp.exec() 更好吗?)或者为我的用户设置一个运行 Pygments 的单独、简单、Python 原生的 Web 服务调用Scala代码?当然,如果有质量相当且支持语言的广度可比 Scala 更易于使用的库,我会全力以赴。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

所有优点,大卫。出于您概述的原因,我不愿意使用 Javascript 库,因为它能够缓存呈现的 HTML。也许 Pygments 和 Jython 是一个不错的解决方案...... 不管有什么价值,我都会在自己的博客中使用 Syntax Highlighter,我对此非常满意。 SH 适合博客,但尝试显示大小超过 10K 的任何内容。我试过了——太可怕了

以上是关于我应该将 Pygments 与 Scala 应用程序一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scala 编写的库在 Android 应用上运行 Proguard

将 pygments 主题转换为 gvim 颜色方案

Scala的implicit如何使用?需要注意啥

在 PHP 中使用 Pygments(PHP 中的 Python)

PHP exec() 与 Pygments for PHP

pygments 的 C 包装器