2

GoogleAppEngine用に構築しているブログソフトウェアのコードハイライトソリューションとしてPygmentsとBeautifulSoupを使用しようとしています。

それがどのように機能するかは、私のHTML投稿がコードを識別するためにpreタグを使用することです。このような:

<p>Check out this cool code example<p>    
<pre class="python">
        import this
        def demo():
            pass</pre>

BeautifulSoupタグ間の部分をキャプチャし、preそれをPygmentsに渡します。Pygmentsは、クラス値をチェックし、正しいレキサーを適用することを想定しています。次に、Pygmentsはフォーマットを適用し、元のテキストをフォーマットされたテキストに置き換えます。このソリューションについては、 SaltyCraneのブログで詳しく説明されています。

エラー

ClassNotFound: no lexer for alias [u'python'] found

おそらく、モジュールを正しくインポートしていませんか?

コード

from google.appengine.ext import db
import fix_path
import bs4
import pygments
from bs4 import BeautifulSoup
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter


    def formatter(p):
        soup = BeautifulSoup(p.otext)
        preblocks = soup.findAll('pre')
        for pre in preblocks:
            if pre.has_key('class'):
                code = ''.join([unicode(item) for item in pre.contents])
                code = unescape_html(code)
                lexer = lexers.get_lexer_by_name(pre['class'])
                formatter = formatters.HtmlFormatter()
                code_hl = highlight(code, lexer, formatter)
                pre.replaceWith(BeautifulSoup(code_hl))
            else:
                print "No Go"
        return unicode(soup)

トレースバック

Traceback (most recent call last):
  File "C:\Users\john\webdev\google\lib\webapp2\webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Users\john\webdev\google\lib\webapp2\webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Users\john\webdev\google\lib\webapp2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Users\john\webdev\google\lib\webapp2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Users\john\webdev\google\lib\webapp2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Users\john\webdev\google\lib\webapp2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\john\webdev\workspace\bsby\views.py", line 45, in post
    p.ftext = utils.formatter(p)
  File "C:\Users\john\webdev\workspace\bsby\utils.py", line 18, in formatter
    lexer = lexers.get_lexer_by_name(pre['class'])
  File "C:\Users\john\webdev\workspace\bsby\lib\pygments\lexers\__init__.py", line 80, in get_lexer_by_name
    raise ClassNotFound('no lexer for alias %r found' % _alias)
ClassNotFound: no lexer for alias [u'python'] found
4

1 に答える 1

0

ええ、それが問題でした。スクリプトの実行に必要なライブラリをインポートしていませんでした。これが正しいコードです。

import fix_path
import bs4
import pygments
from bs4 import BeautifulSoup
from pygments import highlight
from pygments import lexers
from pygments import formatters


    def formatter(p):
        soup = BeautifulSoup(p.otext)
        preblocks = soup.findAll('pre')
        for pre in preblocks:
            if pre.has_key('class'):
                code = ''.join([unicode(item) for item in pre.contents])
                lexer = lexers.get_lexer_by_name("python")
                formatter = formatters.HtmlFormatter()
                code_hl = highlight(code, lexer, formatter)
                pre.replaceWith(BeautifulSoup(code_hl))
                return unicode(soup)
            else:
                return null

それはもう1つの問題です....

このように動的にレキサー名を取得したい...

lexer = lexers.get_lexer_by_name(pre['class'])

ただし、これを行うと、次のエラーが発生します。

ClassNotFound: no lexer for alias [u'python'] found

私が行った場合

lexer = lexers.get_lexer_by_name("python")

動作しますが、python のみです。

于 2012-05-25T03:21:01.060 に答える