building digraph
This commit is contained in:
		
							
								
								
									
										45
									
								
								filter.lua
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								filter.lua
									
									
									
									
									
								
							@@ -1,16 +1,43 @@
 | 
			
		||||
local label_map = {}               -- label has to be unique!
 | 
			
		||||
 | 
			
		||||
local function collect_labels(div) -- only collect labels in div
 | 
			
		||||
    if div.identifier and div.identifier ~= "" then
 | 
			
		||||
        label_map[div.identifier] = div:clone()
 | 
			
		||||
local label_map = {} -- label has to be unique!
 | 
			
		||||
 | 
			
		||||
-- helper functions for debugging
 | 
			
		||||
local function show(s)
 | 
			
		||||
    io.stderr:write("[Debug] " .. s .. "\n")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function collect_labels(blk)
 | 
			
		||||
    if blk.identifier and blk.identifier ~= "" then
 | 
			
		||||
        label_map[blk.identifier] = blk:clone()
 | 
			
		||||
    end
 | 
			
		||||
    return nil
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function dfs(blk, stack) -- depth first search on a top level blk
 | 
			
		||||
    -- check for identifier and build label_map
 | 
			
		||||
    if blk.identifier and blk.identifier ~= "" then
 | 
			
		||||
        label_map[blk.identifier] = blk:clone()
 | 
			
		||||
        table.insert(stack, blk.identifier)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    -- recurse into child blocks
 | 
			
		||||
    -- type matters. see https://hackage-content.haskell.org/package/pandoc-types-1.23.1/docs/Text-Pandoc-Definition.html#t:Block
 | 
			
		||||
    -- fortunately, we only need to recurse on divs.
 | 
			
		||||
    if blk.t == 'Div' then
 | 
			
		||||
        for _, inner in ipairs(blk.content) do
 | 
			
		||||
            dfs(inner, stack)
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
    -- pop
 | 
			
		||||
    if blk.identifier and blk.identifier ~= "" then
 | 
			
		||||
        table.remove(stack) -- pop
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function words(s)
 | 
			
		||||
    local res = {}
 | 
			
		||||
    for part in s:gmatch("[^,]+") do                -- split by commas
 | 
			
		||||
        local trimmed = part:match("^%s*(.-)%s*$")  -- remove leading/trailing spaces
 | 
			
		||||
    for part in s:gmatch("[^,]+") do               -- split by commas
 | 
			
		||||
        local trimmed = part:match("^%s*(.-)%s*$") -- remove leading/trailing spaces
 | 
			
		||||
        if trimmed ~= "" then
 | 
			
		||||
            table.insert(res, trimmed)
 | 
			
		||||
        end
 | 
			
		||||
@@ -26,9 +53,9 @@ local function replace(e)
 | 
			
		||||
        for _, l in ipairs(words(include)) do
 | 
			
		||||
            if label_map[l] then
 | 
			
		||||
                table.insert(blocks, label_map[l]:clone())
 | 
			
		||||
                io.stderr:write("insert [" .. label_map[l].identifier .. ']\n')
 | 
			
		||||
                show("insert [" .. label_map[l].identifier .. ']\n')
 | 
			
		||||
            else
 | 
			
		||||
                io.stderr:write("Cannot find AST node with label " .. l)
 | 
			
		||||
                io.stderr:write("Cannot find AST node with label " .. l .. "\n")
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
        return pandoc.Div(blocks, e.attr)
 | 
			
		||||
@@ -41,7 +68,7 @@ return {
 | 
			
		||||
    Pandoc = function(doc)
 | 
			
		||||
        -- collect labels
 | 
			
		||||
        for _, blk in ipairs(doc.blocks) do
 | 
			
		||||
            collect_labels(blk)
 | 
			
		||||
            dfs(blk,{})
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        -- replace
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user