Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   https://anggtwu.net/LUA/DiagForth1.lua.html
--   https://anggtwu.net/LUA/DiagForth1.lua
--           (find-angg "LUA/DiagForth1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e  () (interactive) (find-angg "LUA/DiagForth1.lua"))
-- (defun o  () (interactive) (find-angg "LUA/DiagTeX1.lua"))
-- (defun oo () (interactive) (find-dn6 "diagforth.lua"))
--
-- «.dxyrun»	(to "dxyrun")
-- «.relplace»	(to "relplace")

forths = forths or {}
forthe = {}          -- Similar to forths[], but defines eaters.

DiagForth = Class {
  type    = "DiagForth",
  __index = {
    w     = function (df) return getword()          or werror() end,
    e     = function (df) return getwordasluaexpr() or werror() end,
    w_w   = function (df) return df:w(),df:w()        end,
    w_w_w = function (df) return df:w(),df:w(),df:w() end,
    e_e   = function (df) return df:e(),df:e()        end,
    e_e_e = function (df) return df:e(),df:e(),df:e() end,
    e_e_w = function (df) return df:e(),df:e(),df:w() end,
    --
    getargs = function (df,word)
        local ga = forthe[word]
        if not ga then return end
        if type(ga) == "function" then return ga() end
        if type(ga) == "string" then
          local methodname = ga:gsub(",", "_")
          if not df[methodname] then
	    error("Bad getargs method in "..word.." -> "..methodname)
	  end
	  return df[methodname](df)
	end
	error("Bad getargs in word: "..word)
      end,
    dxyrun1 = function (df,word)
        if    forths[word] then forths[word](df:getargs(word))
        elseif nodes[word] then ds:push(nodes[word])
        else Error("Unknown word: "..word)
        end
      end,
    dxyrun = function (df,str,pos_)
        local oldvalues = pack(subj,startcol,endcol,word,pos)
        setsubj(str, pos_ or 1)
        while getword() do df:dxyrun1(word) end
        subj,startcol,endcol,word,pos = unpack(oldvalues)
      end,
    --
    run1 = function (df,cmd)
        if type(cmd) == "string" then cmd = {cmd} end
	local word = cmd[1]
        if not forths[word] then error("Unknown word: "..word) end
	forths[word](unpack(cmd, 2))
      end,
    --
  },
}



-- «dxyrun»  (to ".dxyrun")
-- Replaces: (find-dn6 "diagforth.lua" "dxyrun")
dxyrun = function (str, pos_)
    DiagForth{}:dxyrun(str,pos_)
  end

--
-- dxyrun = function (str, pos)
--     setsubj(str, pos or 1)
--     while getword() do
--       PP(word)
--       -- if forths[word] then forths[word]()
--       if    forths[word] then forths[word](forthe_getargs(word))
--       elseif nodes[word] then ds:push(nodes[word])
--       else Error("Unknown word: "..word)
--       end
--     end
--   end

-- (find-dn6 "diagforth.lua" "nodes")
-- (find-dn6 "diagforth.lua" "arrow-modifiers")
-- (find-dn6 "diagmiddle.lua" "dvarrownodes" "forths[\"harrownodes\"] =")

forthe[".p="]      = "w"
forthe[".slide="]  = "w"
forthe[".curve="]  = "w"
forthe[".label="]  = "w"
forthe[".plabel="] = "w,w"
forthe[".PLABEL="] = "w,w"

forths[".p="]      = function (p)     ds:pick(0).placement = p end
forths[".slide="]  = function (slide) ds:pick(0).slide = slide end
forths[".curve="]  = function (curve) ds:pick(0).curve = curve end
forths[".label="]  = function (label) ds:pick(0).label = label end
forths[".plabel="] = function (p,label)
    ds:pick(0).placement = p
    ds:pick(0).label     = label
  end
forths[".PLABEL="] = function (lp,label)
    ds:pick(0).lplacement = lp
    ds:pick(0).label      = label
  end

-- (find-dn6 "diagforth.lua" "arrows" "x+=")
forthe["x+="] = "e"
forthe["y+="] = "e"
forths["x+="] = function (dx) ds:pick(0).x = ds:pick(0).x + dx end
forths["y+="] = function (dy) ds:pick(0).y = ds:pick(0).y + dy end
forthe["xy+="] = "e,e"
forths["xy+="] = function (dx,dy)
    ds:pick(0).x = ds:pick(0).x + dx
    ds:pick(0).y = ds:pick(0).y + dy
  end

-- «relplace»  (to ".relplace")
-- (find-dn6 "diagforth.lua" "relplace")
forthe["relplace"] = "e,e,w"
forths["relplace"] = function (dx,dy,TeX)
    local x, y = ds:pick(0).x, ds:pick(0).y
    ds:push(storearrow(DxyPlace {{x=x+dx, y=y+dy, tex=TeX}}))
  end




-- (misp 51 "2-category-of-cats")
-- (misa    "2-category-of-cats")


--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "DiagForth1.lua"

--]]





-- Local Variables:
-- coding:  utf-8-unix
-- End: