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