1

私は、強調したい多くのプログラミング言語で多くのコードスニペットを含むScalaWebアプリを構築することを検討しています。最高の、最も人気のある構文ハイライターの1つは、PythonツールであるPygmentsのようです。Jythonをダウンロードして、最初にJythonをロードし、次にScalaREPL内から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()です)、Scalaコードが呼び出すためにPygmentsを実行する別のシンプルなPythonネイティブWebサービスをセットアップすることをお勧めしますか?もちろん、Scalaからより使いやすい、同等の品質とサポートされている言語の幅のライブラリがあれば、私はすべての耳です。

4

1 に答える 1

2

Pygmentsは非常に優れた構文ハイライトであり、Scalaコードから実行する方法を理解するのに苦労している場合は、いつでも1つか2つの関数の背後に混乱を隠すことができます。REPLセッションでそれほど高速ではないからといって、必ずしも問題になるとは限りません。JVMは、最適化の多くを適用する前にしばらく待機します。とにかく、どのくらいのコードを強調表示する必要がありますか?コードを動的に強調表示するのが遅いが、コンテンツがあまり変更されていない場合は、レンダリングされたHTMLをキャッシュするだけです。

ScalaまたはJavaで使用できる優れた構文ハイライトツールを知りませんが、 JavaScriptで使用できる、サイトに含めることができる構文ハイライトがいくつかあります。このアプローチの利点の1つは、コードを強調表示するためにサーバー側のリソースを使用する必要がないことです。サイトへのすべての訪問者に依存して、表示するコードを強調表示するために必要な追加の計算能力を提供できます。

http://alexgorbatchev.com/SyntaxHighlighter/は、構文の強調表示に広く使用されているJSライブラリの1つです。

于 2010-10-28T03:37:58.020 に答える