lib/lines.rb in lines-0.1.18 vs lib/lines.rb in lines-0.1.19

- old
+ new

@@ -235,34 +235,42 @@ # Used to introduce new ruby litterals. def map(klass, &rule) @mapping[klass] = rule end + attr_accessor :max_depth + protected attr_reader :mapping def initialize @mapping = {} + @max_depth = 3 end - def objenc_internal(x) - x.map{|k,v| "#{keyenc(k)}=#{valenc(v)}" }.join(' ') + def objenc_internal(x, depth=0) + depth += 1 + if depth > max_depth + '...' + else + x.map{|k,v| "#{keyenc(k)}=#{valenc(v, depth)}" }.join(' ') + end end def keyenc(k) case k when String, Symbol then strenc(k) else strenc(k.inspect) end end - def valenc(x) + def valenc(x, depth) case x - when Hash then objenc(x) - when Array then arrenc(x) + when Hash then objenc(x, depth) + when Array then arrenc(x, depth) when String, Symbol then strenc(x) when Numeric then numenc(x) when Time, Date then timeenc(x) when true then "#t" when false then "#f" @@ -270,20 +278,23 @@ else litenc(x) end end - def objenc(x) - '{' + objenc_internal(x) + '}' + def objenc(x, depth) + '{' + objenc_internal(x, depth) + '}' end - def arrenc(a) + def arrenc(a, depth) + depth += 1 # num + unit. Eg: 3ms if a.size == 2 && a.first.kind_of?(Numeric) && is_literal?(a.last.to_s) numenc(a.first) + strenc(a.last) + elsif depth > max_depth + '[...]' else - '[' + a.map{|x| valenc(x)}.join(' ') + ']' + '[' + a.map{|x| valenc(x, depth)}.join(' ') + ']' end end # TODO: Single-quote espace if possible def strenc(s) @@ -318,10 +329,10 @@ klass = (class << x; self; end).ancestors.first strenc("#<#{klass}:0x#{x.__id__.to_s(16)}>") end def timeenc(t) - t.iso8601 + t.utc.iso8601 end def is_literal?(s) !s.index(/[\s'"]/) end