class JavascriptQueryHook

Constants

CONST_ASSIGN_REGEXP
VAR_ASSIGN_REGEXP
VAR_REGEXP

Public Instance Methods

command_line(filename) click to toggle source
# File lib/query_hook.rb, line 49
def command_line(filename)
  "node #{filename}"
end
compile_file_content(r) click to toggle source
# File lib/query_hook.rb, line 13
def compile_file_content(r)
  "#{compile_file_header(r)}\n#{compile_query(r.query)}"
end
compile_file_header(r) click to toggle source
# File lib/query_hook.rb, line 17
  def compile_file_header(r)
<<javascript
'use strict';

function mumukiConsolePrettyPrint(e) {
    if (e instanceof Function) return '<function>';
    const json = JSON.stringify(e);
    return json && json.replace(/"(\\w+)"\s*:/g, '$1:');
 }

#{r.extra}

#{r.content}

#{compile_cookie(r.cookie)}
javascript
  end
compile_query(query, output_prefix = "=> ", output_var = "__mumuki_query_result__") click to toggle source
# File lib/query_hook.rb, line 35
def compile_query(query, output_prefix = "=> ", output_var = "__mumuki_query_result__")
  if ['var', 'let', 'const'].any? { |type| query.start_with? "#{type} " }
    "#{query}\nconsole.log('#{output_prefix}undefined')"
  else
    "var #{output_var} = #{query};\nconsole.log('#{output_prefix}' + mumukiConsolePrettyPrint(#{output_var}))"
  end
end
tempfile_extension() click to toggle source
# File lib/query_hook.rb, line 9
def tempfile_extension
  '.js'
end

Private Instance Methods

compile_statements(cookie) click to toggle source
# File lib/query_hook.rb, line 55
def compile_statements(cookie)
  reject_duplicated_statements wrap_statements(cookie)
end
declaration?(line, name) click to toggle source
# File lib/query_hook.rb, line 86
def declaration?(line, name)
  declaration_of_type?(VAR_REGEXP, line, name) ||
    declaration_of_type?(VAR_ASSIGN_REGEXP, line, name) ||
    declaration_of_type?(CONST_ASSIGN_REGEXP, line, name)
end
declaration_of_type?(type_pattern, line, name) click to toggle source
# File lib/query_hook.rb, line 92
def declaration_of_type?(type_pattern, line, name)
  line.match(type_pattern) && $1 == name
end
declaration_with_assignment(type, type_pattern, name, expression) click to toggle source
# File lib/query_hook.rb, line 82
def declaration_with_assignment(type, type_pattern, name, expression)
  "#{type} #{name} = (function() { try { return #{expression.gsub(type_pattern, '')} } catch(e) { return undefined } })()"
end
error_patterns() click to toggle source
# File lib/query_hook.rb, line 96
def error_patterns
  [
    Mumukit::ErrorPattern::Errored.new(error_regexp)
  ]
end
error_regexp() click to toggle source
# File lib/query_hook.rb, line 106
def error_regexp
  /(?=\X*#{error_types})(solution.*\n|var __mumuki_query_result__ = )|#{error_types}.*\n\K\X*/
end
error_types() click to toggle source
# File lib/query_hook.rb, line 102
def error_types
  '(Reference|Syntax|Type)Error'
end
reject_duplicated_statements(sentences) click to toggle source
# File lib/query_hook.rb, line 74
def reject_duplicated_statements(sentences)
  sentences.select.with_index do |line, index|
    next line if !line.match(VAR_ASSIGN_REGEXP) && !line.match(VAR_REGEXP) && !line.match(CONST_ASSIGN_REGEXP)
    name = $1
    sentences.slice(0, index).none? { |previous_line| declaration? previous_line, name }
  end
end
wrap_statements(cookie) click to toggle source
# File lib/query_hook.rb, line 59
def wrap_statements(cookie)
  cookie.map do |query|
    case query
    when CONST_ASSIGN_REGEXP
      declaration_with_assignment 'const', CONST_ASSIGN_REGEXP, $1, query
    when VAR_ASSIGN_REGEXP
      declaration_with_assignment 'var', VAR_ASSIGN_REGEXP, $1, query
    when VAR_REGEXP
      "var #{$1}"
    else
      "try { #{query} } catch (e) {}"
    end
  end
end