Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
-- This file:
-- http://angg.twu.net/sheavesforchildren/rect.lua
-- http://angg.twu.net/sheavesforchildren/rect.lua.html
--  (find-angg        "sheavesforchildren/rect.lua")
--
-- (find-lua51manualw3m "")
-- (find-lua51manualw3m "#pdf-table.insert")
-- (find-books "__comp/__comp.el" "ierusalimschy")
-- (find-pil2page 8 "Contents")
-- (find-pil2text 8 "Contents")

-- (find-dn5file "" "gab")
-- (find-dn5file "" "rect")
-- (find-dn5 "rect.lua")
-- (find-dn5 "rect.lua" "complexdef-tests")
-- (find-dn5 "gab.lua")
-- (find-dn5 "gab.lua" "modal")
-- (find-gabgrep "grep -niH -e modal *")
-- (find-angg "LUA/canvas3.lua")
-- (find-angg "LUA/canvas3.lua" "ZDag-functions")
-- (find-LATEX "2011ebl-abs.tex")


-- a = "abcdefg"
-- a:replace(2, "CDE")     --> "abCDEfg"
-- a:replace(2, "CDE", 4)  --> "abCDE g"
--
-- w is the width of the left part
string.leftof = function (s, w)
    if     #s >  w then return s:sub(1, w)
    elseif #s == w then return s
    else return s..string.rep(" ", w - #s)
    end
  end
string.rightof = function (s, w)
    if #s <= w then return ""
    else return s:sub(w+1)
    end
  end
string.replace = function (s, x, r, w)
    w = w or #r
    r = r:leftof(w)
    return s:leftof(x)..r..s:rightof(x + #r)
  end


-- Examples:
-- if:   r = Rect.new("aa\nbb")
-- then: r = Rect {[1]="aa", [2]="bb", raise=0}
--       r:get(0) = "aa"
--       r:get(1) = "bb"
--       "--"..r  = Rect {[1]="--aa", [2]="  bb", raise=0}
--
-- Sanity conditions for a rectangle r:
--   r[1] = r:get(0)  when r.raise = 0
--   r[1] = r:get(-1) when r.raise = 1
--   r[1] = r:get(-2) when r.raise = 2
--   r[2] = r:get(-1) when r.raise = 2
--   r[3] = r:get(0)  when r.raise = 2
--          r:get(y) := r[y + r.raise + 1]
--          r.raise >= 0
--          #r >= r.raise + 1

-- The i-set of a rectangle r is always {1,...,#r}
-- The y-set of a rectangle is always {1-(r.raise+1),...,#r-(r.raise+1)}
---  and we always have 0 \in y-set

Rect = Class {
  type    = "Rect",
  new     = function (str, raise)
      local rect = Rect(splitlines(str or ""))
      rect.raise = raise or 0
      while #rect < rect.raise + 1 do table.insert(rect, "") end
      return rect
    end,
  __index = {
    width = function (rect)
        local w = 0
        for i=1,#rect do w = max(w, #rect[i]) end
        return w
      end,
    toi = function (rect, y) return y + (rect.raise + 1) end,
    toy = function (rect, i) return i - (rect.raise + 1) end,
    -- (find-lua51manualw3m "#pdf-table.insert")
    makeyvalid = function (rect, y)
        local newraise = max(-y+1, rect.raise or 0)
        if newraise > raise then
	  for i=0,newraise-raise do table.insert(rect, 1, "") end
	  rect.raise = newraise
	end
	local newn = max(#rect, y + (rect.raise or 0))
	if newn > #rect then
	  for i=0,newn-#rect do table.insert(rect, "") end
	end
      end,
    get = function (rect, y)
        return rect[y + (rect.raise or 0)]
      end,
    put1 = function (rect, y, s)
      end,
    replace1 = function (rect, x, y, r, w)
        while #rect < y do table.insert(rect, "") end
        rect[y] = rect[y]:replace(x, r, w)
      end,
    replace = function (rect1, x, y, rect2, w)
        w = w or rect2:width()
        for i=1,#rect2 do
          rect1:replace1(x, y, rect2[i], w)
          y = y + 1
        end
        return rect1
      end,
  },
  __concat = function (r1, r2)
      return Rect.new():replace(0, 1, r1):replace(r1:width(), 1, r2)
    end,
  __tostring = function (rect)
      return table.concat(rect, "\n")
    end,
}

= Rect {"a", "bb"} .. Rect {"a", "bb", "ccc"}


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


--]]


-- Local Variables:
-- coding: raw-text-unix
-- End: