如何在构建时包含生成页面?实现API参考页嵌入索引内容
嘿,这个需求是可以实现的,但你之前用的.. include::路子走不通,原因很简单——Sphinx是先处理source里的rst源文件,再生成build目录下的HTML,处理源文件的时候,那些HTML文件要么还没生成,要么rst的include根本不支持引入HTML内容。不过有几个靠谱的方案能帮你搞定:
可行方案汇总
方案1:自定义Sphinx模板,直接嵌入索引内容
Sphinx的模板基于Jinja2,你可以通过修改模板把genindex和py-modindex的内容合并到你的API参考页面:
- 先找到你当前用的主题模板(比如默认的alabaster或者Read the Docs主题),把它的页面模板(一般叫
page.html)复制到source目录下的_templates文件夹里 - 在你的API参考页面对应的rst文件开头,指定自定义模板:
:template: api_index_include.html - 新建
_templates/api_index_include.html,用Jinja2的include标签把索引模板内容嵌进去:
注意:不同主题的模板结构可能有点不一样,你可能需要微调一下模板片段的路径或内容。{% extends "page.html" %} {% block body %} {{ super() }} <h2>全局索引</h2> {% include "genindex.html" %} <h2>模块索引</h2> {% include "py-modindex.html" %} {% endblock %}
方案2:写个简单的Sphinx扩展,动态注入索引内容
你可以写个轻量扩展,在Sphinx构建时读取已生成的索引HTML,然后注入到API页面里:
- 在source目录下创建一个扩展文件,比如
index_inject_ext.py,代码大概是这样:def inject_index_content(app, pagename, templatename, context, doctree): # 只在你的API参考页面生效,替换成你的页面文件名 if pagename == "api_reference": # 读取genindex内容 with open(app.outdir / "genindex.html", "r", encoding="utf-8") as f: context["genindex_content"] = f.read() # 读取py-modindex内容 with open(app.outdir / "py-modindex.html", "r", encoding="utf-8") as f: context["py_modindex_content"] = f.read() def setup(app): app.connect("html-page-context", inject_index_content) - 在
conf.py里添加这个扩展:extensions = ["index_inject_ext"] - 最后在你的API参考rst文件里,用raw指令插入内容:
小提示:第一次构建时索引文件还没生成,可能需要跑两次构建才能看到效果。.. raw:: html {{ genindex_content }} {{ py_modindex_content }}
方案3:用Sphinx自带指令生成类索引内容
如果不需要完全和genindex/py-modindex一模一样,用Sphinx自带的指令就能生成类似的整合索引:
- 用
.. automodule::配合:members:生成模块文档,再用toctree组织起来,最后加.. genindex::生成页面级索引:
这种方式生成的是页面局部索引,不是全站的胜在简单直接,不需要折腾模板或扩展。API参考 ======= .. toctree:: :maxdepth: 2 :caption: 模块列表 modules/module1 modules/module2 .. genindex:: :title: 全局索引
总结一下:要完全复用build后的索引内容就选方案1或2;想简单快速实现类似效果,方案3更合适。
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

