Фильтры Pandoc Lua: как указать атрибуты для элемента Span

У меня есть документ Markdown, содержащий необработанные команды LaTeX. Я пытаюсь использовать фильтр Lua с Pandoc (2.0.1.1) для преобразования команд LaTeX во что-то более портативное. В частности, команды, определяющие язык текста, должны быть преобразованы в промежутки с атрибутом lang. Проблема в том, что я не знаю, как передать атрибуты конструктору pandoc.Span. Это моя попытка фильтра (filter.lua):

function RawInline(elem)
  if elem.format == "tex" then
    text = string.match(elem.text, "\\textspanish{(.+)}")
    if text then
      contents = {pandoc.Str(text)}
      attrs = pandoc.Attr("",{},{lang = "es-SP"})
      return pandoc.Span(contents, attrs)
    end
  else
    return elem
  end
end

Пример использования:

echo '\textspanish{hola}' | pandoc -f markdown -t native --lua-filter=filter.lua

Результатом будет [Para [Span ("",[],[]) [Str "hola"]]] без атрибутов в диапазоне.

Если я передаю имя и / или класс pandoc.Attr, они проходят, например, attrs = pandoc.Attr("name",{"class"},{lang = "es-SP"}) производит [Para [Span ("name",["class"],[]) [Str "hola"]]]. Но атрибуты, которые я передаю конструктору, никогда не появляются в выводе. Как правильно передавать атрибуты pandoc.Attr?


person jcr    schedule 14.11.2017    source источник
comment
Я не понимаю, чего ты хочешь. Пройти что откуда куда? Вы говорите, что не можете передавать атрибуты в конструктор Span, но показываете, что изменение атрибутов и их размещение в конструкторе span в конечном итоге приводит к выводу? Я смущен   -  person Piglet    schedule 14.11.2017
comment
Кажется, что единственный способ передать атрибуты в pandoc.Span - это упаковать их в конкретный объект, вызвав pandoc.Attr и затем передав этот объект в pandoc.Span. Вы можете сделать это одной строкой: return pandoc.Span({pandoc.Str(text)}, pandoc.Attr("name",{"class"},{lang = "es-SP"}))   -  person Egor Skriptunoff    schedule 14.11.2017
comment
Я отредактировал последнее предложение своего вопроса, чтобы сделать его более ясным. Моя проблема в том, что атрибут lang, который я передаю pandoc.Attr, не отображается в выводе. Это происходит независимо от того, делаю ли я это, как в моем вопросе, или в одной строке, как предложил @EgorSkriptunoff. На выходе из предложенного им кода будет [Para [Span ("name",["class"],[]) [Str "hola"]]], без атрибутов, только с идентификатором и классом (который мне не нужен). Поскольку атрибут lang не отображается в выводе, я предполагаю, что должен передать его неверным способом. Таким образом, мой вопрос: как правильно его пройти?   -  person jcr    schedule 14.11.2017


Ответы (1)


Вы нашли один из острых моментов в реализации фильтра lua; это следует сгладить и сделать более удобным для пользователя.

Текущая реализация использует двухэлементные таблицы для хранения пар ключ-значение:

attrs = pandoc.Attr("", {}, {{"lang", "es-SP"}})

Это не лучший способ представлять пары. Текущая реализация имеет две причины:

  1. Он отражает способ кодирования пар (и атрибутов в целом) в выходных данных pandoc в формате JSON.
  2. У этих пар фиксированный порядок.

Последняя часть важна, когда нужно гарантировать, что порядок атрибутов не изменится при прохождении через фильтр. В lua нет правила, определяющего порядок ключей в таблице: таблица lua {one = 1, two = 2} может быть прочитана обратно в pandoc как список атрибутов {one="1" two="2} или как {two="2" one="1"}. Теперь порядок атрибутов не имеет значения для большинства приложений, но мы не можем быть уверены в этом. Отсюда менее интуитивное представление.

person tarleb    schedule 14.11.2017
comment
Поднимите проблему и опишите предпочитаемый интерфейс. Для этого нам нужно найти хороший, интуитивно понятный интерфейс. - person tarleb; 14.11.2017