1

ブログ/ウェブサイトにreStructuredTextを使用していて、グローバルインクルードファイルを追加したいと思います。HTML出力の生成に使用している設定ファイルにアクセスでき、変更できてうれしいです。どちらの構文も理解できません。

  1. デフォルトのインクルードファイルをパーサーに追加する
  2. Pythonのdocutilsを使用してPythonでdirective/inline-rolesなどを定義する

ソースコードとドキュメントを読んでみましたが、理解するのが少し難しいと思いました。非常に明白な何かを見逃したことを願っていますが、次のようなことをしたいと思います(最初の部分はすでにそこにあるものです-ファイルの残りの部分はjekyll-rstプラグインで見ることができますソース(それに直接リンク)

import sys
from docutils.core import publish_parts
from optparse import OptionParser
from docutils.frontend import OptionParser as DocutilsOptionParser
from docutils.parsers.rst import Parser

# sets up a writer that is then called to parse rst pages repeatedly
def transform(writer=None, part=None):
    p = OptionParser(add_help_option=False)

    # Collect all the command line options
    docutils_parser = DocutilsOptionParser(components=(writer, Parser()))
    for group in docutils_parser.option_groups:
        p.add_option_group(group.title, None).add_options(group.option_list)

    p.add_option('--part', default=part)

    opts, args = p.parse_args()


# ... more settings, etc

# then I just tell the parser/writer to process specified file X.rst every time
# (or alternately a python file defining more roles...but nicer if in rst)

これを行う簡単な方法はありますか?defaults.rstファイルを定義して、毎回ロードするのは素晴らしいことです。

編集:これは私がグローバルに含めることができるようにしたいもののいくつかの例です(カスタムディレクティブもいいでしょうが、おそらくそれらをコードで書くでしょう)

.. role:: raw-html(raw)
   :format: html

.. |common-substitution| replace:: apples and orange

.. |another common substitution| replace:: etc
4

2 に答える 2

2

質問を理解できるかどうかはよくわかりません。たとえば、いくつかのファイルでいくつかの置換を定義し、それらを他のすべてのreStructuredTextファイルで使用できるようにしますか、それとも出力ファイルにいくつかの一般的なHTMLを含めますか?あなたの質問を明確にできますか?

前者の場合は、この回答includeで概説しているように、ディレクティブを使用できます。

または、生成された出力に一般的なHTMLを含めたい場合template.txtは、モジュールに含まれているファイルをコピーして編集してみてくださいpath/to/docutils/writers/html4css1/。このファイルに任意のHTML要素を含めて、Docutilsによって生成されたHTMLのレイアウトを変更できます。これらの方法のどちらも、Docuitlsソースコードを変更する必要はありません。これは常に利点です。

編集:Docuitlsを使用してインクルードファイルを設定するためのフラグを設定することはできないと思います。ただし、 Docuitlsに基づいているが拡張機能がたくさんあるSphinxを使用できる場合、このパッケージにはrst_prolog必要なことを正確に実行する設定があります(この回答を参照)。rst_prologは:

読み取られるすべてのソースファイルの先頭に含まれるreStructuredTextの文字列。

于 2012-05-18T08:02:03.440 に答える
1

まったく同じものが必要でした。手動で毎回指定しなくても、グローバルなreStructuredTextファイルをすべてのreStructuredText記事に自動的にインポートする方法です。

この問題の1つの解決策は、次のプラグインです。

import os
from pelican import signals
from pelican.readers import RstReader


class RstReaderWrapper(RstReader):
      enabled = RstReader.enabled
      file_extensions = ['rst']

      class FileInput(RstReader.FileInput):
          def __init__(self, *args, **kwargs):
              RstReader.FileInput_.__init__(self, *args, **kwargs)
              self.source = RstReaderWrapper.SourceWrapper(self.source)

      # Hook into RstReader
      RstReader.FileInput_ = RstReader.FileInput
      RstReader.FileInput = FileInput

      class SourceWrapper():
          """
              Mimics and wraps the result of a call to `open`
          """
          content_to_prepend = None

          def __init__(self, source):
              self.source = source

          def read(self):
              content = self.source.read()
              if self.content_to_prepend is not None:
                  content = "{}\n{}".format(self.content_to_prepend, content)
              return content

          def close(self):
              self.source.close()


def process_settings(pelicanobj):
      include_files = pelicanobj.settings.get('RST_GLOBAL_INCLUDES', []) or []
      base_path = pelicanobj.settings.get('PATH', ".")

      def read(fn):
          with open(os.path.join(base_path, fn), 'r') as res:
              content = res.read()
              return ".. INLCUSION FROM {}\n{}\n".format(fn, content)

      inclusion = "".join(map(read, include_files)) if include_files else None
      RstReaderWrapper.SourceWrapper.content_to_prepend = inclusion


def register():
signals.initialized.connect(process_settings)

要するに使用法:

  • 上記のコードからプラグインを作成します( GitHubからリポジトリのクローンを作成するのが最適です)
  • PLUGINSプラグインをインポートします(適応pelicanconf.py
  • RST_GLOBAL_INCLUDES変数を設定して、含めるRSTファイル(プロジェクトルートへの相対パス)のリストを定義します。pelicanconf.py

ペリカンとdocutilsはどちらもこれを許可するようには設計されていないことに注意してください。処理が開始される前にソースファイルの生のコンテンツへのクリーンなアクセスを提供するシグナルは提供されません。また、「通常の方法」(サブクラス化、ハードコードされた構成の変更など)でファイルを読み取るフレームワークをインターセプトする可能性もありません。 。このプラグインは、の内部クラスFileInputをサブクラス化し、のクラス参照をサブクラスRstReaderに設定します。また、Pythonファイルオブジェクトは。を介してエミュレートされます。それにもかかわらず、このアプローチは私にとってはうまくいき、日常のワークフローでは面倒ではありません。RstReader.FileInputSourceWrapper

この質問は2012年のものですが、この回答は他の人にも役立つと思います。

于 2016-06-28T20:15:44.410 に答える