Как я могу перебрать элементы списка в функции lua-фильтра Пандока? - PullRequest
0 голосов
/ 28 января 2019

Фильтр Pandoc lua позволяет действительно легко перебирать документ и разбирать документ по ходу работы.Моя проблема в том, что я не могу понять, как изолировать элементы списка.Я могу найти списки и вещи уровня блока внутри каждого элемента списка, но я не могу найти способ перебора элементов списка.

Например, допустим, у меня была следующая уценкаdocument:

1.  One string

    Two string

2.  Three string

    Four string

Допустим, я хочу сделать первую строку каждого элемента списка жирным.Я могу легко изменить способ обработки абзацев внутри OrderedLists, скажем, с помощью этого фильтра и pandoc --lua-filter=myfilter.lua --to=markdown input.md

local i
OrderedList = function (element)
  i = 0
  return pandoc.walk_block(element, {
      Para = function (element)
          i = i + 1
          if i == 1 then return pandoc.Para { pandoc.Strong(element.c) }
          else return element end
        end
    })
end

Это действительно изменит первый элемент абзаца на полужирный, но это только изменит первый абзац первогоэлемент списка, поскольку он повторяется по всем абзацам во всех элементах списка в списке, а не в каждом элементе списка, а затем в каждом абзаце.

1.  **One string**

    Two string

2.  Three string

    Four string

Если я разделю два элемента списка снова на два отдельных списка, первыйабзац первого элемента пойман, но я хочу поймать первый абзац каждого элемента списка!Я не могу найти ничего в документации об итерации по элементам списка.Как это сделать?

1 Ответ

0 голосов
/ 29 января 2019

Документы фильтра Luand pandoc были недавно обновлены, добавив больше информации о свойствах каждого типа.Например, для OrderedList элементов документы должны сказать (в настоящее время говорится items вместо content, что является ошибкой):

OrderedList

Упорядоченный список.

  • content: элементы списка (список блоков)
  • listAttributes: параметры списка (ListAttributes)
  • start: псевдоним для listAttributes.start (целое число)
  • style: псевдоним для listAttributes.style (строка)
  • delimiter: псевдоним для listAttributes.delimiter (строка)
  • tag, t: литерал OrderedList (строка)

Таким образом, самый простой способ - перебрать поле содержимого и изменить элементы в нем:

OrderedList = function (element)
  for i, item in ipairs(element.content) do
    local first = item[1]
    if first and first.t == 'Para' then
      element.content[i][1] = pandoc.Para{pandoc.Strong(first.content)}
    end
  end
  return element
end
...