bin/nilac in nilac-0.0.4.3.3 vs bin/nilac in nilac-0.0.4.3.4
- old
+ new
@@ -1,4734 +1,4734 @@
-#!/usr/bin/env ruby
-
-#Nilac is the official Nila compiler. It compiles Nila into pure Javascript. Nilac is currently
-#written in Ruby but will be self hosted in the upcoming years.
-
-#Nila and Nilac are being crafted by Adhithya Rajasekaran and Sri Madhavi Rajasekaran
-
-require 'slop'
-require 'fileutils'
-
-
-def compile(input_file_path, *output_file_name)
-
- def read_file_line_by_line(input_path)
-
- file_id = open(input_path)
-
- file_line_by_line = file_id.readlines()
-
- file_id.close
-
- return file_line_by_line
-
- end
-
- def extract_parsable_file(input_file_contents)
-
- reversed_file_contents = input_file_contents.reverse
-
- line_counter = 0
-
- if input_file_contents.join.include?("__END__")
-
- while !reversed_file_contents[line_counter].strip.include?("__END__")
-
- line_counter += 1
-
- end
-
- return_contents = input_file_contents[0...-1*line_counter-1]
-
- else
-
- input_file_contents
-
- end
-
- end
-
- def replace_multiline_comments(input_file_contents, nila_file_path, *output_js_file_path)
-
- #This method will replace both the single and multiline comments
- #
- #Single line comment will be replaced by => --single_line_comment[n]
- #
- #Multiline comment will be replaced by => --multiline_comment[n]
-
- def find_all_matching_indices(input_string, pattern)
-
- locations = []
-
- index = input_string.index(pattern)
-
- while index != nil
-
- locations << index
-
- index = input_string.index(pattern, index+1)
-
-
- end
-
- return locations
-
-
- end
-
- def find_file_path(input_path, file_extension)
-
- extension_remover = input_path.split(file_extension)
-
- remaining_string = extension_remover[0].reverse
-
- path_finder = remaining_string.index("/")
-
- remaining_string = remaining_string.reverse
-
- return remaining_string[0...remaining_string.length-path_finder]
-
- end
-
- def find_file_name(input_path, file_extension)
-
- extension_remover = input_path.split(file_extension)
-
- remaining_string = extension_remover[0].reverse
-
- path_finder = remaining_string.index("/")
-
- remaining_string = remaining_string.reverse
-
- return remaining_string[remaining_string.length-path_finder..-1]
-
- end
-
- multiline_comments = []
-
- file_contents_as_string = input_file_contents.join
-
- modified_file_contents = file_contents_as_string.dup
-
- multiline_comment_counter = 1
-
- multiline_comments_start = find_all_matching_indices(file_contents_as_string, "=begin")
-
- multiline_comments_end = find_all_matching_indices(file_contents_as_string, "=end")
-
- for y in 0...multiline_comments_start.length
-
- start_of_multiline_comment = multiline_comments_start[y]
-
- end_of_multiline_comment = multiline_comments_end[y]
-
- multiline_comment = file_contents_as_string[start_of_multiline_comment..end_of_multiline_comment+3]
-
- modified_file_contents = modified_file_contents.gsub(multiline_comment, "--multiline_comment[#{multiline_comment_counter}]\n\n")
-
- multiline_comment_counter += 1
-
- multiline_comments << multiline_comment
-
-
- end
-
- temporary_nila_file = find_file_path(nila_file_path, ".nila") + "temp_nila.nila"
-
- if output_js_file_path.empty?
-
- output_js_file = find_file_path(nila_file_path, ".nila") + find_file_name(nila_file_path, ".nila") + ".js"
-
- else
-
- output_js_file = output_js_file_path[0]
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id2 = open(output_js_file, 'w')
-
- file_id.write(modified_file_contents)
-
- file_id.close()
-
- file_id2.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- comments = multiline_comments.dup
-
- return line_by_line_contents, comments, temporary_nila_file, output_js_file
-
- end
-
- def split_semicolon_seperated_expressions(input_file_contents)
-
- modified_file_contents = input_file_contents.dup
-
- input_file_contents.each_with_index do |line, index|
-
- if line.include?("\"")
-
- first_index = line.index("\"")
-
- modified_line = line.sub(line[first_index..line.index("\"", first_index+1)], "--string")
-
- elsif line.include?("'")
-
- first_index = line.index("'")
-
- modified_line = line.sub(line[first_index..line.index("'", first_index+1)], "--string")
-
- else
-
- modified_line = line
-
- end
-
- if modified_line.include?(";")
-
- replacement_line = modified_file_contents[index]
-
- replacement_line = replacement_line.split(";").join("\n\n") + "\n"
-
- modified_file_contents[index] = replacement_line
-
- end
-
- end
-
- return modified_file_contents
-
- end
-
- def compile_heredocs(input_file_contents, temporary_nila_file)
-
- joined_file_contents = input_file_contents.join
-
- possible_heredocs = input_file_contents.reject { |element| !element.include?("<<-") }
-
- possible_heredocs = possible_heredocs.collect { |element| element.match(/<<-(.*|\w*)/).to_a[0] }
-
- possible_heredocs.each do |heredoc|
-
- delimiter = heredoc[3..-1]
-
- quote = 2
-
- if delimiter.include?("'")
-
- quote = 1
-
- end
-
- delimiter = delimiter.gsub("\"", "") if quote == 2
-
- delimiter = delimiter.gsub("'", "") if quote == 1
-
- string_split = joined_file_contents.split(heredoc, 2)
-
- string_extract = string_split[1]
-
- heredoc_extract = string_extract[0...string_extract.index(delimiter)]
-
- replacement_string = ""
-
- if quote == 1
-
- replacement_string = "'#{heredoc_extract.delete("\"")}'".lstrip.inspect
-
- replacement_string = replacement_string[1..-2]
-
- elsif quote == 2
-
- replacement_string = heredoc_extract.lstrip.inspect
-
- end
-
- joined_file_contents = joined_file_contents.sub(heredoc + heredoc_extract + delimiter, replacement_string)
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
-
- end
-
- def compile_interpolated_strings(input_file_contents)
-
- def find_all_matching_indices(input_string, pattern)
-
- locations = []
-
- index = input_string.index(pattern)
-
- while index != nil
-
- locations << index
-
- index = input_string.index(pattern, index+1)
-
-
- end
-
- return locations
-
-
- end
-
- modified_file_contents = input_file_contents.dup
-
- single_quoted_strings = input_file_contents.reject { |element| !(element.count("'") >= 2) }
-
- single_quoted_strings.each do |str|
-
- modified_string = str.dup
-
- while modified_string.include?("'")
-
- first_index = modified_string.index("'")
-
- string_extract = modified_string[first_index..modified_string.index("'", first_index+1)]
-
- modified_string = modified_string.sub(string_extract, "--single_quoted")
-
- end
-
- input_file_contents[input_file_contents.index(str)] = modified_string
-
- end
-
- input_file_contents.each_with_index do |line, index|
-
- if line.include?("\#{")
-
- modified_line = line.dup
-
- interpol_starting_loc = find_all_matching_indices(modified_line, "\#{") + [-1]
-
- interpolated_strings = []
-
- until interpol_starting_loc.empty?
-
- interpol_starting_loc[1] = -2 if interpol_starting_loc[1] == -1
-
- string_extract = modified_line[interpol_starting_loc[0]+1..interpol_starting_loc[1]+1]
-
- closed_curly_brace_index = find_all_matching_indices(string_extract, "}")
-
- index_counter = 0
-
- test_string = ""
-
- until closed_curly_brace_index.empty?
-
- test_string = string_extract[0..closed_curly_brace_index[0]]
-
- puts test_string
-
- original_string = test_string.dup
-
- if test_string.include?("{")
-
- test_string = test_string.reverse.sub("{", "$#{index_counter}$").reverse
-
- test_string[-1] = "@#{index_counter}@"
-
- end
-
- string_extract = string_extract.sub(original_string, test_string)
-
- closed_curly_brace_index = find_all_matching_indices(string_extract, "}")
-
- index_counter += 1
-
- end
-
- string_extract = string_extract[0..string_extract.length-string_extract.reverse.index(/@\d@/)]
-
- interpolated_string = "\#{" + string_extract.split("@#{index_counter-1}@")[0].split("$#{index_counter-1}$")[1] + "}"
-
- to_be_replaced = interpolated_string.scan(/\$\d\$/)
-
- closing_brace_rep = interpolated_string.scan(/@\d@/)
-
- to_be_replaced.each_with_index do |rep, index|
-
- interpolated_string = interpolated_string.sub(rep, "{").sub(closing_brace_rep[index], "}")
-
- end
-
- interpolated_strings << interpolated_string
-
- modified_line = modified_line.sub(interpolated_string, "--interpolate")
-
- if find_all_matching_indices(modified_line, "\#{").empty?
-
- interpol_starting_loc = []
-
- else
-
- interpol_starting_loc = find_all_matching_indices(modified_line, "\#{") + [-1]
-
- end
-
- end
-
- interpolated_strings.each do |interpol|
-
- string_split = line.split(interpol)
-
- if string_split[1].eql?("\"\n")
-
- replacement_string = "\" + " + "(#{interpol[2...-1]})"
-
- modified_file_contents[index] = modified_file_contents[index].sub(interpol+"\"", replacement_string)
-
- elsif string_split[1].eql?("\")\n")
-
- replacement_string = "\" + " + "(#{interpol[2...-1]})"
-
- modified_file_contents[index] = modified_file_contents[index].sub(interpol + "\"", replacement_string)
-
- else
-
- replacement_string = "\"" + " + " + "(#{interpol[2...-1]})" + " + \""
-
- modified_file_contents[index] = modified_file_contents[index].sub(interpol, replacement_string)
-
- end
-
- end
-
- end
-
- end
-
- return modified_file_contents
-
- end
-
- def replace_singleline_comments(input_file_contents)
-
- single_line_comments = []
-
- singleline_comment_counter = 1
-
- for x in 0...input_file_contents.length
-
- current_row = input_file_contents[x]
-
- if current_row.include?("#")
-
- comment_start = current_row.index("#")
-
- if current_row[comment_start+1] != "{"
-
- comment = current_row[comment_start..-1]
-
- single_line_comments << comment
-
- current_row = current_row.gsub(comment, "--single_line_comment[#{singleline_comment_counter}]\n\n")
-
- singleline_comment_counter += 1
-
- end
-
- end
-
- input_file_contents[x] = current_row
-
- end
-
- return input_file_contents, single_line_comments
-
- end
-
- def replace_named_functions(nila_file_contents, temporary_nila_file)
-
- def extract_array(input_array, start_index, end_index)
-
- return input_array[start_index..end_index]
-
- end
-
- end_locations = []
-
- key_word_locations = []
-
- start_blocks = []
-
- end_blocks = []
-
- nila_regexp = /(def )/
-
- named_code_blocks = []
-
- for x in 0...nila_file_contents.length
-
- current_row = nila_file_contents[x]
-
- if current_row.index(nila_regexp) != nil
-
- key_word_locations << x
-
- elsif current_row.lstrip.include?("end\n") || current_row.include?("end")
-
- end_locations << x
-
-
- end
-
-
- end
-
- unless key_word_locations.empty?
-
- modified_file_contents = nila_file_contents.dup
-
- for y in 0...end_locations.length
-
- current_location = end_locations[y]
-
- current_string = modified_file_contents[current_location]
-
- finder_location = current_location
-
- begin
-
- while current_string.index(nila_regexp) == nil
-
- finder_location -= 1
-
- current_string = modified_file_contents[finder_location]
-
- end
-
- code_block_begin = finder_location
-
- code_block_end = current_location
-
- start_blocks << code_block_begin
-
- end_blocks << code_block_end
-
- code_block_begin_string_split = modified_file_contents[code_block_begin].split(" ")
-
- code_block_begin_string_split[0] = code_block_begin_string_split[0].reverse
-
- code_block_begin_string = code_block_begin_string_split.join(" ")
-
- modified_file_contents[code_block_begin] = code_block_begin_string
-
- rescue NoMethodError
-
- puts "Function compilation failed!"
-
- end
-
- end
-
- final_modified_file_contents = nila_file_contents.dup
-
- joined_file_contents = final_modified_file_contents.join
-
- while start_blocks.length != 0
-
- top_most_level = start_blocks.min
-
- top_most_level_index = start_blocks.index(top_most_level)
-
- matching_level = end_blocks[top_most_level_index]
-
- named_code_blocks << extract_array(final_modified_file_contents, top_most_level, matching_level)
-
- start_blocks.delete_at(top_most_level_index)
-
- end_blocks.delete(matching_level)
-
- end
-
- codeblock_counter = 1
-
- named_functions = named_code_blocks.dup
-
- nested_functions = []
-
- named_code_blocks.each do |codeblock|
-
- if joined_file_contents.include?(codeblock.join)
-
- joined_file_contents = joined_file_contents.sub(codeblock.join, "--named_function[#{codeblock_counter}]\n")
-
- codeblock_counter += 1
-
- nested_functions = nested_functions + [[]]
-
- else
-
- nested_functions[codeblock_counter-2] << codeblock
-
- named_functions.delete(codeblock)
-
- end
-
- end
-
- else
-
- joined_file_contents = nila_file_contents.join
-
- named_functions = []
-
- nested_functions = []
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents, named_functions, nested_functions
-
-
- end
-
- def compile_parallel_assignment(input_file_contents, temporary_nila_file)
-
- def arrayify_right_side(input_string)
-
- javascript_regexp = /(if |while |for |function |function\()/
-
- if input_string.include?("=") and input_string.index(javascript_regexp) == nil and input_string.strip[0..3] != "_ref" and !input_string.split("=")[1].include?("[")
-
- modified_input_string = input_string.dup
-
- right_side = input_string.split("=")[1]
-
- if right_side.include?(",")
-
- splits = right_side.split(",")
-
- replacement_string = []
-
- splits.each do |str|
-
- unless str.include?(")") and !str.include?("(")
-
- replacement_string << str
-
- else
-
- replacement_string[-1] = replacement_string[-1]+ "," +str
-
- end
-
- end
-
- replacement_string = " [#{replacement_string.join(",").strip}]\n"
-
- input_string = input_string.sub(right_side,replacement_string)
-
- end
-
- end
-
- return input_string
-
- end
-
- input_file_contents = input_file_contents.collect {|element| arrayify_right_side(element)}
-
- possible_variable_lines = input_file_contents.reject { |element| !element.include? "=" }
-
- possible_parallel_assignment = possible_variable_lines.reject { |element| !element.split("=")[0].include? "," }
-
- parallel_assignment_index = []
-
- possible_parallel_assignment.each do |statement|
-
- location_array = input_file_contents.each_index.select { |index| input_file_contents[index] == statement }
-
- parallel_assignment_index << location_array[0]
-
- end
-
- modified_file_contents = input_file_contents.dup
-
- parallel_assignment_counter = 1
-
- possible_parallel_assignment.each_with_index do |line, index|
-
- line_split = line.split(" = ")
-
- right_side_variables = line_split[0].split(",")
-
- replacement_string = "_ref#{parallel_assignment_counter} = #{line_split[1]}\n\n"
-
- variable_string = ""
-
- right_side_variables.each_with_index do |variable, var_index|
-
- variable_string = variable_string + variable.rstrip + " = _ref#{parallel_assignment_counter}[#{var_index}]\n\n"
-
- end
-
- replacement_string = replacement_string + variable_string
-
- modified_file_contents[parallel_assignment_index[index]] = replacement_string
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(modified_file_contents.join)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_default_values(input_file_contents, temporary_nila_file)
-
- #This method compiles default values present in functions. An example is provided below
-
- # def fill(container = "cup",liquid = "coffee")
- # puts "Filling the #{container} with #{liquid}"
- # end
-
- def parse_default_values(input_function_definition)
-
- split1, split2 = input_function_definition.split("(")
-
- split2, split3 = split2.split(")")
-
- function_parameters = split2.split(",")
-
- default_value_parameters = function_parameters.reject { |element| !element.include? "=" }
-
- replacement_parameters = []
-
- replacement_string = ""
-
- default_value_parameters.each do |paramvalue|
-
- param, value = paramvalue.split("=")
-
- replacement_parameters << param.lstrip.rstrip
-
- replacement_string = replacement_string + "\n" + "if (#{param.lstrip.rstrip} equequ null) {\n #{paramvalue.lstrip.rstrip}\n}\n" +"\n"
-
- end
-
- return replacement_string, default_value_parameters, replacement_parameters
-
- end
-
- possible_default_values = input_file_contents.dup.reject { |element| !element.include?("def") }
-
- possible_default_values = possible_default_values.reject { |element| !element.include?("=") }
-
- if !possible_default_values.empty?
-
- possible_default_values.each do |line|
-
- current_line_index = input_file_contents.each_index.select { |index| input_file_contents[index] == line }.flatten[0]
-
- replacement_string, value_parameters, replacement_parameters = parse_default_values(line)
-
- modified_line = line.dup
-
- value_parameters.each_with_index do |val, index|
-
- modified_line = modified_line.sub(val, replacement_parameters[index])
-
- end
-
- input_file_contents[current_line_index] = modified_line
-
- input_file_contents[current_line_index + 1] = replacement_string
-
- end
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(input_file_contents.join)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def get_variables(input_file_contents, temporary_nila_file, *loop_variables)
-
- variables = []
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("==", "equalequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("!=", "notequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("+=", "plusequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("-=", "minusequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("*=", "multiequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("/=", "divequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("%=", "modequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("=~", "matchequal") }
-
- javascript_regexp = /(if |while |for )/
-
- for x in 0...input_file_contents.length
-
- current_row = input_file_contents[x]
-
- if current_row.include?("=") and current_row.index(javascript_regexp) == nil
-
- current_row = current_row.rstrip + "\n"
-
- current_row_split = current_row.split("=")
-
- for y in 0...current_row_split.length
-
- current_row_split[y] = current_row_split[y].strip
-
-
- end
-
- if current_row_split[0].include?("[") or current_row_split[0].include?("(")
-
- current_row_split[0] = current_row_split[0][0...current_row_split[0].index("[")]
-
- end
-
- variables << current_row_split[0]
-
-
- end
-
- input_file_contents[x] = current_row
-
- end
-
- file_contents_as_string = input_file_contents.join
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(file_contents_as_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- for_loop_variables = []
-
- for_loop_statements = line_by_line_contents.reject {|line| !line.include?("for")}
-
- for_loop_statements.each do |statement|
-
- varis = statement.split("for (")[1].split(";",2)[0].split(",")
-
- for_loop_variables << varis.collect {|vari| vari.strip.split("=")[0].strip}
-
- for_loop_variables = for_loop_variables.flatten
-
- end
-
- variables += loop_variables
-
- variables += for_loop_variables
-
- variables = variables.flatten
-
- if variables.length > 0
-
- variable_declaration_string = "var " + variables.uniq.sort.join(", ") + "\n\n"
-
- line_by_line_contents = [variable_declaration_string, line_by_line_contents].flatten
-
- end
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("plusequal", "+=") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("minusequal", "-=") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("multiequal", "*=") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("divequal", "/=") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("modequal", "%=") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("equalequal", "==") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("notequal", "!=") }
-
- line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("matchequal", "=~") }
-
- return variables.uniq, line_by_line_contents
-
- end
-
- def remove_question_marks(input_file_contents, variable_list, temporary_nila_file)
-
- #A method to remove question marks from global variable names. Local variables are dealt
- #with in their appropriate scope.
-
- #Params:
- #input_file_contents => An array containing the contents of the input nila file
- #variable_list => An array containing all the global variables declared in the file
- #temporary_nila_file => A file object used to write temporary contents
-
- #Example:
-
- #Nila
- #isprime? = false
-
- #Javascript Output
- #var isprime;
- #isprime = false;
-
- #Returns a modified input_file_contents with all the question marks removed
-
- joined_file_contents = input_file_contents.join
-
- variable_list.each do |var|
-
- if var.include? "?"
-
- joined_file_contents = joined_file_contents.gsub(var, var[0...-1])
-
- end
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_arrays(input_file_contents, temporary_nila_file)
-
- def compile_w_arrays(input_file_contents)
-
- def extract(input_string, pattern_start, pattern_end)
-
- def find_all_matching_indices(input_string, pattern)
-
- locations = []
-
- index = input_string.index(pattern)
-
- while index != nil
-
- locations << index
-
- index = input_string.index(pattern, index+1)
-
-
- end
-
- return locations
-
-
- end
-
- all_start_locations = find_all_matching_indices(input_string, pattern_start)
-
- all_end_locations = find_all_matching_indices(input_string, pattern_end)
-
- pattern = []
-
- all_start_locations.each_with_index do |location, index|
-
- pattern << input_string[location..all_end_locations[index]]
-
- end
-
- return pattern
-
- end
-
- def compile_w_syntax(input_string)
-
- modified_input_string = input_string[3...-1]
-
- string_split = modified_input_string.split(" ")
-
- return string_split.to_s
-
- end
-
- modified_file_contents = input_file_contents.dup
-
- input_file_contents.each_with_index do |line, index|
-
- if line.include?("%w{")
-
- string_arrays = extract(line, "%w{", "}")
-
- string_arrays.each do |array|
-
- modified_file_contents[index] = modified_file_contents[index].sub(array, compile_w_syntax(array))
-
- end
-
- end
-
- end
-
- return modified_file_contents
-
- end
-
- def compile_array_indexing(input_file_contents)
-
- possible_indexing_operation = input_file_contents.dup.reject { |element| !element.include? "[" and !element.include? "]" }
-
- possible_range_indexing = possible_indexing_operation.reject { |element| !element.include? ".." }
-
- triple_range_indexing = possible_range_indexing.reject { |element| !element.include? "..." }
-
- triple_range_indexes = []
-
- triple_range_indexing.each do |line|
-
- triple_range_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == line }
-
- end
-
- triple_range_indexes = triple_range_indexes.flatten
-
- triple_range_indexing.each_with_index do |line, index|
-
- split1, split2 = line.split("[")
-
- range_index, split3 = split2.split("]")
-
- index_start, index_end = range_index.split "..."
-
- replacement_string = nil
-
- if index_end.strip == "end"
-
- replacement_string = split1 + ".slice(#{index_start},#{split}.length)\n"
-
- else
-
- replacement_string = split1 + ".slice(#{index_start},#{index_end})\n"
-
- end
-
- possible_range_indexing.delete(input_file_contents[triple_range_indexes[index]])
-
- possible_indexing_operation.delete(input_file_contents[triple_range_indexes[index]])
-
- input_file_contents[triple_range_indexes[index]] = replacement_string
-
- end
-
- double_range_indexing = possible_range_indexing.reject { |element| !element.include?("..") }
-
- double_range_indexes = []
-
- double_range_indexing.each do |line|
-
- double_range_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == line }
-
- end
-
- double_range_indexes = double_range_indexes.flatten
-
- double_range_indexing.each_with_index do |line, index|
-
- split1, split2 = line.split("[")
-
- range_index, split3 = split2.split("]")
-
- index_start, index_end = range_index.split ".."
-
- index_start = "" if index_start.nil?
-
- index_end = "" if index_end.nil?
-
- replacement_string = nil
-
- if index_end.strip == "end"
-
- replacement_string = split1 + ".slice(#{index_start})\n"
-
- elsif index_end.strip == "" and index_start.strip == ""
-
- replacement_string = split1 + ".slice(0)\n"
-
- else
-
- replacement_string = split1 + ".slice(#{index_start},#{index_end}+1)\n"
-
- end
-
- possible_range_indexing.delete(input_file_contents[double_range_indexes[index]])
-
- possible_indexing_operation.delete(input_file_contents[double_range_indexes[index]])
-
- input_file_contents[double_range_indexes[index]] = replacement_string
-
- end
-
- duplicating_operations = input_file_contents.dup.reject { |element| !element.include?(".dup") }
-
- duplicating_operation_indexes = []
-
- duplicating_operations.each do |line|
-
- duplicating_operation_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == line }
-
- end
-
- duplicating_operation_indexes = duplicating_operation_indexes.flatten
-
- duplicating_operation_indexes.each do |index|
-
- input_file_contents[index] = input_file_contents[index].sub(".dup", ".slice(0)")
-
- end
-
- return input_file_contents
-
- end
-
- def compile_multiline(input_file_contents, temporary_nila_file)
-
- possible_arrays = input_file_contents.reject { |element| !element.include?("[") }
-
- possible_multiline_arrays = possible_arrays.reject { |element| element.include?("]") }
-
- multiline_arrays = []
-
- possible_multiline_arrays.each do |starting_line|
-
- index = input_file_contents.index(starting_line)
-
- line = starting_line
-
- until line.include?("]")
-
- index += 1
-
- line = input_file_contents[index]
-
- end
-
- multiline_arrays << input_file_contents[input_file_contents.index(starting_line)..index]
-
- end
-
- joined_file_contents = input_file_contents.join
-
- multiline_arrays.each do |array|
-
- modified_array = array.join
-
- array_extract = modified_array[modified_array.index("[")..modified_array.index("]")]
-
- array_contents = array_extract.split("[")[1].split("]")[0].lstrip.rstrip.split(",").collect { |element| element.lstrip.rstrip }
-
- array_contents = "[" + array_contents.join(",") + "]"
-
- joined_file_contents = joined_file_contents.sub(array_extract, array_contents)
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_array_operators(input_file_contents)
-
- possible_operator_usage = input_file_contents.reject { |element| !element.include?("<<") }
-
- possible_operator_usage.each do |usage|
-
- left, right = usage.split("<<")
-
- input_file_contents[input_file_contents.index(usage)] = left.rstrip + ".push(#{right.lstrip})"
-
- end
-
- return input_file_contents
-
- end
-
- input_file_contents = compile_w_arrays(input_file_contents)
-
- input_file_contents = compile_array_indexing(input_file_contents)
-
- input_file_contents = compile_multiline(input_file_contents, temporary_nila_file)
-
- input_file_contents = compile_array_operators(input_file_contents)
-
- return input_file_contents
-
-
- end
-
- def compile_hashes(input_file_contents,temporary_nila_file)
-
- def compile_multiline_hashes(input_file_contents,temporary_nila_file)
-
- javascript_regexp = /(if |while |for |function |function\()/
-
- possible_hashes = input_file_contents.reject { |element| !element.include?("{") }
-
- possible_multiline_hashes = possible_hashes.reject { |element| element.include?("}") }
-
- possible_multiline_hashes = possible_multiline_hashes.reject {|element| element.index(javascript_regexp) != nil}
-
- multiline_hashes = []
-
- possible_multiline_hashes.each do |starting_line|
-
- index = input_file_contents.index(starting_line)
-
- line = starting_line
-
- until line.include?("}\n")
-
- index += 1
-
- line = input_file_contents[index]
-
- end
-
- multiline_hashes << input_file_contents[input_file_contents.index(starting_line)..index]
-
- end
-
- joined_file_contents = input_file_contents.join
-
- multiline_hashes.each do |hash|
-
- modified_hash = hash.join
-
- hash_extract = modified_hash[modified_hash.index("{")..modified_hash.index("}")]
-
- hash_contents = hash_extract.split("{")[1].split("}")[0].lstrip.rstrip.split(",").collect { |element| element.lstrip.rstrip }
-
- hash_contents = "{" + hash_contents.join(",") + "}"
-
- joined_file_contents = joined_file_contents.sub(hash_extract, hash_contents)
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_inline_hashes(input_file_contents)
-
- def replace_strings(input_string)
-
- string_counter = 0
-
- while input_string.include?("\"")
-
- string_extract = input_string[input_string.index("\"")..input_string.index("\"",input_string.index("\"")+1)]
-
- input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
-
- string_counter += 1
-
- end
-
- while input_string.include?("'")
-
- string_extract = input_string[input_string.index("'")..input_string.index("'",input_string.index("'")+1)]
-
- input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
-
- string_counter += 1
-
- end
-
- return input_string
-
- end
-
- javascript_regexp = /(if |while |for |function |function\(|%[qQ]*\{)/
-
- modified_file_contents = input_file_contents.clone.collect {|element| replace_strings(element)}
-
- possible_inline_hashes = modified_file_contents.reject {|element| element.count("{") != 1}
-
- possible_inline_hashes = possible_inline_hashes.reject {|element| element.count("}") != 1}
-
- possible_inline_hashes = possible_inline_hashes.reject {|element| element.index(javascript_regexp) != nil}
-
- possible_inline_hashes.each do |hash|
-
- hash = input_file_contents[modified_file_contents.index(hash)]
-
- hash_extract = hash[hash.index("{")..hash.index("}")]
-
- contents = hash_extract[1...-1].split(",")
-
- hash_contents = []
-
- contents.each do |items|
-
- items = items.lstrip.sub(":","") if items.lstrip[0] == ":"
-
- key, value = items.split("=>").collect {|element| element.lstrip.rstrip} if items.include?("=>")
-
- key, value = items.split(":").collect {|element| element.lstrip.rstrip} if items.include?(":")
-
- key = key.gsub("'","").gsub("\"","")
-
- hash_contents << " #{key}: #{value},"
-
- end
-
- replacement_string = "{\n" + hash_contents.join("\n") + "\n};\n"
-
- input_file_contents[input_file_contents.index(hash)] = input_file_contents[input_file_contents.index(hash)].sub(hash_extract,replacement_string)
-
- end
-
- return input_file_contents
-
- end
-
- file_contents = compile_multiline_hashes(input_file_contents,temporary_nila_file)
-
- file_contents = compile_inline_hashes(file_contents)
-
- return file_contents
-
- end
-
- def compile_strings(input_file_contents)
-
- def compile_small_q_syntax(input_file_contents)
-
- possible_syntax_usage = input_file_contents.reject { |element| !element.include?("%q") }
-
- possible_syntax_usage.each do |line|
-
- modified_line = line.dup
-
- line_split = line.split("+").collect { |element| element.lstrip.rstrip }
-
- line_split.each do |str|
-
- delimiter = str[str.index("%q")+2]
-
- string_extract = str[str.index("%q")..-1]
-
- delimiter = "}" if delimiter.eql?("{")
-
- delimiter = ")" if delimiter.eql?("(")
-
- delimiter = ">" if delimiter.eql?("<")
-
- if string_extract[-1].eql?(delimiter)
-
- input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "'#{string_extract[3...-1]}'")
-
- modified_line = modified_line.sub(string_extract, "'#{string_extract[3...-1]}'")
-
- elsif delimiter.eql?(" ")
-
- input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "'#{string_extract[3..-1]}'")
-
- modified_line = modified_line.sub(string_extract, "'#{string_extract[3..-1]}'")
-
- end
-
- end
-
- end
-
- return input_file_contents
-
- end
-
- def compile_big_q_syntax(input_file_contents)
-
- possible_syntax_usage = input_file_contents.reject { |element| !element.include?("%Q") }
-
- possible_syntax_usage.each do |line|
-
- modified_line = line.dup
-
- line_split = line.split("+").collect { |element| element.lstrip.rstrip }
-
- line_split.each do |str|
-
- delimiter = str[str.index("%Q")+2]
-
- string_extract = str[str.index("%Q")..-1]
-
- delimiter = "}" if delimiter.eql?("{")
-
- delimiter = ")" if delimiter.eql?("(")
-
- delimiter = ">" if delimiter.eql?("<")
-
- if string_extract[-1].eql?(delimiter)
-
- input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[3...-1]}\"")
-
- modified_line = modified_line.sub(string_extract, "\"#{string_extract[3...-1]}\"")
-
- elsif delimiter.eql?(" ")
-
- input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[3..-1]}\"")
-
- modified_line = modified_line.sub(string_extract, "\"#{string_extract[3..-1]}\"")
-
- end
-
- end
-
- end
-
- return input_file_contents
-
- end
-
- def compile_percentage_syntax(input_file_contents)
-
- possible_syntax_usage = input_file_contents.reject { |element| !element.include?("%") }
-
- possible_syntax_usage = possible_syntax_usage.reject { |element| element.index(/(\%(\W|\s)\w{1,})/).nil? }
-
- possible_syntax_usage.each do |line|
-
- modified_line = line.dup
-
- line_split = line.split("+").collect { |element| element.lstrip.rstrip }
-
- line_split.each do |str|
-
- delimiter = str[str.index("%")+1]
-
- string_extract = str[str.index("%")..-1]
-
- delimiter = "}" if delimiter.eql?("{")
-
- delimiter = ")" if delimiter.eql?("(")
-
- delimiter = ">" if delimiter.eql?("<")
-
- if string_extract[-1].eql?(delimiter)
-
- input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[2...-1]}\"")
-
- modified_line = modified_line.sub(string_extract, "\"#{string_extract[2...-1]}\"")
-
- elsif delimiter.eql?(" ")
-
- input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[2..-1]}\"")
-
- modified_line = modified_line.sub(string_extract, "\"#{string_extract[2..-1]}\"")
-
- end
-
- end
-
- end
-
- return input_file_contents
-
- end
-
- file_contents = compile_small_q_syntax(input_file_contents)
-
- file_contents = compile_big_q_syntax(file_contents)
-
- file_contents = compile_percentage_syntax(file_contents)
-
- return file_contents
-
- end
-
- def compile_integers(input_file_contents)
-
- modified_file_contents = input_file_contents.clone
-
- input_file_contents.each_with_index do |line,index|
-
- matches = line.scan(/(([0-9]+_)+([0-9]+|$))/)
-
- unless matches.empty?
-
- matches.each do |match_arr|
-
- modified_file_contents[index] = modified_file_contents[index].sub(match_arr[0],match_arr[0].gsub("_",""))
-
- end
-
- end
-
- end
-
- return modified_file_contents
-
- end
-
- def compile_named_functions(input_file_contents, named_code_blocks, nested_functions, temporary_nila_file)
-
- #This method compiles all the named Nila functions. Below is an example of what is meant
- #by named/explicit function
-
- #def square(input_number)
- #
- # input_number*input_number
- #
- #end
-
- #The above function will compile to
-
- #square = function(input_number) {
- #
- # return input_number*input_number;
- #
- #};
-
- def is_parameterless?(input_function_block)
-
- if input_function_block[0].include?("(")
-
- false
-
- else
-
- true
-
- end
-
- end
-
- def lexical_scoped_variables(input_function_block)
-
- #This method will pickup and declare all the variables inside a function block. In future, this method will be
- #merged with the get variables method
-
- controlregexp = /(if |while |def |function |function\()/
-
- variables = []
-
- function_name, parameters = input_function_block[0].split("(")
-
- parameters = parameters.split(")")[0].split(",")
-
- parameters = parameters.collect { |element| element.strip }
-
- input_function_block.each do |line|
-
- if line.include? "=" and line.index(controlregexp).nil?
-
- current_line_split = line.strip.split("=")
-
- variables << current_line_split[0].rstrip
-
- end
-
- end
-
- parameters.each do |param|
-
- if variables.include?(param)
-
- variables.delete(param)
-
- end
-
- end
-
- if variables.empty?
-
- return []
-
- else
-
- return variables.uniq
-
- end
-
- end
-
- def remove_question_marks(input_file_contents, input_list, temporary_nila_file)
-
- joined_file_contents = input_file_contents.join
-
- input_list.each do |element|
-
- if element.include? "?"
-
- joined_file_contents = joined_file_contents.gsub(element, element[0...-1])
-
- end
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def add_auto_return_statement(input_array)
-
- joined_array = input_array.join
-
- reversed_input_array = input_array.reverse
-
- if !joined_array.include?("return ")
-
- rejected_array = reversed_input_array.reject { |content| content.lstrip.eql?("") }
-
- rejected_array = rejected_array[1..-1]
-
- if !rejected_array[0].strip.eql?("}")
-
- if !rejected_array[0].strip.eql?("end")
-
- last_statement = rejected_array[0]
-
- replacement_string = "return #{last_statement.lstrip}"
-
- input_array[input_array.index(last_statement)] = replacement_string
-
- end
-
- end
-
- end
-
- return input_array
-
- end
-
- def compile_multiple_return(input_array)
-
- def find_all_matching_indices(input_string, pattern)
-
- locations = []
-
- index = input_string.index(pattern)
-
- while index != nil
-
- locations << index
-
- index = input_string.index(pattern, index+1)
-
-
- end
-
- return locations
-
-
- end
-
- modified_input_array = input_array.dup
-
- return_statements = input_array.dup.reject { |element| !element.include? "return" }
-
- multiple_return_statements = return_statements.dup.reject { |element| !element.include? "," }
-
- modified_multiple_return_statements = multiple_return_statements.dup
-
- return_statement_index = []
-
- multiple_return_statements.each do |statement|
-
- location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
-
- return_statement_index << location_array[0]
-
- end
-
- multiple_return_statements.each_with_index do |return_statement, index|
-
- replacement_counter = 0
-
- if return_statement.include? "\""
-
- starting_quotes = find_all_matching_indices(return_statement, "\"")
-
- for x in 0...(starting_quotes.length)/2
-
- quotes = return_statement[starting_quotes[x]..starting_quotes[x+1]]
-
- replacement_counter += 1
-
- modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(quotes, "repstring#{1}")
-
- modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(quotes, "repstring#{1}")
-
- end
-
- end
-
- end
-
- modified_multiple_return_statements = modified_multiple_return_statements.reject { |element| !element.include? "," }
-
- return_statement_index = []
-
- modified_multiple_return_statements.each do |statement|
-
- location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
-
- return_statement_index << location_array[0]
-
- end
-
- modified_multiple_return_statements.each_with_index do |return_statement, index|
-
- method_call_counter = 0
-
- if return_statement.include? "("
-
- open_paran_location = find_all_matching_indices(return_statement, "(")
-
- open_paran_location.each do |paran_index|
-
- method_call = return_statement[paran_index..return_statement.index(")", paran_index+1)]
-
- method_call_counter += 1
-
- modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(method_call, "methodcall#{method_call_counter}")
-
- modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(method_call, "methodcall#{method_call_counter}")
-
- end
-
- end
-
- end
-
- modified_multiple_return_statements = modified_multiple_return_statements.reject { |element| !element.include?(",") }
-
- return_statement_index = []
-
- modified_multiple_return_statements.each do |statement|
-
- location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
-
- return_statement_index << location_array[0]
-
- end
-
- return_statement_index.each do |index|
-
- original_statement = input_array[index]
-
- statement_split = original_statement.split("return ")
-
- replacement_split = "return [" + statement_split[1].rstrip + "]\n\n"
-
- input_array[index] = replacement_split
-
- end
-
- return input_array
-
- end
-
- def coffee_type_function(input_array)
-
- function_name = input_array[0].split("function ")[1].split("(")[0].lstrip
-
- input_array[0] = "#{function_name} = function(" + input_array[0].split("function ")[1].split("(")[1].lstrip
-
- return input_array
-
- end
-
- def compile_function(input_array, temporary_nila_file)
-
- modified_input_array = input_array.dup
-
- if is_parameterless?(modified_input_array)
-
- if modified_input_array[0].include?("--single")
-
- modified_input_array[0] = input_array[0].sub "def", "function"
-
- interim_string = modified_input_array[0].split("--single")
-
- modified_input_array[0] = interim_string[0].rstrip + "() {\n--single" + interim_string[1]
-
-
- elsif modified_input_array[0].include?("--multi")
-
- modified_input_array[0] = input_array[0].sub "def", "function"
-
- interim_string = modified_input_array[0].split("--multi")
-
- modified_input_array[0] = interim_string[0].rstrip + "() {\n--multi" + interim_string[1]
-
- else
-
- modified_input_array[0] = input_array[0].sub "def", "function"
-
- modified_input_array[0] = modified_input_array[0].rstrip + "() {\n"
-
- end
-
- else
-
- if modified_input_array[0].include?("--single")
-
- modified_input_array[0] = input_array[0].sub "def", "function"
-
- interim_string = modified_input_array[0].split("--single")
-
- modified_input_array[0] = interim_string[0].rstrip + " {\n--single" + interim_string[1]
-
-
- elsif modified_input_array[0].include?("--multi")
-
- modified_input_array[0] = input_array[0].sub "def", "function"
-
- interim_string = modified_input_array[0].split("--multi")
-
- modified_input_array[0] = interim_string[0].rstrip + " {\n--multi" + interim_string[1]
-
- else
-
- modified_input_array[0] = input_array[0].sub "def", "function"
-
- modified_input_array[0] = modified_input_array[0].rstrip + " {\n"
-
- end
-
- end
-
- modified_input_array[-1] = input_array[-1].sub "end", "};\n"
-
- modified_input_array = compile_parallel_assignment(modified_input_array, temporary_nila_file)
-
- variables = lexical_scoped_variables(modified_input_array)
-
- if !variables.empty?
-
- variable_string = "\nvar " + variables.join(", ") + "\n"
-
- modified_input_array.insert(1, variable_string)
-
- end
-
- modified_input_array = remove_question_marks(modified_input_array, variables, temporary_nila_file)
-
- modified_input_array = add_auto_return_statement(modified_input_array)
-
- modified_input_array = compile_multiple_return(modified_input_array)
-
- modified_input_array = coffee_type_function(modified_input_array)
-
- return modified_input_array
-
- end
-
- def extract_function_name(input_code_block)
-
- first_line = input_code_block[0]
-
- first_line_split = first_line.split(" ")
-
- if first_line_split[1].include?("(")
-
- function_name, parameters = first_line_split[1].split("(")
-
- else
-
- function_name = first_line_split[1]
-
- end
-
- return function_name
-
- end
-
- joined_file_contents = input_file_contents.join
-
- unless named_code_blocks.empty?
-
- codeblock_counter = 1
-
- function_names = []
-
- named_code_blocks.each do |codeblock|
-
- function_names[codeblock_counter-1] = []
-
- joined_file_contents = joined_file_contents.sub("--named_function[#{codeblock_counter}]\n", compile_function(codeblock, temporary_nila_file).join)
-
- codeblock_counter += 1
-
- current_nested_functions = nested_functions[codeblock_counter-2]
-
- function_names[codeblock_counter-2] << extract_function_name(codeblock)
-
- current_nested_functions.each do |nested_function|
-
- function_names[codeblock_counter-2] << extract_function_name(nested_function)
-
- joined_file_contents = joined_file_contents.sub(nested_function.join, compile_function(nested_function, temporary_nila_file).join)
-
- end
-
- end
-
- else
-
- function_names = []
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents, function_names
-
- end
-
- def compile_custom_function_map(input_file_contents)
-
- function_map_replacements = {
-
- "puts" => "console.log",
-
- "p" => "console.log",
-
- "print" => "process.stdout.write",
-
- }
-
- function_map = function_map_replacements.keys
-
- modified_file_contents = input_file_contents.dup
-
- input_file_contents.each_with_index do |line, index|
-
- function_map.each do |function|
-
- if line.include?(function+"(") or line.include?(function+" ")
-
- modified_file_contents[index] = line.sub(function, function_map_replacements[function])
-
- end
-
- end
-
- end
-
- return modified_file_contents, function_map_replacements.values
-
- end
-
- def compile_ruby_methods(input_file_contents)
-
- # These are some interesting methods that we really miss in Javascript.
- # So we have made these methods available
-
- method_map_replacement = {
-
- ".split" => ".split(\" \")",
-
- ".strip" => ".replace(/^\s+|\s+$/g,'')",
-
- ".lstrip" => ".replace(/^\s+/g,\"\")",
-
- ".rstrip" => ".replace(/\s+$/g,\"\")"
- }
-
- method_map = method_map_replacement.keys
-
- method_map_regex = method_map.collect {|name| name.gsub(".","\\.")}
-
- method_map_regex = Regexp.new(method_map_regex.join("|"))
-
- modified_file_contents = input_file_contents.clone
-
- input_file_contents.each_with_index do |line, index|
-
- if line.match(method_map_regex)
-
- unless method_match.include?(line+"(")
-
- puts line
-
- end
-
- end
-
- end
-
- end
-
- def compile_whitespace_delimited_functions(input_file_contents, function_names, temporary_nila_file)
-
- def extract(input_string, pattern_start, pattern_end)
-
- def find_all_matching_indices(input_string, pattern)
-
- locations = []
-
- index = input_string.index(pattern)
-
- while index != nil
-
- locations << index
-
- index = input_string.index(pattern, index+1)
-
-
- end
-
- return locations
-
-
- end
-
- all_start_locations = find_all_matching_indices(input_string, pattern_start)
-
- pattern = []
-
- all_start_locations.each do |location|
-
- extracted_string = input_string[location..-1]
-
- string_extract = extracted_string[0..extracted_string.index(pattern_end)]
-
- if !string_extract.include?(" = function(")
-
- pattern << string_extract
-
- end
-
- end
-
- return pattern
-
- end
-
- begin
-
- input_file_contents[-1] = input_file_contents[-1] + "\n" if !input_file_contents[-1].include?("\n")
-
- joined_file_contents = input_file_contents.join
-
- function_names.each do |list_of_functions|
-
- list_of_functions.each do |function|
-
- matching_strings = extract(joined_file_contents, function+" ", "\n")
-
- matching_strings.each do |string|
-
- modified_string = string.dup
-
- modified_string = modified_string.rstrip + modified_string.split(modified_string.rstrip)[1].gsub(" ", "")
-
- modified_string = modified_string.sub(function+" ", function+"(")
-
- modified_string = modified_string.sub("\n", ")\n")
-
- joined_file_contents = joined_file_contents.sub(string, modified_string)
-
- end
-
- end
-
- end
-
- rescue NoMethodError
-
- puts "Whitespace delimitation exited with errors!"
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_conditional_structures(input_file_contents, temporary_nila_file)
-
- def replace_unless_until(input_file_contents)
-
- modified_file_contents = input_file_contents.clone
-
- possible_unless_commands = input_file_contents.reject { |element| !element.include?("unless") }
-
- unless_commands = possible_unless_commands.reject { |element| !element.lstrip.split("unless")[0].empty? }
-
- unless_commands.each do |command|
-
- junk, condition = command.split("unless ")
-
- condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
-
- replacement_string = "if !(#{condition.lstrip.rstrip})\n"
-
- modified_file_contents[modified_file_contents.index(command)] = replacement_string
-
- end
-
- possible_until_commands = input_file_contents.reject { |element| !element.include?("until") }
-
- until_commands = possible_until_commands.reject { |element| !element.lstrip.split("until")[0].empty? }
-
- until_commands.each do |command|
-
- junk, condition = command.split("until ")
-
- condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
-
- replacement_string = "while !(#{condition.lstrip.rstrip})\n"
-
- modified_file_contents[modified_file_contents.index(command)] = replacement_string
-
- end
-
- return modified_file_contents
-
- end
-
- def compile_ternary_if(input_file_contents)
-
- possible_ternary_if = input_file_contents.reject{|element| !element.include?("if")}
-
- possible_ternary_if = possible_ternary_if.reject {|element| !element.include?("then")}
-
- possible_ternary_if.each do |statement|
-
- statement_extract = statement[statement.index("if")..statement.index("end")+2]
-
- condition = statement_extract.split("then")[0].split("if")[1].lstrip.rstrip
-
- true_condition = statement_extract.split("then")[1].split("else")[0].lstrip.rstrip
-
- false_condition = statement_extract.split("else")[1].split("end")[0].lstrip.rstrip
-
- replacement_string = "#{condition} ? #{true_condition} : #{false_condition}"
-
- input_file_contents[input_file_contents.index(statement)] = input_file_contents[input_file_contents.index(statement)].sub(statement_extract,replacement_string)
-
- end
-
- return input_file_contents
-
- end
-
- def compile_inline_conditionals(input_file_contents, temporary_nila_file)
-
- conditionals = [/( if )/, /( while )/, /( unless )/, /( until )/]
-
- plain_conditionals = [" if ", " while ", " unless ", " until "]
-
- joined_file_contents = input_file_contents.join
-
- output_statement = ""
-
- conditionals.each_with_index do |regex, index|
-
- matching_lines = input_file_contents.reject { |content| content.index(regex).nil? }
-
- matching_lines.each do |line|
-
- line_split = line.split(plain_conditionals[index])
-
- condition = line_split[1]
-
- condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
-
- if index == 0
-
- output_statement = "if (#{condition.lstrip.rstrip.gsub("?", "")}) {\n\n#{line_split[0]}\n}\n"
-
- elsif index == 1
-
- output_statement = "while (#{condition.lstrip.rstrip.gsub("?", "")}) {\n\n#{line_split[0]}\n}\n"
-
- elsif index == 2
-
- output_statement = "if (!(#{condition.lstrip.rstrip.gsub("?", "")})) {\n\n#{line_split[0]}\n}\n"
-
- elsif index == 3
-
- output_statement = "while (!(#{condition.lstrip.rstrip.gsub("?", "")})) {\n\n#{line_split[0]}\n}\n"
-
- end
-
- joined_file_contents = joined_file_contents.sub(line, output_statement)
-
- end
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_regular_if(input_file_contents, temporary_nila_file)
-
- def convert_string_to_array(input_string, temporary_nila_file)
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(input_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def extract_if_blocks(if_statement_indexes, input_file_contents)
-
- possible_if_blocks = []
-
- if_block_counter = 0
-
- extracted_blocks = []
-
- controlregexp = /(if |while |def )/
-
- rejectionregexp = /( if | while )/
-
- for x in 0...if_statement_indexes.length-1
-
- possible_if_blocks << input_file_contents[if_statement_indexes[x]..if_statement_indexes[x+1]]
-
- end
-
- end_counter = 0
-
- end_index = []
-
- current_block = []
-
- possible_if_blocks.each_with_index do |block|
-
- current_block += block
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- if end_counter > 0
-
- until end_index.empty?
-
- array_extract = current_block[0..end_index[0]].reverse
-
- index_counter = 0
-
- array_extract.each_with_index do |line|
-
- break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
-
- index_counter += 1
-
- end
-
- block_extract = array_extract[0..index_counter].reverse
-
- extracted_blocks << block_extract
-
- block_start = current_block.index(block_extract[0])
-
- block_end = current_block.index(block_extract[-1])
-
- current_block[block_start..block_end] = "--ifblock#{if_block_counter}"
-
- if_block_counter += 1
-
- end_counter = 0
-
- end_index = []
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- end
-
- end
-
- end
-
- return current_block, extracted_blocks
-
- end
-
- def compile_if_syntax(input_block)
-
- strings = []
-
- string_counter = 0
-
- modified_input_block = input_block.dup
-
- input_block.each_with_index do |line, index|
-
- if line.include?("\"")
-
- opening_quotes = line.index("\"")
-
- string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
-
- strings << string_extract
-
- modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
-
- string_counter += 1
-
- end
-
- end
-
- input_block = modified_input_block
-
- starting_line = input_block[0]
-
- starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
-
- junk, condition = starting_line.split("if")
-
- condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
-
- input_block[0] = "Euuf (#{condition.lstrip.rstrip.gsub("?", "")}) {\n"
-
- input_block[-1] = input_block[-1].lstrip.sub("end", "}")
-
- elsif_statements = input_block.reject { |element| !element.include?("elsuf") }
-
- elsif_statements.each do |statement|
-
- junk, condition = statement.split("elsuf")
-
- condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
-
- input_block[input_block.index(statement)] = "} elsuf (#{condition.lstrip.rstrip.gsub("?", "")}) {\n"
-
- end
-
- else_statements = input_block.reject { |element| !element.include?("else") }
-
- else_statements.each do |statement|
-
- input_block[input_block.index(statement)] = "} else {\n"
-
- end
-
- modified_input_block = input_block.dup
-
- input_block.each_with_index do |line, index|
-
- if line.include?("--string{")
-
- junk, remains = line.split("--string{")
-
- string_index, junk = remains.split("}")
-
- modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
-
- end
-
- end
-
- return modified_input_block
-
- end
-
- input_file_contents = input_file_contents.collect { |element| element.sub("elsif", "elsuf") }
-
- possible_if_statements = input_file_contents.reject { |element| !element.include?("if") }
-
- possible_if_statements = possible_if_statements.reject { |element| element.include?("else") }
-
- possible_if_statements = possible_if_statements.reject { |element| element.lstrip.include?(" if ") }
-
- if !possible_if_statements.empty?
-
- if_statement_indexes = []
-
- possible_if_statements.each do |statement|
-
- if_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
-
- end
-
- if_statement_indexes = [0] + if_statement_indexes.flatten + [-1]
-
- controlregexp = /(while |def )/
-
- modified_input_contents, extracted_statements = extract_if_blocks(if_statement_indexes, input_file_contents.clone)
-
- joined_blocks = extracted_statements.collect { |element| element.join }
-
- if_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
-
- rejected_elements = joined_blocks - if_statements
-
- rejected_elements_index = []
-
- rejected_elements.each do |element|
-
- rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
-
- end
-
- if_blocks_index = (0...extracted_statements.length).to_a
-
- rejected_elements_index = rejected_elements_index.flatten
-
- if_blocks_index -= rejected_elements_index
-
- modified_if_statements = if_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
-
- modified_if_statements = modified_if_statements.collect { |block| compile_if_syntax(block) }.reverse
-
- if_blocks_index = if_blocks_index.collect { |element| "--ifblock#{element}" }.reverse
-
- rejected_elements_index = rejected_elements_index.collect { |element| "--ifblock#{element}" }.reverse
-
- rejected_elements = rejected_elements.reverse
-
- joined_file_contents = modified_input_contents.join
-
- until if_blocks_index.empty? and rejected_elements_index.empty?
-
- if !if_blocks_index.empty?
-
- if joined_file_contents.include?(if_blocks_index[0])
-
- joined_file_contents = joined_file_contents.sub(if_blocks_index[0], modified_if_statements[0].join)
-
- if_blocks_index.delete_at(0)
-
- modified_if_statements.delete_at(0)
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0])
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0])
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- end
-
- else
-
- joined_file_contents = input_file_contents.join
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_regular_while(input_file_contents, temporary_nila_file)
-
- def convert_string_to_array(input_string, temporary_nila_file)
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(input_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def extract_while_blocks(while_statement_indexes, input_file_contents)
-
- possible_while_blocks = []
-
- while_block_counter = 0
-
- extracted_blocks = []
-
- controlregexp = /(if |while |def )/
-
- rejectionregexp = /( if | while )/
-
- for x in 0...while_statement_indexes.length-1
-
- possible_while_blocks << input_file_contents[while_statement_indexes[x]..while_statement_indexes[x+1]]
-
- end
-
- end_counter = 0
-
- end_index = []
-
- current_block = []
-
- possible_while_blocks.each_with_index do |block|
-
- current_block += block
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- if end_counter > 0
-
- until end_index.empty?
-
- array_extract = current_block[0..end_index[0]].reverse
-
- index_counter = 0
-
- array_extract.each_with_index do |line|
-
- break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
-
- index_counter += 1
-
- end
-
- block_extract = array_extract[0..index_counter].reverse
-
- extracted_blocks << block_extract
-
- block_start = current_block.index(block_extract[0])
-
- block_end = current_block.index(block_extract[-1])
-
- current_block[block_start..block_end] = "--whileblock#{while_block_counter}"
-
- while_block_counter += 1
-
- end_counter = 0
-
- end_index = []
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- end
-
- end
-
- end
-
- return current_block, extracted_blocks
-
- end
-
- def compile_while_syntax(input_block)
-
- modified_input_block = input_block.dup
-
- strings = []
-
- string_counter = 0
-
- input_block.each_with_index do |line, index|
-
- if line.include?("\"")
-
- opening_quotes = line.index("\"")
-
- string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
-
- strings << string_extract
-
- modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
-
- string_counter += 1
-
- end
-
- end
-
- input_block = modified_input_block
-
- starting_line = input_block[0]
-
- starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
-
- junk, condition = starting_line.split("while")
-
- input_block[0] = "whaaleskey (#{condition.lstrip.rstrip.gsub("?", "")}) {\n"
-
- input_block[-1] = input_block[-1].lstrip.sub("end", "}")
-
- modified_input_block = input_block.dup
-
- input_block.each_with_index do |line, index|
-
- if line.include?("--string{")
-
- junk, remains = line.split("--string{")
-
- string_index, junk = remains.split("}")
-
- modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
-
- end
-
- end
-
- return modified_input_block
-
- end
-
- possible_while_statements = input_file_contents.reject { |element| !element.include?("while") }
-
- if !possible_while_statements.empty?
-
- while_statement_indexes = []
-
- possible_while_statements.each do |statement|
-
- while_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
-
- end
-
- while_statement_indexes = [0] + while_statement_indexes.flatten + [-1]
-
- controlregexp = /(if |def )/
-
- modified_input_contents, extracted_statements = extract_while_blocks(while_statement_indexes, input_file_contents.clone)
-
- joined_blocks = extracted_statements.collect { |element| element.join }
-
- while_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
-
- rejected_elements = joined_blocks - while_statements
-
- rejected_elements_index = []
-
- rejected_elements.each do |element|
-
- rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
-
- end
-
- while_blocks_index = (0...extracted_statements.length).to_a
-
- rejected_elements_index = rejected_elements_index.flatten
-
- while_blocks_index -= rejected_elements_index
-
- modified_while_statements = while_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
-
- modified_while_statements = modified_while_statements.collect { |block| compile_while_syntax(block) }.reverse
-
- while_blocks_index = while_blocks_index.collect { |element| "--whileblock#{element}" }.reverse
-
- rejected_elements_index = rejected_elements_index.collect { |element| "--whileblock#{element}" }.reverse
-
- rejected_elements = rejected_elements.reverse
-
- joined_file_contents = modified_input_contents.join
-
- until while_blocks_index.empty? and rejected_elements_index.empty?
-
- if !while_blocks_index.empty?
-
- if joined_file_contents.include?(while_blocks_index[0])
-
- joined_file_contents = joined_file_contents.sub(while_blocks_index[0], modified_while_statements[0].join)
-
- while_blocks_index.delete_at(0)
-
- modified_while_statements.delete_at(0)
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- end
-
- else
-
- joined_file_contents = input_file_contents.join
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_regular_for(input_file_contents, temporary_nila_file)
-
- def convert_string_to_array(input_string, temporary_nila_file)
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(input_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def extract_for_blocks(for_statement_indexes, input_file_contents)
-
- possible_for_blocks = []
-
- for_block_counter = 0
-
- extracted_blocks = []
-
- controlregexp = /(if |while |def |for )/
-
- rejectionregexp = /( if | while )/
-
- for x in 0...for_statement_indexes.length-1
-
- possible_for_blocks << input_file_contents[for_statement_indexes[x]..for_statement_indexes[x+1]]
-
- end
-
- end_counter = 0
-
- end_index = []
-
- current_block = []
-
- possible_for_blocks.each_with_index do |block|
-
- current_block += block
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- if end_counter > 0
-
- until end_index.empty?
-
- array_extract = current_block[0..end_index[0]].reverse
-
- index_counter = 0
-
- array_extract.each_with_index do |line|
-
- break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
-
- index_counter += 1
-
- end
-
- block_extract = array_extract[0..index_counter].reverse
-
- extracted_blocks << block_extract
-
- block_start = current_block.index(block_extract[0])
-
- block_end = current_block.index(block_extract[-1])
-
- current_block[block_start..block_end] = "--forblock#{for_block_counter}"
-
- for_block_counter += 1
-
- end_counter = 0
-
- end_index = []
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- end
-
- end
-
- end
-
- return current_block, extracted_blocks
-
- end
-
- def compile_for_syntax(input_block)
-
- def compile_condition(input_condition, input_block)
-
- variable,array_name = input_condition.split("in")
-
- if array_name.strip.include?("[") and array_name.strip.include?("]")
-
- replacement_array = "_ref1 = #{array_name.strip}\n\n"
-
- replacement_string = "#{variable.strip} = _ref1[_i];\n\n"
-
- input_block = [replacement_array] + input_block.insert(1,replacement_string)
-
- input_block[1] = "for (_i = 0, _j = _ref1.length; _i < _j; _i += 1) {\n\n"
-
- elsif array_name.strip.include?("..")
-
- array_type = if array_name.strip.include?("...") then 0 else 1 end
-
- if array_type == 0
-
- num1,num2 = array_name.strip.split("...")
-
- input_block[0] = "for (#{variable.strip} = #{num1}, _j = #{num2}; #{variable.strip} <= _j; #{variable.strip} += 1) {\n\n"
-
- else
-
- num1,num2 = array_name.strip.split("..")
-
- input_block[0] = "for (#{variable.strip} = #{num1}, _j = #{num2}; #{variable.strip} < _j; #{variable.strip} += 1) {\n\n"
-
- end
-
- else
-
- input_block[0] = "for (_i = 0, _j = #{array_name.strip}.length; _i < _j; _i += 1) {\n\n"
-
- input_block = input_block.insert(1,"#{variable.strip} = #{array_name.strip}[_i];\n\n")
-
- end
-
- return input_block
-
- end
-
- modified_input_block = input_block.dup
-
- strings = []
-
- string_counter = 0
-
- input_block.each_with_index do |line, index|
-
- if line.include?("\"")
-
- opening_quotes = line.index("\"")
-
- string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
-
- strings << string_extract
-
- modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
-
- string_counter += 1
-
- end
-
- end
-
- input_block = modified_input_block
-
- starting_line = input_block[0]
-
- starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
-
- junk, condition = starting_line.split("for")
-
- input_block[-1] = input_block[-1].lstrip.sub("end", "}")
-
- input_block = compile_condition(condition,input_block)
-
- modified_input_block = input_block.dup
-
- input_block.each_with_index do |line, index|
-
- if line.include?("--string{")
-
- junk, remains = line.split("--string{")
-
- string_index, junk = remains.split("}")
-
- modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
-
- end
-
- end
-
- return modified_input_block
-
- end
-
- possible_for_statements = input_file_contents.reject { |element| !element.include?("for") }
-
- possible_for_statements = possible_for_statements.reject {|element| element.include?("for (")}
-
- if !possible_for_statements.empty?
-
- for_statement_indexes = []
-
- possible_for_statements.each do |statement|
-
- for_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
-
- end
-
- for_statement_indexes = [0] + for_statement_indexes.flatten + [-1]
-
- controlregexp = /(if |def |while )/
-
- modified_input_contents, extracted_statements = extract_for_blocks(for_statement_indexes, input_file_contents.clone)
-
- joined_blocks = extracted_statements.collect { |element| element.join }
-
- for_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
-
- rejected_elements = joined_blocks - for_statements
-
- rejected_elements_index = []
-
- rejected_elements.each do |element|
-
- rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
-
- end
-
- for_blocks_index = (0...extracted_statements.length).to_a
-
- rejected_elements_index = rejected_elements_index.flatten
-
- for_blocks_index -= rejected_elements_index
-
- modified_for_statements = for_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
-
- modified_for_statements = modified_for_statements.collect { |block| compile_for_syntax(block) }.reverse
-
- for_blocks_index = for_blocks_index.collect { |element| "--forblock#{element}" }.reverse
-
- rejected_elements_index = rejected_elements_index.collect { |element| "--forblock#{element}" }.reverse
-
- rejected_elements = rejected_elements.reverse
-
- joined_file_contents = modified_input_contents.join
-
- until for_blocks_index.empty? and rejected_elements_index.empty?
-
- if !for_blocks_index.empty?
-
- if joined_file_contents.include?(for_blocks_index[0])
-
- joined_file_contents = joined_file_contents.sub(for_blocks_index[0], modified_for_statements[0].join)
-
- for_blocks_index.delete_at(0)
-
- modified_for_statements.delete_at(0)
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- end
-
- else
-
- joined_file_contents = input_file_contents.join
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def compile_loop_keyword(input_file_contents,temporary_nila_file)
-
- def convert_string_to_array(input_string, temporary_nila_file)
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(input_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def extract_loop_blocks(loop_statement_indexes, input_file_contents)
-
- possible_loop_blocks = []
-
- loop_block_counter = 0
-
- extracted_blocks = []
-
- controlregexp = /(if |while |def |loop )/
-
- rejectionregexp = /( if | while )/
-
- for x in 0...loop_statement_indexes.length-1
-
- possible_loop_blocks << input_file_contents[loop_statement_indexes[x]..loop_statement_indexes[x+1]]
-
- end
-
- end_counter = 0
-
- end_index = []
-
- current_block = []
-
- possible_loop_blocks.each_with_index do |block|
-
- current_block += block
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- if end_counter > 0
-
- until end_index.empty?
-
- array_extract = current_block[0..end_index[0]].reverse
-
- index_counter = 0
-
- array_extract.each_with_index do |line|
-
- break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
-
- index_counter += 1
-
- end
-
- block_extract = array_extract[0..index_counter].reverse
-
- extracted_blocks << block_extract
-
- block_start = current_block.index(block_extract[0])
-
- block_end = current_block.index(block_extract[-1])
-
- current_block[block_start..block_end] = "--loopblock#{loop_block_counter}"
-
- loop_block_counter += 1
-
- end_counter = 0
-
- end_index = []
-
- current_block.each_with_index do |line, index|
-
- if line.strip.eql? "end"
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- end
-
- end
-
- end
-
- return current_block, extracted_blocks
-
- end
-
- def compile_loop_syntax(input_block)
-
- modified_input_block = input_block.dup
-
- strings = []
-
- string_counter = 0
-
- input_block.each_with_index do |line, index|
-
- if line.include?("\"")
-
- opening_quotes = line.index("\"")
-
- string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
-
- strings << string_extract
-
- modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
-
- string_counter += 1
-
- end
-
- end
-
- input_block = modified_input_block
-
- starting_line = input_block[0]
-
- starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
-
- input_block[0] = "whaaleskey (true) {\n"
-
- input_block[-1] = input_block[-1].lstrip.sub("end", "}")
-
- modified_input_block = input_block.dup
-
- input_block.each_with_index do |line, index|
-
- if line.include?("--string{")
-
- junk, remains = line.split("--string{")
-
- string_index, junk = remains.split("}")
-
- modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
-
- end
-
- end
-
- return modified_input_block
-
- end
-
- possible_loop_statements = input_file_contents.reject { |element| !element.include?("loop") }
-
- if !possible_loop_statements.empty?
-
- loop_statement_indexes = []
-
- possible_loop_statements.each do |statement|
-
- loop_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
-
- end
-
- loop_statement_indexes = [0] + loop_statement_indexes.flatten + [-1]
-
- controlregexp = /(if |def )/
-
- modified_input_contents, extracted_statements = extract_loop_blocks(loop_statement_indexes, input_file_contents.clone)
-
- joined_blocks = extracted_statements.collect { |element| element.join }
-
- loop_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
-
- rejected_elements = joined_blocks - loop_statements
-
- rejected_elements_index = []
-
- rejected_elements.each do |element|
-
- rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
-
- end
-
- loop_blocks_index = (0...extracted_statements.length).to_a
-
- rejected_elements_index = rejected_elements_index.flatten
-
- loop_blocks_index -= rejected_elements_index
-
- modified_loop_statements = loop_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
-
- modified_loop_statements = modified_loop_statements.collect { |block| compile_loop_syntax(block) }.reverse
-
- loop_blocks_index = loop_blocks_index.collect { |element| "--loopblock#{element}" }.reverse
-
- rejected_elements_index = rejected_elements_index.collect { |element| "--loopblock#{element}" }.reverse
-
- rejected_elements = rejected_elements.reverse
-
- joined_file_contents = modified_input_contents.join
-
- until loop_blocks_index.empty? and rejected_elements_index.empty?
-
- if !loop_blocks_index.empty?
-
- if joined_file_contents.include?(loop_blocks_index[0])
-
- joined_file_contents = joined_file_contents.sub(loop_blocks_index[0], modified_loop_statements[0].join)
-
- loop_blocks_index.delete_at(0)
-
- modified_loop_statements.delete_at(0)
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- else
-
- joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
-
- rejected_elements_index.delete_at(0)
-
- rejected_elements.delete_at(0)
-
- end
-
- end
-
- else
-
- joined_file_contents = input_file_contents.join
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def ignore_statement_modifiers(input_block)
-
- modified_input_block = input_block.dup
-
- rejectionregexp = /( if | while )/
-
- rejected_lines = {}
-
- rejected_line_counter = 0
-
- input_block.each_with_index do |line, index|
-
- if line.lstrip.index(rejectionregexp) != nil
-
- rejected_lines["--rejected{#{rejected_line_counter}}\n\n"] = line
-
- modified_input_block[index] = "--rejected{#{rejected_line_counter}}\n\n"
-
- rejected_line_counter += 1
-
- end
-
- end
-
- return modified_input_block, rejected_lines
-
- end
-
- def replace_statement_modifiers(input_block, rejected_lines)
-
- unless rejected_lines.empty?
-
- rejected_replacements = rejected_lines.keys
-
- loc = 0
-
- indices = []
-
- index_counter = 0
-
- rejected_replacements.each do |replacement_string|
-
- input_block.each_with_index do |line, index|
-
- break if line.include?(replacement_string.rstrip)
-
- index_counter += 1
-
- end
-
- indices << index_counter
-
- index_counter = 0
-
- end
-
- indices.each_with_index do |location, index|
-
- input_block[location] = rejected_lines.values[index] + "\n\n"
-
- end
-
- end
-
- return input_block
-
- end
-
- file_contents = compile_ternary_if(input_file_contents)
-
- puts file_contents
-
- file_contents, rejected_lines = ignore_statement_modifiers(file_contents)
-
- file_contents = replace_unless_until(file_contents)
-
- file_contents = compile_regular_if(file_contents, temporary_nila_file)
-
- file_contents = compile_regular_for(file_contents, temporary_nila_file)
-
- file_contents = compile_regular_while(file_contents, temporary_nila_file)
-
- file_contents = compile_loop_keyword(file_contents,temporary_nila_file)
-
- file_contents = replace_statement_modifiers(file_contents, rejected_lines)
-
- file_contents = compile_inline_conditionals(file_contents, temporary_nila_file)
-
- return file_contents
-
- end
-
- def compile_loops(input_file_contents,temporary_nila_file)
-
- def compile_times_loop(input_file_contents,temporary_nila_file)
-
- def compile_one_line_blocks(input_block)
-
- block_parameters, block_contents = input_block[1...-1].split("|",2)[1].split("|",2)
-
- compiled_block = "(function(#{block_parameters.lstrip.rstrip}) {\n\n #{block_contents.strip} \n\n}(_i))_!;\n"
-
- return compiled_block
-
- end
-
- def extract_variable_names(input_file_contents)
-
- variables = []
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("==", "equalequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("!=", "notequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("+=", "plusequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("-=", "minusequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("*=", "multiequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("/=", "divequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("%=", "modequal") }
-
- input_file_contents = input_file_contents.collect { |element| element.gsub("=~", "matchequal") }
-
- javascript_regexp = /(if |while |for )/
-
- for x in 0...input_file_contents.length
-
- current_row = input_file_contents[x]
-
- if current_row.include?("=") and current_row.index(javascript_regexp) == nil
-
- current_row = current_row.rstrip + "\n"
-
- current_row_split = current_row.split("=")
-
- for y in 0...current_row_split.length
-
- current_row_split[y] = current_row_split[y].strip
-
-
- end
-
- if current_row_split[0].include?("[") or current_row_split[0].include?("(")
-
- current_row_split[0] = current_row_split[0][0...current_row_split[0].index("[")]
-
- end
-
- variables << current_row_split[0]
-
-
- end
-
- input_file_contents[x] = current_row
-
- end
-
- variables += ["_i","_j"]
-
- variables = variables.flatten
-
- return variables.uniq
-
- end
-
- possible_times_loop = input_file_contents.reject{ |element| !element.include?(".times")}
-
- multiline_times_loop = possible_times_loop.reject {|element| !element.include?(" do ")}
-
- unless multiline_times_loop.empty?
-
- multiline_times_loop.each do |starting_line|
-
- index_counter = starting_counter = input_file_contents.index(starting_line)
-
- line = starting_line
-
- until line.strip.eql?("end")
-
- index_counter += 1
-
- line = input_file_contents[index_counter]
-
- end
-
- loop_extract = input_file_contents[starting_counter..index_counter]
-
- file_extract = input_file_contents[0..index_counter]
-
- file_variables = extract_variable_names(file_extract)
-
- block_variables = extract_variable_names(loop_extract)
-
- var_need_of_declaration = file_variables-block_variables-["_i","_j"]
-
- loop_condition, block = loop_extract.join.split(" do ")
-
- block = block.split("end")[0]
-
- replacement_string = "#{loop_condition.rstrip} {#{block.strip}}"
-
- input_file_contents[starting_counter..index_counter] = replacement_string
-
- end
-
- end
-
- possible_times_loop = input_file_contents.reject{ |element| !element.include?(".times")}
-
- oneliner_times_loop = possible_times_loop.reject {|element| !element.include?("{") and !element.include?("}")}
-
- loop_variables = []
-
- modified_file_contents = input_file_contents.clone
-
- unless oneliner_times_loop.empty?
-
- oneliner_times_loop.each do |loop|
-
- original_loop = loop.clone
-
- string_counter = 1
-
- extracted_string = []
-
- while loop.include?("\"")
-
- string_extract = loop[loop.index("\"")..loop.index("\"",loop.index("\"")+1)]
-
- extracted_string << string_extract
-
- loop = loop.sub(string_extract,"--repstring#{string_counter}")
-
- string_counter += 1
-
- end
-
- block_extract = loop[loop.index("{")..loop.index("}")]
-
- compiled_block = ""
-
- if block_extract.count("|") == 2
-
- compiled_block = compile_one_line_blocks(block_extract)
-
- extracted_string.each_with_index do |string,index|
-
- compiled_block = compiled_block.sub("--repstring#{index+1}",string)
-
- end
-
- else
-
- compiled_block = block_extract[1...-1].lstrip.rstrip
-
- extracted_string.each_with_index do |string,index|
-
- compiled_block = compiled_block.sub("--repstring#{index+1}",string)
-
- end
-
- end
-
- times_counter = loop.split(".times")[0].lstrip
-
- replacement_string = "for (_i = 0, _j = #{times_counter}; _i < _j; _i += 1) {\n\n#{compiled_block}\n\n}"
-
- modified_file_contents[input_file_contents.index(original_loop)] = replacement_string
-
- end
-
- loop_variables = ["_i","_j"]
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(modified_file_contents.join)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents,loop_variables
-
- end
-
- file_contents,loop_variables = compile_times_loop(input_file_contents,temporary_nila_file)
-
- return file_contents,loop_variables
-
- end
-
- def add_semicolons(input_file_contents)
-
- def comment(input_string)
-
- if input_string.include?("--single_line_comment")
-
- true
-
- elsif input_string.include?("--multiline_comment")
-
- true
-
- else
-
- false
-
- end
-
- end
-
- reject_regexp = /(function |Euuf |if |else|elsuf|switch |case|while |whaaleskey |for )/
-
- modified_file_contents = input_file_contents.dup
-
- input_file_contents.each_with_index do |line,index|
-
- if line.index(reject_regexp) == nil
-
- if !comment(line)
-
- if !line.lstrip.eql?("")
-
- if !line.lstrip.eql?("}\n")
-
- if !line.lstrip.eql?("}\n\n")
-
- if line.rstrip[-1] != "[" and line.rstrip[-1] != "{" and line.rstrip[-1] != "," and line.rstrip[-1] != ";"
-
- modified_file_contents[index] = line.rstrip + ";\n\n"
-
- end
-
- end
-
- end
-
- end
-
- end
-
- end
-
- end
-
- modified_file_contents
-
- end
-
- def compile_comments(input_file_contents, comments, temporary_nila_file)
-
- #This method converts Nila comments into pure Javascript comments. This method
- #handles both single line and multiline comments.
-
- file_contents_as_string = input_file_contents.join
-
- single_line_comments = comments[0]
-
- multiline_comments = comments[1]
-
- single_line_comment_counter = 1
-
- multi_line_comment_counter = 1
-
- ignorable_keywords = [/if/, /while/, /function/]
-
- dummy_replacement_words = ["eeuuff", "whaalesskkey", "conffoolotion"]
-
- for x in 0...single_line_comments.length
-
- current_singleline_comment = "--single_line_comment[#{single_line_comment_counter}]"
-
- replacement_singleline_string = single_line_comments[x].sub("#", "//")
-
- ignorable_keywords.each_with_index do |keyword, index|
-
- if replacement_singleline_string.index(keyword) != nil
-
- replacement_singleline_string = replacement_singleline_string.sub(keyword.inspect[1...-1], dummy_replacement_words[index])
-
- end
-
- end
-
- file_contents_as_string = file_contents_as_string.sub(current_singleline_comment, replacement_singleline_string)
-
- single_line_comment_counter += 1
-
-
- end
-
- for y in 0...multiline_comments.length
-
- current_multiline_comment = "--multiline_comment[#{multi_line_comment_counter}]"
-
- replacement_multiline_string = multiline_comments[y].sub("=begin", "/*\n")
-
- replacement_multiline_string = replacement_multiline_string.sub("=end", "\n*/")
-
- ignorable_keywords.each_with_index do |keyword, index|
-
- if replacement_multiline_string.index(keyword) != nil
-
- replacement_multiline_string = replacement_multiline_string.sub(keyword.inspect[1...-1], dummy_replacement_words[index])
-
- end
-
- end
-
- file_contents_as_string = file_contents_as_string.sub(current_multiline_comment, replacement_multiline_string)
-
- multi_line_comment_counter += 1
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(file_contents_as_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- line_by_line_contents
-
- end
-
- def pretty_print_javascript(javascript_file_contents, temporary_nila_file)
-
- def reset_tabs(input_file_contents)
-
- #This method removes all the predefined tabs to avoid problems in
- #later parts of the beautifying process.
-
- for x in 0...input_file_contents.length
-
- current_row = input_file_contents[x]
-
- if !current_row.eql?("\n")
-
- current_row = current_row.lstrip
-
- end
-
- input_file_contents[x] = current_row
-
-
- end
-
- return input_file_contents
-
- end
-
- def find_all_matching_indices(input_string, pattern)
-
- locations = []
-
- index = input_string.index(pattern)
-
- while index != nil
-
- locations << index
-
- index = input_string.index(pattern, index+1)
-
-
- end
-
- return locations
-
-
- end
-
- def convert_string_to_array(input_string, temporary_nila_file)
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(input_string)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- return line_by_line_contents
-
- end
-
- def fix_newlines(file_contents)
-
- def extract_blocks(file_contents)
-
- javascript_regexp = /(if |while |for |function\(|((=|:)\s+\{))/
-
- block_starting_lines = file_contents.dup.reject { |element| element.index(javascript_regexp).nil? }[1..-1]
-
- block_starting_lines = block_starting_lines.reject { |element| element.include?(" ") }
-
- initial_starting_lines = block_starting_lines.dup
-
- starting_line_indices = []
-
- block_starting_lines.each do |line|
-
- starting_line_indices << file_contents.index(line)
-
- end
-
- block_ending_lines = file_contents.dup.each_index.select { |index| (file_contents[index].eql? " }\n" or file_contents[index].eql? " };\n")}
-
- modified_file_contents = file_contents.dup
-
- code_blocks = []
-
- starting_index = starting_line_indices[0]
-
- begin
-
- for x in 0...initial_starting_lines.length
-
- code_blocks << modified_file_contents[starting_index..block_ending_lines[0]]
-
- modified_file_contents[starting_index..block_ending_lines[0]] = []
-
- modified_file_contents.insert(starting_index, " *****")
-
- block_starting_lines = modified_file_contents.dup.reject { |element| element.index(javascript_regexp).nil? }[1..-1]
-
- block_starting_lines = block_starting_lines.reject { |element| element.include?(" ") }
-
- starting_line_indices = []
-
- block_starting_lines.each do |line|
-
- starting_line_indices << modified_file_contents.index(line)
-
- end
-
- block_ending_lines = modified_file_contents.dup.each_index.select { |index| (modified_file_contents[index].eql? " }\n" or modified_file_contents[index].eql? " };\n") }
-
- starting_index = starting_line_indices[0]
-
- end
-
- rescue TypeError
-
- puts "Whitespace was left unfixed!"
-
- rescue ArgumentError
-
- puts "Whitespace was left unfixed!"
-
- end
-
- return modified_file_contents, code_blocks
-
- end
-
- compact_contents = file_contents.reject { |element| element.lstrip.eql? "" }
-
- compact_contents, code_blocks = extract_blocks(compact_contents)
-
- processed_contents = compact_contents[1...-1].collect { |line| line+"\n" }
-
- compact_contents = [compact_contents[0]] + processed_contents + [compact_contents[-1]]
-
- code_block_locations = compact_contents.each_index.select { |index| compact_contents[index].eql? " *****\n" }
-
- initial_locations = code_block_locations.dup
-
- starting_index = code_block_locations[0]
-
- for x in 0...initial_locations.length
-
- code_blocks[x][-1] = code_blocks[x][-1] + "\n"
-
- compact_contents = compact_contents[0...starting_index] + code_blocks[x] + compact_contents[starting_index+1..-1]
-
- code_block_locations = compact_contents.each_index.select { |index| compact_contents[index].eql? " *****\n" }
-
- starting_index = code_block_locations[0]
-
-
- end
-
- return compact_contents
-
- end
-
- def roll_blocks(input_file_contents, code_block_starting_locations)
-
- if !code_block_starting_locations.empty?
-
- controlregexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
-
- code_block_starting_locations = [0, code_block_starting_locations, -1].flatten
-
- possible_blocks = []
-
- block_counter = 0
-
- extracted_blocks = []
-
- for x in 0...code_block_starting_locations.length-1
-
- possible_blocks << input_file_contents[code_block_starting_locations[x]..code_block_starting_locations[x+1]]
-
- if possible_blocks.length > 1
-
- possible_blocks[-1] = possible_blocks[-1][1..-1]
-
- end
-
- end
-
- end_counter = 0
-
- end_index = []
-
- current_block = []
-
- possible_blocks.each_with_index do |block|
-
- if !block[0].eql?(current_block[-1])
-
- current_block += block
-
- else
-
- current_block += block[1..-1]
-
- end
-
- current_block.each_with_index do |line, index|
-
- if line.lstrip.eql? "}\n" or line.lstrip.eql?("};\n") or line.lstrip.include?("_!;\n")
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- if end_counter > 0
-
- until end_index.empty?
-
- array_extract = current_block[0..end_index[0]].reverse
-
- index_counter = 0
-
- array_extract.each_with_index do |line|
-
- break if line.index(controlregexp) != nil
-
- index_counter += 1
-
- end
-
- block_extract = array_extract[0..index_counter].reverse
-
- extracted_blocks << block_extract
-
- block_start = current_block.index(block_extract[0])
-
- block_end = current_block.index(block_extract[-1])
-
- current_block[block_start..block_end] = "--block#{block_counter}"
-
- block_counter += 1
-
- end_counter = 0
-
- end_index = []
-
- current_block.each_with_index do |line, index|
-
- if line.lstrip.eql? "}\n" or line.lstrip.eql?("};\n") or line.lstrip.include?("_!;\n")
-
- end_counter += 1
-
- end_index << index
-
- end
-
- end
-
- end
-
- end
-
- end
-
- return current_block, extracted_blocks
-
- else
-
- return input_file_contents, []
-
- end
-
- end
-
- def fix_syntax_indentation(input_file_contents)
-
- fixableregexp = /(else |elsuf )/
-
- need_fixes = input_file_contents.reject { |line| line.index(fixableregexp).nil? }
-
- need_fixes.each do |fix|
-
- input_file_contents[input_file_contents.index(fix)] = input_file_contents[input_file_contents.index(fix)].sub(" ", "")
-
- end
-
- return input_file_contents
-
- end
-
- def replace_ignored_words(input_string)
-
- ignorable_keywords = [/if/, /while/, /function/]
-
- dummy_replacement_words = ["eeuuff", "whaalesskkey", "conffoolotion"]
-
- dummy_replacement_words.each_with_index do |word, index|
-
- input_string = input_string.sub(word, ignorable_keywords[index].inspect[1...-1])
-
- end
-
- return input_string
-
- end
-
- javascript_regexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
-
- javascript_file_contents = javascript_file_contents.collect { |element| element.sub("Euuf", "if") }
-
- javascript_file_contents = javascript_file_contents.collect { |element| element.sub("whaaleskey", "while") }
-
- javascript_file_contents = reset_tabs(javascript_file_contents)
-
- starting_locations = []
-
- javascript_file_contents.each_with_index do |line, index|
-
- if line.index(javascript_regexp) != nil
-
- starting_locations << index
-
- end
-
- end
-
- remaining_file_contents, blocks = roll_blocks(javascript_file_contents, starting_locations)
-
- joined_file_contents = ""
-
- if !blocks.empty?
-
- remaining_file_contents = remaining_file_contents.collect { |element| " " + element }
-
- main_blocks = remaining_file_contents.reject { |element| !element.include?("--block") }
-
- main_block_numbers = main_blocks.collect { |element| element.split("--block")[1] }
-
- modified_blocks = main_blocks.dup
-
- soft_tabs = " "
-
- for x in (0...main_blocks.length)
-
- soft_tabs_counter = 1
-
- current_block = blocks[main_block_numbers[x].to_i]
-
- current_block = [soft_tabs + current_block[0]] + current_block[1...-1] + [soft_tabs*(soft_tabs_counter)+current_block[-1]]
-
- soft_tabs_counter += 1
-
- current_block = [current_block[0]] + current_block[1...-1].collect { |element| soft_tabs*(soft_tabs_counter)+element } + [current_block[-1]]
-
- nested_block = current_block.reject { |row| !row.include?("--block") }
-
- nested_block = nested_block.collect { |element| element.split("--block")[1] }
-
- nested_block = nested_block.collect { |element| element.rstrip.to_i }
-
- modified_nested_block = nested_block.clone
-
- current_block = current_block.join
-
- until modified_nested_block.empty?
-
- nested_block.each do |block_index|
-
- nested_block_contents = blocks[block_index]
-
- nested_block_contents = nested_block_contents[0...-1] + [soft_tabs*(soft_tabs_counter)+nested_block_contents[-1]]
-
- soft_tabs_counter += 1
-
- nested_block_contents = [nested_block_contents[0]] + nested_block_contents[1...-1].collect { |element| soft_tabs*(soft_tabs_counter)+element } + [nested_block_contents[-1]]
-
- nested_block_contents = nested_block_contents.reject { |element| element.gsub(" ", "").eql?("") }
-
- current_block = current_block.sub("--block#{block_index}", nested_block_contents.join)
-
- blocks[block_index] = nested_block_contents
-
- modified_nested_block.delete_at(0)
-
- soft_tabs_counter -= 1
-
- end
-
- current_block = convert_string_to_array(current_block, temporary_nila_file)
-
- nested_block = current_block.reject { |element| !element.include?("--block") }
-
- nested_block = nested_block.collect { |element| element.split("--block")[1] }
-
- nested_block = nested_block.collect { |element| element.rstrip.to_i }
-
- modified_nested_block = nested_block.clone
-
- current_block = current_block.join
-
- if !nested_block.empty?
-
- soft_tabs_counter += 1
-
- end
-
- end
-
- modified_blocks[x] = current_block
-
- end
-
- remaining_file_contents = ["(function() {\n", remaining_file_contents, "\n}).call(this);"].flatten
-
- joined_file_contents = remaining_file_contents.join
-
- main_blocks.each_with_index do |block_id, index|
-
- joined_file_contents = joined_file_contents.sub(block_id, modified_blocks[index])
-
- end
-
- else
-
- remaining_file_contents = remaining_file_contents.collect { |element| " " + element }
-
- remaining_file_contents = ["(function() {\n", remaining_file_contents, "\n}).call(this);"].flatten
-
- joined_file_contents = remaining_file_contents.join
-
- end
-
- file_id = open(temporary_nila_file, 'w')
-
- file_id.write(joined_file_contents)
-
- file_id.close()
-
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
-
- line_by_line_contents = fix_newlines(line_by_line_contents)
-
- line_by_line_contents = fix_syntax_indentation(line_by_line_contents)
-
- line_by_line_contents = line_by_line_contents.collect { |element| replace_ignored_words(element) }
-
- return line_by_line_contents
-
- end
-
- def compile_operators(input_file_contents)
-
- def compile_power_operator(input_string)
-
- matches = input_string.scan(/(\w{1,}\*\*\w{1,})/).to_a.flatten
-
- unless matches.empty?
-
- matches.each do |match|
-
- left, right = match.split("**")
-
- input_string = input_string.sub(match, "Math.pow(#{left},#{right})")
-
- end
-
- end
-
- return input_string
-
- end
-
- def compile_match_operator(input_string)
-
- rejection_exp = /( aannddy | orriioo |nnoottyy )/
-
- if input_string.include?("=~")
-
- input_string = input_string.gsub(" && "," aannddy ").gsub(" || "," orriioo ").gsub("!","nnoottyy")
-
- left, right = input_string.split("=~")
-
- if left.index(rejection_exp) != nil
-
- left = left[left.index(rejection_exp)..-1]
-
- elsif left.index(/\(/)
-
- left = left[left.index(/\(/)+1..-1]
-
- end
-
- if right.index(rejection_exp) != nil
-
- right = right[0...right.index(rejection_exp)]
-
- elsif right.index(/\)/)
-
- right = right[0...right.index(/\)/)]
-
- end
-
- original_string = "#{left}=~#{right}"
-
- replacement_string = "#{left.rstrip} = #{left.rstrip}.match(#{right.lstrip.rstrip})"
-
- input_string = input_string.sub(original_string,replacement_string)
-
- input_string = input_string.gsub(" aannddy "," && ").gsub(" orriioo "," || ").gsub("nnoottyy","!")
-
- end
-
- return input_string
-
- end
-
- input_file_contents = input_file_contents.collect { |element| element.sub("==", "===") }
-
- input_file_contents = input_file_contents.collect { |element| element.sub("!=", "!==") }
-
- input_file_contents = input_file_contents.collect { |element| element.sub("equequ", "==") }
-
- input_file_contents = input_file_contents.collect { |element| element.sub("elsuf", "else if") }
-
- input_file_contents = input_file_contents.collect { |element| compile_power_operator(element) }
-
- input_file_contents = input_file_contents.collect {|element| compile_match_operator(element)}
-
- input_file_contents = input_file_contents.collect {|element| element.gsub("_!;",";")}
-
- return input_file_contents
-
- end
-
- def pretty_print_nila(input_file_contents, temporary_nila_file)
-
-
- end
-
- def output_javascript(file_contents, output_file, temporary_nila_file)
-
- file_id = open(output_file, 'w')
-
- File.delete(temporary_nila_file)
-
- file_id.write("//Written using Nila. Visit http://adhithyan15.github.io/nila\n")
-
- file_id.write(file_contents.join)
-
- file_id.close()
-
- end
-
- if File.exist?(input_file_path)
-
- file_contents = read_file_line_by_line(input_file_path)
-
- file_contents = extract_parsable_file(file_contents)
-
- file_contents, multiline_comments, temp_file, output_js_file = replace_multiline_comments(file_contents, input_file_path, *output_file_name)
-
- file_contents, singleline_comments = replace_singleline_comments(file_contents)
-
- file_contents = split_semicolon_seperated_expressions(file_contents)
-
- file_contents = compile_heredocs(file_contents, temp_file)
-
- file_contents,loop_vars = compile_loops(file_contents,temp_file)
-
- file_contents = compile_interpolated_strings(file_contents)
-
- file_contents = compile_hashes(file_contents,temp_file)
-
- file_contents = compile_conditional_structures(file_contents, temp_file)
-
- file_contents = compile_integers(file_contents)
-
- file_contents = compile_default_values(file_contents, temp_file)
-
- file_contents, named_functions, nested_functions = replace_named_functions(file_contents, temp_file)
-
- comments = [singleline_comments, multiline_comments]
-
- file_contents = compile_parallel_assignment(file_contents, temp_file)
-
- file_contents = compile_arrays(file_contents, temp_file)
-
- file_contents = compile_strings(file_contents)
-
- file_contents, function_names = compile_named_functions(file_contents, named_functions, nested_functions, temp_file)
-
- list_of_variables, file_contents = get_variables(file_contents, temp_file,loop_vars)
-
- file_contents, ruby_functions = compile_custom_function_map(file_contents)
-
- #compile_ruby_methods(file_contents)
-
- function_names << ruby_functions
-
- list_of_variables += loop_vars
-
- file_contents = compile_whitespace_delimited_functions(file_contents, function_names, temp_file)
-
- file_contents = remove_question_marks(file_contents, list_of_variables, temp_file)
-
- file_contents = add_semicolons(file_contents)
-
- file_contents = compile_comments(file_contents, comments, temp_file)
-
- file_contents = pretty_print_javascript(file_contents, temp_file)
-
- file_contents = compile_operators(file_contents)
-
- output_javascript(file_contents, output_js_file, temp_file)
-
- puts "Compilation is successful!"
-
- else
-
- puts "File doesn't exist!"
-
- end
-
-end
-
-def create_mac_executable(input_file)
-
- def read_file_line_by_line(input_path)
-
- file_id = open(input_path)
-
- file_line_by_line = file_id.readlines()
-
- file_id.close
-
- return file_line_by_line
-
- end
-
- mac_file_contents = ["#!/usr/bin/env ruby\n\n"] + read_file_line_by_line(input_file)
-
- mac_file_path = input_file.sub(".rb", "")
-
- file_id = open(mac_file_path, "w")
-
- file_id.write(mac_file_contents.join)
-
- file_id.close
-
-end
-
-def find_file_name(input_path, file_extension)
-
- extension_remover = input_path.split(file_extension)
-
- remaining_string = extension_remover[0].reverse
-
- path_finder = remaining_string.index("/")
-
- remaining_string = remaining_string.reverse
-
- return remaining_string[remaining_string.length-path_finder..-1]
-
-end
-
-def find_file_path(input_path, file_extension)
-
- extension_remover = input_path.split(file_extension)
-
- remaining_string = extension_remover[0].reverse
-
- path_finder = remaining_string.index("/")
-
- remaining_string = remaining_string.reverse
-
- return remaining_string[0...remaining_string.length-path_finder]
-
-end
-
-nilac_version = "0.0.4.3.3"
-
-opts = Slop.parse do
- on :c, :compile=, 'Compile Nila File', as:Array, delimiter:":"
- on :h, :help, 'Help With Nilac' do
-
- puts "Nilac is the official compiler for the Nila language.This is a basic help\nmessage with pointers to more information.\n\n"
-
- puts " Basic Usage:\n\n"
-
- puts " nilac -h/--help\n"
-
- puts " nilac -v/--version\n"
-
- puts " nilac -u/--update => Update Checker\n"
-
- puts " nilac [command] [file_options]\n\n"
-
- puts " Available Commands:\n\n"
-
- puts " nilac -c [nila_file] => Compile Nila File\n\n"
-
- puts " nilac -c [nila_file]:[output_js_file] => Compile nila_file and saves it as\n output_js_file\n\n"
-
- puts " nilac -c [nila_file_folder] => Compiles each .nila file in the nila_folder\n\n"
-
- puts " nilac -c [nila_file_folder]:[output_js_file_folder] => Compiles each .nila\n file in the nila_folder and saves it in the output_js_file_folder\n\n"
-
- puts " nilac -r [nila_file] => Compile and Run nila_file\n\n"
-
- puts " Further Information:\n\n"
-
- puts " Visit http://adhithyan15.github.io/nila to know more about the project.\n\n"
-
- end
- on :v, :version, 'Output Nilac Version No' do
-
- puts nilac_version
-
- end
-
- on :r, :run=, 'Run Nila File', as:Array
-
- on :b, :build, 'Build Nilac for Linux/Mac/Rubygems' do
-
- file_path = Dir.pwd + "/src/nilac.rb"
-
- create_mac_executable(file_path)
-
- FileUtils.mv("#{file_path[0...-3]}", "#{Dir.pwd}/bin/nilac")
-
- puts "Build Successful!"
-
- end
-
- on :release=, 'Build and Release Nilac for Rubygems', as:Array
-
- on :u, :update, 'Check if Nilac is up to date.' do
-
- outdated_gems = `gem outdated`
-
- outdated_gems = outdated_gems.split("\n")
-
- outdated = false
-
- old_version = ""
-
- new_version = ""
-
- outdated_gems.each do |gem_name|
-
- if gem_name.include?("nilac")
-
- outdated = true
-
- old_version = gem_name.split("(")[1].split(")")[0].split("<")[0].lstrip
-
- new_version = gem_name.split("(")[1].split(")")[0].split("<")[1].lstrip.rstrip
-
- break
-
- end
-
- end
-
- if outdated
-
- exec = `gem update nilac`
-
- puts "Your version of Nilac (#{old_version}) was outdated! We have automatically updated you to the latest version (#{new_version})."
-
-
- else
-
- puts "Your version of Nilac is up to date!"
-
- end
-
- end
-end
-
-opts = opts.to_hash
-
-if opts[:compile] != nil
-
- if opts[:compile].length == 1
-
- input = opts[:compile][0]
-
- if input.include? ".nila"
-
- current_directory = Dir.pwd
-
- input_file = input
-
- file_path = current_directory + "/" + input_file
-
- compile(file_path)
-
- elsif input.include? "/"
-
- folder_path = input
-
- files = Dir.glob(File.join(folder_path, "*"))
-
- files = files.reject { |path| !path.include? ".nila" }
-
- files.each do |file|
-
- file_path = Dir.pwd + "/" + file
-
- compile(file_path)
-
- end
-
- end
-
- elsif opts[:compile].length == 2
-
- input = opts[:compile][0]
-
- output = opts[:compile][1]
-
- if input.include? ".nila" and output.include? ".js"
-
- input_file = input
-
- output_file = output
-
- input_file_path = input_file
-
- output_file_path = output_file
-
- compile(input_file_path, output_file_path)
-
- elsif input[-1].eql? "/" and output[-1].eql? "/"
-
- input_folder_path = input
-
- output_folder_path = output
-
- if !File.directory?(output_folder_path)
-
- FileUtils.mkdir_p(output_folder_path)
-
- end
-
- files = Dir.glob(File.join(input_folder_path, "*"))
-
- files = files.reject { |path| !path.include? ".nila" }
-
- files.each do |file|
-
- input_file_path = file
-
- output_file_path = output_folder_path + find_file_name(file, ".nila") + ".js"
-
- compile(input_file_path, output_file_path)
-
- end
-
- end
-
- end
-
-elsif opts[:run] != nil
-
- current_directory = Dir.pwd
-
- file = opts[:run][0]
-
- file_path = current_directory + "/" + file
-
- compile(file_path)
-
- js_file_name = find_file_path(file_path, ".nila") + find_file_name(file_path, ".nila") + ".js"
-
- node_output = `node #{js_file_name}`
-
- puts node_output
-
-elsif opts[:release] != nil
-
- file_path = Dir.pwd + "/src/nilac.rb"
-
- create_mac_executable(file_path)
-
- FileUtils.mv("#{file_path[0...-3]}", "#{Dir.pwd}/bin/nilac")
-
- puts "Your build was successful!\n"
-
- commit_message = opts[:release][0]
-
- `git commit -am "#{commit_message}"`
-
- puts `rake release`
-
-end
+#!/usr/bin/env ruby
+
+#Nilac is the official Nila compiler. It compiles Nila into pure Javascript. Nilac is currently
+#written in Ruby but will be self hosted in the upcoming years.
+
+#Nila and Nilac are being crafted by Adhithya Rajasekaran and Sri Madhavi Rajasekaran
+
+require 'slop'
+require 'fileutils'
+
+
+def compile(input_file_path, *output_file_name)
+
+ def read_file_line_by_line(input_path)
+
+ file_id = open(input_path)
+
+ file_line_by_line = file_id.readlines()
+
+ file_id.close
+
+ return file_line_by_line
+
+ end
+
+ def extract_parsable_file(input_file_contents)
+
+ reversed_file_contents = input_file_contents.reverse
+
+ line_counter = 0
+
+ if input_file_contents.join.include?("__END__")
+
+ while !reversed_file_contents[line_counter].strip.include?("__END__")
+
+ line_counter += 1
+
+ end
+
+ return_contents = input_file_contents[0...-1*line_counter-1]
+
+ else
+
+ input_file_contents
+
+ end
+
+ end
+
+ def replace_multiline_comments(input_file_contents, nila_file_path, *output_js_file_path)
+
+ #This method will replace both the single and multiline comments
+ #
+ #Single line comment will be replaced by => --single_line_comment[n]
+ #
+ #Multiline comment will be replaced by => --multiline_comment[n]
+
+ def find_all_matching_indices(input_string, pattern)
+
+ locations = []
+
+ index = input_string.index(pattern)
+
+ while index != nil
+
+ locations << index
+
+ index = input_string.index(pattern, index+1)
+
+
+ end
+
+ return locations
+
+
+ end
+
+ def find_file_path(input_path, file_extension)
+
+ extension_remover = input_path.split(file_extension)
+
+ remaining_string = extension_remover[0].reverse
+
+ path_finder = remaining_string.index("/")
+
+ remaining_string = remaining_string.reverse
+
+ return remaining_string[0...remaining_string.length-path_finder]
+
+ end
+
+ def find_file_name(input_path, file_extension)
+
+ extension_remover = input_path.split(file_extension)
+
+ remaining_string = extension_remover[0].reverse
+
+ path_finder = remaining_string.index("/")
+
+ remaining_string = remaining_string.reverse
+
+ return remaining_string[remaining_string.length-path_finder..-1]
+
+ end
+
+ multiline_comments = []
+
+ file_contents_as_string = input_file_contents.join
+
+ modified_file_contents = file_contents_as_string.dup
+
+ multiline_comment_counter = 1
+
+ multiline_comments_start = find_all_matching_indices(file_contents_as_string, "=begin")
+
+ multiline_comments_end = find_all_matching_indices(file_contents_as_string, "=end")
+
+ for y in 0...multiline_comments_start.length
+
+ start_of_multiline_comment = multiline_comments_start[y]
+
+ end_of_multiline_comment = multiline_comments_end[y]
+
+ multiline_comment = file_contents_as_string[start_of_multiline_comment..end_of_multiline_comment+3]
+
+ modified_file_contents = modified_file_contents.gsub(multiline_comment, "--multiline_comment[#{multiline_comment_counter}]\n\n")
+
+ multiline_comment_counter += 1
+
+ multiline_comments << multiline_comment
+
+
+ end
+
+ temporary_nila_file = find_file_path(nila_file_path, ".nila") + "temp_nila.nila"
+
+ if output_js_file_path.empty?
+
+ output_js_file = find_file_path(nila_file_path, ".nila") + find_file_name(nila_file_path, ".nila") + ".js"
+
+ else
+
+ output_js_file = output_js_file_path[0]
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id2 = open(output_js_file, 'w')
+
+ file_id.write(modified_file_contents)
+
+ file_id.close()
+
+ file_id2.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ comments = multiline_comments.dup
+
+ return line_by_line_contents, comments, temporary_nila_file, output_js_file
+
+ end
+
+ def split_semicolon_seperated_expressions(input_file_contents)
+
+ modified_file_contents = input_file_contents.dup
+
+ input_file_contents.each_with_index do |line, index|
+
+ if line.include?("\"")
+
+ first_index = line.index("\"")
+
+ modified_line = line.sub(line[first_index..line.index("\"", first_index+1)], "--string")
+
+ elsif line.include?("'")
+
+ first_index = line.index("'")
+
+ modified_line = line.sub(line[first_index..line.index("'", first_index+1)], "--string")
+
+ else
+
+ modified_line = line
+
+ end
+
+ if modified_line.include?(";")
+
+ replacement_line = modified_file_contents[index]
+
+ replacement_line = replacement_line.split(";").join("\n\n") + "\n"
+
+ modified_file_contents[index] = replacement_line
+
+ end
+
+ end
+
+ return modified_file_contents
+
+ end
+
+ def compile_heredocs(input_file_contents, temporary_nila_file)
+
+ joined_file_contents = input_file_contents.join
+
+ possible_heredocs = input_file_contents.reject { |element| !element.include?("<<-") }
+
+ possible_heredocs = possible_heredocs.collect { |element| element.match(/<<-(.*|\w*)/).to_a[0] }
+
+ possible_heredocs.each do |heredoc|
+
+ delimiter = heredoc[3..-1]
+
+ quote = 2
+
+ if delimiter.include?("'")
+
+ quote = 1
+
+ end
+
+ delimiter = delimiter.gsub("\"", "") if quote == 2
+
+ delimiter = delimiter.gsub("'", "") if quote == 1
+
+ string_split = joined_file_contents.split(heredoc, 2)
+
+ string_extract = string_split[1]
+
+ heredoc_extract = string_extract[0...string_extract.index(delimiter)]
+
+ replacement_string = ""
+
+ if quote == 1
+
+ replacement_string = "'#{heredoc_extract.delete("\"")}'".lstrip.inspect
+
+ replacement_string = replacement_string[1..-2]
+
+ elsif quote == 2
+
+ replacement_string = heredoc_extract.lstrip.inspect
+
+ end
+
+ joined_file_contents = joined_file_contents.sub(heredoc + heredoc_extract + delimiter, replacement_string)
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+
+ end
+
+ def compile_interpolated_strings(input_file_contents)
+
+ def find_all_matching_indices(input_string, pattern)
+
+ locations = []
+
+ index = input_string.index(pattern)
+
+ while index != nil
+
+ locations << index
+
+ index = input_string.index(pattern, index+1)
+
+
+ end
+
+ return locations
+
+
+ end
+
+ modified_file_contents = input_file_contents.dup
+
+ single_quoted_strings = input_file_contents.reject { |element| !(element.count("'") >= 2) }
+
+ single_quoted_strings.each do |str|
+
+ modified_string = str.dup
+
+ while modified_string.include?("'")
+
+ first_index = modified_string.index("'")
+
+ string_extract = modified_string[first_index..modified_string.index("'", first_index+1)]
+
+ modified_string = modified_string.sub(string_extract, "--single_quoted")
+
+ end
+
+ input_file_contents[input_file_contents.index(str)] = modified_string
+
+ end
+
+ input_file_contents.each_with_index do |line, index|
+
+ if line.include?("\#{")
+
+ modified_line = line.dup
+
+ interpol_starting_loc = find_all_matching_indices(modified_line, "\#{") + [-1]
+
+ interpolated_strings = []
+
+ until interpol_starting_loc.empty?
+
+ interpol_starting_loc[1] = -2 if interpol_starting_loc[1] == -1
+
+ string_extract = modified_line[interpol_starting_loc[0]+1..interpol_starting_loc[1]+1]
+
+ closed_curly_brace_index = find_all_matching_indices(string_extract, "}")
+
+ index_counter = 0
+
+ test_string = ""
+
+ until closed_curly_brace_index.empty?
+
+ test_string = string_extract[0..closed_curly_brace_index[0]]
+
+ puts test_string
+
+ original_string = test_string.dup
+
+ if test_string.include?("{")
+
+ test_string = test_string.reverse.sub("{", "$#{index_counter}$").reverse
+
+ test_string[-1] = "@#{index_counter}@"
+
+ end
+
+ string_extract = string_extract.sub(original_string, test_string)
+
+ closed_curly_brace_index = find_all_matching_indices(string_extract, "}")
+
+ index_counter += 1
+
+ end
+
+ string_extract = string_extract[0..string_extract.length-string_extract.reverse.index(/@\d@/)]
+
+ interpolated_string = "\#{" + string_extract.split("@#{index_counter-1}@")[0].split("$#{index_counter-1}$")[1] + "}"
+
+ to_be_replaced = interpolated_string.scan(/\$\d\$/)
+
+ closing_brace_rep = interpolated_string.scan(/@\d@/)
+
+ to_be_replaced.each_with_index do |rep, index|
+
+ interpolated_string = interpolated_string.sub(rep, "{").sub(closing_brace_rep[index], "}")
+
+ end
+
+ interpolated_strings << interpolated_string
+
+ modified_line = modified_line.sub(interpolated_string, "--interpolate")
+
+ if find_all_matching_indices(modified_line, "\#{").empty?
+
+ interpol_starting_loc = []
+
+ else
+
+ interpol_starting_loc = find_all_matching_indices(modified_line, "\#{") + [-1]
+
+ end
+
+ end
+
+ interpolated_strings.each do |interpol|
+
+ string_split = line.split(interpol)
+
+ if string_split[1].eql?("\"\n")
+
+ replacement_string = "\" + " + "(#{interpol[2...-1]})"
+
+ modified_file_contents[index] = modified_file_contents[index].sub(interpol+"\"", replacement_string)
+
+ elsif string_split[1].eql?("\")\n")
+
+ replacement_string = "\" + " + "(#{interpol[2...-1]})"
+
+ modified_file_contents[index] = modified_file_contents[index].sub(interpol + "\"", replacement_string)
+
+ else
+
+ replacement_string = "\"" + " + " + "(#{interpol[2...-1]})" + " + \""
+
+ modified_file_contents[index] = modified_file_contents[index].sub(interpol, replacement_string)
+
+ end
+
+ end
+
+ end
+
+ end
+
+ return modified_file_contents
+
+ end
+
+ def replace_singleline_comments(input_file_contents)
+
+ single_line_comments = []
+
+ singleline_comment_counter = 1
+
+ for x in 0...input_file_contents.length
+
+ current_row = input_file_contents[x]
+
+ if current_row.include?("#")
+
+ comment_start = current_row.index("#")
+
+ if current_row[comment_start+1] != "{"
+
+ comment = current_row[comment_start..-1]
+
+ single_line_comments << comment
+
+ current_row = current_row.gsub(comment, "--single_line_comment[#{singleline_comment_counter}]\n\n")
+
+ singleline_comment_counter += 1
+
+ end
+
+ end
+
+ input_file_contents[x] = current_row
+
+ end
+
+ return input_file_contents, single_line_comments
+
+ end
+
+ def replace_named_functions(nila_file_contents, temporary_nila_file)
+
+ def extract_array(input_array, start_index, end_index)
+
+ return input_array[start_index..end_index]
+
+ end
+
+ end_locations = []
+
+ key_word_locations = []
+
+ start_blocks = []
+
+ end_blocks = []
+
+ nila_regexp = /(def )/
+
+ named_code_blocks = []
+
+ for x in 0...nila_file_contents.length
+
+ current_row = nila_file_contents[x]
+
+ if current_row.index(nila_regexp) != nil
+
+ key_word_locations << x
+
+ elsif current_row.lstrip.include?("end\n") || current_row.include?("end")
+
+ end_locations << x
+
+
+ end
+
+
+ end
+
+ unless key_word_locations.empty?
+
+ modified_file_contents = nila_file_contents.dup
+
+ for y in 0...end_locations.length
+
+ current_location = end_locations[y]
+
+ current_string = modified_file_contents[current_location]
+
+ finder_location = current_location
+
+ begin
+
+ while current_string.index(nila_regexp) == nil
+
+ finder_location -= 1
+
+ current_string = modified_file_contents[finder_location]
+
+ end
+
+ code_block_begin = finder_location
+
+ code_block_end = current_location
+
+ start_blocks << code_block_begin
+
+ end_blocks << code_block_end
+
+ code_block_begin_string_split = modified_file_contents[code_block_begin].split(" ")
+
+ code_block_begin_string_split[0] = code_block_begin_string_split[0].reverse
+
+ code_block_begin_string = code_block_begin_string_split.join(" ")
+
+ modified_file_contents[code_block_begin] = code_block_begin_string
+
+ rescue NoMethodError
+
+ puts "Function compilation failed!"
+
+ end
+
+ end
+
+ final_modified_file_contents = nila_file_contents.dup
+
+ joined_file_contents = final_modified_file_contents.join
+
+ while start_blocks.length != 0
+
+ top_most_level = start_blocks.min
+
+ top_most_level_index = start_blocks.index(top_most_level)
+
+ matching_level = end_blocks[top_most_level_index]
+
+ named_code_blocks << extract_array(final_modified_file_contents, top_most_level, matching_level)
+
+ start_blocks.delete_at(top_most_level_index)
+
+ end_blocks.delete(matching_level)
+
+ end
+
+ codeblock_counter = 1
+
+ named_functions = named_code_blocks.dup
+
+ nested_functions = []
+
+ named_code_blocks.each do |codeblock|
+
+ if joined_file_contents.include?(codeblock.join)
+
+ joined_file_contents = joined_file_contents.sub(codeblock.join, "--named_function[#{codeblock_counter}]\n")
+
+ codeblock_counter += 1
+
+ nested_functions = nested_functions + [[]]
+
+ else
+
+ nested_functions[codeblock_counter-2] << codeblock
+
+ named_functions.delete(codeblock)
+
+ end
+
+ end
+
+ else
+
+ joined_file_contents = nila_file_contents.join
+
+ named_functions = []
+
+ nested_functions = []
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents, named_functions, nested_functions
+
+
+ end
+
+ def compile_parallel_assignment(input_file_contents, temporary_nila_file)
+
+ def arrayify_right_side(input_string)
+
+ javascript_regexp = /(if |while |for |function |function\()/
+
+ if input_string.include?("=") and input_string.index(javascript_regexp) == nil and input_string.strip[0..3] != "_ref" and !input_string.split("=")[1].include?("[")
+
+ modified_input_string = input_string.dup
+
+ right_side = input_string.split("=")[1]
+
+ if right_side.include?(",")
+
+ splits = right_side.split(",")
+
+ replacement_string = []
+
+ splits.each do |str|
+
+ unless str.include?(")") and !str.include?("(")
+
+ replacement_string << str
+
+ else
+
+ replacement_string[-1] = replacement_string[-1]+ "," +str
+
+ end
+
+ end
+
+ replacement_string = " [#{replacement_string.join(",").strip}]\n"
+
+ input_string = input_string.sub(right_side,replacement_string)
+
+ end
+
+ end
+
+ return input_string
+
+ end
+
+ input_file_contents = input_file_contents.collect {|element| arrayify_right_side(element)}
+
+ possible_variable_lines = input_file_contents.reject { |element| !element.include? "=" }
+
+ possible_parallel_assignment = possible_variable_lines.reject { |element| !element.split("=")[0].include? "," }
+
+ parallel_assignment_index = []
+
+ possible_parallel_assignment.each do |statement|
+
+ location_array = input_file_contents.each_index.select { |index| input_file_contents[index] == statement }
+
+ parallel_assignment_index << location_array[0]
+
+ end
+
+ modified_file_contents = input_file_contents.dup
+
+ parallel_assignment_counter = 1
+
+ possible_parallel_assignment.each_with_index do |line, index|
+
+ line_split = line.split(" = ")
+
+ right_side_variables = line_split[0].split(",")
+
+ replacement_string = "_ref#{parallel_assignment_counter} = #{line_split[1]}\n\n"
+
+ variable_string = ""
+
+ right_side_variables.each_with_index do |variable, var_index|
+
+ variable_string = variable_string + variable.rstrip + " = _ref#{parallel_assignment_counter}[#{var_index}]\n\n"
+
+ end
+
+ replacement_string = replacement_string + variable_string
+
+ modified_file_contents[parallel_assignment_index[index]] = replacement_string
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(modified_file_contents.join)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_default_values(input_file_contents, temporary_nila_file)
+
+ #This method compiles default values present in functions. An example is provided below
+
+ # def fill(container = "cup",liquid = "coffee")
+ # puts "Filling the #{container} with #{liquid}"
+ # end
+
+ def parse_default_values(input_function_definition)
+
+ split1, split2 = input_function_definition.split("(")
+
+ split2, split3 = split2.split(")")
+
+ function_parameters = split2.split(",")
+
+ default_value_parameters = function_parameters.reject { |element| !element.include? "=" }
+
+ replacement_parameters = []
+
+ replacement_string = ""
+
+ default_value_parameters.each do |paramvalue|
+
+ param, value = paramvalue.split("=")
+
+ replacement_parameters << param.lstrip.rstrip
+
+ replacement_string = replacement_string + "\n" + "if (#{param.lstrip.rstrip} equequ null) {\n #{paramvalue.lstrip.rstrip}\n}\n" +"\n"
+
+ end
+
+ return replacement_string, default_value_parameters, replacement_parameters
+
+ end
+
+ possible_default_values = input_file_contents.dup.reject { |element| !element.include?("def") }
+
+ possible_default_values = possible_default_values.reject { |element| !element.include?("=") }
+
+ if !possible_default_values.empty?
+
+ possible_default_values.each do |line|
+
+ current_line_index = input_file_contents.each_index.select { |index| input_file_contents[index] == line }.flatten[0]
+
+ replacement_string, value_parameters, replacement_parameters = parse_default_values(line)
+
+ modified_line = line.dup
+
+ value_parameters.each_with_index do |val, index|
+
+ modified_line = modified_line.sub(val, replacement_parameters[index])
+
+ end
+
+ input_file_contents[current_line_index] = modified_line
+
+ input_file_contents[current_line_index + 1] = replacement_string
+
+ end
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(input_file_contents.join)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def get_variables(input_file_contents, temporary_nila_file, *loop_variables)
+
+ variables = []
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("==", "equalequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("!=", "notequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("+=", "plusequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("-=", "minusequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("*=", "multiequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("/=", "divequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("%=", "modequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("=~", "matchequal") }
+
+ javascript_regexp = /(if |while |for )/
+
+ for x in 0...input_file_contents.length
+
+ current_row = input_file_contents[x]
+
+ if current_row.include?("=") and current_row.index(javascript_regexp) == nil
+
+ current_row = current_row.rstrip + "\n"
+
+ current_row_split = current_row.split("=")
+
+ for y in 0...current_row_split.length
+
+ current_row_split[y] = current_row_split[y].strip
+
+
+ end
+
+ if current_row_split[0].include?("[") or current_row_split[0].include?("(")
+
+ current_row_split[0] = current_row_split[0][0...current_row_split[0].index("[")]
+
+ end
+
+ variables << current_row_split[0]
+
+
+ end
+
+ input_file_contents[x] = current_row
+
+ end
+
+ file_contents_as_string = input_file_contents.join
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(file_contents_as_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ for_loop_variables = []
+
+ for_loop_statements = line_by_line_contents.reject {|line| !line.include?("for")}
+
+ for_loop_statements.each do |statement|
+
+ varis = statement.split("for (")[1].split(";",2)[0].split(",")
+
+ for_loop_variables << varis.collect {|vari| vari.strip.split("=")[0].strip}
+
+ for_loop_variables = for_loop_variables.flatten
+
+ end
+
+ variables += loop_variables
+
+ variables += for_loop_variables
+
+ variables = variables.flatten
+
+ if variables.length > 0
+
+ variable_declaration_string = "var " + variables.uniq.sort.join(", ") + "\n\n"
+
+ line_by_line_contents = [variable_declaration_string, line_by_line_contents].flatten
+
+ end
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("plusequal", "+=") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("minusequal", "-=") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("multiequal", "*=") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("divequal", "/=") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("modequal", "%=") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("equalequal", "==") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("notequal", "!=") }
+
+ line_by_line_contents = line_by_line_contents.collect { |element| element.gsub("matchequal", "=~") }
+
+ return variables.uniq, line_by_line_contents
+
+ end
+
+ def remove_question_marks(input_file_contents, variable_list, temporary_nila_file)
+
+ #A method to remove question marks from global variable names. Local variables are dealt
+ #with in their appropriate scope.
+
+ #Params:
+ #input_file_contents => An array containing the contents of the input nila file
+ #variable_list => An array containing all the global variables declared in the file
+ #temporary_nila_file => A file object used to write temporary contents
+
+ #Example:
+
+ #Nila
+ #isprime? = false
+
+ #Javascript Output
+ #var isprime;
+ #isprime = false;
+
+ #Returns a modified input_file_contents with all the question marks removed
+
+ joined_file_contents = input_file_contents.join
+
+ variable_list.each do |var|
+
+ if var.include? "?"
+
+ joined_file_contents = joined_file_contents.gsub(var, var[0...-1])
+
+ end
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_arrays(input_file_contents, temporary_nila_file)
+
+ def compile_w_arrays(input_file_contents)
+
+ def extract(input_string, pattern_start, pattern_end)
+
+ def find_all_matching_indices(input_string, pattern)
+
+ locations = []
+
+ index = input_string.index(pattern)
+
+ while index != nil
+
+ locations << index
+
+ index = input_string.index(pattern, index+1)
+
+
+ end
+
+ return locations
+
+
+ end
+
+ all_start_locations = find_all_matching_indices(input_string, pattern_start)
+
+ all_end_locations = find_all_matching_indices(input_string, pattern_end)
+
+ pattern = []
+
+ all_start_locations.each_with_index do |location, index|
+
+ pattern << input_string[location..all_end_locations[index]]
+
+ end
+
+ return pattern
+
+ end
+
+ def compile_w_syntax(input_string)
+
+ modified_input_string = input_string[3...-1]
+
+ string_split = modified_input_string.split(" ")
+
+ return string_split.to_s
+
+ end
+
+ modified_file_contents = input_file_contents.dup
+
+ input_file_contents.each_with_index do |line, index|
+
+ if line.include?("%w{")
+
+ string_arrays = extract(line, "%w{", "}")
+
+ string_arrays.each do |array|
+
+ modified_file_contents[index] = modified_file_contents[index].sub(array, compile_w_syntax(array))
+
+ end
+
+ end
+
+ end
+
+ return modified_file_contents
+
+ end
+
+ def compile_array_indexing(input_file_contents)
+
+ possible_indexing_operation = input_file_contents.dup.reject { |element| !element.include? "[" and !element.include? "]" }
+
+ possible_range_indexing = possible_indexing_operation.reject { |element| !element.include? ".." }
+
+ triple_range_indexing = possible_range_indexing.reject { |element| !element.include? "..." }
+
+ triple_range_indexes = []
+
+ triple_range_indexing.each do |line|
+
+ triple_range_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == line }
+
+ end
+
+ triple_range_indexes = triple_range_indexes.flatten
+
+ triple_range_indexing.each_with_index do |line, index|
+
+ split1, split2 = line.split("[")
+
+ range_index, split3 = split2.split("]")
+
+ index_start, index_end = range_index.split "..."
+
+ replacement_string = nil
+
+ if index_end.strip == "end"
+
+ replacement_string = split1 + ".slice(#{index_start},#{split}.length)\n"
+
+ else
+
+ replacement_string = split1 + ".slice(#{index_start},#{index_end})\n"
+
+ end
+
+ possible_range_indexing.delete(input_file_contents[triple_range_indexes[index]])
+
+ possible_indexing_operation.delete(input_file_contents[triple_range_indexes[index]])
+
+ input_file_contents[triple_range_indexes[index]] = replacement_string
+
+ end
+
+ double_range_indexing = possible_range_indexing.reject { |element| !element.include?("..") }
+
+ double_range_indexes = []
+
+ double_range_indexing.each do |line|
+
+ double_range_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == line }
+
+ end
+
+ double_range_indexes = double_range_indexes.flatten
+
+ double_range_indexing.each_with_index do |line, index|
+
+ split1, split2 = line.split("[")
+
+ range_index, split3 = split2.split("]")
+
+ index_start, index_end = range_index.split ".."
+
+ index_start = "" if index_start.nil?
+
+ index_end = "" if index_end.nil?
+
+ replacement_string = nil
+
+ if index_end.strip == "end"
+
+ replacement_string = split1 + ".slice(#{index_start})\n"
+
+ elsif index_end.strip == "" and index_start.strip == ""
+
+ replacement_string = split1 + ".slice(0)\n"
+
+ else
+
+ replacement_string = split1 + ".slice(#{index_start},#{index_end}+1)\n"
+
+ end
+
+ possible_range_indexing.delete(input_file_contents[double_range_indexes[index]])
+
+ possible_indexing_operation.delete(input_file_contents[double_range_indexes[index]])
+
+ input_file_contents[double_range_indexes[index]] = replacement_string
+
+ end
+
+ duplicating_operations = input_file_contents.dup.reject { |element| !element.include?(".dup") }
+
+ duplicating_operation_indexes = []
+
+ duplicating_operations.each do |line|
+
+ duplicating_operation_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == line }
+
+ end
+
+ duplicating_operation_indexes = duplicating_operation_indexes.flatten
+
+ duplicating_operation_indexes.each do |index|
+
+ input_file_contents[index] = input_file_contents[index].sub(".dup", ".slice(0)")
+
+ end
+
+ return input_file_contents
+
+ end
+
+ def compile_multiline(input_file_contents, temporary_nila_file)
+
+ possible_arrays = input_file_contents.reject { |element| !element.include?("[") }
+
+ possible_multiline_arrays = possible_arrays.reject { |element| element.include?("]") }
+
+ multiline_arrays = []
+
+ possible_multiline_arrays.each do |starting_line|
+
+ index = input_file_contents.index(starting_line)
+
+ line = starting_line
+
+ until line.include?("]")
+
+ index += 1
+
+ line = input_file_contents[index]
+
+ end
+
+ multiline_arrays << input_file_contents[input_file_contents.index(starting_line)..index]
+
+ end
+
+ joined_file_contents = input_file_contents.join
+
+ multiline_arrays.each do |array|
+
+ modified_array = array.join
+
+ array_extract = modified_array[modified_array.index("[")..modified_array.index("]")]
+
+ array_contents = array_extract.split("[")[1].split("]")[0].lstrip.rstrip.split(",").collect { |element| element.lstrip.rstrip }
+
+ array_contents = "[" + array_contents.join(",") + "]"
+
+ joined_file_contents = joined_file_contents.sub(array_extract, array_contents)
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_array_operators(input_file_contents)
+
+ possible_operator_usage = input_file_contents.reject { |element| !element.include?("<<") }
+
+ possible_operator_usage.each do |usage|
+
+ left, right = usage.split("<<")
+
+ input_file_contents[input_file_contents.index(usage)] = left.rstrip + ".push(#{right.lstrip})"
+
+ end
+
+ return input_file_contents
+
+ end
+
+ input_file_contents = compile_w_arrays(input_file_contents)
+
+ input_file_contents = compile_array_indexing(input_file_contents)
+
+ input_file_contents = compile_multiline(input_file_contents, temporary_nila_file)
+
+ input_file_contents = compile_array_operators(input_file_contents)
+
+ return input_file_contents
+
+
+ end
+
+ def compile_hashes(input_file_contents,temporary_nila_file)
+
+ def compile_multiline_hashes(input_file_contents,temporary_nila_file)
+
+ javascript_regexp = /(if |while |for |function |function\()/
+
+ possible_hashes = input_file_contents.reject { |element| !element.include?("{") }
+
+ possible_multiline_hashes = possible_hashes.reject { |element| element.include?("}") }
+
+ possible_multiline_hashes = possible_multiline_hashes.reject {|element| element.index(javascript_regexp) != nil}
+
+ multiline_hashes = []
+
+ possible_multiline_hashes.each do |starting_line|
+
+ index = input_file_contents.index(starting_line)
+
+ line = starting_line
+
+ until line.include?("}\n")
+
+ index += 1
+
+ line = input_file_contents[index]
+
+ end
+
+ multiline_hashes << input_file_contents[input_file_contents.index(starting_line)..index]
+
+ end
+
+ joined_file_contents = input_file_contents.join
+
+ multiline_hashes.each do |hash|
+
+ modified_hash = hash.join
+
+ hash_extract = modified_hash[modified_hash.index("{")..modified_hash.index("}")]
+
+ hash_contents = hash_extract.split("{")[1].split("}")[0].lstrip.rstrip.split(",").collect { |element| element.lstrip.rstrip }
+
+ hash_contents = "{" + hash_contents.join(",") + "}"
+
+ joined_file_contents = joined_file_contents.sub(hash_extract, hash_contents)
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_inline_hashes(input_file_contents)
+
+ def replace_strings(input_string)
+
+ string_counter = 0
+
+ while input_string.include?("\"")
+
+ string_extract = input_string[input_string.index("\"")..input_string.index("\"",input_string.index("\"")+1)]
+
+ input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
+
+ string_counter += 1
+
+ end
+
+ while input_string.include?("'")
+
+ string_extract = input_string[input_string.index("'")..input_string.index("'",input_string.index("'")+1)]
+
+ input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
+
+ string_counter += 1
+
+ end
+
+ return input_string
+
+ end
+
+ javascript_regexp = /(if |while |for |function |function\(|%[qQ]*\{)/
+
+ modified_file_contents = input_file_contents.clone.collect {|element| replace_strings(element)}
+
+ possible_inline_hashes = modified_file_contents.reject {|element| element.count("{") != 1}
+
+ possible_inline_hashes = possible_inline_hashes.reject {|element| element.count("}") != 1}
+
+ possible_inline_hashes = possible_inline_hashes.reject {|element| element.index(javascript_regexp) != nil}
+
+ possible_inline_hashes.each do |hash|
+
+ hash = input_file_contents[modified_file_contents.index(hash)]
+
+ hash_extract = hash[hash.index("{")..hash.index("}")]
+
+ contents = hash_extract[1...-1].split(",")
+
+ hash_contents = []
+
+ contents.each do |items|
+
+ items = items.lstrip.sub(":","") if items.lstrip[0] == ":"
+
+ key, value = items.split("=>").collect {|element| element.lstrip.rstrip} if items.include?("=>")
+
+ key, value = items.split(":").collect {|element| element.lstrip.rstrip} if items.include?(":")
+
+ key = key.gsub("'","").gsub("\"","")
+
+ hash_contents << " #{key}: #{value},"
+
+ end
+
+ replacement_string = "{\n" + hash_contents.join("\n") + "\n};\n"
+
+ input_file_contents[input_file_contents.index(hash)] = input_file_contents[input_file_contents.index(hash)].sub(hash_extract,replacement_string)
+
+ end
+
+ return input_file_contents
+
+ end
+
+ file_contents = compile_multiline_hashes(input_file_contents,temporary_nila_file)
+
+ file_contents = compile_inline_hashes(file_contents)
+
+ return file_contents
+
+ end
+
+ def compile_strings(input_file_contents)
+
+ def compile_small_q_syntax(input_file_contents)
+
+ possible_syntax_usage = input_file_contents.reject { |element| !element.include?("%q") }
+
+ possible_syntax_usage.each do |line|
+
+ modified_line = line.dup
+
+ line_split = line.split("+").collect { |element| element.lstrip.rstrip }
+
+ line_split.each do |str|
+
+ delimiter = str[str.index("%q")+2]
+
+ string_extract = str[str.index("%q")..-1]
+
+ delimiter = "}" if delimiter.eql?("{")
+
+ delimiter = ")" if delimiter.eql?("(")
+
+ delimiter = ">" if delimiter.eql?("<")
+
+ if string_extract[-1].eql?(delimiter)
+
+ input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "'#{string_extract[3...-1]}'")
+
+ modified_line = modified_line.sub(string_extract, "'#{string_extract[3...-1]}'")
+
+ elsif delimiter.eql?(" ")
+
+ input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "'#{string_extract[3..-1]}'")
+
+ modified_line = modified_line.sub(string_extract, "'#{string_extract[3..-1]}'")
+
+ end
+
+ end
+
+ end
+
+ return input_file_contents
+
+ end
+
+ def compile_big_q_syntax(input_file_contents)
+
+ possible_syntax_usage = input_file_contents.reject { |element| !element.include?("%Q") }
+
+ possible_syntax_usage.each do |line|
+
+ modified_line = line.dup
+
+ line_split = line.split("+").collect { |element| element.lstrip.rstrip }
+
+ line_split.each do |str|
+
+ delimiter = str[str.index("%Q")+2]
+
+ string_extract = str[str.index("%Q")..-1]
+
+ delimiter = "}" if delimiter.eql?("{")
+
+ delimiter = ")" if delimiter.eql?("(")
+
+ delimiter = ">" if delimiter.eql?("<")
+
+ if string_extract[-1].eql?(delimiter)
+
+ input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[3...-1]}\"")
+
+ modified_line = modified_line.sub(string_extract, "\"#{string_extract[3...-1]}\"")
+
+ elsif delimiter.eql?(" ")
+
+ input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[3..-1]}\"")
+
+ modified_line = modified_line.sub(string_extract, "\"#{string_extract[3..-1]}\"")
+
+ end
+
+ end
+
+ end
+
+ return input_file_contents
+
+ end
+
+ def compile_percentage_syntax(input_file_contents)
+
+ possible_syntax_usage = input_file_contents.reject { |element| !element.include?("%") }
+
+ possible_syntax_usage = possible_syntax_usage.reject { |element| element.index(/(\%(\W|\s)\w{1,})/).nil? }
+
+ possible_syntax_usage.each do |line|
+
+ modified_line = line.dup
+
+ line_split = line.split("+").collect { |element| element.lstrip.rstrip }
+
+ line_split.each do |str|
+
+ delimiter = str[str.index("%")+1]
+
+ string_extract = str[str.index("%")..-1]
+
+ delimiter = "}" if delimiter.eql?("{")
+
+ delimiter = ")" if delimiter.eql?("(")
+
+ delimiter = ">" if delimiter.eql?("<")
+
+ if string_extract[-1].eql?(delimiter)
+
+ input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[2...-1]}\"")
+
+ modified_line = modified_line.sub(string_extract, "\"#{string_extract[2...-1]}\"")
+
+ elsif delimiter.eql?(" ")
+
+ input_file_contents[input_file_contents.index(modified_line)] = input_file_contents[input_file_contents.index(modified_line)].sub(string_extract, "\"#{string_extract[2..-1]}\"")
+
+ modified_line = modified_line.sub(string_extract, "\"#{string_extract[2..-1]}\"")
+
+ end
+
+ end
+
+ end
+
+ return input_file_contents
+
+ end
+
+ file_contents = compile_small_q_syntax(input_file_contents)
+
+ file_contents = compile_big_q_syntax(file_contents)
+
+ file_contents = compile_percentage_syntax(file_contents)
+
+ return file_contents
+
+ end
+
+ def compile_integers(input_file_contents)
+
+ modified_file_contents = input_file_contents.clone
+
+ input_file_contents.each_with_index do |line,index|
+
+ matches = line.scan(/(([0-9]+_)+([0-9]+|$))/)
+
+ unless matches.empty?
+
+ matches.each do |match_arr|
+
+ modified_file_contents[index] = modified_file_contents[index].sub(match_arr[0],match_arr[0].gsub("_",""))
+
+ end
+
+ end
+
+ end
+
+ return modified_file_contents
+
+ end
+
+ def compile_named_functions(input_file_contents, named_code_blocks, nested_functions, temporary_nila_file)
+
+ #This method compiles all the named Nila functions. Below is an example of what is meant
+ #by named/explicit function
+
+ #def square(input_number)
+ #
+ # input_number*input_number
+ #
+ #end
+
+ #The above function will compile to
+
+ #square = function(input_number) {
+ #
+ # return input_number*input_number;
+ #
+ #};
+
+ def is_parameterless?(input_function_block)
+
+ if input_function_block[0].include?("(")
+
+ false
+
+ else
+
+ true
+
+ end
+
+ end
+
+ def lexical_scoped_variables(input_function_block)
+
+ #This method will pickup and declare all the variables inside a function block. In future, this method will be
+ #merged with the get variables method
+
+ controlregexp = /(if |while |def |function |function\()/
+
+ variables = []
+
+ function_name, parameters = input_function_block[0].split("(")
+
+ parameters = parameters.split(")")[0].split(",")
+
+ parameters = parameters.collect { |element| element.strip }
+
+ input_function_block.each do |line|
+
+ if line.include? "=" and line.index(controlregexp).nil?
+
+ current_line_split = line.strip.split("=")
+
+ variables << current_line_split[0].rstrip
+
+ end
+
+ end
+
+ parameters.each do |param|
+
+ if variables.include?(param)
+
+ variables.delete(param)
+
+ end
+
+ end
+
+ if variables.empty?
+
+ return []
+
+ else
+
+ return variables.uniq
+
+ end
+
+ end
+
+ def remove_question_marks(input_file_contents, input_list, temporary_nila_file)
+
+ joined_file_contents = input_file_contents.join
+
+ input_list.each do |element|
+
+ if element.include? "?"
+
+ joined_file_contents = joined_file_contents.gsub(element, element[0...-1])
+
+ end
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def add_auto_return_statement(input_array)
+
+ joined_array = input_array.join
+
+ reversed_input_array = input_array.reverse
+
+ if !joined_array.include?("return ")
+
+ rejected_array = reversed_input_array.reject { |content| content.lstrip.eql?("") }
+
+ rejected_array = rejected_array[1..-1]
+
+ if !rejected_array[0].strip.eql?("}")
+
+ if !rejected_array[0].strip.eql?("end")
+
+ last_statement = rejected_array[0]
+
+ replacement_string = "return #{last_statement.lstrip}"
+
+ input_array[input_array.index(last_statement)] = replacement_string
+
+ end
+
+ end
+
+ end
+
+ return input_array
+
+ end
+
+ def compile_multiple_return(input_array)
+
+ def find_all_matching_indices(input_string, pattern)
+
+ locations = []
+
+ index = input_string.index(pattern)
+
+ while index != nil
+
+ locations << index
+
+ index = input_string.index(pattern, index+1)
+
+
+ end
+
+ return locations
+
+
+ end
+
+ modified_input_array = input_array.dup
+
+ return_statements = input_array.dup.reject { |element| !element.include? "return" }
+
+ multiple_return_statements = return_statements.dup.reject { |element| !element.include? "," }
+
+ modified_multiple_return_statements = multiple_return_statements.dup
+
+ return_statement_index = []
+
+ multiple_return_statements.each do |statement|
+
+ location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
+
+ return_statement_index << location_array[0]
+
+ end
+
+ multiple_return_statements.each_with_index do |return_statement, index|
+
+ replacement_counter = 0
+
+ if return_statement.include? "\""
+
+ starting_quotes = find_all_matching_indices(return_statement, "\"")
+
+ for x in 0...(starting_quotes.length)/2
+
+ quotes = return_statement[starting_quotes[x]..starting_quotes[x+1]]
+
+ replacement_counter += 1
+
+ modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(quotes, "repstring#{1}")
+
+ modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(quotes, "repstring#{1}")
+
+ end
+
+ end
+
+ end
+
+ modified_multiple_return_statements = modified_multiple_return_statements.reject { |element| !element.include? "," }
+
+ return_statement_index = []
+
+ modified_multiple_return_statements.each do |statement|
+
+ location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
+
+ return_statement_index << location_array[0]
+
+ end
+
+ modified_multiple_return_statements.each_with_index do |return_statement, index|
+
+ method_call_counter = 0
+
+ if return_statement.include? "("
+
+ open_paran_location = find_all_matching_indices(return_statement, "(")
+
+ open_paran_location.each do |paran_index|
+
+ method_call = return_statement[paran_index..return_statement.index(")", paran_index+1)]
+
+ method_call_counter += 1
+
+ modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(method_call, "methodcall#{method_call_counter}")
+
+ modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(method_call, "methodcall#{method_call_counter}")
+
+ end
+
+ end
+
+ end
+
+ modified_multiple_return_statements = modified_multiple_return_statements.reject { |element| !element.include?(",") }
+
+ return_statement_index = []
+
+ modified_multiple_return_statements.each do |statement|
+
+ location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
+
+ return_statement_index << location_array[0]
+
+ end
+
+ return_statement_index.each do |index|
+
+ original_statement = input_array[index]
+
+ statement_split = original_statement.split("return ")
+
+ replacement_split = "return [" + statement_split[1].rstrip + "]\n\n"
+
+ input_array[index] = replacement_split
+
+ end
+
+ return input_array
+
+ end
+
+ def coffee_type_function(input_array)
+
+ function_name = input_array[0].split("function ")[1].split("(")[0].lstrip
+
+ input_array[0] = "#{function_name} = function(" + input_array[0].split("function ")[1].split("(")[1].lstrip
+
+ return input_array
+
+ end
+
+ def compile_function(input_array, temporary_nila_file)
+
+ modified_input_array = input_array.dup
+
+ if is_parameterless?(modified_input_array)
+
+ if modified_input_array[0].include?("--single")
+
+ modified_input_array[0] = input_array[0].sub "def", "function"
+
+ interim_string = modified_input_array[0].split("--single")
+
+ modified_input_array[0] = interim_string[0].rstrip + "() {\n--single" + interim_string[1]
+
+
+ elsif modified_input_array[0].include?("--multi")
+
+ modified_input_array[0] = input_array[0].sub "def", "function"
+
+ interim_string = modified_input_array[0].split("--multi")
+
+ modified_input_array[0] = interim_string[0].rstrip + "() {\n--multi" + interim_string[1]
+
+ else
+
+ modified_input_array[0] = input_array[0].sub "def", "function"
+
+ modified_input_array[0] = modified_input_array[0].rstrip + "() {\n"
+
+ end
+
+ else
+
+ if modified_input_array[0].include?("--single")
+
+ modified_input_array[0] = input_array[0].sub "def", "function"
+
+ interim_string = modified_input_array[0].split("--single")
+
+ modified_input_array[0] = interim_string[0].rstrip + " {\n--single" + interim_string[1]
+
+
+ elsif modified_input_array[0].include?("--multi")
+
+ modified_input_array[0] = input_array[0].sub "def", "function"
+
+ interim_string = modified_input_array[0].split("--multi")
+
+ modified_input_array[0] = interim_string[0].rstrip + " {\n--multi" + interim_string[1]
+
+ else
+
+ modified_input_array[0] = input_array[0].sub "def", "function"
+
+ modified_input_array[0] = modified_input_array[0].rstrip + " {\n"
+
+ end
+
+ end
+
+ modified_input_array[-1] = input_array[-1].sub "end", "};\n"
+
+ modified_input_array = compile_parallel_assignment(modified_input_array, temporary_nila_file)
+
+ variables = lexical_scoped_variables(modified_input_array)
+
+ if !variables.empty?
+
+ variable_string = "\nvar " + variables.join(", ") + "\n"
+
+ modified_input_array.insert(1, variable_string)
+
+ end
+
+ modified_input_array = remove_question_marks(modified_input_array, variables, temporary_nila_file)
+
+ modified_input_array = add_auto_return_statement(modified_input_array)
+
+ modified_input_array = compile_multiple_return(modified_input_array)
+
+ modified_input_array = coffee_type_function(modified_input_array)
+
+ return modified_input_array
+
+ end
+
+ def extract_function_name(input_code_block)
+
+ first_line = input_code_block[0]
+
+ first_line_split = first_line.split(" ")
+
+ if first_line_split[1].include?("(")
+
+ function_name, parameters = first_line_split[1].split("(")
+
+ else
+
+ function_name = first_line_split[1]
+
+ end
+
+ return function_name
+
+ end
+
+ joined_file_contents = input_file_contents.join
+
+ unless named_code_blocks.empty?
+
+ codeblock_counter = 1
+
+ function_names = []
+
+ named_code_blocks.each do |codeblock|
+
+ function_names[codeblock_counter-1] = []
+
+ joined_file_contents = joined_file_contents.sub("--named_function[#{codeblock_counter}]\n", compile_function(codeblock, temporary_nila_file).join)
+
+ codeblock_counter += 1
+
+ current_nested_functions = nested_functions[codeblock_counter-2]
+
+ function_names[codeblock_counter-2] << extract_function_name(codeblock)
+
+ current_nested_functions.each do |nested_function|
+
+ function_names[codeblock_counter-2] << extract_function_name(nested_function)
+
+ joined_file_contents = joined_file_contents.sub(nested_function.join, compile_function(nested_function, temporary_nila_file).join)
+
+ end
+
+ end
+
+ else
+
+ function_names = []
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents, function_names
+
+ end
+
+ def compile_custom_function_map(input_file_contents)
+
+ function_map_replacements = {
+
+ "puts" => "console.log",
+
+ "p" => "console.log",
+
+ "print" => "process.stdout.write",
+
+ }
+
+ function_map = function_map_replacements.keys
+
+ modified_file_contents = input_file_contents.dup
+
+ input_file_contents.each_with_index do |line, index|
+
+ function_map.each do |function|
+
+ if line.include?(function+"(") or line.include?(function+" ")
+
+ modified_file_contents[index] = line.sub(function, function_map_replacements[function])
+
+ end
+
+ end
+
+ end
+
+ return modified_file_contents, function_map_replacements.values
+
+ end
+
+ def compile_ruby_methods(input_file_contents)
+
+ # These are some interesting methods that we really miss in Javascript.
+ # So we have made these methods available
+
+ method_map_replacement = {
+
+ ".split" => ".split(\" \")",
+
+ ".strip" => ".replace(/^\s+|\s+$/g,'')",
+
+ ".lstrip" => ".replace(/^\s+/g,\"\")",
+
+ ".rstrip" => ".replace(/\s+$/g,\"\")"
+ }
+
+ method_map = method_map_replacement.keys
+
+ method_map_regex = method_map.collect {|name| name.gsub(".","\\.")}
+
+ method_map_regex = Regexp.new(method_map_regex.join("|"))
+
+ modified_file_contents = input_file_contents.clone
+
+ input_file_contents.each_with_index do |line, index|
+
+ if line.match(method_map_regex)
+
+ unless method_match.include?(line+"(")
+
+ puts line
+
+ end
+
+ end
+
+ end
+
+ end
+
+ def compile_whitespace_delimited_functions(input_file_contents, function_names, temporary_nila_file)
+
+ def extract(input_string, pattern_start, pattern_end)
+
+ def find_all_matching_indices(input_string, pattern)
+
+ locations = []
+
+ index = input_string.index(pattern)
+
+ while index != nil
+
+ locations << index
+
+ index = input_string.index(pattern, index+1)
+
+
+ end
+
+ return locations
+
+
+ end
+
+ all_start_locations = find_all_matching_indices(input_string, pattern_start)
+
+ pattern = []
+
+ all_start_locations.each do |location|
+
+ extracted_string = input_string[location..-1]
+
+ string_extract = extracted_string[0..extracted_string.index(pattern_end)]
+
+ if !string_extract.include?(" = function(")
+
+ pattern << string_extract
+
+ end
+
+ end
+
+ return pattern
+
+ end
+
+ begin
+
+ input_file_contents[-1] = input_file_contents[-1] + "\n" if !input_file_contents[-1].include?("\n")
+
+ joined_file_contents = input_file_contents.join
+
+ function_names.each do |list_of_functions|
+
+ list_of_functions.each do |function|
+
+ matching_strings = extract(joined_file_contents, function+" ", "\n")
+
+ matching_strings.each do |string|
+
+ modified_string = string.dup
+
+ modified_string = modified_string.rstrip + modified_string.split(modified_string.rstrip)[1].gsub(" ", "")
+
+ modified_string = modified_string.sub(function+" ", function+"(")
+
+ modified_string = modified_string.sub("\n", ")\n")
+
+ joined_file_contents = joined_file_contents.sub(string, modified_string)
+
+ end
+
+ end
+
+ end
+
+ rescue NoMethodError
+
+ puts "Whitespace delimitation exited with errors!"
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_conditional_structures(input_file_contents, temporary_nila_file)
+
+ def replace_unless_until(input_file_contents)
+
+ modified_file_contents = input_file_contents.clone
+
+ possible_unless_commands = input_file_contents.reject { |element| !element.include?("unless") }
+
+ unless_commands = possible_unless_commands.reject { |element| !element.lstrip.split("unless")[0].empty? }
+
+ unless_commands.each do |command|
+
+ junk, condition = command.split("unless ")
+
+ condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
+
+ replacement_string = "if !(#{condition.lstrip.rstrip})\n"
+
+ modified_file_contents[modified_file_contents.index(command)] = replacement_string
+
+ end
+
+ possible_until_commands = input_file_contents.reject { |element| !element.include?("until") }
+
+ until_commands = possible_until_commands.reject { |element| !element.lstrip.split("until")[0].empty? }
+
+ until_commands.each do |command|
+
+ junk, condition = command.split("until ")
+
+ condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
+
+ replacement_string = "while !(#{condition.lstrip.rstrip})\n"
+
+ modified_file_contents[modified_file_contents.index(command)] = replacement_string
+
+ end
+
+ return modified_file_contents
+
+ end
+
+ def compile_ternary_if(input_file_contents)
+
+ possible_ternary_if = input_file_contents.reject{|element| !element.include?("if")}
+
+ possible_ternary_if = possible_ternary_if.reject {|element| !element.include?("then")}
+
+ possible_ternary_if.each do |statement|
+
+ statement_extract = statement[statement.index("if")..statement.index("end")+2]
+
+ condition = statement_extract.split("then")[0].split("if")[1].lstrip.rstrip
+
+ true_condition = statement_extract.split("then")[1].split("else")[0].lstrip.rstrip
+
+ false_condition = statement_extract.split("else")[1].split("end")[0].lstrip.rstrip
+
+ replacement_string = "#{condition} ? #{true_condition} : #{false_condition}"
+
+ input_file_contents[input_file_contents.index(statement)] = input_file_contents[input_file_contents.index(statement)].sub(statement_extract,replacement_string)
+
+ end
+
+ return input_file_contents
+
+ end
+
+ def compile_inline_conditionals(input_file_contents, temporary_nila_file)
+
+ conditionals = [/( if )/, /( while )/, /( unless )/, /( until )/]
+
+ plain_conditionals = [" if ", " while ", " unless ", " until "]
+
+ joined_file_contents = input_file_contents.join
+
+ output_statement = ""
+
+ conditionals.each_with_index do |regex, index|
+
+ matching_lines = input_file_contents.reject { |content| content.index(regex).nil? }
+
+ matching_lines.each do |line|
+
+ line_split = line.split(plain_conditionals[index])
+
+ condition = line_split[1]
+
+ condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
+
+ if index == 0
+
+ output_statement = "if (#{condition.lstrip.rstrip.gsub("?", "")}) {\n\n#{line_split[0]}\n}\n"
+
+ elsif index == 1
+
+ output_statement = "while (#{condition.lstrip.rstrip.gsub("?", "")}) {\n\n#{line_split[0]}\n}\n"
+
+ elsif index == 2
+
+ output_statement = "if (!(#{condition.lstrip.rstrip.gsub("?", "")})) {\n\n#{line_split[0]}\n}\n"
+
+ elsif index == 3
+
+ output_statement = "while (!(#{condition.lstrip.rstrip.gsub("?", "")})) {\n\n#{line_split[0]}\n}\n"
+
+ end
+
+ joined_file_contents = joined_file_contents.sub(line, output_statement)
+
+ end
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_regular_if(input_file_contents, temporary_nila_file)
+
+ def convert_string_to_array(input_string, temporary_nila_file)
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(input_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def extract_if_blocks(if_statement_indexes, input_file_contents)
+
+ possible_if_blocks = []
+
+ if_block_counter = 0
+
+ extracted_blocks = []
+
+ controlregexp = /(if |while |def )/
+
+ rejectionregexp = /( if | while )/
+
+ for x in 0...if_statement_indexes.length-1
+
+ possible_if_blocks << input_file_contents[if_statement_indexes[x]..if_statement_indexes[x+1]]
+
+ end
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block = []
+
+ possible_if_blocks.each_with_index do |block|
+
+ current_block += block
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ if end_counter > 0
+
+ until end_index.empty?
+
+ array_extract = current_block[0..end_index[0]].reverse
+
+ index_counter = 0
+
+ array_extract.each_with_index do |line|
+
+ break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
+
+ index_counter += 1
+
+ end
+
+ block_extract = array_extract[0..index_counter].reverse
+
+ extracted_blocks << block_extract
+
+ block_start = current_block.index(block_extract[0])
+
+ block_end = current_block.index(block_extract[-1])
+
+ current_block[block_start..block_end] = "--ifblock#{if_block_counter}"
+
+ if_block_counter += 1
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ return current_block, extracted_blocks
+
+ end
+
+ def compile_if_syntax(input_block)
+
+ strings = []
+
+ string_counter = 0
+
+ modified_input_block = input_block.dup
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("\"")
+
+ opening_quotes = line.index("\"")
+
+ string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
+
+ strings << string_extract
+
+ modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
+
+ string_counter += 1
+
+ end
+
+ end
+
+ input_block = modified_input_block
+
+ starting_line = input_block[0]
+
+ starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
+
+ junk, condition = starting_line.split("if")
+
+ condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
+
+ input_block[0] = "Euuf (#{condition.lstrip.rstrip.gsub("?", "")}) {\n"
+
+ input_block[-1] = input_block[-1].lstrip.sub("end", "}")
+
+ elsif_statements = input_block.reject { |element| !element.include?("elsuf") }
+
+ elsif_statements.each do |statement|
+
+ junk, condition = statement.split("elsuf")
+
+ condition = condition.gsub(" and "," && ").gsub(" or "," || ").gsub(" not "," !")
+
+ input_block[input_block.index(statement)] = "} elsuf (#{condition.lstrip.rstrip.gsub("?", "")}) {\n"
+
+ end
+
+ else_statements = input_block.reject { |element| !element.include?("else") }
+
+ else_statements.each do |statement|
+
+ input_block[input_block.index(statement)] = "} else {\n"
+
+ end
+
+ modified_input_block = input_block.dup
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("--string{")
+
+ junk, remains = line.split("--string{")
+
+ string_index, junk = remains.split("}")
+
+ modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
+
+ end
+
+ end
+
+ return modified_input_block
+
+ end
+
+ input_file_contents = input_file_contents.collect { |element| element.sub("elsif", "elsuf") }
+
+ possible_if_statements = input_file_contents.reject { |element| !element.include?("if") }
+
+ possible_if_statements = possible_if_statements.reject { |element| element.include?("else") }
+
+ possible_if_statements = possible_if_statements.reject { |element| element.lstrip.include?(" if ") }
+
+ if !possible_if_statements.empty?
+
+ if_statement_indexes = []
+
+ possible_if_statements.each do |statement|
+
+ if_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
+
+ end
+
+ if_statement_indexes = [0] + if_statement_indexes.flatten + [-1]
+
+ controlregexp = /(while |def )/
+
+ modified_input_contents, extracted_statements = extract_if_blocks(if_statement_indexes, input_file_contents.clone)
+
+ joined_blocks = extracted_statements.collect { |element| element.join }
+
+ if_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
+
+ rejected_elements = joined_blocks - if_statements
+
+ rejected_elements_index = []
+
+ rejected_elements.each do |element|
+
+ rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
+
+ end
+
+ if_blocks_index = (0...extracted_statements.length).to_a
+
+ rejected_elements_index = rejected_elements_index.flatten
+
+ if_blocks_index -= rejected_elements_index
+
+ modified_if_statements = if_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
+
+ modified_if_statements = modified_if_statements.collect { |block| compile_if_syntax(block) }.reverse
+
+ if_blocks_index = if_blocks_index.collect { |element| "--ifblock#{element}" }.reverse
+
+ rejected_elements_index = rejected_elements_index.collect { |element| "--ifblock#{element}" }.reverse
+
+ rejected_elements = rejected_elements.reverse
+
+ joined_file_contents = modified_input_contents.join
+
+ until if_blocks_index.empty? and rejected_elements_index.empty?
+
+ if !if_blocks_index.empty?
+
+ if joined_file_contents.include?(if_blocks_index[0])
+
+ joined_file_contents = joined_file_contents.sub(if_blocks_index[0], modified_if_statements[0].join)
+
+ if_blocks_index.delete_at(0)
+
+ modified_if_statements.delete_at(0)
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0])
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0])
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ end
+
+ else
+
+ joined_file_contents = input_file_contents.join
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_regular_while(input_file_contents, temporary_nila_file)
+
+ def convert_string_to_array(input_string, temporary_nila_file)
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(input_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def extract_while_blocks(while_statement_indexes, input_file_contents)
+
+ possible_while_blocks = []
+
+ while_block_counter = 0
+
+ extracted_blocks = []
+
+ controlregexp = /(if |while |def )/
+
+ rejectionregexp = /( if | while )/
+
+ for x in 0...while_statement_indexes.length-1
+
+ possible_while_blocks << input_file_contents[while_statement_indexes[x]..while_statement_indexes[x+1]]
+
+ end
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block = []
+
+ possible_while_blocks.each_with_index do |block|
+
+ current_block += block
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ if end_counter > 0
+
+ until end_index.empty?
+
+ array_extract = current_block[0..end_index[0]].reverse
+
+ index_counter = 0
+
+ array_extract.each_with_index do |line|
+
+ break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
+
+ index_counter += 1
+
+ end
+
+ block_extract = array_extract[0..index_counter].reverse
+
+ extracted_blocks << block_extract
+
+ block_start = current_block.index(block_extract[0])
+
+ block_end = current_block.index(block_extract[-1])
+
+ current_block[block_start..block_end] = "--whileblock#{while_block_counter}"
+
+ while_block_counter += 1
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ return current_block, extracted_blocks
+
+ end
+
+ def compile_while_syntax(input_block)
+
+ modified_input_block = input_block.dup
+
+ strings = []
+
+ string_counter = 0
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("\"")
+
+ opening_quotes = line.index("\"")
+
+ string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
+
+ strings << string_extract
+
+ modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
+
+ string_counter += 1
+
+ end
+
+ end
+
+ input_block = modified_input_block
+
+ starting_line = input_block[0]
+
+ starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
+
+ junk, condition = starting_line.split("while")
+
+ input_block[0] = "whaaleskey (#{condition.lstrip.rstrip.gsub("?", "")}) {\n"
+
+ input_block[-1] = input_block[-1].lstrip.sub("end", "}")
+
+ modified_input_block = input_block.dup
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("--string{")
+
+ junk, remains = line.split("--string{")
+
+ string_index, junk = remains.split("}")
+
+ modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
+
+ end
+
+ end
+
+ return modified_input_block
+
+ end
+
+ possible_while_statements = input_file_contents.reject { |element| !element.include?("while") }
+
+ if !possible_while_statements.empty?
+
+ while_statement_indexes = []
+
+ possible_while_statements.each do |statement|
+
+ while_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
+
+ end
+
+ while_statement_indexes = [0] + while_statement_indexes.flatten + [-1]
+
+ controlregexp = /(if |def )/
+
+ modified_input_contents, extracted_statements = extract_while_blocks(while_statement_indexes, input_file_contents.clone)
+
+ joined_blocks = extracted_statements.collect { |element| element.join }
+
+ while_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
+
+ rejected_elements = joined_blocks - while_statements
+
+ rejected_elements_index = []
+
+ rejected_elements.each do |element|
+
+ rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
+
+ end
+
+ while_blocks_index = (0...extracted_statements.length).to_a
+
+ rejected_elements_index = rejected_elements_index.flatten
+
+ while_blocks_index -= rejected_elements_index
+
+ modified_while_statements = while_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
+
+ modified_while_statements = modified_while_statements.collect { |block| compile_while_syntax(block) }.reverse
+
+ while_blocks_index = while_blocks_index.collect { |element| "--whileblock#{element}" }.reverse
+
+ rejected_elements_index = rejected_elements_index.collect { |element| "--whileblock#{element}" }.reverse
+
+ rejected_elements = rejected_elements.reverse
+
+ joined_file_contents = modified_input_contents.join
+
+ until while_blocks_index.empty? and rejected_elements_index.empty?
+
+ if !while_blocks_index.empty?
+
+ if joined_file_contents.include?(while_blocks_index[0])
+
+ joined_file_contents = joined_file_contents.sub(while_blocks_index[0], modified_while_statements[0].join)
+
+ while_blocks_index.delete_at(0)
+
+ modified_while_statements.delete_at(0)
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ end
+
+ else
+
+ joined_file_contents = input_file_contents.join
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_regular_for(input_file_contents, temporary_nila_file)
+
+ def convert_string_to_array(input_string, temporary_nila_file)
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(input_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def extract_for_blocks(for_statement_indexes, input_file_contents)
+
+ possible_for_blocks = []
+
+ for_block_counter = 0
+
+ extracted_blocks = []
+
+ controlregexp = /(if |while |def |for )/
+
+ rejectionregexp = /( if | while )/
+
+ for x in 0...for_statement_indexes.length-1
+
+ possible_for_blocks << input_file_contents[for_statement_indexes[x]..for_statement_indexes[x+1]]
+
+ end
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block = []
+
+ possible_for_blocks.each_with_index do |block|
+
+ current_block += block
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ if end_counter > 0
+
+ until end_index.empty?
+
+ array_extract = current_block[0..end_index[0]].reverse
+
+ index_counter = 0
+
+ array_extract.each_with_index do |line|
+
+ break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
+
+ index_counter += 1
+
+ end
+
+ block_extract = array_extract[0..index_counter].reverse
+
+ extracted_blocks << block_extract
+
+ block_start = current_block.index(block_extract[0])
+
+ block_end = current_block.index(block_extract[-1])
+
+ current_block[block_start..block_end] = "--forblock#{for_block_counter}"
+
+ for_block_counter += 1
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ return current_block, extracted_blocks
+
+ end
+
+ def compile_for_syntax(input_block)
+
+ def compile_condition(input_condition, input_block)
+
+ variable,array_name = input_condition.split("in")
+
+ if array_name.strip.include?("[") and array_name.strip.include?("]")
+
+ replacement_array = "_ref1 = #{array_name.strip}\n\n"
+
+ replacement_string = "#{variable.strip} = _ref1[_i];\n\n"
+
+ input_block = [replacement_array] + input_block.insert(1,replacement_string)
+
+ input_block[1] = "for (_i = 0, _j = _ref1.length; _i < _j; _i += 1) {\n\n"
+
+ elsif array_name.strip.include?("..")
+
+ array_type = if array_name.strip.include?("...") then 0 else 1 end
+
+ if array_type == 0
+
+ num1,num2 = array_name.strip.split("...")
+
+ input_block[0] = "for (#{variable.strip} = #{num1}, _j = #{num2}; #{variable.strip} <= _j; #{variable.strip} += 1) {\n\n"
+
+ else
+
+ num1,num2 = array_name.strip.split("..")
+
+ input_block[0] = "for (#{variable.strip} = #{num1}, _j = #{num2}; #{variable.strip} < _j; #{variable.strip} += 1) {\n\n"
+
+ end
+
+ else
+
+ input_block[0] = "for (_i = 0, _j = #{array_name.strip}.length; _i < _j; _i += 1) {\n\n"
+
+ input_block = input_block.insert(1,"#{variable.strip} = #{array_name.strip}[_i];\n\n")
+
+ end
+
+ return input_block
+
+ end
+
+ modified_input_block = input_block.dup
+
+ strings = []
+
+ string_counter = 0
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("\"")
+
+ opening_quotes = line.index("\"")
+
+ string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
+
+ strings << string_extract
+
+ modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
+
+ string_counter += 1
+
+ end
+
+ end
+
+ input_block = modified_input_block
+
+ starting_line = input_block[0]
+
+ starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
+
+ junk, condition = starting_line.split("for")
+
+ input_block[-1] = input_block[-1].lstrip.sub("end", "}")
+
+ input_block = compile_condition(condition,input_block)
+
+ modified_input_block = input_block.dup
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("--string{")
+
+ junk, remains = line.split("--string{")
+
+ string_index, junk = remains.split("}")
+
+ modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
+
+ end
+
+ end
+
+ return modified_input_block
+
+ end
+
+ possible_for_statements = input_file_contents.reject { |element| !element.include?("for") }
+
+ possible_for_statements = possible_for_statements.reject {|element| element.include?("for (")}
+
+ if !possible_for_statements.empty?
+
+ for_statement_indexes = []
+
+ possible_for_statements.each do |statement|
+
+ for_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
+
+ end
+
+ for_statement_indexes = [0] + for_statement_indexes.flatten + [-1]
+
+ controlregexp = /(if |def |while )/
+
+ modified_input_contents, extracted_statements = extract_for_blocks(for_statement_indexes, input_file_contents.clone)
+
+ joined_blocks = extracted_statements.collect { |element| element.join }
+
+ for_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
+
+ rejected_elements = joined_blocks - for_statements
+
+ rejected_elements_index = []
+
+ rejected_elements.each do |element|
+
+ rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
+
+ end
+
+ for_blocks_index = (0...extracted_statements.length).to_a
+
+ rejected_elements_index = rejected_elements_index.flatten
+
+ for_blocks_index -= rejected_elements_index
+
+ modified_for_statements = for_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
+
+ modified_for_statements = modified_for_statements.collect { |block| compile_for_syntax(block) }.reverse
+
+ for_blocks_index = for_blocks_index.collect { |element| "--forblock#{element}" }.reverse
+
+ rejected_elements_index = rejected_elements_index.collect { |element| "--forblock#{element}" }.reverse
+
+ rejected_elements = rejected_elements.reverse
+
+ joined_file_contents = modified_input_contents.join
+
+ until for_blocks_index.empty? and rejected_elements_index.empty?
+
+ if !for_blocks_index.empty?
+
+ if joined_file_contents.include?(for_blocks_index[0])
+
+ joined_file_contents = joined_file_contents.sub(for_blocks_index[0], modified_for_statements[0].join)
+
+ for_blocks_index.delete_at(0)
+
+ modified_for_statements.delete_at(0)
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ end
+
+ else
+
+ joined_file_contents = input_file_contents.join
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def compile_loop_keyword(input_file_contents,temporary_nila_file)
+
+ def convert_string_to_array(input_string, temporary_nila_file)
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(input_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def extract_loop_blocks(loop_statement_indexes, input_file_contents)
+
+ possible_loop_blocks = []
+
+ loop_block_counter = 0
+
+ extracted_blocks = []
+
+ controlregexp = /(if |while |def |loop )/
+
+ rejectionregexp = /( if | while )/
+
+ for x in 0...loop_statement_indexes.length-1
+
+ possible_loop_blocks << input_file_contents[loop_statement_indexes[x]..loop_statement_indexes[x+1]]
+
+ end
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block = []
+
+ possible_loop_blocks.each_with_index do |block|
+
+ current_block += block
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ if end_counter > 0
+
+ until end_index.empty?
+
+ array_extract = current_block[0..end_index[0]].reverse
+
+ index_counter = 0
+
+ array_extract.each_with_index do |line|
+
+ break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
+
+ index_counter += 1
+
+ end
+
+ block_extract = array_extract[0..index_counter].reverse
+
+ extracted_blocks << block_extract
+
+ block_start = current_block.index(block_extract[0])
+
+ block_end = current_block.index(block_extract[-1])
+
+ current_block[block_start..block_end] = "--loopblock#{loop_block_counter}"
+
+ loop_block_counter += 1
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block.each_with_index do |line, index|
+
+ if line.strip.eql? "end"
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ return current_block, extracted_blocks
+
+ end
+
+ def compile_loop_syntax(input_block)
+
+ modified_input_block = input_block.dup
+
+ strings = []
+
+ string_counter = 0
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("\"")
+
+ opening_quotes = line.index("\"")
+
+ string_extract = line[opening_quotes..line.index("\"", opening_quotes+1)]
+
+ strings << string_extract
+
+ modified_input_block[index] = modified_input_block[index].sub(string_extract, "--string{#{string_counter}}")
+
+ string_counter += 1
+
+ end
+
+ end
+
+ input_block = modified_input_block
+
+ starting_line = input_block[0]
+
+ starting_line = starting_line + "\n" if starting_line.lstrip == starting_line
+
+ input_block[0] = "whaaleskey (true) {\n"
+
+ input_block[-1] = input_block[-1].lstrip.sub("end", "}")
+
+ modified_input_block = input_block.dup
+
+ input_block.each_with_index do |line, index|
+
+ if line.include?("--string{")
+
+ junk, remains = line.split("--string{")
+
+ string_index, junk = remains.split("}")
+
+ modified_input_block[index] = modified_input_block[index].sub("--string{#{string_index.strip}}", strings[string_index.strip.to_i])
+
+ end
+
+ end
+
+ return modified_input_block
+
+ end
+
+ possible_loop_statements = input_file_contents.reject { |element| !element.include?("loop") }
+
+ if !possible_loop_statements.empty?
+
+ loop_statement_indexes = []
+
+ possible_loop_statements.each do |statement|
+
+ loop_statement_indexes << input_file_contents.dup.each_index.select { |index| input_file_contents[index] == statement }
+
+ end
+
+ loop_statement_indexes = [0] + loop_statement_indexes.flatten + [-1]
+
+ controlregexp = /(if |def )/
+
+ modified_input_contents, extracted_statements = extract_loop_blocks(loop_statement_indexes, input_file_contents.clone)
+
+ joined_blocks = extracted_statements.collect { |element| element.join }
+
+ loop_statements = joined_blocks.reject { |element| element.index(controlregexp) != nil }
+
+ rejected_elements = joined_blocks - loop_statements
+
+ rejected_elements_index = []
+
+ rejected_elements.each do |element|
+
+ rejected_elements_index << joined_blocks.each_index.select { |index| joined_blocks[index] == element }
+
+ end
+
+ loop_blocks_index = (0...extracted_statements.length).to_a
+
+ rejected_elements_index = rejected_elements_index.flatten
+
+ loop_blocks_index -= rejected_elements_index
+
+ modified_loop_statements = loop_statements.collect { |string| convert_string_to_array(string, temporary_nila_file) }
+
+ modified_loop_statements = modified_loop_statements.collect { |block| compile_loop_syntax(block) }.reverse
+
+ loop_blocks_index = loop_blocks_index.collect { |element| "--loopblock#{element}" }.reverse
+
+ rejected_elements_index = rejected_elements_index.collect { |element| "--loopblock#{element}" }.reverse
+
+ rejected_elements = rejected_elements.reverse
+
+ joined_file_contents = modified_input_contents.join
+
+ until loop_blocks_index.empty? and rejected_elements_index.empty?
+
+ if !loop_blocks_index.empty?
+
+ if joined_file_contents.include?(loop_blocks_index[0])
+
+ joined_file_contents = joined_file_contents.sub(loop_blocks_index[0], modified_loop_statements[0].join)
+
+ loop_blocks_index.delete_at(0)
+
+ modified_loop_statements.delete_at(0)
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ else
+
+ joined_file_contents = joined_file_contents.sub(rejected_elements_index[0], rejected_elements[0].join)
+
+ rejected_elements_index.delete_at(0)
+
+ rejected_elements.delete_at(0)
+
+ end
+
+ end
+
+ else
+
+ joined_file_contents = input_file_contents.join
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def ignore_statement_modifiers(input_block)
+
+ modified_input_block = input_block.dup
+
+ rejectionregexp = /( if | while )/
+
+ rejected_lines = {}
+
+ rejected_line_counter = 0
+
+ input_block.each_with_index do |line, index|
+
+ if line.lstrip.index(rejectionregexp) != nil
+
+ rejected_lines["--rejected{#{rejected_line_counter}}\n\n"] = line
+
+ modified_input_block[index] = "--rejected{#{rejected_line_counter}}\n\n"
+
+ rejected_line_counter += 1
+
+ end
+
+ end
+
+ return modified_input_block, rejected_lines
+
+ end
+
+ def replace_statement_modifiers(input_block, rejected_lines)
+
+ unless rejected_lines.empty?
+
+ rejected_replacements = rejected_lines.keys
+
+ loc = 0
+
+ indices = []
+
+ index_counter = 0
+
+ rejected_replacements.each do |replacement_string|
+
+ input_block.each_with_index do |line, index|
+
+ break if line.include?(replacement_string.rstrip)
+
+ index_counter += 1
+
+ end
+
+ indices << index_counter
+
+ index_counter = 0
+
+ end
+
+ indices.each_with_index do |location, index|
+
+ input_block[location] = rejected_lines.values[index] + "\n\n"
+
+ end
+
+ end
+
+ return input_block
+
+ end
+
+ file_contents = compile_ternary_if(input_file_contents)
+
+ puts file_contents
+
+ file_contents, rejected_lines = ignore_statement_modifiers(file_contents)
+
+ file_contents = replace_unless_until(file_contents)
+
+ file_contents = compile_regular_if(file_contents, temporary_nila_file)
+
+ file_contents = compile_regular_for(file_contents, temporary_nila_file)
+
+ file_contents = compile_regular_while(file_contents, temporary_nila_file)
+
+ file_contents = compile_loop_keyword(file_contents,temporary_nila_file)
+
+ file_contents = replace_statement_modifiers(file_contents, rejected_lines)
+
+ file_contents = compile_inline_conditionals(file_contents, temporary_nila_file)
+
+ return file_contents
+
+ end
+
+ def compile_loops(input_file_contents,temporary_nila_file)
+
+ def compile_times_loop(input_file_contents,temporary_nila_file)
+
+ def compile_one_line_blocks(input_block)
+
+ block_parameters, block_contents = input_block[1...-1].split("|",2)[1].split("|",2)
+
+ compiled_block = "(function(#{block_parameters.lstrip.rstrip}) {\n\n #{block_contents.strip} \n\n}(_i))_!;\n"
+
+ return compiled_block
+
+ end
+
+ def extract_variable_names(input_file_contents)
+
+ variables = []
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("==", "equalequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("!=", "notequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("+=", "plusequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("-=", "minusequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("*=", "multiequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("/=", "divequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("%=", "modequal") }
+
+ input_file_contents = input_file_contents.collect { |element| element.gsub("=~", "matchequal") }
+
+ javascript_regexp = /(if |while |for )/
+
+ for x in 0...input_file_contents.length
+
+ current_row = input_file_contents[x]
+
+ if current_row.include?("=") and current_row.index(javascript_regexp) == nil
+
+ current_row = current_row.rstrip + "\n"
+
+ current_row_split = current_row.split("=")
+
+ for y in 0...current_row_split.length
+
+ current_row_split[y] = current_row_split[y].strip
+
+
+ end
+
+ if current_row_split[0].include?("[") or current_row_split[0].include?("(")
+
+ current_row_split[0] = current_row_split[0][0...current_row_split[0].index("[")]
+
+ end
+
+ variables << current_row_split[0]
+
+
+ end
+
+ input_file_contents[x] = current_row
+
+ end
+
+ variables += ["_i","_j"]
+
+ variables = variables.flatten
+
+ return variables.uniq
+
+ end
+
+ possible_times_loop = input_file_contents.reject{ |element| !element.include?(".times")}
+
+ multiline_times_loop = possible_times_loop.reject {|element| !element.include?(" do ")}
+
+ unless multiline_times_loop.empty?
+
+ multiline_times_loop.each do |starting_line|
+
+ index_counter = starting_counter = input_file_contents.index(starting_line)
+
+ line = starting_line
+
+ until line.strip.eql?("end")
+
+ index_counter += 1
+
+ line = input_file_contents[index_counter]
+
+ end
+
+ loop_extract = input_file_contents[starting_counter..index_counter]
+
+ file_extract = input_file_contents[0..index_counter]
+
+ file_variables = extract_variable_names(file_extract)
+
+ block_variables = extract_variable_names(loop_extract)
+
+ var_need_of_declaration = file_variables-block_variables-["_i","_j"]
+
+ loop_condition, block = loop_extract.join.split(" do ")
+
+ block = block.split("end")[0]
+
+ replacement_string = "#{loop_condition.rstrip} {#{block.strip}}"
+
+ input_file_contents[starting_counter..index_counter] = replacement_string
+
+ end
+
+ end
+
+ possible_times_loop = input_file_contents.reject{ |element| !element.include?(".times")}
+
+ oneliner_times_loop = possible_times_loop.reject {|element| !element.include?("{") and !element.include?("}")}
+
+ loop_variables = []
+
+ modified_file_contents = input_file_contents.clone
+
+ unless oneliner_times_loop.empty?
+
+ oneliner_times_loop.each do |loop|
+
+ original_loop = loop.clone
+
+ string_counter = 1
+
+ extracted_string = []
+
+ while loop.include?("\"")
+
+ string_extract = loop[loop.index("\"")..loop.index("\"",loop.index("\"")+1)]
+
+ extracted_string << string_extract
+
+ loop = loop.sub(string_extract,"--repstring#{string_counter}")
+
+ string_counter += 1
+
+ end
+
+ block_extract = loop[loop.index("{")..loop.index("}")]
+
+ compiled_block = ""
+
+ if block_extract.count("|") == 2
+
+ compiled_block = compile_one_line_blocks(block_extract)
+
+ extracted_string.each_with_index do |string,index|
+
+ compiled_block = compiled_block.sub("--repstring#{index+1}",string)
+
+ end
+
+ else
+
+ compiled_block = block_extract[1...-1].lstrip.rstrip
+
+ extracted_string.each_with_index do |string,index|
+
+ compiled_block = compiled_block.sub("--repstring#{index+1}",string)
+
+ end
+
+ end
+
+ times_counter = loop.split(".times")[0].lstrip
+
+ replacement_string = "for (_i = 0, _j = #{times_counter}; _i < _j; _i += 1) {\n\n#{compiled_block}\n\n}"
+
+ modified_file_contents[input_file_contents.index(original_loop)] = replacement_string
+
+ end
+
+ loop_variables = ["_i","_j"]
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(modified_file_contents.join)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents,loop_variables
+
+ end
+
+ file_contents,loop_variables = compile_times_loop(input_file_contents,temporary_nila_file)
+
+ return file_contents,loop_variables
+
+ end
+
+ def add_semicolons(input_file_contents)
+
+ def comment(input_string)
+
+ if input_string.include?("--single_line_comment")
+
+ true
+
+ elsif input_string.include?("--multiline_comment")
+
+ true
+
+ else
+
+ false
+
+ end
+
+ end
+
+ reject_regexp = /(function |Euuf |if |else|elsuf|switch |case|while |whaaleskey |for )/
+
+ modified_file_contents = input_file_contents.dup
+
+ input_file_contents.each_with_index do |line,index|
+
+ if line.index(reject_regexp) == nil
+
+ if !comment(line)
+
+ if !line.lstrip.eql?("")
+
+ if !line.lstrip.eql?("}\n")
+
+ if !line.lstrip.eql?("}\n\n")
+
+ if line.rstrip[-1] != "[" and line.rstrip[-1] != "{" and line.rstrip[-1] != "," and line.rstrip[-1] != ";"
+
+ modified_file_contents[index] = line.rstrip + ";\n\n"
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ modified_file_contents
+
+ end
+
+ def compile_comments(input_file_contents, comments, temporary_nila_file)
+
+ #This method converts Nila comments into pure Javascript comments. This method
+ #handles both single line and multiline comments.
+
+ file_contents_as_string = input_file_contents.join
+
+ single_line_comments = comments[0]
+
+ multiline_comments = comments[1]
+
+ single_line_comment_counter = 1
+
+ multi_line_comment_counter = 1
+
+ ignorable_keywords = [/if/, /while/, /function/]
+
+ dummy_replacement_words = ["eeuuff", "whaalesskkey", "conffoolotion"]
+
+ for x in 0...single_line_comments.length
+
+ current_singleline_comment = "--single_line_comment[#{single_line_comment_counter}]"
+
+ replacement_singleline_string = single_line_comments[x].sub("#", "//")
+
+ ignorable_keywords.each_with_index do |keyword, index|
+
+ if replacement_singleline_string.index(keyword) != nil
+
+ replacement_singleline_string = replacement_singleline_string.sub(keyword.inspect[1...-1], dummy_replacement_words[index])
+
+ end
+
+ end
+
+ file_contents_as_string = file_contents_as_string.sub(current_singleline_comment, replacement_singleline_string)
+
+ single_line_comment_counter += 1
+
+
+ end
+
+ for y in 0...multiline_comments.length
+
+ current_multiline_comment = "--multiline_comment[#{multi_line_comment_counter}]"
+
+ replacement_multiline_string = multiline_comments[y].sub("=begin", "/*\n")
+
+ replacement_multiline_string = replacement_multiline_string.sub("=end", "\n*/")
+
+ ignorable_keywords.each_with_index do |keyword, index|
+
+ if replacement_multiline_string.index(keyword) != nil
+
+ replacement_multiline_string = replacement_multiline_string.sub(keyword.inspect[1...-1], dummy_replacement_words[index])
+
+ end
+
+ end
+
+ file_contents_as_string = file_contents_as_string.sub(current_multiline_comment, replacement_multiline_string)
+
+ multi_line_comment_counter += 1
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(file_contents_as_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ line_by_line_contents
+
+ end
+
+ def pretty_print_javascript(javascript_file_contents, temporary_nila_file)
+
+ def reset_tabs(input_file_contents)
+
+ #This method removes all the predefined tabs to avoid problems in
+ #later parts of the beautifying process.
+
+ for x in 0...input_file_contents.length
+
+ current_row = input_file_contents[x]
+
+ if !current_row.eql?("\n")
+
+ current_row = current_row.lstrip
+
+ end
+
+ input_file_contents[x] = current_row
+
+
+ end
+
+ return input_file_contents
+
+ end
+
+ def find_all_matching_indices(input_string, pattern)
+
+ locations = []
+
+ index = input_string.index(pattern)
+
+ while index != nil
+
+ locations << index
+
+ index = input_string.index(pattern, index+1)
+
+
+ end
+
+ return locations
+
+
+ end
+
+ def convert_string_to_array(input_string, temporary_nila_file)
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(input_string)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ return line_by_line_contents
+
+ end
+
+ def fix_newlines(file_contents)
+
+ def extract_blocks(file_contents)
+
+ javascript_regexp = /(if |while |for |function\(|((=|:)\s+\{))/
+
+ block_starting_lines = file_contents.dup.reject { |element| element.index(javascript_regexp).nil? }[1..-1]
+
+ block_starting_lines = block_starting_lines.reject { |element| element.include?(" ") }
+
+ initial_starting_lines = block_starting_lines.dup
+
+ starting_line_indices = []
+
+ block_starting_lines.each do |line|
+
+ starting_line_indices << file_contents.index(line)
+
+ end
+
+ block_ending_lines = file_contents.dup.each_index.select { |index| (file_contents[index].eql? " }\n" or file_contents[index].eql? " };\n")}
+
+ modified_file_contents = file_contents.dup
+
+ code_blocks = []
+
+ starting_index = starting_line_indices[0]
+
+ begin
+
+ for x in 0...initial_starting_lines.length
+
+ code_blocks << modified_file_contents[starting_index..block_ending_lines[0]]
+
+ modified_file_contents[starting_index..block_ending_lines[0]] = []
+
+ modified_file_contents.insert(starting_index, " *****")
+
+ block_starting_lines = modified_file_contents.dup.reject { |element| element.index(javascript_regexp).nil? }[1..-1]
+
+ block_starting_lines = block_starting_lines.reject { |element| element.include?(" ") }
+
+ starting_line_indices = []
+
+ block_starting_lines.each do |line|
+
+ starting_line_indices << modified_file_contents.index(line)
+
+ end
+
+ block_ending_lines = modified_file_contents.dup.each_index.select { |index| (modified_file_contents[index].eql? " }\n" or modified_file_contents[index].eql? " };\n") }
+
+ starting_index = starting_line_indices[0]
+
+ end
+
+ rescue TypeError
+
+ puts "Whitespace was left unfixed!"
+
+ rescue ArgumentError
+
+ puts "Whitespace was left unfixed!"
+
+ end
+
+ return modified_file_contents, code_blocks
+
+ end
+
+ compact_contents = file_contents.reject { |element| element.lstrip.eql? "" }
+
+ compact_contents, code_blocks = extract_blocks(compact_contents)
+
+ processed_contents = compact_contents[1...-1].collect { |line| line+"\n" }
+
+ compact_contents = [compact_contents[0]] + processed_contents + [compact_contents[-1]]
+
+ code_block_locations = compact_contents.each_index.select { |index| compact_contents[index].eql? " *****\n" }
+
+ initial_locations = code_block_locations.dup
+
+ starting_index = code_block_locations[0]
+
+ for x in 0...initial_locations.length
+
+ code_blocks[x][-1] = code_blocks[x][-1] + "\n"
+
+ compact_contents = compact_contents[0...starting_index] + code_blocks[x] + compact_contents[starting_index+1..-1]
+
+ code_block_locations = compact_contents.each_index.select { |index| compact_contents[index].eql? " *****\n" }
+
+ starting_index = code_block_locations[0]
+
+
+ end
+
+ return compact_contents
+
+ end
+
+ def roll_blocks(input_file_contents, code_block_starting_locations)
+
+ if !code_block_starting_locations.empty?
+
+ controlregexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
+
+ code_block_starting_locations = [0, code_block_starting_locations, -1].flatten
+
+ possible_blocks = []
+
+ block_counter = 0
+
+ extracted_blocks = []
+
+ for x in 0...code_block_starting_locations.length-1
+
+ possible_blocks << input_file_contents[code_block_starting_locations[x]..code_block_starting_locations[x+1]]
+
+ if possible_blocks.length > 1
+
+ possible_blocks[-1] = possible_blocks[-1][1..-1]
+
+ end
+
+ end
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block = []
+
+ possible_blocks.each_with_index do |block|
+
+ if !block[0].eql?(current_block[-1])
+
+ current_block += block
+
+ else
+
+ current_block += block[1..-1]
+
+ end
+
+ current_block.each_with_index do |line, index|
+
+ if line.lstrip.eql? "}\n" or line.lstrip.eql?("};\n") or line.lstrip.include?("_!;\n")
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ if end_counter > 0
+
+ until end_index.empty?
+
+ array_extract = current_block[0..end_index[0]].reverse
+
+ index_counter = 0
+
+ array_extract.each_with_index do |line|
+
+ break if line.index(controlregexp) != nil
+
+ index_counter += 1
+
+ end
+
+ block_extract = array_extract[0..index_counter].reverse
+
+ extracted_blocks << block_extract
+
+ block_start = current_block.index(block_extract[0])
+
+ block_end = current_block.index(block_extract[-1])
+
+ current_block[block_start..block_end] = "--block#{block_counter}"
+
+ block_counter += 1
+
+ end_counter = 0
+
+ end_index = []
+
+ current_block.each_with_index do |line, index|
+
+ if line.lstrip.eql? "}\n" or line.lstrip.eql?("};\n") or line.lstrip.include?("_!;\n")
+
+ end_counter += 1
+
+ end_index << index
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ return current_block, extracted_blocks
+
+ else
+
+ return input_file_contents, []
+
+ end
+
+ end
+
+ def fix_syntax_indentation(input_file_contents)
+
+ fixableregexp = /(else |elsuf )/
+
+ need_fixes = input_file_contents.reject { |line| line.index(fixableregexp).nil? }
+
+ need_fixes.each do |fix|
+
+ input_file_contents[input_file_contents.index(fix)] = input_file_contents[input_file_contents.index(fix)].sub(" ", "")
+
+ end
+
+ return input_file_contents
+
+ end
+
+ def replace_ignored_words(input_string)
+
+ ignorable_keywords = [/if/, /while/, /function/]
+
+ dummy_replacement_words = ["eeuuff", "whaalesskkey", "conffoolotion"]
+
+ dummy_replacement_words.each_with_index do |word, index|
+
+ input_string = input_string.sub(word, ignorable_keywords[index].inspect[1...-1])
+
+ end
+
+ return input_string
+
+ end
+
+ javascript_regexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
+
+ javascript_file_contents = javascript_file_contents.collect { |element| element.sub("Euuf", "if") }
+
+ javascript_file_contents = javascript_file_contents.collect { |element| element.sub("whaaleskey", "while") }
+
+ javascript_file_contents = reset_tabs(javascript_file_contents)
+
+ starting_locations = []
+
+ javascript_file_contents.each_with_index do |line, index|
+
+ if line.index(javascript_regexp) != nil
+
+ starting_locations << index
+
+ end
+
+ end
+
+ remaining_file_contents, blocks = roll_blocks(javascript_file_contents, starting_locations)
+
+ joined_file_contents = ""
+
+ if !blocks.empty?
+
+ remaining_file_contents = remaining_file_contents.collect { |element| " " + element }
+
+ main_blocks = remaining_file_contents.reject { |element| !element.include?("--block") }
+
+ main_block_numbers = main_blocks.collect { |element| element.split("--block")[1] }
+
+ modified_blocks = main_blocks.dup
+
+ soft_tabs = " "
+
+ for x in (0...main_blocks.length)
+
+ soft_tabs_counter = 1
+
+ current_block = blocks[main_block_numbers[x].to_i]
+
+ current_block = [soft_tabs + current_block[0]] + current_block[1...-1] + [soft_tabs*(soft_tabs_counter)+current_block[-1]]
+
+ soft_tabs_counter += 1
+
+ current_block = [current_block[0]] + current_block[1...-1].collect { |element| soft_tabs*(soft_tabs_counter)+element } + [current_block[-1]]
+
+ nested_block = current_block.reject { |row| !row.include?("--block") }
+
+ nested_block = nested_block.collect { |element| element.split("--block")[1] }
+
+ nested_block = nested_block.collect { |element| element.rstrip.to_i }
+
+ modified_nested_block = nested_block.clone
+
+ current_block = current_block.join
+
+ until modified_nested_block.empty?
+
+ nested_block.each do |block_index|
+
+ nested_block_contents = blocks[block_index]
+
+ nested_block_contents = nested_block_contents[0...-1] + [soft_tabs*(soft_tabs_counter)+nested_block_contents[-1]]
+
+ soft_tabs_counter += 1
+
+ nested_block_contents = [nested_block_contents[0]] + nested_block_contents[1...-1].collect { |element| soft_tabs*(soft_tabs_counter)+element } + [nested_block_contents[-1]]
+
+ nested_block_contents = nested_block_contents.reject { |element| element.gsub(" ", "").eql?("") }
+
+ current_block = current_block.sub("--block#{block_index}", nested_block_contents.join)
+
+ blocks[block_index] = nested_block_contents
+
+ modified_nested_block.delete_at(0)
+
+ soft_tabs_counter -= 1
+
+ end
+
+ current_block = convert_string_to_array(current_block, temporary_nila_file)
+
+ nested_block = current_block.reject { |element| !element.include?("--block") }
+
+ nested_block = nested_block.collect { |element| element.split("--block")[1] }
+
+ nested_block = nested_block.collect { |element| element.rstrip.to_i }
+
+ modified_nested_block = nested_block.clone
+
+ current_block = current_block.join
+
+ if !nested_block.empty?
+
+ soft_tabs_counter += 1
+
+ end
+
+ end
+
+ modified_blocks[x] = current_block
+
+ end
+
+ remaining_file_contents = ["(function() {\n", remaining_file_contents, "\n}).call(this);"].flatten
+
+ joined_file_contents = remaining_file_contents.join
+
+ main_blocks.each_with_index do |block_id, index|
+
+ joined_file_contents = joined_file_contents.sub(block_id, modified_blocks[index])
+
+ end
+
+ else
+
+ remaining_file_contents = remaining_file_contents.collect { |element| " " + element }
+
+ remaining_file_contents = ["(function() {\n", remaining_file_contents, "\n}).call(this);"].flatten
+
+ joined_file_contents = remaining_file_contents.join
+
+ end
+
+ file_id = open(temporary_nila_file, 'w')
+
+ file_id.write(joined_file_contents)
+
+ file_id.close()
+
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
+
+ line_by_line_contents = fix_newlines(line_by_line_contents)
+
+ line_by_line_contents = fix_syntax_indentation(line_by_line_contents)
+
+ line_by_line_contents = line_by_line_contents.collect { |element| replace_ignored_words(element) }
+
+ return line_by_line_contents
+
+ end
+
+ def compile_operators(input_file_contents)
+
+ def compile_power_operator(input_string)
+
+ matches = input_string.scan(/(\w{1,}\*\*\w{1,})/).to_a.flatten
+
+ unless matches.empty?
+
+ matches.each do |match|
+
+ left, right = match.split("**")
+
+ input_string = input_string.sub(match, "Math.pow(#{left},#{right})")
+
+ end
+
+ end
+
+ return input_string
+
+ end
+
+ def compile_match_operator(input_string)
+
+ rejection_exp = /( aannddy | orriioo |nnoottyy )/
+
+ if input_string.include?("=~")
+
+ input_string = input_string.gsub(" && "," aannddy ").gsub(" || "," orriioo ").gsub("!","nnoottyy")
+
+ left, right = input_string.split("=~")
+
+ if left.index(rejection_exp) != nil
+
+ left = left[left.index(rejection_exp)..-1]
+
+ elsif left.index(/\(/)
+
+ left = left[left.index(/\(/)+1..-1]
+
+ end
+
+ if right.index(rejection_exp) != nil
+
+ right = right[0...right.index(rejection_exp)]
+
+ elsif right.index(/\)/)
+
+ right = right[0...right.index(/\)/)]
+
+ end
+
+ original_string = "#{left}=~#{right}"
+
+ replacement_string = "#{left.rstrip} = #{left.rstrip}.match(#{right.lstrip.rstrip})"
+
+ input_string = input_string.sub(original_string,replacement_string)
+
+ input_string = input_string.gsub(" aannddy "," && ").gsub(" orriioo "," || ").gsub("nnoottyy","!")
+
+ end
+
+ return input_string
+
+ end
+
+ input_file_contents = input_file_contents.collect { |element| element.sub("==", "===") }
+
+ input_file_contents = input_file_contents.collect { |element| element.sub("!=", "!==") }
+
+ input_file_contents = input_file_contents.collect { |element| element.sub("equequ", "==") }
+
+ input_file_contents = input_file_contents.collect { |element| element.sub("elsuf", "else if") }
+
+ input_file_contents = input_file_contents.collect { |element| compile_power_operator(element) }
+
+ input_file_contents = input_file_contents.collect {|element| compile_match_operator(element)}
+
+ input_file_contents = input_file_contents.collect {|element| element.gsub("_!;",";")}
+
+ return input_file_contents
+
+ end
+
+ def pretty_print_nila(input_file_contents, temporary_nila_file)
+
+
+ end
+
+ def output_javascript(file_contents, output_file, temporary_nila_file)
+
+ file_id = open(output_file, 'w')
+
+ File.delete(temporary_nila_file)
+
+ file_id.write("//Written using Nila. Visit http://adhithyan15.github.io/nila\n")
+
+ file_id.write(file_contents.join)
+
+ file_id.close()
+
+ end
+
+ if File.exist?(input_file_path)
+
+ file_contents = read_file_line_by_line(input_file_path)
+
+ file_contents = extract_parsable_file(file_contents)
+
+ file_contents, multiline_comments, temp_file, output_js_file = replace_multiline_comments(file_contents, input_file_path, *output_file_name)
+
+ file_contents, singleline_comments = replace_singleline_comments(file_contents)
+
+ file_contents = split_semicolon_seperated_expressions(file_contents)
+
+ file_contents = compile_heredocs(file_contents, temp_file)
+
+ file_contents,loop_vars = compile_loops(file_contents,temp_file)
+
+ file_contents = compile_interpolated_strings(file_contents)
+
+ file_contents = compile_hashes(file_contents,temp_file)
+
+ file_contents = compile_conditional_structures(file_contents, temp_file)
+
+ file_contents = compile_integers(file_contents)
+
+ file_contents = compile_default_values(file_contents, temp_file)
+
+ file_contents, named_functions, nested_functions = replace_named_functions(file_contents, temp_file)
+
+ comments = [singleline_comments, multiline_comments]
+
+ file_contents = compile_parallel_assignment(file_contents, temp_file)
+
+ file_contents = compile_arrays(file_contents, temp_file)
+
+ file_contents = compile_strings(file_contents)
+
+ file_contents, function_names = compile_named_functions(file_contents, named_functions, nested_functions, temp_file)
+
+ list_of_variables, file_contents = get_variables(file_contents, temp_file,loop_vars)
+
+ file_contents, ruby_functions = compile_custom_function_map(file_contents)
+
+ #compile_ruby_methods(file_contents)
+
+ function_names << ruby_functions
+
+ list_of_variables += loop_vars
+
+ file_contents = compile_whitespace_delimited_functions(file_contents, function_names, temp_file)
+
+ file_contents = remove_question_marks(file_contents, list_of_variables, temp_file)
+
+ file_contents = add_semicolons(file_contents)
+
+ file_contents = compile_comments(file_contents, comments, temp_file)
+
+ file_contents = pretty_print_javascript(file_contents, temp_file)
+
+ file_contents = compile_operators(file_contents)
+
+ output_javascript(file_contents, output_js_file, temp_file)
+
+ puts "Compilation is successful!"
+
+ else
+
+ puts "File doesn't exist!"
+
+ end
+
+end
+
+def create_mac_executable(input_file)
+
+ def read_file_line_by_line(input_path)
+
+ file_id = open(input_path)
+
+ file_line_by_line = file_id.readlines()
+
+ file_id.close
+
+ return file_line_by_line
+
+ end
+
+ mac_file_contents = ["#!/usr/bin/env ruby\n\n"] + read_file_line_by_line(input_file)
+
+ mac_file_path = input_file.sub(".rb", "")
+
+ file_id = open(mac_file_path, "w")
+
+ file_id.write(mac_file_contents.join)
+
+ file_id.close
+
+end
+
+def find_file_name(input_path, file_extension)
+
+ extension_remover = input_path.split(file_extension)
+
+ remaining_string = extension_remover[0].reverse
+
+ path_finder = remaining_string.index("/")
+
+ remaining_string = remaining_string.reverse
+
+ return remaining_string[remaining_string.length-path_finder..-1]
+
+end
+
+def find_file_path(input_path, file_extension)
+
+ extension_remover = input_path.split(file_extension)
+
+ remaining_string = extension_remover[0].reverse
+
+ path_finder = remaining_string.index("/")
+
+ remaining_string = remaining_string.reverse
+
+ return remaining_string[0...remaining_string.length-path_finder]
+
+end
+
+nilac_version = "0.0.4.3.3"
+
+opts = Slop.parse do
+ on :c, :compile=, 'Compile Nila File', as:Array, delimiter:":"
+ on :h, :help, 'Help With Nilac' do
+
+ puts "Nilac is the official compiler for the Nila language.This is a basic help\nmessage with pointers to more information.\n\n"
+
+ puts " Basic Usage:\n\n"
+
+ puts " nilac -h/--help\n"
+
+ puts " nilac -v/--version\n"
+
+ puts " nilac -u/--update => Update Checker\n"
+
+ puts " nilac [command] [file_options]\n\n"
+
+ puts " Available Commands:\n\n"
+
+ puts " nilac -c [nila_file] => Compile Nila File\n\n"
+
+ puts " nilac -c [nila_file]:[output_js_file] => Compile nila_file and saves it as\n output_js_file\n\n"
+
+ puts " nilac -c [nila_file_folder] => Compiles each .nila file in the nila_folder\n\n"
+
+ puts " nilac -c [nila_file_folder]:[output_js_file_folder] => Compiles each .nila\n file in the nila_folder and saves it in the output_js_file_folder\n\n"
+
+ puts " nilac -r [nila_file] => Compile and Run nila_file\n\n"
+
+ puts " Further Information:\n\n"
+
+ puts " Visit http://adhithyan15.github.io/nila to know more about the project.\n\n"
+
+ end
+ on :v, :version, 'Output Nilac Version No' do
+
+ puts nilac_version
+
+ end
+
+ on :r, :run=, 'Run Nila File', as:Array
+
+ on :b, :build, 'Build Nilac for Linux/Mac/Rubygems' do
+
+ file_path = Dir.pwd + "/src/nilac.rb"
+
+ create_mac_executable(file_path)
+
+ FileUtils.mv("#{file_path[0...-3]}", "#{Dir.pwd}/bin/nilac")
+
+ puts "Build Successful!"
+
+ end
+
+ on :release=, 'Build and Release Nilac for Rubygems', as:Array
+
+ on :u, :update, 'Check if Nilac is up to date.' do
+
+ outdated_gems = `gem outdated`
+
+ outdated_gems = outdated_gems.split("\n")
+
+ outdated = false
+
+ old_version = ""
+
+ new_version = ""
+
+ outdated_gems.each do |gem_name|
+
+ if gem_name.include?("nilac")
+
+ outdated = true
+
+ old_version = gem_name.split("(")[1].split(")")[0].split("<")[0].lstrip
+
+ new_version = gem_name.split("(")[1].split(")")[0].split("<")[1].lstrip.rstrip
+
+ break
+
+ end
+
+ end
+
+ if outdated
+
+ exec = `gem update nilac`
+
+ puts "Your version of Nilac (#{old_version}) was outdated! We have automatically updated you to the latest version (#{new_version})."
+
+
+ else
+
+ puts "Your version of Nilac is up to date!"
+
+ end
+
+ end
+end
+
+opts = opts.to_hash
+
+if opts[:compile] != nil
+
+ if opts[:compile].length == 1
+
+ input = opts[:compile][0]
+
+ if input.include? ".nila"
+
+ current_directory = Dir.pwd
+
+ input_file = input
+
+ file_path = current_directory + "/" + input_file
+
+ compile(file_path)
+
+ elsif input.include? "/"
+
+ folder_path = input
+
+ files = Dir.glob(File.join(folder_path, "*"))
+
+ files = files.reject { |path| !path.include? ".nila" }
+
+ files.each do |file|
+
+ file_path = Dir.pwd + "/" + file
+
+ compile(file_path)
+
+ end
+
+ end
+
+ elsif opts[:compile].length == 2
+
+ input = opts[:compile][0]
+
+ output = opts[:compile][1]
+
+ if input.include? ".nila" and output.include? ".js"
+
+ input_file = input
+
+ output_file = output
+
+ input_file_path = input_file
+
+ output_file_path = output_file
+
+ compile(input_file_path, output_file_path)
+
+ elsif input[-1].eql? "/" and output[-1].eql? "/"
+
+ input_folder_path = input
+
+ output_folder_path = output
+
+ if !File.directory?(output_folder_path)
+
+ FileUtils.mkdir_p(output_folder_path)
+
+ end
+
+ files = Dir.glob(File.join(input_folder_path, "*"))
+
+ files = files.reject { |path| !path.include? ".nila" }
+
+ files.each do |file|
+
+ input_file_path = file
+
+ output_file_path = output_folder_path + find_file_name(file, ".nila") + ".js"
+
+ compile(input_file_path, output_file_path)
+
+ end
+
+ end
+
+ end
+
+elsif opts[:run] != nil
+
+ current_directory = Dir.pwd
+
+ file = opts[:run][0]
+
+ file_path = current_directory + "/" + file
+
+ compile(file_path)
+
+ js_file_name = find_file_path(file_path, ".nila") + find_file_name(file_path, ".nila") + ".js"
+
+ node_output = `node #{js_file_name}`
+
+ puts node_output
+
+elsif opts[:release] != nil
+
+ file_path = Dir.pwd + "/src/nilac.rb"
+
+ create_mac_executable(file_path)
+
+ FileUtils.mv("#{file_path[0...-3]}", "#{Dir.pwd}/bin/nilac")
+
+ puts "Your build was successful!\n"
+
+ commit_message = opts[:release][0]
+
+ `git commit -am "#{commit_message}"`
+
+ puts `rake release`
+
+end