Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://angg.twu.net/LUA/DFSTriangle.lua.html
--   http://angg.twu.net/LUA/DFSTriangle.lua
--           (find-angg "LUA/DFSTriangle.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>

-- dofile "DFS.lua"

DFSTriangle = Class {
  type = "DFSTriangle",
  from = function (dfs) return DFSTriangle { dfs = dfs } end,
  __index = {
    kinfo = function (dfst, k) return dfst.dfs:kinfo(k)  end,
    knode = function (dfst, k) return dfst:kinfo(k).node end,
    kname = function (dfst, k) return dfst:kinfo(k).name end,
    --
    drawdiagonal = function (dfst)
        local maxk = dfst.dfs:maxk()
        dfst.maxk = maxk
        dfst.r = Rect.rep("", maxk)
        for i=1,maxk do
          dfst.r[i] = dfst.r[i]:replace(i-1, dfst:kname(i))
        end
        return dfst
      end,
    --
    arrownames = function (dfst, k1, k2)
	local node1 = dfst.dfs:kinfo(k1).node
	local node2 = dfst.dfs:kinfo(k2).node
	local arrownames = dfs.arrownames[node1] and dfs.arrownames[node1][node2]
	return arrownames
      end,
    setgridchar = function (dfst, k1, k2, c)
        dfst.r[k2] = dfst.r[k2]:replace(k1-1, c)
      end,
    setgrid0 = function (dfst)
        dfst.grid = {}
        for i=1,dfst.maxk do
	  dfst.grid[i] = {}
          for j=i+1,dfst.maxk do
            dfst.grid[i][j] = {}
          end
        end
      end,
    setgrid1 = function (dfst)
        for i=1,dfst.maxk do
          for j=i+1,dfst.maxk do
	    if dfst:arrownames(i, j) then dfst:setgridchar(i, j, ">") end
          end
        end
      end,
    setgrid2 = function (dfst)
        for i=1,dfst.maxk do
          for j=i+1,dfst.maxk do
	    local c = dfst.grid[i][j].char
	    if c then dfst.r[j] = dfst.r[j]:replace(i-1, c) end
          end
        end
      end,
  },
}