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

-- «.XtoT»			(to "XtoT")
-- «.Xtot-tests»		(to "Xtot-tests")
-- «.StrGridLabels»		(to "StrGridLabels")
-- «.StrGridLabels-tests»	(to "StrGridLabels-tests")
-- «.StrGrid»			(to "StrGrid")
-- «.StrGrid-tests»		(to "StrGrid-tests")


-- __  ___      _____ 
-- \ \/ / |_ __|_   _|
--  \  /| __/ _ \| |  
--  /  \| || (_) | |  
-- /_/\_\\__\___/|_|  
--                    
-- «XtoT»  (to ".XtoT")
--
XtoT = Class {
  type  = "XtoT",
  from_ = function (x0, x1, t0, t1)
      return XtoT {x0=x0, x1=x1, t0=t0, t1=t1}
    end,
  from  = function (x0, x1, t0, t1)
      return XtoT.from_(x0, x1, t0, t1):functions()
    end,
  __tostring = mytostringp,
  __index = {
    xtot = function (xt, x)
        local x0,x1,t0,t1 = xt.x0, xt.x1, xt.t0, xt.t1
        return t0 + (x-x0)*(t1-t0)/(x1==x0 and 1 or x1-x0)
      end,
    ttox = function (xt, t)
        local x0,x1,t0,t1 = xt.x0, xt.x1, xt.t0, xt.t1
        return x0 + (t-t0)*(x1-x0)/(t1==t0 and 1 or t1-t0)
      end,
    functions = function (xt)
        local xtot = function (x) return xt:xtot(x) end
        local ttox = function (t) return xt:ttox(t) end
        return xt,xtot,ttox
      end,
  },
}

-- «Xtot-tests»  (to ".Xtot-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "StrGrid1.lua"
xt,xtot,ttox = XtoT.from(10, 20, 100, 200)
= xtot(12)
= ttox(120)

--]]



--  ____  _         ____      _     _ _          _          _     
-- / ___|| |_ _ __ / ___|_ __(_) __| | |    __ _| |__   ___| |___ 
-- \___ \| __| '__| |  _| '__| |/ _` | |   / _` | '_ \ / _ \ / __|
--  ___) | |_| |  | |_| | |  | | (_| | |__| (_| | |_) |  __/ \__ \
-- |____/ \__|_|   \____|_|  |_|\__,_|_____\__,_|_.__/ \___|_|___/
--                                                                
-- «StrGridLabels»  (to ".StrGridLabels")
StrGridLabels = Class {
  type = "StrGridLabels",
  new = function () return StrGridLabels {_=VTable{}} end,
  __tostring = function (sgl) return tostring(sgl._) end,
  __index = {
    add = function (sgl,c,x,y) sgl._[c] = {x,y}; return sgl end,
    subst = function (sgl,bigstr)
        local f = function (c)
            local xy = sgl._[c]
            local x,y = xy[1], xy[2]
            return format("(%s,%s)", x, y)
          end
        return (bigstr:gsub("[A-Z]", f))
      end,
  },
}

-- «StrGridLabels-tests»  (to ".StrGridLabels-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "StrGrid1.lua"
sgl = StrGridLabels.new()
sgl:add("A",2,3):add("B",3,4)
= sgl
= sgl:subst("fooBAr")

--]]



