4

TLDR: マークダウンで書きながら、ペリカンで CSS 行番号を付けようとしています。Pygments は間接的に使用され、オプションを渡すことができないため、行を分離できず、「改行」用の CSS セレクターがありません。

Pelican で Markdown を使用すると、CodeHilite 拡張機能を使用してコード ブロックを生成できます。Markdown を使用している場合、Pelican は pygments を直接使用することをサポートしていません... RST のみ (および ... すべてを RST に変換することはできません)。

だから、私が試したこと:

MD_EXTENSIONS = [
'codehilite(css_class=highlight,linenums=False,guess_lang=True,use_pygments=True)',
'extra']

と:

:::python
<div class="line">import __main__ as main</div>

と:

PYGMENTS_RST_OPTIONS = {'classprefix': 'pgcss', 'linenos': 'table'}

行番号を表示することはできますか? はい。次のコード ブロックに進むように指示できますか? いいえ、それが私が CSS の行番号付けを使用したい理由です...番号付けの開始と停止のタイミングを簡単に制御できます。

どんな助けでも大歓迎です。私はこれを数時間いじっています。

4

2 に答える 2

6

私が知っている唯一の方法は、CodeHilite 拡張機能をフォークすることです (私は開発者です)。まず、既存の拡張機能 (このファイル) のコピーを作成し、目的の結果を得るために必要なコードに変更を加えて、ファイルを PYTHONPATH に保存する必要があります (おそらく "sitepackages" ディレクトリにあり、その正確な場所は使用しているシステムと Python のインストール方法によって異なります)。他の Python パッケージと競合しないように、ファイルに一意の名前を作成する必要があることに注意してください。

それが済んだら、ペリカンにそのことを伝える必要があります。Pelican の構成ファイルは単なる Python であるため、新しい拡張子をインポートし (ファイル拡張子を除いたファイルの名前を使用します: yourmodule.py=> yourmodule)、拡張子のリストに含めます。

from yourmodule import CodeHiliteExtension
MD_EXTENSIONS = [
CodeHiliteExtension(css_class='highlight', linenums=False),
'extra']

CodeHiliteExtensionへの呼び出しは文字列ではなく、実際にはクラスを呼び出して適切な引数を渡すことに注意してください。これは必要に応じて調整できます。

そして、それはそれであるべきです。拡張機能を展開する (または他のユーザーが使用できるように配布する) ためのより簡単な方法を設定したい場合はsetup.py、この質問の範囲を超えるファイルの作成を検討することをお勧めします。Markdown 拡張機能に固有のヘルプについては、このチュートリアルを参照してください。

拡張機能内のコードに加える必要がある変更について具体的なヘルプが必要な場合は、何を達成したいかによって異なります。まず、117 行目で引数が Pygments に渡されます。最も簡単な方法は、必要なオプションをそこにハードコードすることです。


reStructuredText で動作を再現しようとすると、がっかりする可能性が高いことに注意してください。Docutils は、Pygments を独自の処理でラップします。実際、いくつかのオプションは Pygments に渡されることはありませんが、reStructeredText パーサー自体によって処理されます。私の記憶が正しければ、CSS 行番号付けはそのような機能の 1 つです。実際、Pygments はそれをオプションとして提供していません。

その場合、Pygments が非番号付きコードを返すように CodeHilite 拡張機能のフォークを変更し、拡張機能が強調表示されたコード ブロックを返す前に必要なフックを自分で適用する必要があります。そのためには、改行で分割してから、各行を適切に折り返して行をループする必要があります。最後に、新しくラップされた行を結合して戻ります。


次の(テストされていない)変更が開始されると思われます。

diff --git a/markdown/extensions/codehilite.py b/markdown/extensions/codehilite.py
index 0657c37..fbd127d 100644
--- a/markdown/extensions/codehilite.py
+++ b/markdown/extensions/codehilite.py
@@ -115,12 +115,18 @@ class CodeHilite(object):
                 except ValueError:
                     lexer = get_lexer_by_name('text')
             formatter = get_formatter_by_name('html',
-                                              linenos=self.linenums,
+                                              linenos=self.linenums if self.linenumes != 'css' else False,
                                               cssclass=self.css_class,
                                               style=self.style,
                                               noclasses=self.noclasses,
                                               hl_lines=self.hl_lines)
-            return highlight(self.src, lexer, formatter)
+            result = highlight(self.src, lexer, formatter)
+            if self.linenums == 'css':
+                lines = result.split('\n')
+                for i, line in enumerate(lines):
+                    lines[i] = '<div class="line">%s</div>' % line
+                result = '\n'.join(lines)
+            return result
         else:
             # just escape and build markup usable by JS highlighting libs
             txt = self.src.replace('&', '&amp;')

Pygments を無効にし、JavaScript ライブラリを使用して強調表示を行うことで、目的を達成できる可能性があります。それは、選択した JavaScript ライブラリとその機能によって異なります。

于 2015-04-15T13:18:54.980 に答える
3

TL; DR

に、pelicanconf.py次を追加します。

# for highlighting code-segments
# PYGMENTS_RST_OPTIONS = {'cssclass': 'codehilite', 'linenos': 'table'}   # disable RST options
MD_EXTENSIONS = ['codehilite(noclasses=True, pygments_style=native)', 'extra']  # enable MD options

明らかに、これらを適切にインストールする必要があります

pip install pygments markdown
于 2015-11-21T13:31:17.263 に答える