【问题标题】:Specifying anchor names in reST在 reST 中指定锚名称
【发布时间】:2012-11-18 11:02:07
【问题描述】:

我正在使用 docutils 附带的 rst2html 工具从 reST 创建 HTML。似乎代码已经为各个部分分配了id 属性,这些属性可以用作 URL 中的片段标识符,即作为跳转到页面特定部分的锚点。这些id 值基于部分标题的文本。当我更改该标题的措辞时,标识符也会更改,从而使旧 URL 无效。

有没有办法指定名称作为给定部分的标识符,这样我就可以在不使链接失效的情况下编辑标题?如果我自己从自己的脚本中调用 docutils 发布者,会有办法吗?

【问题讨论】:

    标签: python restructuredtext docutils


    【解决方案1】:

    我认为您不能在 reST 部分中设置显式 id,但我可能弄错了。

    如果您希望有编号的 id,这将取决于文档树中各个部分的顺序,而不是它们的标题,您可以通过对 docutils/nodes 中的 document.set_id() 方法稍作更改来做到这一点.py(在我的版本的第 997 行。)

    这是补丁:

     def set_id(self, node, msgnode=None):
         for id in node['ids']:
             if id in self.ids and self.ids[id] is not node:
                 msg = self.reporter.severe('Duplicate ID: "%s".' % id)
                 if msgnode != None:
                     msgnode += msg
         if not node['ids']:
    -        for name in node['names']:
    -            id = self.settings.id_prefix + make_id(name)
    -            if id and id not in self.ids:
    -                break
    -        else:
    +        if True: #forcing numeric ids
                 id = ''
                 while not id or id in self.ids:
                     id = (self.settings.id_prefix +
                           self.settings.auto_id_prefix + str(self.id_start))
                     self.id_start += 1
             node['ids'].append(id)
         self.ids[id] = node
         return id
    

    我刚刚对其进行了测试,它生成的部分 id 为 id1、id2...

    如果您不想更改此系统范围的文件,您可以使用自定义 rst2html 命令对其进行猴子修补。

    【讨论】:

    • 数字 ID 在我的情况下并没有那么好,但monkey-patching that function 仍然是一个有用的建议:我可以从我的部分标题中提取一个相当稳定的 ID。 Works well 我当前的应用程序。如果有人有更优雅的建议,我会保留悬赏,但如果没有,那就是你的。
    • 默认 ID 取决于章节标题,而不是它们的位置。数字 ID 取决于它们的位置,而不是它们的标题。我不认为有第三种方式,一般来说,除非你想出某种自定义代码,这取决于你命名你的部分的方式。
    【解决方案2】:

    我不确定我是否真的理解你的问题。

    您可以在文档中的任意位置创建explicit hyperlink targets,这些位置可用于引用这些位置,而与 docutils 创建的隐式超链接目标无关:

    .. _my_rstfile:
    
    ------------------
    This is my rstfile
    ------------------
    
    .. _a-section:
    
    First Chapter
    -------------
    
    This a link to a-section_ which is located in my_rstfile_.
    

    您似乎想在多个 rst 文件之间创建链接,但我建议使用 Sphinx,因为它可以处理不同文件之间对 arbitrary locations 的引用,并且具有更多优势,例如 toctree 和 @ 987654325@。您不仅可以将 sphinx 用于源代码文档,还可以用于一般文本处理。 Sphinx documentation 本身就是一个例子(readthedocs 上还有数百个其他例子)。

    使用sphinx-quickstart 调用Sphinx 应该很简单。您可以简单地将现有的 rst 文件添加到 index.rst 中的目录树并运行 make html。如果你想记录 python 代码,你可以使用sphinx-apidoc,它会自动生成一个 API 文档。

    【讨论】:

    • 这种显式超链接目标的问题是自动生成的目录中的链接不会使用这些链接。因此,如果有人选择了一个 TOC 项,然后复制了生成的 URL,那么该 URL 中的片段标识符稍后可能会变得无效。但这是有可能的,至少对于来自外部文档的链接。我会仔细看看狮身人面像。
    • 所以我认为 sphinx 是最好的选择,因为它就是为此而设计的。我稍微更新了我的答案。
    • 对于这个特定的任务,使用带有htmlsinglehtml 构建的Sphinx 看起来非常很有希望,尽管我仍然需要重写我的文档才能使其工作,所以我还不能说我对结果有多满意。我仍然想知道如何将基本的rst2html 调整为使用自定义锚点。这意味着我最终可能会按照您的建议使用 Sphinx,并且仍然将赏金授予 Tobia,因为他的回答更符合我的问题。希望你不要太介意。
    • 老实说:我不认为引用编号部分是一个好方法,因为您可能会在之后更改排序。例如,您不会在乳胶中这样做。所以我认为我的解决方案更符合您的问题:显式超链接目标是更好的选择。 Sphinx 仍然是一个更好的选择,因为它会自动处理一些事情并且是为此目的而设计的。此外,我认为您不必重写文档,它们应该按原样工作(相反的情况并非在所有情况下都有效:sphinx 引入了更多角色,而 docutils 不知道)。
    • 好的,我只是将我的一个现有文档放入由 quickstart 创建的index.rst。由自动生成的 TOC 使用的各个部分的最终锚点再次由部分标题形成,而不是由这些标题之前的显式链接目标形成。只有整个文档具有由文件名形成的锚点。因此,为了使其有用,我必须将我的文档拆分为每个函数一个文件。然后它可能会起作用,尽管我想找到一些方法来在 singlehtml 构建中省略这个 document- 前缀。
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2014-09-30
    • 2014-11-24
    • 1970-01-01
    • 2013-03-11
    相关资源
    最近更新 更多