2013-11-17 8 views
0

Я написал пользовательский директиву Rest, который принимает входной сигнал, как это:Rest заказного ДИРЕКТИВА, построенные в писателе TraceBack

.. foo:: 
    abcdef 
    ghijkl 
    mnopqr 

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

и выводят таблицу. Стол имеет форму букв выше, каждая буква представляет собой изображение. Следующие несколько строк связывают изображение с каждой буквой.

Это часть директивы, которая делает вывод:

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 

Это «работает», в том, что он возвращается в порядке. Но позже, когда автор пытается вывести то, что моя директива вернулась, она вызывает отслеживающий:

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 ¹; Я предполагаю, что элементы таблицы, которые я возвращаю, не совсем «хорошо сформированы», по крайней мере, для автора. Однако, похоже, нет любой документации. (Если есть, пожалуйста, укажите мне!)

Кто-нибудь знает, что о узле таблицы Я возвращаю HTML-писателю, и что я должен изменить, чтобы исправить это?

¹ Даже если мой вывод не является хорошим, лучше получить сообщение об ошибке «Индекс списка вне диапазона».

ответ

1

Я сделал две ошибки:

  1. кажется, что таблицы действительно должны colgroups.

    for _ in range(3): 
        colspec = nodes.colspec(colwidth=1) 
        tgroup.append(colspec) 
    

    Это фиксировало непосредственную проблему трассировки. Окончательная структура выглядела примерно так:

    * table 
        * tgroup 
        * one colspec for each column. 
        * tbody 
         * one row for each row 
         * one entry for each column. (These are the cells.) 
          * The optional content for the cell. You can pass in an empty 
          entry, the HTML writer will output an &nbsp;'d cell. 
    

    Там также thead, для заголовков; работает так же, как tbody. Я использовал (и в итоге понял это из) docutils.parsers.rst.directives.tables, функция build_table_from_list была весьма полезна.

  2. мне нужно настроить возвращения немного:

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

    Это должно быть [table], не table:

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

    Занятно, автор принимает эту ошибку. Вы получите стол, минус окружающие теги <table>.

Обратите внимание, что colgroup «s colwidth представляет собой отношение: Три колонны colwidth„1“получить выходной сигнал в виде трех столбцов шириной„33%“.