Делать расширение сфинкса, которое складывает участки тела
Я пытаюсь сделать расширение в 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.