class Dyndoc::RbServer

Public Class Methods

capture(code,rbEnvir=nil) click to toggle source
# File lib/dyndoc/base/filter/server.rb, line 129
def RbServer.capture(code,rbEnvir=nil)

    require 'stringio'
              require 'ostruct'

            begin
                # redirect output to StringIO objects
                oldstdout,oldstderr=$stdout, $stderr
                stdout, stderr = StringIO.new, StringIO.new
                $stdout, $stderr = stdout, stderr

                if rbEnvir.is_a? Binding
                  out=rbEnvir.eval(code)
                elsif rbEnvir.is_a? Module
                    out=rbEnvir.module_eval(code)
                end
            ensure
                # restore normal output
                $stdout, $stderr = oldstdout,oldstderr
            end
        {input: code, output: out.inspect, stdout: stdout.string, stderr: stderr.string}
    end
echo(code,rbEnvir=nil,prompt="ruby> ",tab=2) click to toggle source
# File lib/dyndoc/base/filter/server.rb, line 166
def RbServer.echo(code,rbEnvir=nil,prompt="ruby> ",tab=2)
            out=""
            res=RbServer.inputsAndOutputs(code,rbEnvir)
            ## Dyndoc.warn "RbServer",res
            res.each do |cmd|
                    ## Dyndoc.warn "input",cmd
                  out << prompt+ cmd[:input].split("\n").each_with_index.map{|e,i| i==0 ? e : " "*(prompt.length)+e}.join("\n").gsub(/\t/," "*tab)
                    out << "\n"
                    ## Dyndoc.warn "output1",out
                    out << cmd[:stdout]
                    out << cmd[:output] || ""
                    ## Dyndoc.warn "output2",out
                    out << cmd[:stderr]!=""  ? cmd[:stderr] : ""
                    out << (cmd[:output]  ? "\n\n" : "")
                    ## Dyndoc.warn "output3",out
            end
            out
    end
echo_verb(txt,mode,rbEnvir=nil) click to toggle source
# File lib/dyndoc/base/filter/server.rb, line 185
    def RbServer.echo_verb(txt,mode,rbEnvir=nil)
            ## Dyndoc.warn "echo_verb:txt",txt
            txtout=Dyndoc::RbServer.echo(txt.strip,rbEnvir).strip
            mode=:default unless Dyndoc::VERB.keys.include? mode
            header= (mode!=:default) and txtout.length>0
            out=""
            out << Dyndoc::VERB[mode][:begin] << "\n" if header
            out << txtout
            out << "\n" << Dyndoc::VERB[mode][:end] << "\n" if header
            out
end
filter(str,rbEnvir=nil) click to toggle source
# File lib/dyndoc/base/filter/server.rb, line 32
    def RbServer.filter(str,rbEnvir=nil)
      res=str.gsub(/\\?(?i:\#Rb|\#rb|\:Rb|\:rb|\:)#{@@start}[^#{@@stop}]+#{@@stop}/) {|w|
          if w[0,1]=="\\"
            w[1..-1]
          else
            k=(w[1,2].downcase=="rb" ? w[4..-2] : w[2..-2]) #the key
#p "apply:Rb";p k;p w;p rbEnvir
            RbServer.output(k,rbEnvir,:error=> w)
          end
        }
      res
    end
inputsAndOutputs(code,rbEnvir=nil) click to toggle source
# File lib/dyndoc/base/filter/server.rb, line 152
def RbServer.inputsAndOutputs(code,rbEnvir=nil)
    require 'ripper'
    res = []
    input = ""
    code.each_line do |l|
            input += l
            if Ripper.sexp input
                    res << RbServer.capture(input,rbEnvir)
                    input = ""
            end
    end
    res
end
output(code,rbEnvir=nil,opts={:error=>"ERROR"}) click to toggle source
def RbServer.output(code,rbEnvir=nil,error="ERROR")
  begin

puts “code”;p code

out=eval(code,rbEnvir)

puts “out”;p out

rescue
  out=error
end

p out

  out=out.join(",") if out.is_a? Array
  out.to_s
end
# File lib/dyndoc/base/filter/server.rb, line 60
    def RbServer.output(code,rbEnvir=nil,opts={:error=>"ERROR"})

            begin
                if rbEnvir.is_a? Binding
                      out=rbEnvir.eval(code)
                    elsif rbEnvir.is_a? Module
                        out=rbEnvir.module_eval(code)
                    end
            rescue
               if RUBY_VERSION >= "1.9.3" and rbEnvir.is_a? Binding and rbEnvir.eval("local_variables").include? :childBinding
                       begin
                              rbEnvir2=rbEnvir.eval("childBinding")
                              out=rbEnvir2.eval(code)
                              return out
                      rescue
                      end
               end

                        #two solution:
                        #in the same spirit as #{}
                        # out="\\:{"+code+"}"
                        # or more informative for debugging!

                        out="\\:{"+code+"}"

                        if Dyndoc.cfg_dyn[:ruby_debug] ==:expression
                       Dyndoc.warn "WARNING: >>>>>>>>>>>>>>>>>>+\n"+opts[:error]+" in #{rbEnvir}:\n"+code+"\n<<<<<<<<<<<<<<<<<<"
                        end


                        if Dyndoc.cfg_dyn[:dyndoc_mode]!=:normal and $dyn_logger
                                ##p ["error ruby",code]
                       $dyn_logger.write("\nERROR Ruby:\n"+code+"\n")
                end

            rescue SyntaxError
                        
                        $outRbError="RbServer syntax error in: "+code
                        puts $outRbError
                raise SystemError if Dyndoc.cfg_dyn[:dyndoc_mode]==:normal and  Dyndoc.cfg_dyn[:ruby_debug]!=:none
                if Dyndoc.cfg_dyn[:dyndoc_mode]!=:normal
                       $dyn_logger.write("\nERROR Ruby Syntax:\n"+code+"\n")
                end
                out=":{"+code+"}"
             end
#p out
        out
    end
redirect() { || ... } click to toggle source
# File lib/dyndoc/base/filter/server.rb, line 109
def RbServer.redirect
  if block_given?
    require 'stringio'
    begin
      # redirect output to StringIO objects
      oldstdout,oldstderr=$stdout, $stderr
      stdout, stderr = StringIO.new, StringIO.new
      $stdout, $stderr = stdout, stderr
      yield
    ensure
      # restore normal output
      $stdout, $stderr = oldstdout,oldstderr
    end
    return {stdout: stdout.string, stderr: stderr.string}
  else
    return {stdout: "", stderr: ""}
  end

end