Проблемы с фильтром lua для итерации по строкам таблицы - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь написать простой фильтр lua для pandoc, чтобы выполнить какое-либо макроразложение для элементов в таблице ReST.

filter.lua

function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

function Table(table)

    elems=pandoc.Table(table)["rows"]

    print(tablelength(table))
    for v in pairs(elems) do
        print(v) -- Prints nothings
    end
    return table
end

test.rst

======= =========
A       B 
======= =========
{{x}}   {{y}}
======= =========

Теперь, если я запускаю pandoc.exe -s --lua-filter filter.lua test.rst -t rst, программа говорит, что в элементах есть 5 элементов, но цикл for просто пропускается, и яна самом деле не знаю, что я делаю здесь не так.

Я очень плохо знаком с Луа, а также очень хорошо знаю Пандока.Как я могу перебрать элементы в элементах?

1 Ответ

0 голосов
/ 14 февраля 2019

lua-фильтры Pandoc предоставляют удобный walk_block помощник, который рекурсивно перемещает дерево документа вниз и применяет функцию к элементам, которые соответствуют ключу.

В приведенном ниже примере мыприсвойте walk_block таблицу lua (что такое карта или dict на других языках) только с одним ключом (ключ Str), и значение таблицы - это функция, которую нужно применить.Функция проверяет фигурные скобки, удаляет их и добавляет foo.

function Table(table)
  return pandoc.walk_block(table, {
    Str = function(el)
      if el.text:sub(1,2) == '{{' then
        txt = 'foo' .. el.text:sub(3, -3)
      else
        txt = el.text
      end
      return pandoc.Str(txt)
    end
  })
end
...