--  ____  _         ____      _     _ 
-- / ___|| |_ _ __ / ___|_ __(_) __| |
-- \___ \| __| '__| |  _| '__| |/ _` |
--  ___) | |_| |  | |_| | |  | | (_| |
-- |____/ \__|_|   \____|_|  |_|\__,_|
--                                    
-- «StrGrid»  (to ".StrGrid")
StrGrid = Class {
  type = "StrGrid",
  from = function (bigstr, x0, y0, shrink)
      x0 = x0 or 0
      y0 = y0 or 0
      shrink = shrink or 1
      local grid = {}
      for _,li in ipairs(splitlines(bigstr)) do
        local spl = split(li)
        if #spl > 0 then table.insert(grid, spl) end
      end
      local rows,cols = #grid, #grid[1]
      local xmin,ymin = x0, y0
      local xmax,ymax = x0+(cols-1)/shrink, y0+(rows-1)/shrink
      local _,rtoy,ytor = XtoT.from(1,rows, ymax,y0)
      local _,ctox,xtoc = XtoT.from(1,cols, x0,xmax)
      return StrGrid {grid=grid,
        x0=x0, y0=y0, shrink=shrink,
        xmin=xmin, ymin=ymin,
        xmax=xmax, ymax=ymax,
        rows=rows, cols=cols,
        rtoy=rtoy, ytor=ytor,
        ctox=ctox, xtoc=xtoc
      }
    end,
  __tostring = function (sg) return mytostringv(sg.grid) end,
  __index = {
    get = function (sg, x, y)
        local r,c = sg.ytor(y), sg.xtoc(x)
        if not sg.grid[r] then return end
        return sg.grid[r][c]
      end,
    labels = function (sg)
        local labels = StrGridLabels.new()
        for y=sg.ymax,sg.ymin,-1 do
          for x=sg.xmin,sg.xmax do
            local c = sg:get(x,y) or ""
            if c:match("[A-Z]") then labels:add(c,x,y) end
          end
        end
        return labels
      end,
    subst = function (sg, bigstr)
        return sg:labels():subst(bigstr)
      end,
    --
    xycs = function (sg)
        return cow(function ()
            for y=sg.ymax,sg.ymin,-1 do
              for x=sg.xmin,sg.xmax do
                local c = sg:get(x,y)
                if c then coy(x, y, c) end
              end
            end
          end)
      end,
    printxycs = function (sg)
        for x,y,c in sg:xycs() do print(x,y,c) end
      end,
  },
}

-- «StrGrid-tests»  (to ".StrGrid-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "StrGrid1.lua"

sg = StrGrid.from [[
  a b c d e f
  g h i j k l
  m n o p q r
]]
= sg
= sg:get(0,0)
= sg:get(1,0)
= sg:get(0,1)
= sg:get(10,0)

sg = StrGrid.from([[
  a b c d e f
  g h i j k l
  m n o p q r
]], -4, -1)
= sg

sg = StrGrid.from([[
  a - B - C
  | . | . |
  d - e - F
]], 0, 0, 2)
= sg
= sg:get(0,0)
= sg:get(1,0)
= sg:get(0,1)
= sg:get(0,0.5)
= sg:printxycs()
-- for x,y,c in sg:xycs() do print(x,y,c) end

  lbls = sg:labels()
= lbls
= sg:subst("aBaCaFa")

-- (find-angg "GNUPLOT/piramide-2.dem")
sg = StrGrid.from([[
   0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
   | . | . | . | . | . | . | . | . |
   0 - A - 0 - 0 - 0 - 0 - 0 - B - 0
   | . | \ | . | . | . | . | / | . |
   0 - 0 - 1 - 1 - 1 - 1 - 1 - 0 - 0
   | . | . | \ | . | . | / | . | . |
   0 - 0 - 1 - 2 - 2 - 2 - 1 - 0 - 0
   | . | . | . | \ | / | . | . | . |
   0 - 0 - 1 - 2 - C - 2 - 1 - 0 - 0
   | . | . | . | / | \ | . | . | . |
   0 - 0 - D - E - 2 - 2 - 1 - 0 - 0
   | . | . | \ | . | . | \ | . | . |
   0 - 0 - F - G - 1 - 1 - 1 - 0 - 0
   | . | / | . | . | . | . | \ | . |
   0 - H - 0 - 0 - 0 - 0 - 0 - I - 0
   | . | . | . | . | . | . | . | . |
   0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
]], 0, 0, 2)
= sg:labels()
= sg:subst("A--C--H")

--]==]



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