Делать расширение сфинкса, которое складывает участки тела

Я пытаюсь сделать расширение в Sphinx, идея состоит в том, что расширение определяет заголовок разделов, а затем преобразует их в раздел сгиба, то есть сфинкс отображает заголовок с помощью кнопки префикса, которая помогает отображать или не отображать содержимое раздел.

test_fold
=============

.. fold:: 

    * First Section 
        Hae duae provinciae bello quondam piratico catervis mixtae praedonum 
        a Servilio pro consule missae sub iugum factae sunt vectigales. 
        et hae quidem regiones velut in prominenti terrarum lingua positae 
        ob orbe eoo monte Amano disparantur.

    * Second Section
        Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit 
        nobis sermonem Laeli de amicitia habitum ab illo secum et cum altero 
        genero, C. Fannio Marci filio, paucis diebus post mortem Africani. 
        Eius disputationis sententias memoriae mandavi, quas hoc libro 
        exposui arbitratu meo; quasi enim ipsos induxi loquentes, ne 
        'inquam' et 'inquit' saepius interponeretur, atque ut tamquam 
        a praesentibus coram haberi sermo videretur.

    * Third Section
        Et interdum acciderat, ut siquid in penetrali secreto nullo citerioris 
        vitae ministro praesente paterfamilias uxori susurrasset in aurem, 
        velut Amphiarao referente aut Marcio, quondam vatibus inclitis, 
        postridie disceret imperator. ideoque etiam parietes arcanorum 
        soli conscii timebantur.

Я начал писать расширение как это:

from docutils.nodes import raw
from docutils.parsers.rst import Directive

FOLD = "*"
foldSize = len(FOLD)

def removeSpace(_str):
    if _str[0]==" ":
        return removeSpace(_str[1:])
    else:
        return _str

class FoldDirective(Directive):

   # this enables content in the directive
   has_content = True

   def run(self):

    titles = []
    mains = []
    newMain = ""

    #loop
    for indexInt in xrange(len(self.content)):

        #get
        string = self.content[indexInt]
        if indexInt>0:
            previousString = self.content[indexInt-1]
        else:
            previousString = ""

        #Check
        if len(string)>0:
            if string[0] == FOLD:
                titles.append(string[foldSize:])
                if indexInt>0:
                    mains.append(newMain)
                newMain = ""
            elif previousString[0] == FOLD:
                newMain = string
            else:
                newMain += string

    #append the last
    mains.append(newMain)

    #return
    return [raw('',"<table><tr>",format='html')]+map(
        lambda title,main:
        raw('',"<td><button/></td><td><div>"+str(title)+"</div><td>     <tr><td></td><td><div>"+str(main)+"</div></td></tr>",format='html'),
        titles,mains
    )+[raw('',"</tr></table>",format='html')]

def setup(app):
    app.add_directive('fold', FoldDirective)

Но проблема здесь: - Я не знаю, чтобы связать кнопки с функцией onClick, которая заставила бы исчезнуть главное при щелчке. - Основные просто добавляются в необработанный HTML, что не является оптимальным, потому что, если они содержат также поддирективы, они не будут обрабатываться. - Документацию по sphinx действительно трудно понять, если мне придется выбирать, поэтому в таком случае некоторые вызовы узлов. Общие примеры, но я не знаю, что именно.

Спасибо

2 ответа

Вы можете узнать, как это работает в облачной теме: http://pythonhosted.org/cloud_sptheme/cloud_theme_test.html

Я бы рекомендовал прочитать документацию по расширениям Sphinx, а также посмотреть на это расширение, которое изменяет разметку HTML с помощью директивы для комментариев Disqus.

Другие вопросы по тегам