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