class Awestruct::Rack::Debug

Public Class Methods

new(app) click to toggle source
# File lib/awestruct/rack/debug.rb, line 8
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/awestruct/rack/debug.rb, line 12
def call(env)
  engine = ::Awestruct::Engine.instance

  debug = false

  query = ::Rack::Utils.parse_query(env['QUERY_STRING'])
  path = env['REQUEST_PATH']
  path = path + 'index.html' if path.end_with? '/'

  page = engine.site.pages_by_output_path[path]

  debug = true if !page.nil? and query.include? 'debug'

  if debug
    debug_exp = []
    debug_exp = query['debug'].split('.').reverse unless query['debug'].nil?

    if debug_exp.size == 0
      html = IO.read(File.join(File.dirname(__FILE__), 'trace.html'))
      return [
          200,
          {'Content-Type'.freeze => 'text/html', 'Content-Length'.freeze => html.size.to_s},
          [html]
      ]
    else
      json = ''
      begin
        json = dump(introspect(page, {}, debug_exp)).freeze
      rescue Exception => e
        json += "#{e.message.freeze} \n#{e.backtrace.freeze}"
      end

      return [
          200,
          {'Content-Type'.freeze => 'application/json', 'Content-Length'.freeze => json.size.to_s},
          [json]
      ]
    end
  else
    source_call = @app.call(env)
    if source_call[1]['Content-Type'].eql? 'text/html'
      html = source_call[2][0]
      html += %Q(
        <script>
          document.addEventListener("keypress", function(event) {
              if(event.shiftKey && (event.key === '?' || event.keyCode === 63 || event.charCode === 63)) {
                  window.open(window.location.pathname + '?debug', '_blank')
              }
          });
        </script>
      )
      source_call[1]['Content-Length'] = html.size.to_s
      source_call[2][0] = html
    end
    source_call
  end
end
dump(value) click to toggle source
# File lib/awestruct/rack/debug.rb, line 135
def dump(value)
  value = value.to_h.freeze if value.respond_to? :to_h
  "#{JSON.dump(value)} \n\n "
end
introspect(source, target, exp, depth = 0) click to toggle source
# File lib/awestruct/rack/debug.rb, line 70
def introspect(source, target, exp, depth = 0)
  return target if source.nil?

  exp_all_curr = exp.clone
  exp_curr = exp_all_curr.pop

  if source.is_a? Array
    if !exp_curr.nil? and exp_curr[/^-?\d+$/]
      target_arr = []
      (0...source.size).each {|x| target_arr[x] = {}}
      target_arr[exp_curr.to_i] = introspect(source[exp_curr.to_i], {}, exp_all_curr, depth+1)
      return target_arr
    else
      target_arr = []
      source.each do |var|
        if var.respond_to? :to_h
          target_arr << introspect(var, {}, ['*'], depth+1)
        else
          target_arr << introspect(var, {}, exp, depth+1)
        end
      end
      return target_arr
    end
  end

  return source if source.is_a? String

  if exp_curr.nil?
    return source if target.empty?
    return target
  end

  data = nil

  if source.is_a? Awestruct::Page
    data = source.original_entries.freeze
  elsif source.is_a? Hash
    data = source
  elsif source.is_a? OpenStruct
    data = source.to_h.freeze
  end

  return source.to_s if data.nil?

  data.each do |key, value|
    if key.to_s == exp_curr or exp_curr == '*'
      if value.is_a? Hash or value.is_a? OpenStruct or value.is_a? Awestruct::Page or value.is_a? Array
        target[key] = introspect(value, {}, exp_all_curr, depth+1)
      elsif value.respond_to? :to_h
        target[key] = introspect(value.to_h.freeze, {}, exp_all_curr, depth+1)
      else
        target[key] = value.to_s
      end
    elsif exp_curr[/^-?\d+$/]
      if value.is_a? Array
        target_arr = []
        target_arr << introspect(value[exp_curr.to_i], {}, exp_all_curr, depth+1)
        target[key] = target_arr
      end
    end

  end
  target
end