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

-- A part of dednat6, rewritten as a classe with a
-- nice __tostring a nice test block. Based on:
--   (find-dn6file "abbrevs.lua")

-- «.Abbrevs»		(to "Abbrevs")
-- «.Abbrevs-tests»	(to "Abbrevs-tests")


--     _    _     _                        
--    / \  | |__ | |__  _ __ _____   _____ 
--   / _ \ | '_ \| '_ \| '__/ _ \ \ / / __|
--  / ___ \| |_) | |_) | | |  __/\ V /\__ \
-- /_/   \_\_.__/|_.__/|_|  \___| \_/ |___/
--                                         
-- «Abbrevs»  (to ".Abbrevs")
-- See: (find-dednat6 "abbrevs.lua")
--
Abbrevs = Class {
  type = "Abbrevs",
  new  = function () return Abbrevs {dict={}} end,
  __tostring = function (ab) return ab:tostring() end,
  __index = {
    tostring = function (ab)
        local q = function (o) return mytostring(o) end
        local f = function (key)
            return format(" %-8s => %s", q(key), q(ab.dict[key]))
          end
        return mapconcat(f, sorted(keys(ab.dict)), "\n")
      end,
    --
    add = function (ab, abbrev, expansion, ...)
        local dict = ab.dict
        for i=1,#abbrev-1 do                -- for each prefix of abbrev
          local prefix = abbrev:sub(1, i)   --
          dict[prefix] = dict[prefix] or 0  -- store a "keep trying"
        end
        dict[abbrev] = expansion          -- for abbrev itself, store expansion
        if select("#", ...) > 0 then   -- more abbrev/expansion pairs?
          ab:add(...)                  -- add them too (using recursion)
        end
        return ab
      end,
    del = function (ab, abbrev)
        ab.dict[abbrev] = 0            -- 0 means "keep trying"
        return ab
      end,
    --
    longestprefix = function (ab, str, j)
        local dict = ab.dict
        local longest = nil            -- longest prefix having an expansion
        for k=j,#str do
          local candidate = str:sub(j, k)
          local e = dict[candidate]
          if e == nil then break end   -- if e==nil we can stop
          if e ~= 0 then               -- if e==0 we keep trying
            longest = candidate        -- if e~=nil and e~=0 we record the match
          end
        end
        return longest, dict[longest]  -- return best match and its "expansion"
      end,
    findfirstexpansion = function (ab, str, i)
        for j=i,#str do
          local longest, expansion = ab:longestprefix(str, j)
          if longest then return j, longest, expansion end
        end
      end,
    unabbrev = function (ab, str, i)
        i = i or 1
        local j, longest, expansion = ab:findfirstexpansion(str, i, pt)
        if j then
          return str:sub(i, j-1) ..               -- the unexpandable part, then
                 expansion ..                     -- the expansion, then...
                 ab:unabbrev(str, j+#longest, pt) -- recurse!
        end
        return str:sub(i)                      -- or all the rest of the string.
      end,
  },
}


abbrevs = Abbrevs.new()
unabbrev   = function (str)       return abbrevs:unabbrev(str) end
addabbrev  = function (a, e)      return abbrevs:add(a, e) end
addabbrevs = function (a, e, ...) return abbrevs:add(a, e, ...) end
delabbrev  = function (a)         return abbrevs:del(a) end

standardabbrevs = function ()
    addabbrevs(
      "->^", "\\ton ",   "`->", "\\ito ", "-.>", "\\tnto ",
      "=>",  "\\funto ", "<->", "\\bij ", "->",  "\\to ",
      "|-",  "\\vdash ", "|->", "\\mto ", "\"",  " ")
  end


-- «Abbrevs-tests»  (to ".Abbrevs-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Dednat7.lua"
abbrevs = Abbrevs.new()
addabbrevs("->", "\\to ", "<->", "\\bij ")
=  abbrevs
=  abbrevs:longestprefix("a->b<->c", 1)
=  abbrevs:longestprefix("a->b<->c", 2)
PP(abbrevs:longestprefix("a->b<->c", 2))
PP(abbrevs:findfirstexpansion("a->b<->c", 1))
PP(abbrevs:unabbrev("a->b<->c", 6))
PP(abbrevs:unabbrev("a->b<->c", 5))
PP(abbrevs:unabbrev("a->b<->c", 4))
PP(abbrevs:unabbrev("a->b<->c", 3))
PP(abbrevs:unabbrev("a->b<->c", 2))
PP(abbrevs:unabbrev("a->b<->c", 1))
PP(abbrevs:unabbrev("a->b<->c"))
= unabbrev("a->b<->c")

--]]






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