diff --git a/stead/xobj.lua b/stead/xact.lua similarity index 53% rename from stead/xobj.lua rename to stead/xact.lua index 4b7950c..eb9767c 100644 --- a/stead/xobj.lua +++ b/stead/xact.lua @@ -1,43 +1,3 @@ -function isXobject(s) - return type(s) == 'table' and s.xobject_type; -end - -__hook_act = function(v, n) - local k,o - if type(v.var) == 'table' then - for k,o in ipairs(v.var) do -- var add - if o == n then - stead.table.insert(v.var, 'x'..n); - break - end - end - end - return function(s, ...) - local r, v = call(s, 'x'..n, unpack(arg)); - if type(r) == 'string' then - r = do_xact(s, r); - end - return r,v - end -end - -xobj = stead.inherit(obj, function(v) -- object without name and dsc, but with xact attribute - v.xdsc = v.dsc - v.dsc = __hook_act(v, 'dsc'); - v.xact = v.act - v.act = __hook_act(v, 'act'); - v.xinv = v.inv - v.inv = __hook_act(v, 'inv'); - v.xtak = v.tak - v.tak = __hook_act(v, 'tak'); - v.xuse = v.use - v.use = __hook_act(v, 'use'); - v.xused = v.used - v.used = __hook_act(v, 'used'); - v.xobject_type = true - return v -end) - xact = function(n, f) -- just simple action! local v = {}; if type(n) ~= 'string' or (type(f) ~= 'string' and not isCode(f)) then @@ -45,7 +5,7 @@ xact = function(n, f) -- just simple action! end v.nam = n v.act = f; - v = xobj(v); + v = obj(v); v.save = function(self, name, h, need) if need then local f = self.xact; @@ -61,7 +21,7 @@ xact = function(n, f) -- just simple action! return v end -do_xact = function(self, str) +__do_xact = function(str) local aarg = {} local function parg(v) stead.table.insert(aarg, v); @@ -81,10 +41,11 @@ do_xact = function(self, str) o = o:sub(1, i - 1); a:gsub('[^,()]+', parg); end - if o == '' then o = self end + if o == '' then + error("Empty link: "..s, 2); + end else - o = self - d = s; + error("Wrong link: "..s, 2); end local oo = objs():srch(o) if not oo then @@ -93,13 +54,14 @@ do_xact = function(self, str) return xref(d, ref(oo), unpack(aarg)); end if type(str) ~= 'string' then return end - me():tag() local s = stead.string.gsub(str,'{[^}]+}', xrefrep); return s; end -xroom = stead.inherit(room, function(v) - v.xdsc = v.dsc - v.dsc = __hook_act(v, 'dsc'); - return v; +stead.fmt = stead.hook(stead.fmt, function(f, ...) + local r = f(unpack(arg)) + if type(r) == 'string' and stead.state then + r = __do_xact(r); + end + return r; end)