首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReST自定义指令的输出导致编写器中内置的跟踪

ReST自定义指令的输出导致编写器中内置的跟踪
EN

Stack Overflow用户
提问于 2013-11-17 02:09:16
回答 1查看 145关注 0票数 0

我编写了一个自定义ReST指令,它接受如下输入:

代码语言:javascript
复制
.. foo::
    abcdef
    ghijkl
    mnopqr

    a = apple; apple.png
    b = banana; banana.png
    (etc.)

并输出一个表。表的形状像上面的字母块,每个字母代表一个图像。接下来的几行将图像与每个字母相关联。

这是指令中执行输出的部分:

代码语言:javascript
复制
tbody = nodes.tbody()
for line in lines[:3]:
    row = []
    for c in line:
        if c not in ingredients:
            continue
        name, image = ingredients[c]
        row.append(nodes.image(uri=IMAGE_URL.format(image)))
    row_entries = [nodes.entry([n]) for n in row]
    row = nodes.row()
    row.extend(row_entries)
    tbody.append(row)

table = nodes.table()
tgroup = nodes.tgroup()
table.append(tgroup)
tgroup.append(tbody)
return [nodes.literal_block(text='\n'.join(self.content))] + table

这个“工作”,因为它返回okay。但是,稍后,当作者试图输出我的指令返回的内容时,它会导致一个回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "./rst2html.py", line 24, in <module>
    publish_cmdline(writer_name='html', description=description)
  File "/usr/lib64/python3.2/site-packages/docutils/core.py", line 352, in publish_cmdline
    config_section=config_section, enable_exit_status=enable_exit_status)
  File "/usr/lib64/python3.2/site-packages/docutils/core.py", line 219, in publish
    output = self.writer.write(self.document, self.destination)
  File "/usr/lib64/python3.2/site-packages/docutils/writers/__init__.py", line 80, in write
    self.translate()
  File "/usr/lib64/python3.2/site-packages/docutils/writers/html4css1/__init__.py", line 173, in translate
    self.document.walkabout(visitor)
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 166, in walkabout
    visitor.dispatch_visit(self)
  File "/usr/lib64/python3.2/site-packages/docutils/nodes.py", line 1627, in dispatch_visit
    return method(node)
  File "/usr/lib64/python3.2/site-packages/docutils/writers/html4css1/__init__.py", line 792, in visit_entry
    if node.parent.parent.parent.stubs[node.parent.column]:
IndexError: list index out of range

这似乎是docutils中的一个bug;我猜我返回的表元素不是很“格式良好”,至少对作者来说是这样。然而,似乎没有任何关于这方面的文档。(如果有,请指给我看!)

有谁知道我返回的HTML编写器不喜欢的表节点是什么,以及我应该修改什么来修复它?

即使我的输出不是很好,一个比“超出范围的列表索引”更好的错误应该被发回给我。

EN

回答 1

Stack Overflow用户

发布于 2013-11-17 02:39:55

我犯了两个错误:

  1. 看来桌子上一定有几个字组。 in范围(3):colspec = nodes.colspec(colwidth=1) tgroup.append(colspec) 解决了追踪的直接问题。最后的结构如下所示: *表格* tgroup *每列一个colspec。*正文*每一行一行*每列一项。(这些是单元格。)*单元格的可选内容。您可以传入一个空条目,HTML编写器将输出一个新的d单元格。 还有一个thead,用于标题;它的工作方式与tbody类似。我一直在使用(并最终从) docutils.parsers.rst.directives.tables中了解到这一点,build_table_from_list函数非常有用。
  2. 我需要稍微调整一下返回: 返回nodes.literal_block(text='\n'.join(self.content)) +表 这应该是[table],而不是table: 返回nodes.literal_block(text='\n'.join(self.content)) +表 有趣的是,作者接受了这个错误。您将得到一个表,减去周围的<table>标记。

请注意,colgroupcolwidth是一个比率:三列颜色宽度"1“作为宽度为"33%”的三列输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20026343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档