class Ciphr::Transformer
Public Class Methods
new(input)
click to toggle source
Calls superclass method
# File lib/ciphr/parser.rb, line 37 def initialize(input) super() @input = input #in ctor to provide instance scope to rule blocks rule(:name => simple(:v)) { v } rule(:file => simple(:v)) {|d| Ciphr::Functions::Reader::FileReader.new({:file => d[:v].to_s}, [])} #eagerly eval these? #trim to nearest byte vs chunk? rule(:string => simple(:v)) {|d| Ciphr::Functions::Reader::StringReader.new({:string => d[:v]},[]) } rule(:b2 => simple(:v)) {|d| Ciphr::Functions::Base::Base2.new({:radix => 2}, [Ciphr::Functions::Reader::StringReader.new({:string => lpad(d[:v].to_s,8,"0")},[])]).tap{|f| f.invert = true} } rule(:b8 => simple(:v)) {|d| Ciphr::Functions::Base::Base8.new({:radix => 8}, [Ciphr::Functions::Reader::StringReader.new({:string => lpad(d[:v].to_s,8,"0")},[])]).tap{|f| f.invert = true} } rule(:b10 => simple(:v)) {|d| Ciphr::Functions::Radix::Radix.new({:radix => 10}, [Ciphr::Functions::Reader::StringReader.new({:string => d[:v].to_s},[])]).tap{|f| f.invert = true} } rule(:b16 => simple(:v)) {|d| Ciphr::Functions::Base::Base16.new({:radix => 16}, [Ciphr::Functions::Reader::StringReader.new({:string => lpad(d[:v].to_s,2,"0")},[])]).tap{|f| f.invert = true} } rule(:b64 => simple(:v)) {|d| Ciphr::Functions::Base::Base64.new({:chars => "+/="}, [Ciphr::Functions::Reader::StringReader.new({:string => d[:v]},[])]).tap{|f| f.invert = true} } rule(:arguments => sequence(:arguments), :invert => simple(:invert), :name => simple(:name)) {|d| transform_call(d) } rule(:arguments => simple(:arguments), :invert => simple(:invert), :name => simple(:name)) {|d| transform_call(d) } rule(:invert => simple(:invert), :name => simple(:name)) {|d| transform_call(d) } rule(:operations => simple(:operations)) {|d| transform_operations(d)} rule(:operations => sequence(:operations)) {|d| transform_operations(d)} end
Public Instance Methods
lpad(s,n,p)
click to toggle source
# File lib/ciphr/parser.rb, line 59 def lpad(s,n,p) s.size % n == 0 ? s : p * (n - s.size % n) + s end
transform_call(d)
click to toggle source
# File lib/ciphr/parser.rb, line 71 def transform_call(d) klass, options = Ciphr::FunctionRegistry.global[d[:name].to_s] f = klass.new(options, [d[:arguments]||[]].flatten) f.invert = true if d[:invert] f end
transform_operations(d)
click to toggle source
# File lib/ciphr/parser.rb, line 63 def transform_operations(d) operations = [d[:operations]].flatten if operations[0].args.size < operations[0].class.params.size operations.unshift(Ciphr::Functions::Reader::IoReader.new({},[@input])) end operations.inject{|m,f| f.args = [f.args||[]].flatten.unshift(m); f } end