Поддерживает ли pandoc создание таблиц уценок в своих шаблонах? - PullRequest
1 голос
/ 05 мая 2019

Я читаю руководство pandoc и, если я правильно понимаю, оно поддерживает использование файла шаблона и файла YAML, который содержит переменные для использования в шаблонах. Это также говорит о том, что YAML поддерживает любые произвольные объекты (даже списки). Однако я хочу спросить, возможно ли отобразить таблицы уценок в шаблоне, используя данные YAML. В примерах показано только простое сопоставление ключа и значения.


Edit: Я создал файл testable.md, который содержит

---
table:
  caption: Cities
  headers: [city, population]
  rows:
    - [Berlin, '3,748,148']
    - [Tokyo, '13,839,910']
---

$table$

**Random Text**

и использовал эту команду для использования фильтра, предоставленного tarleb: pandoc -f markdown -t docx --lua-filter=yaml_table.lua -o target.docx testtable.md

Однако, похоже, что выходной файл все еще не содержит таблицу. Я что-то упустил?


Edit: Я понял, что файл шаблона указан не так, как вход Он работал правильно, когда я создал testtable.md, который содержал только следующее:

---
table:
  caption: Cities
  headers: [city, population]
  rows:
    - [Berlin, '3,748,148']
    - [Tokyo, '13,839,910']
---

И создал файл шаблона с именем markdowntmpl.md, содержащий следующее

$table$

**Random Text**

Затем я использовал следующую команду:

pandoc -f markdown -t markdown --template=markdowntemplate.md --lua-filter=yaml_table.lua -o target.md testtable.md

Выход:

  city     population
  -------- ------------
  Berlin   3,748,148
  Tokyo    13,839,910

  : Cities

**Random Text**

Затем я могу приступить к созданию из него документа docx.

1 Ответ

1 голос
/ 06 мая 2019

Все элементы, представляемые в Markdown, также могут быть помещены в поля метаданных. Самый простой способ вставить сложные элементы - это использовать сохраняющий новую строку синтаксис YAML для многострочных строк. Например.,

---
table: |
  | city   | population |
  |--------|------------|
  | Berlin |  3,748,148 |
  | Tokyo  | 13,839,910 |
---

Это определяет table как поле метаданных, содержащее таблицу.


Не существует "родного" YAML-способа определения таблицы, но вы можете свернуть свой собственный с помощью pandoc Lua filter .

Скажем, хотелось бы определить таблицу следующим образом:

---
table:
  caption: Cities
  headers: [city, population]
  rows:
    - [Berlin, '3,748,148']
    - [Tokyo, '13,839,910']
---

Тогда можно использовать следующий фильтр для преобразования его в таблицу pandoc.

local List = require 'pandoc.List'

function repeated(item, times)
  local result = {}
  for i = 1, times do result[i] = item end
  return result
end

function to_table (tbl)
  if tbl.t ~= 'MetaMap' or not tbl.rows then
    return nil
  end

  -- Turn MetaInlines into blocks
  local to_blocks = function (x) return {pandoc.Plain(List:new(x))} end

  local headers = (List:new(tbl.headers)):map(to_blocks)
  local rows = List:new(tbl.rows):map(
    function (row) return List:new(row):map(to_blocks) end
  )
  local columns = #rows[1]
  local aligns = tbl.aligns or repeated(pandoc.AlignDefault, columns)
  local widths = tbl.widths or repeated(0, columns)
  return pandoc.Table(List:new(tbl.caption), aligns, widths, headers, rows)
end

function Meta (meta)
  for k, v in pairs(meta) do
      local success, result = pcall(to_table, v)
      if success and result then
        meta[k] = pandoc.MetaBlocks{result}
      end
  end
  return meta
end
...