lua-filters icon indicating copy to clipboard operation
lua-filters copied to clipboard

include-files.lua fails with relative path if not executed from the main document directory

Open chrisaga opened this issue 2 years ago • 3 comments

All relative paths are processed relatively to the working directory. Relative path in a document (main source file) are obviously relative to the directory of this document. So the filter works only if the working directory (from which the pandoc command is run) is the directory where the main document is stored.

This should be easily fixed if we could access to the sourcefile variable set by Pandoc (see Pandoc's manual). I was not able to figure out how it can be accessed from a lua filter.

NB1. I suspect the same restriction applies to include-code-files.lua NB2. With this restriction we can not even build clean test cases with all files stored in a test subdirectory

chrisaga avatar Jun 17 '22 18:06 chrisaga

Absolute paths are fine, but the line 86 local fh = io.open(line) of the lua filter does not support non-Latin paths.

wenbopeng avatar Jul 11 '23 09:07 wenbopeng

I found a solution. I modifyed the code a bit but didnt came to the moment to create a PR:

My modification looks as followed:

    local path = pandoc.path.directory(PANDOC_STATE.input_files[1]) .. "\\" .. cb.attributes.include
    local fh = io.open(path)
    if not fh then
      io.stderr:write("Cannot open file " .. path .. " | Skipping includes\n")
    else
      ...

When i am done with my exams I will do a PR

AH-Hammi avatar Jan 10 '24 17:01 AH-Hammi

I have solved it with the help of ChatGPT.


-- block-auto.lua
function RawBlock(raw)
  -- 根据嵌入的格式匹配相应的过滤器
  local filters = {
    markdown = pandoc.read(raw.text, 'markdown').blocks,
    html = pandoc.read(raw.text, 'html').blocks,
    latex = pandoc.read(raw.text, 'latex').blocks
  }
  -- 返回匹配到的过滤器的结果,如果没有匹配到,返回原始块
  return filters[raw.format] or raw
end


function CodeBlock (cb)
  -- 根据嵌入的格式匹配相应的过滤器
  local filters = {
    ["insert-markdown"] = function (path)
      local blocks = pandoc.pipe("pandoc", {"-f", "markdown", "-t", "markdown", path}, "")
      local doc = pandoc.read(blocks, "markdown")
      return doc.blocks
    end,
    ["insert-html"] = function (path)
      local blocks = pandoc.pipe("pandoc", {"-f", "html", "-t", "json", path}, "")
      local doc = pandoc.read(blocks, "json")
      return doc.blocks
    end,
    ["insert-latex"] = function (path)
      local blocks = pandoc.pipe("pandoc", {"-f", "latex", "-t", "json", path}, "")
      local doc = pandoc.read(blocks, "json")
      return doc.blocks
    end,
    ["insert-docx"] = function (path)
      local blocks = pandoc.pipe("pandoc", {"-f", "docx", "-t", "json", path}, "")
      local doc = pandoc.read(blocks, "json")
      return doc.blocks
    end
  }
  -- 创建一个空的结果列表
  local result = {}
  -- 遍历代码块中的每一行
  for line in cb.text:gmatch("[^\n]+") do
    -- 假设每一行都是一个文件路径,尝试匹配相应的过滤器
    local matched = false
    for class, filter in pairs(filters) do
      if cb.classes:includes(class) then
        -- 如果有匹配到的过滤器,调用它并将结果添加到结果列表中
        local blocks = filter(line)
        for _, block in ipairs(blocks) do
          table.insert(result, block)
        end
        matched = true
        break
      end
    end
    -- 如果没有匹配到任何过滤器,就保留原始内容,并将其作为一个段落添加到结果列表中
    if not matched then
      table.insert(result, pandoc.Para({pandoc.Str(line)}))
    end
  end
  -- 返回结果列表作为新的代码块内容
  return result
end

Instructions:


```{.insert-html}
D:\Research\R\Project\output\report.html
```

```{.insert-markdown}
D:\Research\R\Project\output\report.md
```


```{.insert-latex}
D:\Research\R\Project\output\report.tex
```


```{.insert-docx}
D:\Research\R\Project\output\report.docx
```

wenbopeng avatar Jan 11 '24 01:01 wenbopeng