42 lines
1.2 KiB
Lua
42 lines
1.2 KiB
Lua
-- local l = require("pandoc.logging")
|
|
local read, json = pandoc.read, pandoc.json
|
|
|
|
assert(#arg > 1, "\n" ..
|
|
"[ERROR] usage: pandoc lua links.lua <destination file> <input file>...")
|
|
local destination_filepath
|
|
local input_filepaths = {}
|
|
local input_filepaths_keys = {}
|
|
for _, option in ipairs(arg) do
|
|
if destination_filepath == nil then
|
|
destination_filepath = option
|
|
else
|
|
table.insert(input_filepaths, option)
|
|
input_filepaths_keys[option] = {}
|
|
end
|
|
end
|
|
|
|
for _,filepath in ipairs(input_filepaths) do
|
|
local f = assert(io.open(filepath), "\n" ..
|
|
"[ERROR] could not open " .. filepath)
|
|
local data = f:read("a")
|
|
f:close()
|
|
local visited_map = {}
|
|
read(data):walk({
|
|
Link = function (link)
|
|
if not input_filepaths_keys[link.target] then return end
|
|
if visited_map[link.target] then return end
|
|
table.insert(input_filepaths_keys[filepath], link.target)
|
|
visited_map[link.target] = true
|
|
end
|
|
})
|
|
end
|
|
|
|
local data = json.encode(input_filepaths_keys)
|
|
local f = io.open(destination_filepath)
|
|
if f == nil or f:read("a") ~= data then
|
|
local f = assert(io.open(destination_filepath, "w"), "\n" ..
|
|
"[ERROR] could not open " .. destination_filepath .. " for writing")
|
|
f:write(data)
|
|
f:close()
|
|
end
|