On Fri, Sep 21, 2018 at 5:10 PM Komiya Takeshi wrote: > > >Can I somehow derive a new node from an existing node without killing > >the original visit/depart functions? > > How about subclassing a Translator class? > You can get original implementation with calling super() function.
Thanks a lot Takeshi, I didn't think about that! > And you can use custom translators with app.set_translator() API. I tried it with a subclass of LaTeXTranslator and it works nicely. One advantage is that I can use the "classes" attribute to influence the behavior, very similar to how CSS classes influence the HTML output. However, I think there is one problem: Only one extension can set a translator for a given output format, right? What happens if some other extension also wants to set a translator for 'latex'? Either way, as far as I've learned up to now, subclassing existing node classes doesn't really work because the visit/depart methods of the superclass cannot be used. I've now decided to just wrap the existing node objects with a custom node (trivially derived from docutils.nodes.Element). Such classes don't create any HTML or LaTeX output on their own, so arbitrarily many of them can be nested without adding stuff to the generated output. So instead of e.g. subclassing docutils.nodes.literal_block, I'm just creating a literal_block node object and put it as (only) child into a node of my custom class. This calls my custom visit/depart methods immediately before/after the visit/depart methods of literal_block. And that's exactly what I needed. In case anybody is interested, here's the code I've written to create those nodes: https://github.com/spatialaudio/nbsphinx/blob/cbb97918c7b4cd0960a644351402506077b35b9c/src/nbsphinx.py#L707-L762 If somebody has suggestions for improvements, please let me know! cheers, Matthias > Thanks, > Takeshi KOMIYA > 2018年9月21日(金) 7:28 Matthias Geier <[email protected]>: > > > > Dear Sphinx experts. > > > > I've asked this already a few years ago > > (https://groups.google.com/forum/#!topic/sphinx-dev/0chv7BsYuW0) but I > > didn't get an answer. > > > > Now I'm having a very similar problem again and I thought I'll try asking > > again. > > > > I know that I can create new nodes and register visit/depart functions > > with app.add_node(). > > > > But instead of a completely new node, I would like to use an existing > > node, I just need additional custom visit/depart functions that are > > called in addition to the original visit/depart functions. > > In fact, I would like to get the original visit/depart functions for > > HTML output and my own custom functions for LaTeX output. > > > > In my concrete case I would like to use docutils.nodes.container nodes > > specifying a "classes" argument to select CSS classes that will be > > used in the HTML renderer. > > But for LaTeX output I need to add some more stuff in the visit/depart > > functions. > > > > If I derive my own class from docutils.nodes.container and register it > > with app.add_node(), the CSS classes are not added to the HTML output, > > because apparently the original visit/depart functions are not > > executed in that case. > > > > Can I somehow derive a new node from an existing node without killing > > the original visit/depart functions? > > > > cheers, > > Matthias -- You received this message because you are subscribed to the Google Groups "sphinx-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sphinx-users. For more options, visit https://groups.google.com/d/optout.
