2012-11-15 1 views
8

次のように私は、単純なスフィンクスの拡張子を持っています。バーでは、«が、LaTeX出力はテスト»含まれています:?«(Sphinxドキュメンテーションプロセッサの拡張機能は、HTMLとLaTeXの出力が異なる方法で動作しますか?

.. testdirective:: 
    :foo: bar 

HTML出力は»テストが含まれているを含むドキュメントを考えると

from docutils import nodes 
from docutils.parsers.rst import directives 
from sphinx.util.compat import Directive 

class testnode(nodes.Element): 
    def __init__(self, *args, **kwargs): 
     super(testnode, self).__init__(*args, **kwargs) 
     self['foo'] = '?' 

def visit_testnode_latex(self, node): 
    self.body.append('Test: %s' % node['foo']) 

def depart_testnode_latex(self, node): 
    pass 

def visit_testnode_html(self, node): 
    self.body.append('<p>Test: %s</p>' % node['foo']) 

def depart_testnode_html(self, node): 
    pass 

class TestDirective(Directive): 
    has_content = False 
    required_arguments = 0 
    optional_arguments = 0 
    final_argument_whitespace = False 
    option_spec = { 
     'foo': directives.unchanged, 
    } 

    def run(self): 
     node = testnode() 
     node['foo'] = self.options.get('foo') 
     return [node] 

def setup(app): 
    app.add_directive("testdirective", TestDirective) 
    app.add_node(testnode, 
       html=(visit_testnode_html, 
         depart_testnode_html), 
       latex=(visit_testnode_latex, 
         depart_testnode_latex)) 

をデフォルト値)。私はnode['foo']TestDirective.run()の割り当ての後で正しい値を持っていることを確認しましたが、LaTeXライターが実行されるまでそれは固執していません。

私は間違っていますか?

答えて

3

スフィンクスのLaTeXライターを踏んだ後、私はこの問題を発見しました。これは、testnodeイニシャライザの'foo'キーワードのデフォルトを設定する方法です。

LaTeXライターには、ドキュメントツリー全体を別のツリーにインライン化するための深いコピーがある点があります。 ノード上のディープコピーは、同じクラスの新しいノードを初期化し、元のノードのすべての属性と内容をコンストラクタに渡します。したがって、testnodeがコピーされると、コンストラクタに渡された元の 'foo'属性がコンストラクタによってオーバーライドされます。代わりに、このようにそれを書いて、それが動作するはずです:

class testnode(nodes.Element): 
    def __init__(self, *args, **kwargs): 
     super(testnode, self).__init__(*args, **kwargs) 
     if 'foo' not in self: 
      self['foo'] = '?' 

これはコンストラクタに渡されていた属性のいずれかの明示的な値を上書きするから、あなたのデフォルトを防ぐことができます。可能ないくつかの他のバリエーションがあります。

関連する問題